You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OIDC认证整合GitLab CI脚本实现镜像推送至ECR

整合GitLab CI的Docker构建与AWS ECR推送(基于OIDC认证)

整合思路

  1. 镜像适配:选用同时支持aws-cli和Docker命令的GitLab官方aws-base镜像,搭配docker:dind服务实现Docker镜像构建。
  2. OIDC认证集成:在构建流程前置步骤中完成AWS临时凭证获取,避免硬编码持久密钥。
  3. ECR登录替换:用aws ecr get-login-password命令完成ECR仓库的登录认证,替代原DockerHub登录逻辑。
  4. 镜像目标调整:将镜像标签和推送地址替换为AWS ECR的仓库地址。

完整整合后的.gitlab-ci.yml脚本

image: 
  name: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  entrypoint: ['/usr/bin/env']

stages:
  - build
  - deploy

services:
  - docker:dind

variables:
  # 替换为你的实际AWS账号ID、区域和ECR仓库名,也可在GitLab项目变量中配置
  AWS_ACCOUNT_ID: "123456789012"
  AWS_REGION: "us-east-1"
  ECR_REPOSITORY_NAME: "your-ecr-repo-name"
  # 自动组合ECR仓库完整地址
  ECR_REGISTRY: "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"
  ECR_IMAGE_URI: "${ECR_REGISTRY}/${ECR_REPOSITORY_NAME}"

before_script:
  # 通过OIDC获取AWS临时凭证
  - |
    STS=($(aws sts assume-role-with-web-identity
      --role-arn arn:aws:iam::${AWS_ACCOUNT_ID}:role/gitlab-aws-access-role
      --role-session-name "GitLabRunner-${CI_PROJECT_ID}-${CI_PIPELINE_ID}"
      --web-identity-token $CI_JOB_JWT_V2
      --duration-seconds 3600
      --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]'
      --output text))
  - export AWS_ACCESS_KEY_ID="${STS[0]}"
  - export AWS_SECRET_ACCESS_KEY="${STS[1]}"
  - export AWS_SESSION_TOKEN="${STS[2]}"
  # 登录AWS ECR仓库
  - aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ECR_REGISTRY}

Build:
  stage: build
  script:
    # 拉取ECR上的最新镜像作为构建缓存(不存在则跳过)
    - docker pull ${ECR_IMAGE_URI}:latest || true
    # 构建镜像并打上提交SHA、分支两个标签
    - |
      docker build
      --pull
      --cache-from ${ECR_IMAGE_URI}:latest
      --label "org.opencontainers.image.title=$CI_PROJECT_TITLE"
      --label "org.opencontainers.image.url=$CI_PROJECT_URL"
      --label "org.opencontainers.image.created=$CI_JOB_STARTED_AT"
      --label "org.opencontainers.image.revision=$CI_COMMIT_SHA"
      --label "org.opencontainers.image.version=$CI_COMMIT_REF_NAME"
      --tag ${ECR_IMAGE_URI}:${CI_COMMIT_SHA}
      --tag ${ECR_IMAGE_URI}:${CI_COMMIT_REF_NAME}
      .
    # 推送提交SHA标签的镜像到ECR
    - docker push ${ECR_IMAGE_URI}:${CI_COMMIT_SHA}
    # 推送分支标签的镜像到ECR(方便按分支检索)
    - docker push ${ECR_IMAGE_URI}:${CI_COMMIT_REF_NAME}

Deploy:
  variables:
    GIT_STRATEGY: none
  stage: deploy
  only:
    - master  # 根据实际主分支名调整,比如main
  script:
    # 拉取构建好的镜像
    - docker pull ${ECR_IMAGE_URI}:${CI_COMMIT_SHA}
    # 打上latest标签
    - docker tag ${ECR_IMAGE_URI}:${CI_COMMIT_SHA} ${ECR_IMAGE_URI}:latest
    # 推送latest标签到ECR
    - docker push ${ECR_IMAGE_URI}:latest

关键配置注意事项

  • 变量配置:AWS_ACCOUNT_ID、AWS_REGION、ECR_REPOSITORY_NAME建议在GitLab项目的「CI/CD变量」中设置,避免明文暴露。
  • IAM角色权限:确保GitLab OIDC角色(gitlab-aws-access-role)拥有ECR操作权限,包括ecr:GetAuthorizationToken、ecr:PutImage、ecr:UploadLayerPart等核心权限。
  • 镜像兼容性:aws-base镜像已预装aws-cli,配合docker:dind服务可直接执行Docker构建命令,无需额外安装依赖。

内容的提问来源于stack exchange,提问作者zilcuanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 18:20:00