전부터 CI/CD를 구성하고 싶었는데, Jenkins니 Kubernetes니 뭔가 어렵게 느껴져서 쉽게 적용하지 못하고 있다가, 우연히 GitLab CI/CD 적용법을 알게되서 적용해보게 되었다. Gitlab을 사용하는 회사에서는 자연스럽게 GitLab CI/CD를 선택한다니까, 믿고 쓸만한 것 같다. 완전 무료는 아닌 것 같지만, 무료로 제공해주는만큼만 써도 그게 어디야…
구조
내가 그동안 배포를 진행하던 방식은 이렇다.
기존 배포방식
- GitLab으로 코드를
push
한다. - ec2에서
git pull
을 이용해 코드를 가져온다. docker-compose up —build -d
로 docker를 build시킨다.- 끝
GitLab CI/CD 적용
- GitLab으로 코드를
push
한다. - GitLab이 미리 작성한
.gitlab-ci.yml
와 등록된Runner
가Pipeline
을 실행한다. gitlab-runner
가 설치된 ec2에서 정의된 명령어를 수행한다.- 끝
이렇게 보니까 그렇게 간단해진건 아닌 것 같지만, 나는 앞으로 push만 하면 되는거니까 개꿀…
EC2에 gitlab-runner 설치하기
GitLab-CI는 설치형이기 때문에 EC2에 해당 프로그램을 설치해야한다.
1 2
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash $ sudo yum install gitlab-runner
yum으로 설치하고나면 gitlab-runner라는 이름으로 이미 서비스가 등록되어버린다. 적용된 서비스의 삭제를 먼저 진행하자.
1 2 3 4 5 6 7
# 모든 runner 삭제 $ gitlab-runner unregister --all-runners # gitlab-runner 제거 $ sudo gitlab-runner uninstall # 추가된 사용자 제거 $ sudo userdel gitlab-runner $ sudo rm -rf /home/gitlab-runner/
명령어를 실행하게될 유저와 directory를 설정해줘야하는데, 나는 이미 코드가 ec2-user에 있었기 때문에 root로 접근시켜서 해결하는 방식으로 했다. gitlab-runner라는 이름으로 user를 생성해서 하는 것도 방법이다.
1 2
$ sudo gitlab-runner install --user=root --working-directory=/home/ec2-user $ sudo gitlab-runner start
이제 GitLab으로 runner를 등록해주자. Token 입력이 필요하니까 미리 GitLab의 Settings → CI/CD → Runners에 Specific runners를 열어두자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
$ sudo gitlab-runner register # GitLab 서버 주소 입력 Enter the GitLab instance URL (for example, https://gitlab.com/): https://gitlab.com/ # GitLab CI Token 입력 (Specific runners에 친절하게 적혀있다) Enter the registration token: ... # Runner 설명 Enter a description for the runner: gitlab-runner for my gitlab repository # .gitlab-ci.yml에 작성될 tag인데, 꼭 기억하고 있어야한다. Enter tags for the runner (comma-separated): deploy # 이건 뭔지 모르겠다...일단 패스ㅎ Enter optional maintenance note for the runner: # 실행할 명령 형식을 선택하는건데, 그동안 배포를 shell로 진행했으니까 shell로 선택 Please enter the executor: docker-ssh, ssh, virtualbox, docker, parallels, shell, docker+machine, docker-ssh+machine, kubernetes: shell
간혹 등록한 후에 ERROR: Preparation failed: getwd: getwd: no such file or directory 에러가 발생하는 경우가 있다. 이걸 방지하기 위해서 restart를 진행해주자. ERROR: Preparation failed: Getwd: getwd: no such file or directory
1
$ gitlab-runner restart
미리 열어둔 Settings → CI/CD → Runners에 가보면 runner가 등록된 것을 확인할 수 있다.
.gitlab-ci.yml
작성하기
repository 최상단에 들어가게될 .gitlab-ci.yml을 작성해주자! runner가 실행될때 실제로 돌아게될 코드들을 작성하면 된다. 공식문서를 참고한건 아니고…여러 블로그를 조합한 결과이기 떄문에 너무 맹신하지는 말자ㅎ
|
|
잘 돌아가나 확인해보기
deploy branch로 push해서 정상적으로 작동하는지 확인해보자! GitLab → CI/CD → Piplines에 들어가면 현재 상황을 체크할 수 있다!
위처처럼 뜨면 성공!!! 체크표시를 클릭해서 들어가면 실행된 코드를 볼 수 있다. 실패했을때 왜 실패했는지 체크가 쉬우니까 꼭 확인해보자!
내가 겪었던 오류들…
- Permission deny…
처음에 gitlab을 설치할때 타 블로그를 보고
--user=gitlab-runner
로 설정했었다. 나는 root로 설정했어야헀는데;;; 그래서 삭제한 후--user=root
로 재설치를 진행했다. - 실패이유를 확인할 수가 없어…? 처음에 push를 날려보고 실패했는데, 왜 실패했는지를 알 수가 없었다;;;; .gitlab-ci.yml에서 stages 부분이 없었는데, 추가하고 나니까 체크표시나 실패표시가 뜨면서 log를 볼 수 있더라.
- git pull 실패 사실 이건 실패라고 하긴 좀 그렇고;;; 항상 ec2-user로 git pull을 했어서, root로는 권한이 없어서 생긴 문제다. 손으로 root에 접속해서 git pull을 한번 하면서 id, pw 입력한 후로를 잘 돌아갔다! (전에 한번 id, pw를 입력하면 그 정보를 저장해두는 설정을 했었다.)