DevOps

[CI/CD] GitLab CI/CD 적용 시 알아두면 좋은 점

네른 2022. 4. 28. 19:51

해당 업무를 진행하면서 조사하고 적용한 내용중 잊어먹지 않으면 좋을만한 것을 정리하고자 함.

GitLab은 자체적으로 제공하는 GitLab Runner를 통해 CI/CD를 자동화하는 기능을 제공하고 있음

이를 설정하면서 겪은 크가지 두 주의점을 기록해두고자 함 1) Gitlab-Gitlab Runner 연동 시 주의할 점 2) DIND 대신 socket을 이용해 runner 동작시키는 법


GitLab은 해당 레포지토리에 commit이 push될 때 CI를 동작하도록 하며

해당 브랜치가 master 브랜치에 머지될 때 마다 CD 작업을 수행하도록 설정할 수 있음.

 

일련의 과정들은 앞서 언급된 GitLab Runner를 통해 수행됨

GitLab Runner는 쉽게 말해 GitLab에서 지시한 일을 수행하고 그 결과를 GitLab에게 돌려주는 워커

 

여기서는 GitLab과 GitLab Runner 모두 docker 위에서 동작함을 전제로 설명하고자 함

자세한 설치과정은 굳이 설명하지 않으며 구성하면서 겪은 내용들을 한번 정리하는 것이 목적

 

GitLab / GitLab Runner를 설치 및 연동할 때 주의할 점

 - 우선 두 컨테이너(GitLab과 GitLab Runner)를 연결할 도커 네트워크가 필요함

 - Runner의 config 파일 중 network_mode 값을 앞서 설정한 도커 네트워크로 설정

 - GitLab의 url을 지정하기 위해서는 gitlab 컨테이너 내부의 /etc/gitlab/gitlab.rb의 external_url 값을 수정하면 됨

 - GitLab의 설정을 변경한 경우 해당 컨테이너 내에서 gitlab-ctl reconfigure를 입력하여 적용하고
   gitlab-rake gitlab:check 명령어를 통해 설정에 문제가 있는지 한번 확인


GitLab Runner는 설치된 docker 환경에서 별도의 컨테이너를 생성해 사용자의 요청을 처리하게 됨.

이 때, 사용자의 요청에 docker 명령어가 포함되어 있다면 (docker를 이용한 deploy 등) 다음과 같은 설정이 필요함

 - 왜? docker 내의 컨테이너에서 외부에다가 docker command를 전달해야하기 때문

 - 방법은 크게 두가지로, 첫 째는 dind(docker in docker)라는 별도의 도커 서비스를 이용하는것

 - 다른 방법은 호스트의 docker socket을 container에게 전달하는 것.

    : 여기서는 이 방식을 사용했으며, 다음과 같음.

    1) GitLab Runner 내의 /etc/gitlab-runner/config.toml 파일에서 privileged 값을 true로 설정.

    2) 해당 파일 내의 volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"] 를 입력

    3) gitlab runner를 실행할 때 volume mount 옵션으로 해당 sock 파일 마운트

 

위 설정을 마치고, 실제 gitlab-ci.yml 파일을 이용해서 push 작업을 수행하려면 다음과 같이 수행하면 됨

push:
  stage: dep
  image: docker:latest
  before_script:
    - apk update > /dev/null
    - apk add ca-certificates > /dev/null
    - cp -r /etc/gitlab-runner/my.crt /usr/local/share/ca-certificates
    - update-ca-certificates --fresh > /dev/null
    - docker login -u "${HARBOR_USER}" -p "${HARBOR_PASSWORD}" "${HARBOR_REGISTRY}"
  script:
    - docker build --tag "${HARBOR_REGISTRY}"/devops-test/test:test_tag .
    - docker push "${HARBOR_REGISTERY}"/devopst-test/test:test_tag

 - 여기서는 self-signed 된 cert를 이용하기에 관련 내용이 있는 것이므로, docker login/build/push 단계를 수행하면 된다는 것만 알면 됨

 - 위와 같이 cert를 사용하는 경우, 앞선 config.toml 파일에 volumes를 다음과 같이 수정 

    : volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache", "/etc/gitlab-runner/my.crt:/etc/gitlab-runner/my.crt"]

    : 물론 cert 파일은 runner container에 들어가 있어야 함

    : 위의 volumes 옵션은 'runner가 생성한 container'에게 전달할 volume을 의미하는 것