Не удалось отправить изображение в GCR из конвейера Jenkins.

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

  1. Я установил все необходимые плагины Jenkins: плагин учетных данных Google OAuth, плагин Docker Pipeline, плагин аутентификации реестра контейнеров Google.

  2. Создал сервисный аккаунт + ключ с ролями Storage Admin и Object Viewer. Скачал json файл.

  3. Создал учетные данные в Jenkins, используя имя проекта Google в качестве идентификатора и ключа json.

  4. Мой код конвейера для сборки выглядит так:

    stage('Build Image') {
        app = docker.build("<gcp-project-id>/<myproject>")
    }
    
  5. Мой код конвейера для сборки выглядит так:

    stage('Push Image') {
    docker.withRegistry('https://us.gcr.io', 'gcr:<gcp-project-id>') {
        app.push("${commit_id}")
        app.push("latest")
    }
    

    }

Однако сборка завершается ошибкой на последнем шаге:

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

Я потратил несколько часов, пытаясь понять это. Любая помощь будет принята с благодарностью!


person jraj    schedule 04.05.2018    source источник


Ответы (2)


У меня такая же проблема. Я обнаружил, что Дженкинс, похоже, не использует эти учетные данные: при использовании он говорит: «Эти учетные данные нигде не записывались как используемые». . При использовании с gcloud util учетная запись службы и ключ работают нормально, поэтому проблема где-то в Jenkins.

person Fleuri    schedule 04.05.2018
comment
Спасибо. Не могли бы вы поделиться фрагментом кода, чтобы показать шаги сборки и push? Я запускаю Jenkins как контейнер Docker на машине GCP. - person jraj; 04.05.2018
comment
Я управляю Дженкинсом вне GCP. Мой конвейер для важных частей выглядит следующим образом: pastebin.com/mPkPTSbL - person Fleuri; 04.05.2018
comment
Спасибо. Мне пришлось добавить шаг входа в докер, чтобы это сработало. Плагин google auth вообще не работает. - person jraj; 04.05.2018
comment
Подтвержденный. Я тоже получил его работу с дополнительным шагом входа в докер. Не повезло с плагином. - person Fleuri; 08.05.2018
comment
Можно ли было бы добавить детали шага входа в докер в качестве ответа на случай, если у других возникнут проблемы с этим? - person neilH; 29.05.2018

Создайте учетную запись службы в GCP с разрешением на отправку изображения, а затем скопируйте учетные данные json fie и сохраните их как учетные данные внутри Jenkins; вызовите идентификатор учетных данных внутри вашего конвейера, как показано ниже, и он должен отправить изображения в gcr

            withCredentials([file(credentialsId: 'gcr', variable: 'GC_KEY')]){
              sh "cat '$GC_KEY' | docker login -u _json_key --password-stdin https://eu.gcr.io"
              sh "gcloud auth activate-service-account --key-file='$GC_KEY'"
              sh "gcloud auth configure-docker"
              GLOUD_AUTH = sh (
                    script: 'gcloud auth print-access-token',
                    returnStdout: true
                ).trim()
              echo "Pushing image To GCR"
              sh "docker push eu.gcr.io/${google_projectname}/${image_name}:${image-tag}"
          }

Кроме того, я определил некоторые переменные, использованные выше

person Avinash Singh    schedule 13.11.2019