Как отправить образ докера в реестр контейнеров Google с помощью плагина maven fabric8 из конвейера Jenkins: неавторизовано

Я изо всех сил пытался отправить образ докера в реестр контейнеров Google, используя плагин maven fabric8 на конвейере Jenkins. Я проверил все вопросы по stackoverflow, но ни один из них не решил мою проблему.

Это моя установка:

Кластер Kubernetes, работающий на Google Kubernetes Engine. Я развернул модуль с сервером Jenkins, который запускает агентов с подключаемым модулем Kubernetes CI на основе этого пользовательского образа:

FROM openjdk:8

RUN apt-get update && \
    apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" && \
    apt-get update &&  \
    apt-get -y install docker-ce

RUN curl https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz > /tmp/google-cloud-sdk.tar.gz

RUN mkdir -p /usr/local/gcloud \
  && tar -C /usr/local/gcloud -xvf /tmp/google-cloud-sdk.tar.gz \
  && /usr/local/gcloud/google-cloud-sdk/install.sh

ENV PATH $PATH:/usr/local/gcloud/google-cloud-sdk/bin

У этого агента есть Java 8 и Docker.

Я хочу использовать плагин maven fabric8 для создания образа докера и его отправки в реестр контейнеров Google. Дело в том, что бы я ни делал, я всегда сталкиваюсь с этой ошибкой (неавторизованной):

Unable to push 'eu.gcr.io/myprojectid/gke-springboot-sample' from registry 'eu.gcr.io' : unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication -> [Help 1]

ПРИМЕЧАНИЕ:

  1. Я создал учетную запись службы, связанную с моим проектом GC, и дал ей следующие разрешения: редактор проекта и администратор хранилища.

  2. Я настроил глобальный секрет Jenkins (учетные данные облачного реестра), связанный с файлом key.json, принадлежащим этой учетной записи службы.

В моем конвейере есть все, что я пробовал до сих пор:

1: oauth2accesstoken

stage("Build docker image") {
    agent {
        label 'jenkins-slave'
    }
    steps {
        container('jenkins-slave'){
            script {
                sh "./mvnw clean build fabric8:build"
                withCredentials([file(credentialsId: 'cloud-registry-credentials', variable: 'crc')]) {
                    sh "gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://eu.gcr.io"
                    sh "./mvnw fabric8:push"
                }
            }
        }
    }
}

ВЫХОД:

+ gcloud auth print-access-token
+ docker login -u oauth2accesstoken --password-stdin https://eu.gcr.io

WARNING! Your password will be stored unencrypted in /home/jenkins/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

[Pipeline] sh
Running shell script
+ ./mvnw fabric8:push

[INFO] F8> The push refers to a repository [eu.gcr.io/myprojectid/gke-springboot-sample]
#
[ERROR] F8> Unable to push 'eu.gcr.io/projectid/gke-springboot-sample' from registry 'eu.gcr.io' : unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication  [unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication ]

2: key.json

stage("Build docker image") {
    agent {
        label 'jenkins-slave'
    }
    steps {
        container('jenkins-slave'){
            script {
                sh "./mvnw fabric8:build"
                withCredentials([file(credentialsId: 'cloud-registry-credentials', variable: 'crc')]) {
                    sh "docker login -u _json_key --password-stdin https://eu.gcr.io < ${crc}"
                    sh "gcloud auth activate-service-account --key-file=${crc}"
                    sh "./mvnw fabric8:push"
                }
            }
        }
    }
}

ВЫХОД:

+ docker login -u _json_key --password-stdin https://eu.gcr.io
WARNING! Your password will be stored unencrypted in /home/jenkins/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

[Pipeline] sh
 Running shell script

+ gcloud auth activate-service-account --key-file=****
Activated service account credentials for: [[email protected]]

[Pipeline] sh
 Running shell script
+ ./mvnw fabric8:push

[ERROR] F8> Unable to push 'eu.gcr.io/myprojectid/gke-springboot-sample' from registry 'eu.gcr.io' : unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication  [unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication ]
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
0
0
1 771
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

возможно, вы ищете Jenkins Плагин аутентификации реестра контейнеров Google.

другая возможная причина может заключаться в том, что пользователю jenkins-cr не назначена требуемая роль storage.admin в Cloud IAM ... вот соответствующий документация. только что видел, как вы его назначили; возможно, еще раз проверьте это.

вы также можете получить поддержку там, если это скорее связано с плагином fabric8.

Кроме того, следовательно, это ведро, ACL этого ведра может в конечном итоге помешать.

Привет, Мартин, спасибо за ответ. Я рассмотрел все аспекты, включая те, что вы предложили, и все было в порядке. К счастью, я нашел проблему, как только у меня будет время, я опубликую подробный ответ.

codependent 10.08.2018 15:25
Ответ принят как подходящий

После добавления флага -X к команде maven ./mvnw fabric8:push я обнаружил следующую строку DEBUG: AuthConfig: no credentials found.

Мне пришлось покопаться в исходном коде AuthConfigFactory класс, чтобы выяснить, что проблема в том, что он не нашел ранее сгенерированный файл /home/jenkins/.docker/config.json.

Проблема в том, что дом этого контейнера - / root, поэтому он искал его в /root/.docker/config.json, а его там не было. В качестве обходного пути я добавил sh "cp /home/jenkins/.docker/config.json /root/.docker/config.json", и теперь он работает как шарм:

[DEBUG] F8> AuthConfig: credentials from ~.docker/config.json
[INFO] F8> myprojectid/gke-springboot-sample:0.0.1-SNAPSHOTsnapshot-180813-080943-0179 in 5 seconds 

Другие вопросы по теме