基于OIDC认证整合GitLab CI脚本实现镜像推送至ECR
整合GitLab CI的Docker构建与AWS ECR推送(基于OIDC认证)
整合思路
- 镜像适配:选用同时支持
aws-cli和Docker命令的GitLab官方aws-base镜像,搭配docker:dind服务实现Docker镜像构建。 - OIDC认证集成:在构建流程前置步骤中完成AWS临时凭证获取,避免硬编码持久密钥。
- ECR登录替换:用
aws ecr get-login-password命令完成ECR仓库的登录认证,替代原DockerHub登录逻辑。 - 镜像目标调整:将镜像标签和推送地址替换为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
相关产品推荐
相关产品推荐

