【问题标题】:Push to ECR from Jenkins pipeline从 Jenkins 管道推送到 ECR
【发布时间】:2020-03-23 21:10:52
【问题描述】:

我有 Jenkins 服务器。我有创建 Docker 映像的 Jenkins 文件,现在我想将该映像推送到 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,角色将如何工作?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 嗯...当你看到一个插件准备被采用时,你并不是很热衷于使用它?
    • github.com/jenkinsci/amazon-ecr-plugin 不再被采用。它现在被维护。我还看到了最近的版本
    【解决方案2】:

    我是否必须创建一个特殊的 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 Token producer 来转换 Amazon (主要)所有与 Docker 相关的 Jenkins API 的凭据 插件。感谢这位制作人,您可以选择您现有的 为各种 Docker 操作注册了 Amazon 凭证 Jenkins,使用 CloudBees Docker Build and Publish 插件的示例:

    【讨论】:

    • 我有 jenkins 前提。我创建了一个具有 ECR 写访问权限的策略。现在创建角色时我应该选择哪个服务(因为它在创建角色时要求服务)?那么在哪里编辑信任关系呢?
    • 只有具有特定权限的本地服务器用户才有意义。但是在这个插件中使用角色我不认为它会起作用,你可以看看这个docs.aws.amazon.com/codedeploy/latest/userguide/…
    • 您说在 VPS 中使用密钥和访问密钥是最佳实践,但您建议的插件 Amazon+ECR-plugin 需要密钥和访问密钥
    • "你不应该在 AWS VPC 中使用访问密钥和秘密密钥" ,如果 jenkins 在 VPC 中运行,你也可以使用角色,我认为它应该可以工作,不确定插件的后端实现.
    【解决方案3】:

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

    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. 在您的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
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2018-10-19
      • 1970-01-01
      相关资源
      最近更新 更多