GitLab CI 연동

GitLab CI 연동

이 문서는 GitLab을 OAuth ID 프로바이더로 사용해 GitLab CI에서 Argo CD 인증 토큰을 얻는 방법을 안내합니다. OAuth 2.0 토큰 교환(Token Exchange)을 사용하며, Dex 같은 일부 ID 프로바이더는 이를 기본 지원합니다.

출처: 문서

본문

GitLab CI

GitLab은 OAuth ID 프로바이더로, GitLab CI에서 저장소와 실행 위치를 식별하는 토큰을 생성하는 데 사용할 수 있습니다.

참고: https://docs.gitlab.com/ci/secrets/id_token_authentication

OAuth 2.0 토큰 교환(Token Exchange)을 사용해야 합니다. Dex 같은 일부 ID 프로바이더는 이를 기본 지원합니다.

Dex 사용

argocd-cm을 편집하고 dex.config 섹션을 구성하세요:

dex.config: |
  connectors:
    - type: oidc
      id: github-ci
      name: GitLab CI
      config:
        issuer: https://gitlab.com
        # If using GitLab self-hosted, then use your GitLab issuer
        scopes: [openid]
        userNameKey: sub
        insecureSkipEmailVerified: true

ArgoCD는 GitLab CI에서 토큰을 가져오는 데 사용할 수 있는 argo-cd-cli라는 정적 클라이언트를 자동으로 생성합니다.

다음은 Dex에서 유효한 Argo CD 인증 토큰을 가져와 CLI로 작업을 수행하는 GitLab CI 예시입니다:

deploy:
  id_tokens:
    GITLAB_OIDC_TOKEN:
      aud: https://argocd.example.com # Your ArgoCD URL

  script:
    - apt-get update && apt-get install -y jq curl
    - curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
    - install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
    - rm argocd-linux-amd64
    - |       
      # Exchange GitLab token for Dex token
      DEX_URL="https://argocd.example.com/api/dex/token"
      DEX_TOKEN_RESPONSE=$(curl -sSf \
        "$DEX_URL" \
        --user argo-cd-cli: \
        --data-urlencode "connector_id=gitlab-ci" \
        --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
        --data-urlencode "scope=openid email profile federated:id" \
        --data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:access_token" \
        --data-urlencode "subject_token=$GITLAB_OIDC_TOKEN" \
        --data-urlencode "subject_token_type=urn:ietf:params:oauth:token-type:id_token")

      DEX_TOKEN=$(echo "$DEX_TOKEN_RESPONSE" | jq -r .access_token)

      # Use with ArgoCD CLI
      export ARGOCD_SERVER="argocd.example.com" 
      export ARGOCD_OPTS="--grpc-web"
      export ARGOCD_AUTH_TOKEN="$DEX_TOKEN"
      argocd version
      argocd account get-user-info
      argocd app list

RBAC 구성

ArgoCD 전역 RBAC 구성 맵을 사용할 때 policy.csv를 다음과 같이 정의할 수 있습니다:

configs:
  rbac:
    policy.csv: |
      # Specific project(infra) for specific apps
      p, project_path:my-repo/my-project:*, applications, get, infra/*, allow
      # Only main branch can sync under production project
      p, project_path:my-repo/my-project:ref_type:branch:ref:main, applications, sync, production/*, allow

자세한 내용: RBAC 구성

더 알아보기 (Learn more)