问题描述
在使用 GitLab 和 GitLab Runner 时遇到了问题。他们在同一台主机上运行 GitLab 和 GitLab Runner,并且主机上的 EC2 实例附加了一个 IAM 角色,该 IAM 角色允许执行一些跨多个 AWS 账户的 ECR 操作。Runners 使用 docker 作为执行器,并且能够完美地扮演角色以推送和拉取镜像。然而,如果需要拉取/推送到运行 GitLab 的帐户中,就会出现问题。他们首先需要在 GitLab 主机上拉取镜像,以便在 Runners 中访问这些镜像。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1 – 使用 AWS ECR 凭证助手
一种解决方法是使用 Amazon 的 ECR 凭证助手来处理 GitLab Runner 与 AWS ECR 的认证。以下是在 GitLab CI/CD 中使用的脚本示例:
在你的 gitlab-ci.yml
文件中,添加以下内容:
image: docker:19.03
services:
- docker:19.03.0-dind
before_script:
- $(aws ecr get-login --no-include-email --region <your_region>)
# ... 接下来的任务和步骤
确保在 GitLab 项目的 Settings/CI-CD 部分中设置了 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
变量。此外,确保你指定的地区 (<your_region>
) 与你登录的地区相同,以便能够访问正确的 ECR 镜像。
方案2 – 使用自定义脚本
如果你想更精细地控制 GitLab Runner 与 AWS ECR 的交互,你可以使用自定义脚本来管理这个过程。以下是一个启动私有 GitLab Runner 并配置其访问 AWS ECR 的脚本示例:
#!/bin/bash
set -e
# 更新系统并安装必要的工具
apt update -y && apt install awscli make -y
# 下载并安装 GitLab Runner
curl -LJO https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb
dpkg -i gitlab-runner_amd64.deb
# 配置 GitLab Runner
sed -i -e '/volumes/s/\["\/cache\"]/\["\/cache","\/var\/run\/docker.sock:\/var\/run\/docker.sock"]/' /etc/gitlab-runner/config.toml
# 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && usermod -aG docker gitlab-runner
# 注册 GitLab Runner
gitlab-runner register \
--non-interactive \
--url "https://gitlab.com/" \
--registration-token "${GITLAB_RUNNER_TOKEN}" \
--executor "docker" \
--docker-image "docker:latest" \
--description "gitlab-runner" \
--tag-list "gitlab,runner,aws" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"
# 配置 AWS 环境变量
echo -e "export AWS_SDK_LOAD_CONFIG=true \nexport AWS_REGION=${AWS_REGION}" >> ~/.bashrc
source ~/.bashrc
# 配置 Docker 凭证助手
mkdir ~/.docker
cat <<EOF >>~/.docker/config.json
{
"credsStore": "ecr-login"
}
EOF
# 下载并安装 Amazon ECR 凭证助手
git clone https://github.com/awslabs/amazon-ecr-credential-helper.git
cd amazon-ecr-credential-helper/ && make docker
cp bin/local/docker-credential-ecr-login /usr/local/bin
# 重启 Docker 服务和 GitLab Runner
systemctl restart docker && gitlab-runner restart
# 输出 ECR 登录凭证列表
export AWS_REGION=${AWS_REGION} && docker-credential-ecr-login list
在上面的示例中,我们首先更新系统并安装所需的工具,然后下载和安装 GitLab Runner。接着,我们配置了 GitLab Runner 的基本设置,安装了 Docker,并注册了 GitLab Runner。随后,我们配置了 AWS 环境变量,设置了 Docker 凭证助手,安装了 Amazon ECR 凭证助手,并重启了 Docker 和 GitLab Runner。最后,我们输出了 ECR 登录凭证列表。
总结
通过使用 AWS ECR 凭证助手或自定义脚本,你可以解决 GitLab Runner 无法从当前 AWS 账户中拉取 AWS ECR 镜像的问题。这将确保 Runner 能够正确地与 ECR 交互,并顺利地完成你的 CI/CD 流程。