Vue 프로젝트에 CI를 적용했다. 그리고 이제 나머지 Spring Boot 프로젝트에 CI를 적용해보겠다.
이전 글 2021.08.22 - [AWS] - 🐮 Vue 프로젝트에 Jenkins로 CI를 적용해보자 에서 기반 작업을 다 진행했으니 매우 간단하게만 설명하겠다. 이번에도 역시 매우 아쉬운 부분이 있었고 이는 마지막에 작성하겠다.
사용한 기술 스택
- Spring Boot (gradle)
- Docker
- Jenkins
- EC2
사전작업
1. 이전 글에서 진행한 Jenkins가 도커 컨테이너로 실행중이다.
2. 잘 실행되는 jar파일이 만들어지는지 확인한다.
어떻게 할건데?
원래는 이렇게 하고 싶었어요..
아래 출처에 등록된 블로그 내용과 같이 다음과 같은 프로세스로 만들고 싶었다. 하지만 아래와 같이 했다. 그 이유는 아래 아쉬운점에 적겠다. (나의 글보다는 아래 출처 글을 기반으로 진행하는게 더 나은 선택일 듯 하다 ㅎㅎ)
하지만 이렇게 했어요..
코드를 푸쉬하면, Jenkins에 트리거된다. Jenkins에서 실행가능한 jar 파일이 만들어지도록 빌드 및 테스트한다. jar 파일이 만들어지면, 해당 jar 파일과 도커 이미지를 만들기 위한 Dockerfile 그리고 스크립트를 실행하기 위해 내가 작성한 deploy.sh 를 EC2 서버에 scp로 전달해 실행한다. 그러면 새로운 jar 파일로 도커 이미지가 생성되고 deploy.sh에 기존 도커 컨테이너를 삭제하고 새로운 컨테이너를 실행하라는 명령을 입력해 실행시킨다. 그러면 결과적으로 기존 컨테이너는 중단되고 새로운 컨테이너가 실행되게 된다.
최종 파이프라인
pipeline {
agent any
stages {
stage('prepare') {
steps {
sh "pwd"
sh "java -version"
sh "git --version"
git branch: '브랜치명', credentialsId: 'Gitlab', url: '깃헙레퍼지토리주소'
dir("backend") {
sh "pwd"
sh "ls -al"
}
}
}
stage('build') {
steps {
dir("backend") {
echo "build stage"
sh "ls -al"
sh "chmod 777 ./gradlew"
sh "./gradlew build"
sh "ls -al"
}
}
}
stage('copy jar') {
steps {
dir("backend") {
echo "copy jar"
sh "pwd"
sh "scp /var/jenkins_home/workspace/backend_pipeline_test/backend/build/libs/backend-0.0.1-SNAPSHOT.jar ubuntu@123.456.789.012:/home/ubuntu/app/backend"
sh "scp /var/jenkins_home/workspace/backend_pipeline_test/backend/src/main/resources/application-oauth.properties ubuntu@123.456.789.012:/home/ubuntu/app/backend"
sh "scp /var/jenkins_home/workspace/backend_pipeline_test/backend/Dockerfile ubuntu@123.456.789.012:/home/ubuntu/app/backend"
sh "scp /var/jenkins_home/workspace/backend_pipeline_test/backend/deploy.sh ubuntu@123.456.789.012:/home/ubuntu/app/backend"
}
}
post {
success {
echo "success"
sh "ssh ubuntu@123.456.789.012 chmod 777 /home/ubuntu/app/backend/deploy.sh"
sh "ssh ubuntu@123.456.789.012 /home/ubuntu/app/backend/deploy.sh"
}
}
}
}
}
이미 이전 글에서 내용을 작성했으므로 설명은 생략하겠다. 추가적인 내용이 있다면, scp로 필요한 파일들을 전부 전송했다는 것 그리고 EC2 서버에서 내가 작성한 deploy.sh 를 ssh를 이용해서 실행시켰다는 것이다.
Dockefile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
Dockerfile에 작성된 내용은 매우 간단하다. Java 8 기반에서 옮긴 jar 파일을 app.jar라는 이름으로 복사한다. 그 후에 jar를 실행하는 명령어를 실행하도록 했다.
app.jar가 컨테이너 안에 잘 copy 된 것을 볼 수 있다.
deploy.sh
echo "hello"
cd /home/ubuntu/app/backend
pwd
# Dockerfile을 기반으로 도커 이미지를 생성하도록 한다.
docker build -t routingstar/backend:latest .
# 이미 실행중이던 컨테이너를 종료시킨다.
docker container stop routingstar
# 그리고 해당 컨테이너를 삭제했다.
docker rm routingstar
# EC2의 8000번 포트와 컨테이너의 8000번 포트를 연결하고
# routingstar/backend라는 이미지를 routingstar 라는 이름의 컨테이너를 백그라운드로 실행시킨다.
docker run -d --name routingstar -p 8000:8000 routingstar/backend
각 내용은 주석으로 설명을 달아놨다.
배운 점 / 좋았던 점
1) Jenkins로 CI 하기
저번 졸작에서는 travis로 진행하고 처음으로 jenkins를 사용했다. travis는 호스팅서버를 제공하기 때문에 따로 ec2 서버를 이용하거나 컨테이너를 실행할 필요가 없었다. 하지만 이번에 jenkins를 사용하면서 직접 컨테이너 안에서 어떻게 실행되는지 볼 수 있어서 흐름을 이해하기 좋았다. 또한 보다 유연하게 플러그인을 설치하고 사용할 수 있어서 좋았다.
2) 알림 등록
매터모스트 알림을 등록했다. 확실히 진행 여부를 알 수 있으니까 편하고 좋았다.
아쉬웠던 점
1) 도커 hub에 올려서 CI 하지 못한것
위에 첨부한 사진과 같이 파이프라인을 만들고 싶었지만 하지 못했다. 그 이유는 Jenkins에 도커를 설치하는 과정이 뭔가 험난했다.. 잘안됨... 왜지?ㅠㅠ 그래서 찾아보니까 보통 Jenkins 컨테이너와 EC2에 설치된 도커 경로를 볼륨으로 공유해서 사용하는게 대부분이라고 했다. 하지만 이미 실행되고 있는 컨테이너에 볼륨을 추가하는게 잘 안됐다. (사실 잘 될거같은데 시간이 부족해서 마음이 급하다보니까 잘 안된 것 같다.^^) 다음에 보완할 때는 볼륨 공유를 시도해볼 예정이다.
2) 약 2초의 중단..😎
무중단까지도 적용하고 싶었지만 시간적인 문제로 인해 구현하지 못했다. 그래서 한 2초 정도? 중단이 있었다. 내가 만약 사용자라면? 완전 싫을 것 같다! 이번에 여유를 갖고 한번 시도해보겠다.
3) scp 명령어의 많은 사용
이렇게 하는게 맞는지 모르겠지만, 필요한 파일을 EC2로 전달하기 위해 굉장히 많은 scp 명령어를 사용했다. 뭔가 이건 아쉽다기보다 더 좋은 방법이 있지 않을까 싶었다..!
결론은 사실 Jenkins에서 도커 이미지를 생성하는 방식으로하면 해결되지 않을까 싶다. 다시 시도해보고 더 좋은 방법을 공유하러 오겠다.. 재밌어!!😈
출처
'AWS' 카테고리의 다른 글
🐮 Vue 프로젝트에 Jenkins로 CI를 적용해보자 (0) | 2021.08.22 |
---|---|
EC2에서 npm run serve 했더니 나타났던 오류 (0) | 2021.07.01 |
🤢 정적 파일 nginx로 배포하는 과정 중 나타난 오류 (0) | 2021.07.01 |
🐥 Linux에서 필요했던 내용 (0) | 2021.07.01 |
👩🏻🌾 AWS, Docker, Nginx로 신나게 배포하기 - 1편 (0) | 2021.07.01 |