amazon-web-services - 从 Jenkins CI/CD 推送到存在于不同 AWS 账户中的 ECR
问题描述
我有 Jenkins Slave 节点作为 EC2 实例,我在其中运行我的 CI/CD 并将图像推送到 AWS ECR。
stage('Push Image to ECR'){
steps{
withAWS(region: 'us-east-1', roleAccount: shared_services_account, role:
'Role-Name') {
sh 'eval \$(aws ecr get-login --no-include-email --region us-east-1)'
sh 'docker tag test-image 5722XXXXXX.dkr.ecr.us-east-
1.amazonaws.com/Dev/DC/DCservice:latest'
sh 'sudo docker push 572205XXXX.dkr.ecr.us-east-
1.amazonaws.com/Dev/DC/DCservice:latest'
}
现在我的 EC2 Jenkins 从节点和 ECR 在同一个帐户中。
但是对于生产,如果想使用相同的 Jenkins EC2 从节点并将其推送到生产 AWS 账户的 ECR。
我相信下面的代码不起作用,因为它会推送到同一 AWS 账户的 ECR?
sh 'eval \$(aws ecr get-login --no-include-email --region us-east-1'
请建议我如何使用相同的 EC2 从节点推送到产品 AWS 账户的 ECR。
解决方案
要回答您的直接问题,您需要registry_id
在get-login
命令中指定(相关文档)
sh 'eval \$(aws ecr get-login --registry-ids 012345678910 --no-include-email --region us-east-1'
但是,还有其他一些值得检查的事情。
假设您可以通过 Internet 推送到 ECR,您需要以下内容:
附加到您的 Jenkins EC2 实例的 IAM 实例配置文件,其角色策略允许您将 ECR 推送到“其他”账户中,请参阅此以获取策略结构示例
您的 Jenkins EC2 实例需要一个允许 HTTPS 出站访问 Internet 的安全组规则
您在“其他”账户中的 ECR 策略需要允许来自 Jenkins 实例配置文件的写入,请参阅此处以获取 ECR 策略示例
(这样的事情应该有效)
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowPushPull",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:instance-profile/jenkins_ec2"
]
},
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload"
]
}
]
}
如果您不想通过 Internet 推送,可以使用最近发布的 ECR 端点,请参阅此了解更多信息
推荐阅读
- android - 管理员如何在聊天中将玩家静音?
- node.js - 中间件似乎被服务器忽略了
- php - 为什么中间件中设置的加密cookie也返回字符串长度?
- python - 如何连续训练keras模型
- r - R 中基于 p 值(前向)的模型选择
- javascript - 如何在节点 js 中为 json 文件创建一个 for 循环
- javascript - chrome 扩展中的音频;有时有效,有时会导致空白 DOMException
- angular - 将 Json 数据检索到 ITest
- javascript - React Material-UI Modal TypeError:无法读取未定义的属性“hasOwnProperty”
- python - 如何在不丢失逗号的情况下将列表写入 JSON 文件