Jenkins:从奴隶推送到 ECR
Jenkins: Push to ECR from slave
我正在用 spotify 的 maven 插件构建一个 docker 容器,然后尝试推送到 ecr。
这发生在使用 cloudbees Build and Publish plugin after managing to login with the Amazon ECR 插件。
这对詹金斯大师来说就像一个魅力。
但是在奴隶上我得到:
no basic auth credentials
Build step 'Docker Build and Publish' marked build as failure
是否从 slaves 推送超出了 ECR 插件的范围,或者我错过了什么?
您没有从站的凭据,这就是您遇到的问题。我解决了这个问题,在按需从站中 运行 的每个管道中注入此凭据。
withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'AWS_EC2_key', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
sh "aws configure set aws_access_key_id ${AWS_ACCESS_KEY_ID}"
sh "aws configure set aws_secret_access_key ${AWS_SECRET_ACCESS_KEY}"
sh '$(aws ecr get-login --no-include-email --region eu-central-1)'
sh "docker push ${your_ec2_repo}/${di_name}:image_name${newVersion}"
当然你需要在slave中安装aws-cli
您可能与此处 ECR 插件中报告的错误发生冲突:https://issues.jenkins-ci.org/browse/JENKINS-44143
该线程中的不同人描述的症状略有不同,但共同的主题是 docker 未能使用由 ECR 插件正确生成的身份验证详细信息。
我发现在我的案例中这是因为 ECR 插件正在保存到一个 docker 配置和 docker-commons 插件(它处理 docker API) 是从另一个人那里读来的。 Docker 更改了导致冲突的早期版本中的配置格式和位置。
插件作者提供了一种解决方法,即首先对两个配置文件进行核对:
node {
//cleanup current user docker credentials
sh 'rm ~/.dockercfg || true'
sh 'rm ~/.docker/config.json || true'
//configure registry
docker.withRegistry('https://ID.ecr.eu-west-1.amazonaws.com', 'ecr:eu-west-1:86c8f5ec-1ce1-4e94-80c2-18e23bbd724a') {
//build image
def customImage = docker.build("my-image:${env.BUILD_ID}")
//push image
customImage.push()
}
您可能想尝试将其纯粹作为调试步骤和快速修复(如果它有效,您可以确信这个错误是您的问题)。
我的永久修复方法是简单地手动创建新样式 dockercfg 并使用合理的默认值,然后将环境变量设置为指向它。
我在我的 Docker 文件中这样做,它创建了我的 Jenkins 实例,如下所示:
RUN mkdir -p $JENKINS_HOME/.docker/ && \
echo '{"auths":{}}' > $JENKINS_HOME/.docker/config.json
ENV DOCKER_CONFIG $JENKINS_HOME/.docker
此处的答案不适用于我的管道。我发现这个解决方案有效,而且很干净:
withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'myCreds', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
sh '''
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${REGISTRY}
..
'''
}
此解决方案不需要 aws cli v2。
我正在用 spotify 的 maven 插件构建一个 docker 容器,然后尝试推送到 ecr。
这发生在使用 cloudbees Build and Publish plugin after managing to login with the Amazon ECR 插件。
这对詹金斯大师来说就像一个魅力。 但是在奴隶上我得到:
no basic auth credentials
Build step 'Docker Build and Publish' marked build as failure
是否从 slaves 推送超出了 ECR 插件的范围,或者我错过了什么?
您没有从站的凭据,这就是您遇到的问题。我解决了这个问题,在按需从站中 运行 的每个管道中注入此凭据。
withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'AWS_EC2_key', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
sh "aws configure set aws_access_key_id ${AWS_ACCESS_KEY_ID}"
sh "aws configure set aws_secret_access_key ${AWS_SECRET_ACCESS_KEY}"
sh '$(aws ecr get-login --no-include-email --region eu-central-1)'
sh "docker push ${your_ec2_repo}/${di_name}:image_name${newVersion}"
当然你需要在slave中安装aws-cli
您可能与此处 ECR 插件中报告的错误发生冲突:https://issues.jenkins-ci.org/browse/JENKINS-44143
该线程中的不同人描述的症状略有不同,但共同的主题是 docker 未能使用由 ECR 插件正确生成的身份验证详细信息。
我发现在我的案例中这是因为 ECR 插件正在保存到一个 docker 配置和 docker-commons 插件(它处理 docker API) 是从另一个人那里读来的。 Docker 更改了导致冲突的早期版本中的配置格式和位置。
插件作者提供了一种解决方法,即首先对两个配置文件进行核对:
node {
//cleanup current user docker credentials
sh 'rm ~/.dockercfg || true'
sh 'rm ~/.docker/config.json || true'
//configure registry
docker.withRegistry('https://ID.ecr.eu-west-1.amazonaws.com', 'ecr:eu-west-1:86c8f5ec-1ce1-4e94-80c2-18e23bbd724a') {
//build image
def customImage = docker.build("my-image:${env.BUILD_ID}")
//push image
customImage.push()
}
您可能想尝试将其纯粹作为调试步骤和快速修复(如果它有效,您可以确信这个错误是您的问题)。
我的永久修复方法是简单地手动创建新样式 dockercfg 并使用合理的默认值,然后将环境变量设置为指向它。
我在我的 Docker 文件中这样做,它创建了我的 Jenkins 实例,如下所示:
RUN mkdir -p $JENKINS_HOME/.docker/ && \
echo '{"auths":{}}' > $JENKINS_HOME/.docker/config.json
ENV DOCKER_CONFIG $JENKINS_HOME/.docker
此处的答案不适用于我的管道。我发现这个解决方案有效,而且很干净:
withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'myCreds', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
sh '''
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${REGISTRY}
..
'''
}
此解决方案不需要 aws cli v2。