Configuring GitLab CI-CD with AWS EC2
Last updated
Last updated
배포 자동화를 통해 비효율 끝판왕 개선하기!!
지난번에 배포한 SSAFY에서 준 EC2 하나에 backend와 frontend server 두 개를 올리는 방식에서, 재배포 시 git repo pull 받고 일련의 배포 명령어를 주르륵 실행해야 했고, 너무 비효율적이라 빨리 고치고 싶었다.
그래서 CI/CD 를 알아보던 중, SSAFY에서 Github이 아닌 GitLab을 활용하고 있는 만큼 GitLab이 만든 Gitlab CI/CD를 활용해서 배포 자동화를 해보기로 했다!
References: namioto.ip.or.kr
GitLab CI/CD는 Docker container위에서 작동되고, 연결된 Kubernetes 에 배포된다
Project root에 gitlab-ci.yml
파일이 있는 상태에서 push가 들어오면, 해당 파일에 명시된 Pipeline (task 묶음)이 실행된다
Test
Unit Test
통합 Test
E2E Test
Test Coverage 측정
Lint
Code quality 측정
Code convention 점검
Build
Build
Bundling
Dockerfile build
Container registry push
Deploy
Helm Chart
Helm Chart란?
helm
은 Kubernetes package manager
helm chart
는 pacakage format으로 application을 설치하기 위한 파일들로 구성됨!
KNative Functions
KNative란?
Serverless cloud native application을 배포, 실행, 관리하기 위해 Kubernetes에 구성 요소를 추가하는 Open source community project
KNative App(컨테이너) 배포
Gitlab Runner는 remote branch에 push가 되면 설정된 Stage위의 작업들을 실행해준다!
그러기 위해서는 원격 저장소에 GitLab Runner
가 설치되어 있어야 한다
root 계정에서 바로 실행하려면 1 ~ 2 번 건너뛰기!
gitlab-runner
라는 이름의 계정을 생성한다
위의 명령어를 입력하고, 5가지 사항을 interactive하게 입력해야 한다
Settings > CI/CD > Runners settings > Specific Runners 에서 아래와 같이 등록된 Runner를 확인할 수 있다
.gitlab-ci.yml
파일 작성하기Project root 에
.gitlab-ci.yml
파일을 작성한다
이것은 SpringBoot - React 프로젝트의 배포 자동화를 위해 내가 작성한 script 이다!!
이 yml 파일 하나를 만들기 위해 엄청나게 많은 시행착오를 겪어서 나온 결과이지만, 처음 작성해보는 Gitlab CI/CD 파일이고, 더 나은 방법이 있을 수 있으므로 참고만 하자! (아마 있을 것이다! 계속 알아보고 있다!)
더 효율적인 방법을 찾으면 update 하겠다!!
ex)
deploy-to-server
Gitlab Runner를 등록 할 때 지어준 JOB 이름
stage
이 글의 위에서 설명한 바와 같이 Gitlab은 Stage 별로 특정 작업들을 수행할 수 있는 그룹이 있는데, 그 중 deploy stage 라는 것
only
master branch에 event가 발생 했을 때에만 pipeline 이 활성화 되게 설정
before_script
말그대로 runner에 의해 실행될 shell script 실행 이전에 수행 될 script
whoami
명령어
Gitlab Runner를 등록 할 때 Root 계정이 아닌 따로 만든 계정 (gitlab-runner
) 으로 등록했기 때문에 제대로 설정되어있나 보려고 추가함!
script
Gitlab Runner에 의해 실행될 Shell script
backend build 후 재배포, front build 후 재배포 하는 순서로 실행된다!
kill $(lsof -t -i:8000)
backend server가 사용하고 있는 포트번호인 8000번 포트를 종료한다
setsid nohup java -jar backend-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &
가장 많이 시행 착오 겪은 부분이다
처음에 기존 jar 파일을 background에서 실행 시키도록 nohup -jar backend-0.0.1-SNAPSHOT.jar &
로 pipeline을 활성화 시켰더니 Job이 종료되지 않고 계속 실행되었다
nohup -jar backend-0.0.1-SNAPSHOT.jar > nohup.out &
로 변경했더니 permission denied error 가 났다
그 후로도 수정에 수정을 거쳐 결국 linux directory structure에서 장치 파일들이 저장되는 가상의 파일시스템인 /dev
로 .out 파일을 작성하게 변경하였다 (실제로 작성되지는 않는다! 물리적 용량을 차지하지 않는 directory 임!)
그 결과, Runner의 Job이 성공적으로 종료되고, background에서 Jar 파일이 실행되는 것을 확인 할 수 있었다!
after_script
말 그대로 script 수행이 완료되면 수행 될 script
tags
특정 Tag가 달린 Runner에 명령을 내릴 수 있게 한다
Gitlab Runner 등록 시 설정한 Tag를 잘 기억해 두었다가 여기에 적으면 된다!
.gitlab-ci.yml
파일에 기재했듯이, master branch에 event가 발생하면 pipeline이 실행된다
CI/CD > Pipelines 에서 실행된 pipeline들을 확인 할 수 있다
Pipeline 을 클릭해서 들어가면 실행된 Job 을 확인 할 수 있다
Job이 성공적으로 실행되면 아래와 같은 화면을 볼 수 있다
Job succeeded!
+
처음에 Job 실행 시 새로 생성한 gitlab-runner
계정에 대한 sudo 권한이 없어서 권한을 부여했다
위의 명령어를 입력한 뒤 아래의 내용을 추가했다
+
이 방식 말고 Dockerfile
을 작성하고 docker image를 실행시키는 Job을 Gitlab CI/CD로 설정하는 방법을 생각해보고 있다!
Kubernetes를 활용하는 방법도 알아보는 중! 재밌당!