August 3rd, 2015
##前言
想要把Server部署(deployment)自動化,於是又把Jenkins拿出來用.
Service Deployment
PHP Service
要部署PHP Service其實很簡單,主要就是把檔案*.php複製到apache目錄底下就好.
在Jenkins抓完Git之後,新增一個”執行Shell”
echo "Deploy server1..."
mv pserver1/*.php /var/www/html/server1/
Go Service
由於Server上的Golang Service使用screen在背景跑.要部署要分成幾個階段:
- Build Go execution file
- 這裏有兩個approach一個是使用Go Plugin for Jenkins,而我是直接使用command line跟系統參數.確認
go env
可以抓到正確的環境參數:
- 這裏有兩個approach一個是使用Go Plugin for Jenkins,而我是直接使用command line跟系統參數.確認
在Jenkins抓完Git之後,新增一個”執行Shell”
echo "Building Go SERVER"
export GOPATH=/YOUR/GOPATH
cd YOUR_GO_PATH
rm ORI_GO_EXECUTION_FILE
go build -v
- Kill current service and start new service
在Jenkins build好Go之後,新增一個”執行Shell”
echo "Deploy Server"
cd /YOUR/PATH
sudo ./go_server_restart.sh
這裏有shell script 的內容:
#!/bin/sh
cd /YOUR/PATH
COMMAND_GO_SERVER=/YOUR/PATH/go_server
go_server_pid=`pidof ${COMMAND_GO_SERVER}`
if [ $go_server_pid ]; then
date +"%Y/%m/%d %H:%M:%S-Go Server Restart"
kill -9 $go_server_pid
sudo screen -d -m ./go_server
date +"%Y/%m/%d %H:%M:%S-Restart completed"
else
sudo screen -d -m ./go_server
date +"%Y/%m/%d %H:%M:%S-Start completed"
fi
關於Jenkins權限
這裏要注意,如果要跑mv
或是kill -9
需要有root的權限,這樣需要把jenkins的權限調高.細節可以參考How to run a script as root in Jenkins?
- 修改Sudoers
sudo visudo
- 增加
jenkins ALL = NOPASSWD: ALL
如果要更改檔案後commit回去 [2015/10/21 update]
如果希望能更改檔案後,自動的push回去的話. 主要要參考這一個stackoverflow
主要的問題是jenkins的每一個action裡面的git 是沒有紀錄的(因為是工作區) 所以解決方式是跑git checkout master
.不過這樣一來在那邊的git 的id 會亂掉. 比較建議的做法是另外開一個資料夾,然後把檔案複製過去再去commit
- jenkins a repo build file
- copy destination files to b folder (the same a repo)
- git commit/push in b folder
請注意: 這個做法有相對的安全考量,請自行參照
TODO:
Post commit hook
需要Jenkins在commit submit之後,自動跑task. 可以參考Jenkins CI: How to trigger builds on SVN commit
##參考資料