[心得]基於jenkins+git+Artifactory的CICD方案
CICD全稱是持續整合持續交付,比較適合小步快跑快速迭代的網際網路風格,因而在網際網路圈廣泛流行。
本文所敘述的方案在某二線網際網路公司已經得到部門級應用。這篇博文不談具體的jenkins+git+artifactory怎麼安裝配置,具體配置當你需要實幹時谷歌查詢就行。
CICD的方案有什麼好處呢?以下是其中一部分:
1. 統一編譯機制compile
2. 統一打包機制package
3. 統一包管理倉庫repository
4. 統一包部署方案deployment
4. 便於迴歸regression
5. 便於擴容extension
6. 便於配置configuration
軟體工程的一個核心是控制複雜度,儘可能避免引入人為風險因素。既能避免重複造輪子,又能提高業務上線的支援速度,從而保障高質量快速的產品迭代!
所有的程式碼,包括測試程式碼和開發程式碼,均維護在git或者svn下,目前git是主流,svn的程式碼在逐步往git遷移。
利用jenkins的SCM外掛,可以偵測到程式碼庫的變更,從而自動觸發編譯模組。
編譯部分,考慮到不同程式碼庫的編譯需求差異,我們使用了Docker技術,從而c++/java等編譯需求都能滿足:
export success=1
docker run -idtP --name $JOB_NAME$BUILD_NUMBER -v $(readlink -m $scm_path1 ):$scm_mount1 $DOCKER_IMG /usr/sbin/sshd -D &&
ssh_port=$(docker port $JOB_NAME$BUILD_NUMBER |grep 22/ |awk -F : '{ print $2 }') && sleep 3 &&
ssh -p $ssh_port -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no localhost \
"pwd && cat ~/.bashrc && source ~/.bashrc && cd $scm_mount1 && $MAKE_CMD" && export success=0
這其中,大寫的變數是jenkins job傳遞進來的,小寫的變數則在前面需要定義好。$MAKE_CMD也是在jenkins job裡面事先填好的。
編譯好之後需要打包,具體打包哪些檔案,這個需要用一個配置檔案mypackage.json來定義:
{
"default_parameters":
{
"dest_base_path": "/data/app/mypackage/"
},
"package_conf":
{
"package_name": "mypackage",
"scm": "git",
"include_paths": ["common"]
},
"install_conf": {
"link": [
{
"src": "common",
"dest": "$(dest_base_path)/common"
}
]
},
"start": "cd $(dest_base_path) && ./op.sh start",
"stop": "cd $(dest_base_path) && ./op.sh stop"
}
這個格式對於各種包通用。上述包中將common資料夾打包到軟體包裡。
package_create.py -c mypackage.json -b master -r -s "test"
這條語句的意思是,用該json配置檔案對master進行打包,打包之後保留原始目錄,包新增字尾test字串。
打包之後下一步是把包upload到倉庫:
package_upload.py -g mygroup -target /data/mypackage_test.tgz -m artifactory
這一條是把包上傳到artifactory倉庫
至此,編譯、打包、傳倉庫搞定。
下一步是部署和配置。
先說部署:
部署細分為下包和安裝:
package_download.py -g mygroup -p mypackage_test -v 1.0.1 -b master -d . -r artifactory
這一部署是從倉庫把包下載到當前目錄。
然後是安裝:
package_install.py -p mypackage_test -v 1.0.1 -b master --same
這條語句是把包安裝到原來同一個位置。
這裡採用了一個類似加鎖一樣的操作:touch一個LOCK檔案,然後執行相應的操作,解壓包,連結檔案路徑,顯示安裝資訊。
最後是配置:
打包的conf裡面支援一個欄位:additional_ops,可以把替換配置檔案這些額外動作放到這個引數裡面,比如測試環境和線上環境是兩套,那麼替換操作在這一步做一下區分。
切換包的任務,我們是放到一個ansible的playbook裡面去操作,那個另外專門寫一個博文闡述。這裡簡單點一下:
po.py start
裡面封裝了切換服務的操作。
下一篇博文講講怎麼用jenkins做QA保障。