我在谷歌云中运行一个运行Jenkins服务器的虚拟机(在一个docker容器中)。我正在尝试为我的应用程序构建一个Docker镜像,并使用Jenkins管道将其推送到Google Container Registry。
我安装了所有必需的Jenkins插件: Google OAuth凭据插件, Docker Pipeline插件, Google Container Registry Auth插件
使用Storage Admin和Object Viewer角色创建服务帐户+密钥。下载了json文件。
使用Google项目名称作为ID和json密钥在Jenkins中创建凭证。
我的构建管道代码如下所示:
stage('Build Image') {
app = docker.build("<gcp-project-id>/<myproject>")
}
我的构建管道代码如下所示:
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
我花了几个小时试图解决这个问题。任何帮助将不胜感激!
答案 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}"
}
我还定义了上面使用的一些变量