데브옵스
gitlab runner 로 ci 만들어보기
ZestLee
2024. 6. 22. 22:02
개요
- 이번에 이직한 회사에서 gitlab 을 사용하는데, cicd 가 되어있지 않아 배포 과정이 수동적이었다
- 이에 따라서 gitlab runner 구성과 gitlab ci 스크립트 작성을 통해 자동화 배포 환경을 구축하게 되었다
Gitlab runner 구성
- 먼저 gitlab runner 구성하는 작업을 진행했다
- gitlab runner 는 ci/cd 파이프라인을 실행하는 역할을 한다
- 관련 가이드를 참고해서 runner 를 성공적으로 설치 / 등록할 수 있었다
- 초기 구성은 여기가 잘 나와있음
Gitlab ci 스크립트 작성
- 그 다음으로는 .gitlab-ci.yml 파일을 작성해서 ci/cd 파이프라인을 구성했다.
- 나는 파이프라인을 다음과 같은 단계로 나눴다
- Compile:dev 단계
- develop 브랜치의 mr 이벤트 발생 시 실행
- yarn install, git pull, yarn build 실행
- 빌드 결과물은 사용되지 않음
- Build:dev 단계
- develop 브랜치에 push 이벤트 발생 시 실행
- git pull origin develop, yarn install, yarn build 수행
- 빌드 결과물을 out 디렉토리에 artifacts 로 저장
- Deploy:dev 단계
- develop 브랜치에 push 이벤트 발생 시 실행
- Build:dev 단계의 artifacts 를 의존
- out 디렉토리의 결과물을 개발 서버에 배포
3개의 단계로 나눈 이유
- Compile:dev 단계
- MR 을 머지한 이후 빌드 오류가 나는 경우가 잦았다
- 따라서 머지 이전에 빌드 오류가 나는지 확인한 뒤 머지할 수 있도록 강제성을 두기 위해서 만든 것이다
- Build:dev 단계
- Compile 단계에서 만든 빌드 파일을 사용하면 되지 않을까 싶겠지만,
그렇게 하게 되면 서로의 커밋이 최종 파일을 덮어버리는 이슈가 생겼다 - 예를 들어 a MR 이 방치되던 중 b MR 을 생성 > b MR 이 먼저 머지 및 빌드 > a MR 이 머지 및 빌드
이런 경우에는 b 가 머지되었음에도 불구하고 a 시점의 코드가 나가게 되므로, b 내용이 전부 사라지게 된다
따라서 Build:dev 단계에서는 머지된 develop 최신 브랜치를 땡겨오고, 그것을 빌드하게끔 했다
- Compile 단계에서 만든 빌드 파일을 사용하면 되지 않을까 싶겠지만,
- Deploy:dev 단계
- Build 된 파일을 그대로 사용하는 단계이다
- gitlab 서버와 배포 서버는 다르기 때문에 나눴다
TODO
- 급하게 만든 CI 라 아직 고쳐야 할 점이 있다
- Compile:dev 에서는 캐싱된 node_modules 를 사용하고,
package.json 이 업데이트 되지 않았다면 yarn install 을 건너뛰기- 현재는 매번 yarn install 을 하기 때문에 MR 생성 시 컴파일이 느린 감이 있다
- 컴파일을 체크하기 위한 스크립트를 간소화 할 수 없는지 확인
- next 프로젝트를 빠르게 컴파일 할 수 있는 방법이 없을지...
- lint 는 진짜 린트 체크만 해서 실제 빌드와는 또 다르다..
- 빌드를 병렬로 할 수는 없을지
- ci 단계에서 안 적은 것이 있는데, 사실은 퍼블팀을 위한 빌드 단계가 또 있다
- 기본 build/deploy 단계는 퍼블리싱 파일 미포함이지만, 퍼블팀에서 실 서버를 봐야 하는 이슈가 생겼었다
- 따라서 포트를 두 개 띄우고 퍼블팀만 볼 수 있는 서버를 하나 더 띄워서 보게끔 만들었다
내부 사정으로 각각 export 옵션 / standlone 옵션으로 상이하기 때문에 어쩔 수 없이 두개를 띄웠다 - 그래서 빌드가 두개가 직렬로 돌고 있어서 퍼블 CI/CD 는 상대적으로 느린데, 빌드를 병렬로 할 수 없을지 찾아봐야 한다