2017年12月4日 星期一

Jenkins: Build and publish file to remote server via Shell Scripts

Jenkins 可以在執行期用 Shell Script 搭配 ssh 指令把檔案丟到遠端伺服器部屬,我嘗試過使用 Publish Over SSH Plugin 這個模組,不過這真的有點麻煩,於是就使用指令來帶過這一切。

確認遠程伺服器和本地伺服器

需要安裝 sshpass 和 unzip, zip 這三個模組,分別安裝在:

本地端 (或 Jenkins 伺服器環境)
sudo yum install sshpass
sudo yum install zip

遠端
sudo yum install unzip

傳輸部屬方式

有兩種方式可以做 ssh 的遙控,第一種是在本地端先使用 ssh-keys 建立公私鑰,把公鑰傳到遠端伺服器 ~/.ssh/authorized_keys 檔案中,確定遠端伺服器可以被控制,不過這個方法我沒有成功。

因為上述方法不成功,所以我嘗試使用 sshpass ,在 ssh 的同時,把密碼輸入進去。

按照部屬流程的話,安裝必要模組後,在組態設定的 [建置] 區,選擇 [執行 Shell] 然後把建置目錄打包起來:

zip ./publish.zip -r ./*

然後再把遠端伺服器的部屬目錄刪除:
sshpass -p '[密碼]' ssh -o StrictHostKeyChecking=no [使用者名稱]@[主機位置] rm -rf /var/www/html/**

刪除後,就可以把剛才在建置目錄打包的 .zip 檔案丟到遠端伺服器目錄:
sshpass -p "[密碼]" scp -o StrictHostKeyChecking=no ./publish.zip [使用者名稱]@[主機位置]:/var/www/html/publish.zip

然後,再遠端直接解壓縮:
sshpass -p '[密碼]' ssh -o StrictHostKeyChecking=no [使用者名稱]@[主機位置] unzip /var/www/html/publish.zip -d /var/www/html

最後再刪除 publish.zip 這個打包檔案:
sshpass -p '[密碼]' ssh -o StrictHostKeyChecking=no [使用者名稱]@[主機位置] rm -rf /var/www/html/publish.zip


錯誤

如果你碰上 ssh 連線的錯誤,像這樣:
只要再 ssh 指令後面加上 -o StrictHostKeyChecking=no 來略過錯誤的憑證,就可以了。

Git 安全性

請記得在上傳至伺服器後,把 .git 資料夾刪除或鎖定訪問權限,避免造成訪客隨意瀏覽進 .git 目錄,導致資料外洩。

Reference:
https://stackoverflow.com/questions/37735151/jenkins-build-trying-to-execute-shell-command-that-include-ssh-command
https://stackoverflow.com/questions/21259811/how-to-copy-file-from-ssh-remote-host-to-jenkins-server
http://www.cnblogs.com/zz0412/p/jenkins_jj_10.html
https://stackoverflow.com/questions/15174194/jenkins-host-key-verification-failed
http://puremonkey2010.blogspot.tw/2015/02/linux-ssh-host-key-verification-failed.html
https://wiki.jenkins.io/display/JENKINS/Publish+Over+SSH+Plugin
https://stackoverflow.com/questions/27198326/execute-shell-script-from-workspace-on-remote-machine-after-build-successful-je
https://ssorc.tw/5152

沒有留言:

張貼留言

© ERIC RILEY , 自由無須告知轉貼
Background Japanese Sayagata by Olga Libby