用 Jenkins 從 GCP 外部 Push Docker Image 到 GCR

因為上一篇提到的問題,加上測試 GCP 時間緊迫 (測試帳號的 300USD 額度,每分鐘都是錢啊),所以先選擇了 workaround 解決方案。

題目:從第三方 Jenkins server push docker image 到 GCR (Google Container Registry)

從現存在第三方的 Jenkins server,透過 packer 打包完 Docker image 後,push 到 GCP 上的 GCR。

方法一:Jenkins Plugin – Google Container Registry Auth Plugin

基本上,Google Container Registry Auth Plugin 這個 plugin 就是用 Google OAuth Plugin 搭配 Service Account 讓外部的 Jenkins 存取你的 GCR。

當然,中招對我們來說跟家常便飯一樣,所以這個方案對我們無效,因為這個 Plugin 是需要透過 build step 去設定我們要 Docker 做的事情,但由於我們要透過 packer 來上傳,而 packer 又是自己透過 run_command 來呼叫 docker,所以我們無法明確知道 packer 目前使用的 docker 是否已經拿到 Google OAuth 的權限,可進行 push 的動作。

方法二:使用 Google Cloud SDK 中的 gcloud

由於 Jenkins Plugin 還要花時間、加上 packer 的限制,所以暫時先不考慮方法一。
接下來我們也可以參考在本機開發的時候,使用 gcloud 指令來針對 GCR 進行操作。

相關文件在這邊,Pushing to Container Registry

最後也不使用這個的考量點,是因為還要在 Jenkins server 上面安裝 Google Cloud SDK,依照目前只想要 POC 的狀態,有點太麻煩,所以不考慮這個方法。

方法三:docker login

docker login 這個方法個人覺得頗暴力的,但也是求快下暫時的解決方案。
只要先準備好 Service Account 的 access token,就可以照著文件中的指令直接操作:

docker login -e jenkins@OHYAIAMFLYINTHECLOUD-testing.iam.gserviceaccount.com -u _json_key -p "$(cat key.json)" https://us.gcr.io

這樣子,就可以插在每個 Jenkins job 要啟動 packer build 之前,都用 docker login 讓 docker 有權限可以進行 docker push 到自己專案的 GCR 囉!

關於 Service Account 權限

這中間還有碰到一個問題,是這個 Service Account 的權限要開到多大才夠呢?

目前測試起來,是需要給到 StorageStorage Admin 才不會出現 Permission denied。
估計是因為第一次 push 會需要 create GCR 對應 cloud storage 專案路徑 containers/repositories/library 中的目錄才會有的問題。

後記

個人覺得這個方法滿粗糙,也挺暴力的,潛在滿多小地方可能會讓自己的 access token 或是 login session 被有心人惡搞。
目前覺得說不定在方法一中使用 Jenkins plugin 是否也能做到 docker login 的效果,還要找時間測試看看才知道了!

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s