从 Jenkins 管道推送到 ECR
Push to ECR from Jenkins pipeline
我有本地 Jenkins 服务器。我有创建 Docker 图像的 Jenkins 文件,现在我想将该图像推送到 AWS ECR.Do 我必须创建一个特殊的 IAM 用户并提供其访问密钥和秘密访问密钥?或者最好的方法是什么。
我在网上找到了下面的内容
withAWS(role:'Jenkins', roleAccount:'XXXX216610',duration: 900, roleSessionName: 'jenkinssession')
sh ' eval $(aws ecr get-login --no-include-email --region us-east-2) '
但是由于我的 jenkins 服务器是 onprem,角色将如何工作?
Do i have to create a special IAM user and provide its access and
secret access keys ? Or what will be the best way to do this.
如果您在 AWS 中使用 运行 Jenkins 并且您使用密钥和访问密钥,那么您就违反了最佳实践。您永远不应在 AWS VPC 中使用访问密钥和秘密密钥。这些设计用于从 AWS 账户外部与 AWS 交互。
您应该创建一个具有特定角色的 IAM role,该角色仅允许 Jenkins 将映像推送到 ECR。
就您当前的命令而言,eval $(aws ecr get-login --no-include-email --region us-east-2)
您将始终需要此令牌来 push/pull 将图像发送至 ECR,此令牌有一些过期时间,您应该在下面阅读有关此方法的信息。但是 IAM 角色似乎没问题。
您还可以探索 Amazon+ECR-plugin
关于
Amazon ECR plugin implements a Docker Token producer to convert Amazon
credentials to Jenkins’ API used by (mostly) all Docker-related
plugins. Thank's to this producer, you can select your existing
registered Amazon credentials for various Docker operations in
Jenkins, for sample using CloudBees Docker Build and Publish plugin:
我认为没有一种简单的方法可以从本地服务器承担角色。正如您所提到的,您将需要设置一个 IAM 用户并在您的本地应用程序上使用凭据。
这是可能的,但调试起来非常微妙,因此请务必按照以下步骤操作。
- 在 jenkins 管道中使用
dockerfile
代理(您可以将其命名为 Dockerfile.jenkins
或您喜欢的其他名称)并在其中安装 amazon ecr credential helper 以获得 clean 和稳定建筑环境。
FROM ubuntu:rolling
RUN apt-get update && apt-get install -y amazon-ecr-credential-helper
- 在您的 git 存储库中创建一个
config.json
文件,例如 .docker/config.json
.
{
"credHelpers": {
"[YOUR_ACCOUNT_ID].dkr.ecr.[YOUR_REGION].amazonaws.com": "ecr-login"
}
}
- 在您的
Jenkinsfile
中测试 docker pull
,确保您的访问密钥的用户启用了正确的策略(可能 AmazonEC2ContainerRegistryFullAccess
)。
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkins'
}
}
stages {
stage('TEST ECR') {
steps {
script {
sh "DOCKER_CONFIG=.docker AWS_ACCESS_KEY_ID=[YOUR_ACCESS_KEY_ID] AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_KEY] docker pull [YOUR PRIVATE IMAGE]"
// docker.build("${tag}", "${DOCKER_BUILD_ARGS} -f Dockerfile .")
// sh "docker push ${tag}"
}
}
}
}
}
如果可以拉,那么在正确的环境变量设置下将DOCKER_CONFIG=.docker AWS_ACCESS_KEY_ID=[YOUR_ACCESS_KEY_ID] AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_KEY] docker pull [YOUR PRIVATE IMAGE]
改为docker push [YOUR IMAGE]
就可以了。
您的回购看起来是:
.
├── .docker
│ └── config.json
├── Dockerfile
└── Dockerfile.jenkins
您现在可以使用 https://plugins.jenkins.io/amazon-ecr/ 中的 Jenkins“amazon-ecr”插件代替 eval 进行 ECR 部署。
pipeline {
environment {
registry = '1111111111111.dkr.ecr.eu-central-1.amazonaws.com/myRepo'
registryCredential = 'ID_OF_MY_AWS_JENKINS_CREDENTIAL'
dockerImage = ''
}
agent any
stages {
stage('Building image') {
steps{
script {
dockerImage = docker.build registry + ":$BUILD_NUMBER"
}
}
}
stage('Deploy image') {
steps{
script{
docker.withRegistry("https://" + registry, "ecr:eu-central-1:" + registryCredential) {
dockerImage.push()
}
}
}
}
}
}
我有本地 Jenkins 服务器。我有创建 Docker 图像的 Jenkins 文件,现在我想将该图像推送到 AWS ECR.Do 我必须创建一个特殊的 IAM 用户并提供其访问密钥和秘密访问密钥?或者最好的方法是什么。
我在网上找到了下面的内容
withAWS(role:'Jenkins', roleAccount:'XXXX216610',duration: 900, roleSessionName: 'jenkinssession')
sh ' eval $(aws ecr get-login --no-include-email --region us-east-2) '
但是由于我的 jenkins 服务器是 onprem,角色将如何工作?
Do i have to create a special IAM user and provide its access and secret access keys ? Or what will be the best way to do this.
如果您在 AWS 中使用 运行 Jenkins 并且您使用密钥和访问密钥,那么您就违反了最佳实践。您永远不应在 AWS VPC 中使用访问密钥和秘密密钥。这些设计用于从 AWS 账户外部与 AWS 交互。
您应该创建一个具有特定角色的 IAM role,该角色仅允许 Jenkins 将映像推送到 ECR。
就您当前的命令而言,eval $(aws ecr get-login --no-include-email --region us-east-2)
您将始终需要此令牌来 push/pull 将图像发送至 ECR,此令牌有一些过期时间,您应该在下面阅读有关此方法的信息。但是 IAM 角色似乎没问题。
您还可以探索 Amazon+ECR-plugin
关于
Amazon ECR plugin implements a Docker Token producer to convert Amazon credentials to Jenkins’ API used by (mostly) all Docker-related plugins. Thank's to this producer, you can select your existing registered Amazon credentials for various Docker operations in Jenkins, for sample using CloudBees Docker Build and Publish plugin:
我认为没有一种简单的方法可以从本地服务器承担角色。正如您所提到的,您将需要设置一个 IAM 用户并在您的本地应用程序上使用凭据。
这是可能的,但调试起来非常微妙,因此请务必按照以下步骤操作。
- 在 jenkins 管道中使用
dockerfile
代理(您可以将其命名为Dockerfile.jenkins
或您喜欢的其他名称)并在其中安装 amazon ecr credential helper 以获得 clean 和稳定建筑环境。
FROM ubuntu:rolling
RUN apt-get update && apt-get install -y amazon-ecr-credential-helper
- 在您的 git 存储库中创建一个
config.json
文件,例如.docker/config.json
.
{
"credHelpers": {
"[YOUR_ACCOUNT_ID].dkr.ecr.[YOUR_REGION].amazonaws.com": "ecr-login"
}
}
- 在您的
Jenkinsfile
中测试docker pull
,确保您的访问密钥的用户启用了正确的策略(可能AmazonEC2ContainerRegistryFullAccess
)。
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkins'
}
}
stages {
stage('TEST ECR') {
steps {
script {
sh "DOCKER_CONFIG=.docker AWS_ACCESS_KEY_ID=[YOUR_ACCESS_KEY_ID] AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_KEY] docker pull [YOUR PRIVATE IMAGE]"
// docker.build("${tag}", "${DOCKER_BUILD_ARGS} -f Dockerfile .")
// sh "docker push ${tag}"
}
}
}
}
}
如果可以拉,那么在正确的环境变量设置下将DOCKER_CONFIG=.docker AWS_ACCESS_KEY_ID=[YOUR_ACCESS_KEY_ID] AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_KEY] docker pull [YOUR PRIVATE IMAGE]
改为docker push [YOUR IMAGE]
就可以了。
您的回购看起来是:
.
├── .docker
│ └── config.json
├── Dockerfile
└── Dockerfile.jenkins
您现在可以使用 https://plugins.jenkins.io/amazon-ecr/ 中的 Jenkins“amazon-ecr”插件代替 eval 进行 ECR 部署。
pipeline {
environment {
registry = '1111111111111.dkr.ecr.eu-central-1.amazonaws.com/myRepo'
registryCredential = 'ID_OF_MY_AWS_JENKINS_CREDENTIAL'
dockerImage = ''
}
agent any
stages {
stage('Building image') {
steps{
script {
dockerImage = docker.build registry + ":$BUILD_NUMBER"
}
}
}
stage('Deploy image') {
steps{
script{
docker.withRegistry("https://" + registry, "ecr:eu-central-1:" + registryCredential) {
dockerImage.push()
}
}
}
}
}
}