从詹金斯管道推送到ECR

时间:2019-11-28 08:58:00

标签: amazon-web-services docker jenkins aws-ecr

我有Jenkins服务器。我有Jenkins文件现在可以创建Docker映像,我想将该映像推送到AWS ECR。是否必须创建一个特殊的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角色将如何工作?

4 个答案:

答案 0 :(得分:2)

您现在可以使用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()
                }
            }
        }
    }
  }
}

答案 1 :(得分:1)

  

我必须创建一个特殊的IAM用户并提供其访问权限吗?   秘密访问密钥?或做这件事的最好方法是什么。

如果您在AWS内运行Jenkins,并且使用密钥和访问密钥,则违反了最佳实践。您永远不要在AWS VPC内使用访问密钥和秘密密钥。它们旨在与AWS账户外部的AWS进行交互。

您应该创建一个具有特定角色的IAM role,并且该角色只允许Jenkins将图像推送到ECR。

就您当前的命令eval \$(aws ecr get-login --no-include-email --region us-east-2)而言,您将始终需要此令牌来将图像推/拉到ECR,该令牌已到期,您应该在下面阅读有关此方法的信息。但是使用IAM角色似乎还可以。

ECR_AWSCLI-get-login-token

您还可以探索Amazon+ECR-plugin

关于

  

Amazon ECR插件实现了一个Docker令牌生产者来转换Amazon   所有Docker相关的(大多数)使用的Jenkins API的凭据   插件。谢谢这个制作人,您可以选择您现有的   已注册的Amazon凭证用于各种Docker操作   Jenkins,使用CloudBees Docker Build和Publish插件的示例:

答案 2 :(得分:1)

我认为,没有一种简单的方法可以从本地服务器承担角色。如前所述,您将需要设置IAM用户并在本地应用程序上使用凭据。

答案 3 :(得分:0)

可能,但调试起来很微妙,因此请确保遵循以下步骤。

  1. 在jenkins管道中使用dockerfile代理(您可以将其命名为Dockerfile.jenkins或其他您喜欢的名称)并在其中安装amazon ecr credential helper,以得到干净稳定的 >建筑环境。
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. docker pull中测试Jenkinsfile,确保已使用正确的策略(可能是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