지난 게시글에 이어 Node.js express 테스트 서버를 띄워 CI/CD를 구축해보는 과정을 정리해보겠다. 생각만큼 쉽지않은 과정이였는데 공부는 많이 되더라...
앞서 우리는 GitLab의 파이프라인을 실행하기 위해서 GitLab Runner라는 에이전트가 설치되어 있어야함을 알게 되었다. 본격적으로 CI/CD를 구축하기 전에 GitLab Runner에 대해 이해하고 넘어가보자.
GitLab의 공식 문서에서 발췌한 내용입니다.
https://docs.gitlab.com/runner/
GitLab Runner는 크게 두가지로 구분할 수 있는데 모든 프로젝트에 대해 GitLab에서
관리하는 GitLab-hosted runners와 직접 Runner를 설치하고 자체 인스턴스에 Runner를 등록할 수 있는 self-managed runners이다.
내가 구축해볼 내용은 self-managed runners로 참고한 여러 블로그들이나 GitLab의 공식 문서 내용을 보았을때 일반적으로 많이 사용되는 Runner인듯하다.
서버에 GitLab Runner를 설치한 후 GitLab에 등록하면 Runner는 일반적으로 GitLab Runner를 설치한 동일한 머신에서 작업을 처리한다.
Runner를 등록할 때 Executor를 선택해야한다.
Executor는 각 작업이 실행되는 환경을 결정하므로 나는 익숙한 shell을 선택했다.
Runner를 등록하기 전에 GitLab의 어느 사용자가 엑세스할 수 있는지, 특정 그룹이나 프로젝트로 제한할지 결정해야한다.
Runner를 등록할 때 태그를 추가할 수 있는데 CI/CD 작업이 실행되면 할당된 태그를 확인하여 어떤 Runner를 사용했는지 알 수 있다.
job:
tags:
- runnertest
태그를 사용하지 않고 파이프라인을 실행시키고 싶다면 아래 옵션을 활성화 시켜줘야한다.
GitLab Runner를 설치하는 과정에서 생성되는 파일인 config.toml 파일을 편집하여 runner를 구성할 수 있다.
기본적인 개념에 대해 알아봤으니 이제 설치부터 배포까지의 과정을
프로젝트 리포지토리의 CICD-Runners 탭에서 새로운 프로젝트 runner를 생성하기 위한 설치 명령어와 토큰을 확인할 수 있다.
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
sudo chmod +x /usr/local/bin/gitlab-runner
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
GitLab Runner를 위한 신규 사용자 계정을 만드는 과정인데 만일 기존에 이용중인 사용자를 그대로 사용할거면 만들어주지 않아도 된다.
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
Project runners를 등록한다면 반드시 Instance runners를 비활성화 해야한다.
Instance runners는 여러 프로젝트가 공유하기 때문에 특정 프로젝트의 빌드가 리소스를 독점하거나 다른 프로젝트의 빌드를 지연시킬 수 있기 때문이다.
※리소스 충돌 방지※
Project runners를 사용하면 해당 러너의 리소스가 특정 프로젝트에 전용으로 할당되어 다른 프로젝트의 빌드와 충돌하는 것을 방지할 수 있다.
명령어를 통해 해당 프로젝트 runner를 등록하는 과정을 진행할 수 있다.
sudo gitlab-runner register
내가 등록했던 로그가 날라가서 다른 블로그의 이미지를 참고했다.
명령어와 동일한 탭에서 정상적으로 등록됐는지 확인할 수 있다.
이 부분에 대해서 많은 고민을 했다.
젠킨스를 활용했을 땐 SSH를 이용해서 배포하는 방식으로 했어서 그런지 test-server와 product-server 사이에서 당연히 test-server에 runner를 설치해야된다고 생각했기 때문이다.
SSH를 통해 배포 삽질하는 과정이 복잡하고 에러가 너무 많이나는 바람에 이게 맞나? 싶은 기분이 들 때쯤 공식 문서를 다시한번 들여다봤다.
"Runners usually process jobs on the same machine where you installed GitLab Runner."
Runner는 일반적으로 GitLab Runner를 설치한 동일한 머신에서 작업을 처리합니다.
설치한 머신에서 작업을 처리한다고 하면 굳이 test-server에 설치하여 SSH로 배포할 것이 아니라 product-server에 설치하고 그 서버에서 배포하고 실행하면 되는게 아니겠는가?
그래서 나는 서비스할 서버에 runner를 설치하기로 결정했다. (더 좋은 방법이 있겠지만!)
stages: # Pipeline 선언
- build
- deploy
before_script:
- export PATH=$PATH:/root/.nvm/versions/node/v20.10.0/bin # npm 명령어를 사용하기 위한 절대경로 설정
- sudo pm2 delete all || true
Build:
stage: build
cache:
paths:
- node_modules
script:
- sudo -E env "PATH=$PATH" npm install
deploy:
stage: deploy
variables:
PM2_HOME: '/home/gitlab-runner/.pm2'
script:
- echo "Deploying the project to product-server..."
- cp -r * /home/ubuntu/product3
- sudo -E env "PATH=$PATH" pm2 list
- sudo -E env "PATH=$PATH" pm2 start /home/ubuntu/product3/app.js
- sudo -E env "PATH=$PATH" pm2 save
- sudo -E env "PATH=$PATH" pm2 list
pm2, node와 관련된 명령어 찾을 수 없음 오류
권한 없음 오류
-sudo npm start 무한 루프
script:
- sudo -E env "PATH=$PATH" npm start
test-server에서 개발된 소스를 product-server로 배포하기까지의 과정을 담아봤다. 단순히 EC2에 node를 설치한 환경에 배포하는 과정일 뿐인데 삽질을 참 많이 하게됐다. 그러면서 드는 생각은 도커를 활용하여 배포하는 것이 훨씬 수월하고 많이 사용되는 방법이 아닐까 싶었다.
일경험 회사의 서비스 환경은 지금 테스트한 환경과 동일하게 EC2로 운영되고있다. 이미 장애 없이 잘 돌아가고 있는 서비스를 위험하게 만들 수는 없기 때문에 아마 CD가 아닌 CI 과정만 적용해야겠다.
이것만으로도 충분한 개선이라고 판단하고있다. (왜냐면 소스를 복사 붙여넣기로 하고있었음)
CI만 적용하는 과정이기에 더이상 관련된 포스팅은 안 할 수도 있겠다. 하지만 일경험 회고를 통해 프로세스를 개선한 후기도 함께 작성하면 좋겟다! 아듀!!
[참고]
https://docs.gitlab.com/ee/topics/build_your_application.html
https://velog.io/@leesomyoung/CICD%EB%A5%BC-%EC%9C%84%ED%95%9C-gitlab-pipeline-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0#2-gitlab-runner-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EB%93%B1%EB%A1%9D