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 구성