1. 程式人生 > >[心得]基於jenkins+git+Artifactory的CICD方案

[心得]基於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保障。