Amazon web services 在Jenkins文件中对ECR进行身份验证,以便我可以提取一个图像来运行内置?

Amazon web services 在Jenkins文件中对ECR进行身份验证,以便我可以提取一个图像来运行内置?,amazon-web-services,docker,jenkins,jenkins-pipeline,aws-ecr,Amazon Web Services,Docker,Jenkins,Jenkins Pipeline,Aws Ecr,这里的情况是,我们有一个应用程序,目前正在Jenkins slave上构建,其中安装了特定版本的node。我们想要标准化构建环境,因此要在docker容器中构建 通过我的研究。然而,我们面临的挑战是,我们希望使用我们自己管理并存储在ECR中的自定义图像。我们不想使用docker hub上的。考虑到这个限制,我正在努力在Jenkins文件中验证到我们的ECR中。理想情况下,我可以这样做: pipeline { agent { docker { ima

这里的情况是,我们有一个应用程序,目前正在Jenkins slave上构建,其中安装了特定版本的node。我们想要标准化构建环境,因此要在docker容器中构建

通过我的研究。然而,我们面临的挑战是,我们希望使用我们自己管理并存储在ECR中的自定义图像。我们不想使用docker hub上的。考虑到这个限制,我正在努力在Jenkins文件中验证到我们的ECR中。理想情况下,我可以这样做:

pipeline {
    agent {
        docker {
            image 'node:7'
            registryUrl 'ecr_url.amazonaws.com'
            registryCredentialsId 'ecr:us-east-1:iam_role'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'command goes here'
            }
        }
    }
}

但这里的问题是,我们的ECR登录依赖于在Jenkins worker(安装了aws cli)上运行shell命令来登录和访问映像。到目前为止,我还没有在Jenkins文件中进行身份验证,因此我可以提取一个图像来运行内置。是否有人知道这是否可行,如果可能,如何编辑Jenkins文件来实现这一点?

从ECR提取图像之前,您需要授权令牌。这意味着您还需要在Jenkins服务器上安装AWS-CLI。最好的方法是分配角色并在管道中的某个地方运行下面的命令来获取授权令牌,如果这对您来说很复杂,您可以使用下面的ECR插件

您的Docker客户端必须作为 AWS用户才能推拉图像。AWS CLI获取登录名 命令为您提供要传递到的身份验证凭据 码头工人。有关更多信息,请参阅注册表身份验证

所以你可以用

AmazonECR插件实现了一个Docker令牌生成器来转换Amazon Jenkins API的凭证(大部分)由所有Docker相关人员使用 插件。感谢这位制作人,您可以选择您现有的 在中为各种Docker操作注册了Amazon凭据 Jenkins,对于使用CloudBees Docker构建和发布插件的示例:

通常我们使用这个命令来获取令牌

$(aws ecr get-login --no-include-email --region us-west-2)
有了in-pipline,你可以试试

pipeline
{
    options
    {
        buildDiscarder(logRotator(numToKeepStr: '3'))
    }

    agent any
    environment 
    {
        PROJECT = 'tap_sample'
        ECRURL = 'http://999999999999.dkr.ecr.eu-central-1.amazonaws.com'
        ECRCRED = 'ecr:eu-central-1:tap_ecr'
    }
    stages
    {
        stage('Docker image pull')
        {
            steps
            {
                script
                {
                    sh("eval \$(aws ecr get-login --no-include-email | sed 's|https://||')")
                    docker.withRegistry(ECRURL, ECRCRED)
                    {
                        docker.image(PROJECT).pull()
                    }
                }
            }
        }
    }
}
你几乎让它工作了。 将其用作声明性管道上的代理的诀窍是创建一个AWS凭据,其中包含空的
Access\u key
Secret
,但在其上设置IAM角色。

管道{
代理人{
docker{

图片“

让我看看我是否理解您的意思;如果公共docker hub中存在一个名为:stackoverflow/Voces engine的图片,并且您在ECR中创建了answorth/Voces engine,您想使用您的投票引擎而不是仅使用来自投票引擎的公共引擎吗?是的。我们有自己的图片(answorth/Voces engine)我们希望按照容器其余部分中的说明将其拉入并构建应用程序。挑战是通过Jenkins文件登录到我们的ECR。@Adii答案对您有帮助吗?嗨,Adii,是的,这很有帮助。我想我的突出问题是如何在声明性Jenkins文件中使用它;我们所有的构建和管道现在都不是直接配置的在Jenkins中,但是在源代码管理中的Jenkins文件中。从您关于amazon ecr插件(为我们安装)的链接中,他们有一个示例,说明了它与另一个pllugin(cloudbees docker管道)的关系。然而,它使用了“ecr:us-east-1:credential id”的示例登录到ECR。如果我们在构建时没有运行shell命令,而只是运行Jenkinsfule,我们将如何获得此令牌?我假设它将根据AWS注册表自动创建令牌,或者您可以在pull
$之前在jenkins文件中运行此命令(AWS ECR get login--不包括电子邮件--区域us-west-2)
在AWS CLI V2中,
get login
命令被弃用,取而代之的是
get login password
。新模式将是
AWS ecr get login password--region region region | docker login--username AWS--password stdin AWS_account_id.dkr.ecr.region.amazonaws.com
,如图所示,这很有趣,但我是无法确定您在何处/如何找到registryCredentialsId使用的字符串“ecr:eu-west-1:aws实例角色”。您能详细说明一下吗?
pipeline {
    agent {
        docker { 
          image '<account-id>.dkr.ecr.eu-west-1.amazonaws.com/image/my-image:v1'
          args '--entrypoint= '
          registryCredentialsId "ecr:eu-west-1:aws-instance-role"
          registryUrl "https://<account-id>.dkr.ecr.eu-west-1.amazonaws.com"
        }
    }
    stages {
        stage('Test') {
            steps {
                sh "I'm on an ECR agent"
            }
        }
    }
}