Сборка Jenkins Pipeline с Docker, Google Registry и Google Auth Plugin

Я создаю образ Docker с помощью конвейера Jenkins (с помощью сценария конвейера, автоматически созданного JHipster). Я хочу отправить свой последний образ докера в реестр контейнеров Google.

Вот что я сделал:

  1. Я установил как плагин пользовательской среды сборки CloudBees Docker, так и плагин аутентификации реестра контейнеров Google.
  2. Я установил учетные данные Google для авторизации в Jenkins, следуя инструкциям на странице здесь
  3. Я настроил свой этап сборки для использования формата тега реестра Google, например: docker.build('us.gcr.io/[my-project-id]/[my-artifact-id]', 'target/docker')
  4. Я сослался на идентификатор своих учетных данных Google Auth на моем шаге отправки:

(Хм. Для правильного форматирования требуется дополнительная текстовая строка после маркеров)

docker.withRegistry('https://us.gcr.io', '[my-credential-id]') {
    dockerImage.push 'latest'
}

Но сборка не выполняется с:

ERROR: Could not find credentials matching [my-credential-id] 
Finished: FAILURE

Я практически считаю, что эти плагины не работают в мире конвейеров, но я подумал, что спрошу, выполнил ли кто-нибудь это, и мог бы дать мне несколько указателей.


person bcholmes    schedule 21.08.2017    source источник


Ответы (5)


Попробуйте поставить перед своим идентификатором учетных данных префикс «gcr:».

Ваш идентификатор учетных данных будет выглядеть как "gcr: [my-credential-id]".

Полный рабочий пример:

stage('Build image') {
  app = docker.build("[id-of-your-project-as-in-google-url]/[name-of-the-artifact]")
}
stage('Push image') {
  docker.withRegistry('https://eu.gcr.io', 'gcr:[credentials-id]') {
    app.push("${env.BUILD_NUMBER}")
    app.push("latest")
  }
}

Обратите внимание на название изображения. Я боролся с проталкиванием изображения даже с рабочими учетными данными, пока я не назвал изображение с нотацией [id-of-your-project-as-in-google-url] / [name-of-the-artifact].

Когда вы получаете сообщение о том, что вам нужно включить Google ....... API, вы, вероятно, ошиблись в своем [id-of-your-project-as-in-google-url].

Теперь изображения можно успешно использовать с URL-адресом eu.gcr.io/[id-of-your-project-as-in-google-urlpting/[name-of-the-artifact ]:47.

LZ

person LZaruba    schedule 27.09.2017
comment
Это определенно помогло. Я больше не получаю сообщение об ошибке "Не удалось найти учетные данные", но я застрял на unauthorized: Not Authorized ошибке. Спасибо за указатель! - person bcholmes; 27.09.2017
comment
И через несколько секунд после того, как я написал этот комментарий, я попытался удалить все из моего .docker/config.json, и это, похоже, помогло. - person bcholmes; 27.09.2017
comment
Через пару часов после написания ответа я нашел рабочее решение. Я обновил ответ, чтобы отразить решение. - person LZaruba; 28.09.2017
comment
На этапе сборки я использую имя из трех частей: us.gcr.io/[project-name provided/[artifact-name]). Но если вам подходит название, состоящее из двух частей, отлично! - person bcholmes; 28.09.2017
comment
Что касается удаления всего из моего .docker/config.json комментария: у меня может возникнуть странное поведение, если я смешаю и сопоставлю использование завершающей косой черты в docker.withRegistry('https://us.gcr.io/', '[my-credential-id]'). Похоже, это приводит к тому, что .docker/config.json содержит несколько ссылок на репо (некоторые с косой чертой в конце, а некоторые без). - person bcholmes; 16.11.2017
comment
К сожалению, это решение с префиксом gcr: не сработало. В документации Jenkins Pipeline указано, что учетные данные для docker.withRegistry должны относиться к учетным данным пароля пользователя. - person u-phoria; 25.03.2018
comment
@ u-phoria: префикс gcr: предполагает, что на вашем сервере Jenkins установлен плагин Google Container Registry Auth. - person bcholmes; 16.05.2018
comment
Мне также нужно было установить плагин Google Container Registry Auth и использовать префикс gcr: для его работы. По-другому у меня НЕ работало. - person FireGnome; 08.11.2018
comment
Еще одно замечание для новичков: приведенный выше Полный рабочий пример должен быть в блоке node {}: jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline - person Lewen; 09.07.2019

Предыдущие ответы, похоже, больше не работали для меня. У меня работает такой синтаксис:

stage('Push Image') {
        steps {
            script {
                docker.withRegistry('https://gcr.io', 'gcr:my-credential-id') {
                    dockerImage.push()
                }
            }
        }
    }
person Stijn Diependaele    schedule 18.02.2020

Другой способ настройки облачного реестра Google может быть таким, как показано ниже, где вы используете плагин withCredentials и используете тип учетных данных файла.

withCredentials([file(credentialsId: 'gcr-private-repo-reader', variable: 'GC_KEY')]){
                sh '''
                    chmod 600 $GC_KEY
                    cat $GC_KEY | docker login -u _json_key --password-stdin https://eu.gcr.io

                    docker ps
                    docker pull eu.gcr.io/<reponame>/<image>
                '''
                }
person Shambu    schedule 30.06.2020

проверьте, есть ли у вас https://plugins.jenkins.io/google-container-registry-auth/ установлен плагин.

После установки плагина используйте gcr:credential-id synthax

person VictorB    schedule 20.03.2020

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

В конечном итоге я обошел проблему, используя этап сценария gcloud вместо этапа конвейера докеров, например:

stage('publish gcloud') {
    sh "gcloud docker -- push us.gcr.io/[my-project-id]/[my-artifact-id]"
}

Команда gcloud может найти учетные данные аутентификации, которые настроены с помощью gcloud init в командной строке сервера Jenkins.

person bcholmes    schedule 25.08.2017
comment
Я видел, как команда gcloud возвращалась с Not Authorized несколько раз. Возможно, время авторизации истекло? - person bcholmes; 29.08.2017
comment
Да, команда gcloud довольно быстро теряет информацию об авторизации. Это не жизнеспособное текущее решение. - person bcholmes; 07.09.2017
comment
Этот вопрос предлагает альтернативный подход. - person bcholmes; 27.09.2017
comment
Теперь это не рекомендуется в новой версии gcloud. - person c9s; 16.05.2018