从 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 角色似乎没问题。

ECR_AWSCLI-get-login-token

您还可以探索 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 用户并在您的本地应用程序上使用凭据。

这是可能的,但调试起来非常微妙,因此请务必按照以下步骤操作。

  1. 在 jenkins 管道中使用 dockerfile 代理(您可以将其命名为 Dockerfile.jenkins 或您喜欢的其他名称)并在其中安装 amazon ecr credential helper 以获得 clean 和稳定建筑环境。
FROM ubuntu:rolling

RUN apt-get update && apt-get install -y amazon-ecr-credential-helper
  1. 在您的 git 存储库中创建一个 config.json 文件,例如 .docker/config.json.
{
    "credHelpers": {
        "[YOUR_ACCOUNT_ID].dkr.ecr.[YOUR_REGION].amazonaws.com": "ecr-login"
    }
}
  1. 在您的 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()
                }
            }
        }
    }
  }
}