Byte Ebi's Logo

Byte Ebi 🍤

每天一小口,蝦米變鯨魚

Jenkins 04 在流程中使用 SSH 指令操作 GCP 上另一台執行個體

讓 Jenkins 透過 SSH 連線操作遠端主機,代替手動連線部署

Ray

在沒有自動化部屬的情境下,每次都需要手動連線到伺服器主機內部
透過下指令或是執行將部署指令的執行檔,不僅麻煩且有人為失誤的風險
透過 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 裡面的中繼資料
之後就會直接登入了

gcloud ssh

在 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

最新文章

Category

Tag