외부 배포 도구의 배포 추적하기

외부 배포 도구의 배포 추적하기

GitLab은 자체 내장 배포 솔루션을 제공하지만, 프로젝트에 따라 Heroku나 ArgoCD 같은 외부 배포 도구를 선호할 수도 있어요. GitLab은 이런 외부 도구에서 배포 이벤트를 받아서 직접 추적할 수 있게 해 줍니다. 설정만 해 두면 머지 리퀘스트가 어느 환경에 배포됐는지, DORA 지표 같은 것까지 손쉽게 확인할 수 있죠. 이 글에서 배포 추적 설정 방법을 예제와 함께 보여드릴게요.

출처: 문서

본문

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

GitLab은 내장 배포 솔루션을 제공하지만, Heroku나 ArgoCD 같은 외부 배포 도구를 선호할 수도 있어요. GitLab은 이런 외부 도구에서 배포 이벤트를 받아 직접 추적할 수 있게 해 줍니다. 추적을 설정하면 다음과 같은 기능을 사용할 수 있어요.

GitLab이 해당 외부 배포를 승인하고 활용할 수 없기 때문에 사용할 수 없는 기능도 있어요. 보호된 환경(Protected Environments), 배포 승인(Deployment Approvals), 배포 안전(Deployment safety), 배포 롤백(Deployment rollback)이 그것이죠.

배포 추적 설정 방법

외부 배포 도구는 보통 배포 상태가 변경될 때 추가 API 요청을 실행하는 웹훅을 제공해요. 도구를 구성해서 GitLab Deployment API에 요청을 보내게 하면 됩니다. 이벤트와 API 요청 흐름을 정리하면 다음과 같아요.

GitLab API 인증에는 프로젝트 액세스 토큰을 만들 수 있어요.

예제: ArgoCD의 배포 추적

ArgoCD 웹훅을 사용해 배포 이벤트를 GitLab Deployment API로 보낼 수 있어요. ArgoCD가 새 revision을 성공적으로 배포하면 GitLab에 success 배포 레코드를 만드는 예제 설정을 보여드릴게요.

새 웹훅을 만드세요. 다음 매니페스트 파일을 저장한 뒤 kubectl apply -n argocd -f <manifest-file-path>로 적용하면 됩니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  trigger.on-deployed: |
    - description: Application is synced and healthy. Triggered once per commit.
      oncePer: app.status.sync.revision
      send:
      - gitlab-deployment-status
      when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'
  template.gitlab-deployment-status: |
    webhook:
      gitlab:
        method: POST
        path: /projects/<your-project-id>/deployments
        body: |
          {
            "status": "success",
            "environment": "production",
            "sha": "{{.app.status.operationState.operation.sync.revision}}",
            "ref": "main",
            "tag": "false"
          }
  service.webhook.gitlab: |
    url: https://gitlab.com/api/v4
    headers:
    - name: PRIVATE-TOKEN
      value: <your-access-token>
    - name: Content-type
      value: application/json

애플리케이션에 새 구독(subscription)을 만드세요.

kubectl patch app <your-app-name> -n argocd -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-deployed.gitlab":""}}}' --type merge

배포가 예상대로 생성되지 않았다면 argocd-notifications 도구로 문제를 해결할 수 있어요. 예를 들어 argocd-notifications template notify gitlab-deployment-status <your-app-name> --recipient gitlab:argocd-notifications 명령은 API 요청을 즉시 발생시키고, GitLab API 서버의 오류 메시지가 있으면 그대로 보여줍니다.

더 알아보기 (Learn more)

GitLab 내장 배포 기능으로 전환하거나 비교해 보고 싶다면 환경과 배포 문서를, 배포 관련 API를 직접 만들고 싶다면 Deployments API 문서를 이어서 확인해 보세요.