Дженкинс: толчок к ECR от раба
Я создаю докер-контейнер с плагином spotify maven и пытаюсь потом нажать ecr.
Это происходит с помощью плагина Cloudbees Build and Publish после входа в систему с помощью плагина Amazon ECR.
Это работает как заклинание на мастере Дженкинса. Но на раб я получаю
no basic auth credentials
Build step 'Docker Build and Publish' marked build as failure
Выталкивается от рабов из области применения ECR-плагина или я что-то упустил?
3 ответа
Возможно, вы не согласны с ошибкой, о которой сообщалось в плагине ECR, здесь: https://issues.jenkins-ci.org/browse/JENKINS-44143
Разные люди в этой теме описывают немного разные симптомы, но общая тема заключается в том, что докер не смог использовать детали аутентификации, которые были правильно сгенерированы плагином ECR.
Я обнаружил, что в моем случае это было связано с тем, что плагин ECR сохранялся в одной конфигурации докера, а плагин docker-commons (который обрабатывает фактическую работу 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 вручную с разумным значением по умолчанию, а затем установить переменную окружения, чтобы указать на него.
Я сделал это в моем Dockerfile, который создает мой экземпляр 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.
У вас нет полномочий в подчиненном, это проблема, которую вы имеете. Я исправляю эту проблему, вводя эти учетные данные в каждый конвейер, который работает в ведомых подчиненных.
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}"
Конечно, вам нужно установить AWS-Cli в ведомом