无法将图像从Jenkins Pipeline推送到GCR

时间:2018-05-04 03:32:32

标签: jenkins-pipeline google-container-registry

我在谷歌云中运行一个运行Jenkins服务器的虚拟机(在一个docker容器中)。我正在尝试为我的应用程序构建一个Docker镜像,并使用Jenkins管道将其推送到Google Container Registry。

  1. 我安装了所有必需的Jenkins插件: Google OAuth凭据插件, Docker Pipeline插件, Google Container Registry Auth插件

  2. 使用Storage Admin和Object Viewer角色创建服务帐户+密钥。下载了json文件。

  3. 使用Google项目名称作为ID和json密钥在Jenkins中创建凭证。

  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")
    }
    

    }

  6. 但是,构建在最后一步失败,出现此错误:

    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 个答案:

答案 0 :(得分:2)

我有同样的问题。我发现Jenkins似乎没有使用这些凭据:在使用情况下,它表示“此凭据未被记录为在任何地方使用。” 。当与gcloud util一起使用时,服务帐户和密钥工作正常,所以问题出在Jenkins的某个地方。

答案 1 :(得分:0)

在GCP中创建一个具有推送图像权限的服务帐户,然后复制凭据json文件并将其另存为Jenkins中的凭据;调用管道内部的凭据ID,如下所示,它将图像推送到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}"
          }

我还定义了上面使用的一些变量