Jenkins 04 在流程中使用 SSH 指令操作 GCP 上另一台執行個體
讓 Jenkins 透過 SSH 連線操作遠端主機,代替手動連線部署
在沒有自動化部屬的情境下,每次都需要手動連線到伺服器主機內部
透過下指令或是執行將部署指令的執行檔,不僅麻煩且有人為失誤的風險
透過 Jenkins 的 pipeline 來取代人工執行,部署就變得輕鬆又愜意
安裝套件
沒錯,又双叒叕要安裝套件
劇透注意:先不要安裝,看到下一段再考慮
這次要安裝 pipeline 的支援套件:SSH Pipeline Steps
安裝方法和安裝其他套件一樣,在側邊懶選擇管理 Jenkins
->管理外掛程式
並搜尋 ssh-steps 然後安裝SSH Pipeline StepsVersion
套件
使用 gcloud 登入
然後突然想到之前有裝 gloud,而 gcloud 本身就具有直接透過 SSH 連線到相同專案下其他執行個體的功能!
不用安裝套件囉!可以可賀
如果還沒安裝 gcloud 指令的可以參考先前的文章的教學:Jenkins 03 打包 Docker image 並推送到 GCR
能夠使用 gcloud 進行 ssh 指令的前提是你的「身分與存取權管理(IAM)」要有相對應的權限設定
如果下面步驟中的指令被拒絕就自求多福見招拆招吧,看到一個就加一個
首先在 jenkins 主機上切換使用者成 jenkins
sudo su jenkins
並輸入指令
gcloud compute ssh INTERNAL_INSTANCE_NAME --zone=ZONE --internal-ip
第一次連線的時候會提示你產生及加入 ssh key,這邊最容易發生 IAM 權限不足而被拒絕
基本上寫不進去,就是看錯誤訊息提示要加什麼權限給先前設定的那組金鑰,然後到 IAM 頁面進行調整
若 IAM 設定沒問題,照著提示按一按產生 ssh key 後會自動加入 Compute Engine 裡面的中繼資料
中
之後就會直接登入了
在 pipeline 中使用 gcloud 指令連線
// jenkinsfile
pipeline {
agent any
stages {
stage('Deploy branch: develop to beta') {
when {
branch 'develop'
}
steps {
echo "ssh to store-beta-api instance."
withCredentials([file(credentialsId: 'jenkins-gcr', variable: 'GC_KEY')]) {
sh "gcloud compute ssh store-beta-api --zone=asia-east1-b --internal-ip --command 'cd /data/store-backend && sudo sh ./_scripts/deploy_beta.sh'"
}
echo "Deploy beta done"
}
}
}
}
特別注意的是需要使用--command
來指定在遠端下的指令,並且是要連接在一起的
因為當那行指令執行完就斷開連結了,狀態並不會延續!
範例中示範了透過 gcloud 指令透過內部靜態 ip 位址
進行 SSH 連線
進入同一個 GCP 專案下位在asia-east1-b
地區,名叫store-beta-api
的 VM 執行個體
連線成功後執行了兩個指令,分別是進入/data/store-backend
資料夾內
以及執行資料夾內的./_scripts/deploy_beta.sh
執行檔
在小型服務或是內部測試機環境中,通常都只有啟動一台 VM 執行個體
透過這個簡單的範例,就可以在觸發條件滿足時自動連線到該主機內部進行部署
參考資料:gcloud compute ssh