[CI/CD 구축] AWS, Docker, GitLab을 사용하여 CI/CD 구축하기 1편

회사에서 프로젝트를 진행할 때, 각자의 소스 버전 관리 시스템(GitLab, GitHub 등)의 repository에 push만 진행하면 알아서 자동으로 서버에 작성한 코드가 반영되는 것을 볼 수 있다. 요즘은 어느 회사에 가던 이러한 CI/CD [여러 가지 사전적인 의미가 많지만 본 포스팅에서는 개발자를 위한 자동화 프로세스를 뜻하는 지속적인 통합(Continuous Integration)과 지속적인 서비스 배포(Continuous Deployment)의 의미를 부여]를 경험하게 될 것이다.

 

나 또한 회사를 다니면서 누군가가 구축해놓은 CI/CD 파이프라인을 이용만 하였기 때문에 실질적으로 이를 간략하게나마 만들어보며 대략적인 플로우를 머릿속에 다시 한번 확립하고자 본 포스팅을 작성한다.

 

사전 준비 사항
1. GitLab Repository & Project 생성 (GitLab Infra 무지성 사용방지를 위한 신용카드 등록 필수)
2. AWS EC2 인스턴스 (본 포스팅은 free tier aws linux 2 인스턴스 사용)

1. AWS EC2 인스턴스에 Docker Install 하기

 

Install Docker Engine on CentOS

 

docs.docker.com

# yum update & upgrade
$ sudo yum update -y & upgrade -y

# Docker install
$ sudo yum install docker -y

# Docker group을 새로 만들고 ec2-user 그룹에 편입 
$ sudo usermod -aG docker ec2-user

# Docker 실행
$ sudo service docker start

 

2. AWS EC2 인스턴스에 Docker GitLab Runner 설치 및 설정하기

 

Run GitLab Runner in a container | GitLab

Documentation for GitLab Community Edition, GitLab Enterprise Edition, Omnibus GitLab, and GitLab Runner.

docs.gitlab.com

  • Docker 컨테이너 내에서 실행하려면 gitlab-runner컨테이너를 다시 시작할 때 구성이 손실되지 않도록 해야 한다.
  • 첫번째 방법으로 로컬 시스템에서 볼륨 마운트를 사용하여 Runner 컨테이너를 시작하는 방법
# 로컬 볼륨 마운트로 컨테이너 시작
$ sudo docker run -d --name gitlab-runner --restart always \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
#    gitlab/gitlab-runner:latest -> 해당 gitlab-runner 이미지는 gitlab-ci 명령어 스크립트를 실행할 수 없는 이미지이므로 다른 이미지로 대체
  mingyu94/php7.2:1.2
  • 두번째 방법으로 Docker 볼륨을 사용하여 Runner 컨테이너를 시작하는 방법
# Docker 볼륨을 생성
$ sudo docker volume create gitlab-runner-config

# 생성한 볼륨을 사용하여 GitLab Runner 컨테이너를 시작
$ sudo docker run -d --name gitlab-runner --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v gitlab-runner-config:/etc/gitlab-runner \
#    gitlab/gitlab-runner:latest -> 해당 gitlab-runner 이미지는 gitlab-ci 명령어 스크립트를 실행할 수 없는 이미지이므로 다른 이미지로 대체
    mingyu94/php7.2:1.2

 

3. GitLab Runner Register 설정하기

  • 위의 마운트 유형에 따라 등록 명령을 실행한다.
# Docker 볼륨을 사용하여 컨테이너 시작한 경우 레지스터 등록
$ sudo docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register

# 로컬 볼륨 마운트로 시작한 컨테이너 레지스터 등록
docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register

  • GitLab Instance URl을 기입한다.
Enter the GitLab instance URL (for example, https://gitlab.com/):
https://gitlab.com/
  • GitLab Registration Token값을 입력한다.
Enter the registration token:
GR1348941Z4_xxxxxxxxxxxxxx
  • 그 이외에 것들을 기입한다
# ruuner를 설명할 description을 기입한다
Enter a description for the runner:
[16bc6575b7e7]: frist runner use project1

# runner에서 사용할 태그를 콤마(,)로 구분지어 기입한다.
Enter tags for the runner (comma-separated):
project1,firstcreaterunner

# (선택사항)러너에 대한 선택적 유지 관리 메모를 입력한다. 
Enter optional maintenance note for the runner:

Registering runner... succeeded                     runner=GR1348941Z4_gkZef

# 러너를 실행하는 실행자?를 기입한다. 여기선 docker
Enter an executor: docker+machine, custom, docker, docker-ssh, parallels, shell, ssh, virtualbox, docker-ssh+machine, kubernetes, instance:
docker

# 도커 기본 이미지를 지정한다. 난 gitlab/gitlab-runner 이미지를 사용
Enter the default Docker image (for example, ruby:2.7):
gitlab/gitlab-runner
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

# 완료된 설정 내용은 /etc/gitlab-runner/config.toml 에 저장된다
Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"
  • 마지막으로 러너가 잘 설정되었는지 gitlab에서 확인한다.

 

4. 생성했던 GitLab project에서 gitlab-ci.yml 내용 변경 및 push 후 build-job 확인하기

  • gitlab-ci.yml 파일 수정후 commit change(push) 진행Job pass 확인하기

 

5. AWS EC2로 ssh 접속하여 runner가 작동하고 있는 docker container Log 확인하기

  • 4번의 Job이 잘 실행된 걸 확인 한 후에 AWS EC2 인스턴스로 ssh 접속한다.
  • docker logs 명령어로 docker container에서 작동하고 있는 runner가 이벤트를 잘 캐치해서 처리했는지 확인한다.
# ec2 인스턴스 ssh로 접속 후
$ docker logs -n 20 gitlab-runner # 로그 마지막 20줄만 찍겠다 그런의미

runner가 job을 잘 처리한걸 볼 수 있다