本文針對的是了解或已經在使用Jenkins和Git的開發者或團隊。
本團隊使用了Jenkins作為持續集成平台,Git作為版本管理工具,而本人負責的項目是PHP項目,所謂發布項目就是復制文件。
通常有兩種發布方式:全量發布和增量發布。
這兩種發布方式並沒有本質的區別,主要區別在於不同的應用場景。
全量發布:代碼改動比較大,基本上覆蓋了項目的大部分代碼,這個時候可以選擇把整個項目打包,當然可能會排除掉少量文件或目錄(通常需要排除配置文件)。另外需要注意的是如果有運行期目錄比如用於存放臨時文件則需要保持其空框架,但如果項目有上傳文件等的目錄,則不太合適全量發布,因為那樣意味着需要把已上傳文件備份並恢復,如果文件數量比較大,則是一項很耗時的工作。
全量發布意味着發布時通常會把之前的代碼刪除或重命名。
增量發布:代碼改動不大,則可以直接指定改動的文件或文件夾。
增量發布意味着發布時不需要刪除原來的代碼,而是直接COPY覆蓋。
結合Jenkins和Git,具體實現思路如下:
在源碼根目錄維護三個文本文件:VERSION,V_INCLUDE, V_EXCLUSE
其中VERSION存放每次要發布的版本號;
V_INCLUDE用於存放增量發布時要發布的文件(夾)列表,一個一行;
V_EXCLUDE用於存放全量發布時要排除的文件(夾)列表,一個一行。
(后面兩個文件以V開頭是為了出現在VERSION文件的附近,不容易被遺忘)。
在Jenkins中創建兩個任務:全量發布任務、增量發布任務。
全量發布任務的腳本中,先從Git獲取代碼,然后從VERSION讀取版本號,從V_EXCLUSE讀取要排除的文件列表。
增量發布任務的腳本中,先從Git獲取代碼,然后從VERSION讀取版本號,從V_INCLUSE讀取要包含的文件列表。
下面給出全量發布的腳本:
# 定義變量 root_path=$PWD code_name="HiCloudShop" # 清理歷史數據 rm -rf release* || echo "no dir" #download code if [ -d $code_name ]; then rm -rf $code_name fi # 從Git獲取代碼 git clone ssh://xxx@xxx.com:29418/xxx/$code_name # 獲取版本號 cd $code_name versionname=`cat VERSION` version=$versionname # 創建release目錄 mkdir ${root_path}/release_$version # 生成Git info cp /xxx/sh_script/git_info.sh . chmod +x git_info.sh ./git_info.sh mv git_info.txt git_info_${JOB_NAME}.txt cp git_info_${JOB_NAME}.txt ${root_path}/release_$version/ rm -rf .git # 壓縮源碼 cd $root_path cat ${root_path}/${code_name}/V_EXCLUDE | awk -v code_name=$code_name '/^(.+)$/{print " --exclude="code_name"/"$1}'| xargs tar czvf $code_name.tgz $code_name # 把源碼轉移到release目錄 mv $code_name.tgz ${root_path}/release_$version/
tar行用到了awk和xargs:
先用cat取出V_EXCLUDE文件的內容(需要排除的文件列表);然后用awk在每個文件名前面綴上源碼文件夾的名稱(因為我們需要在源碼文件夾的上一層執行tar);然后使用xargs把這個列表傳給tar作為參數。
其中awk使用了-v參數把shell中code_name的值傳到awk。
PS: 之前tar中是使用-X參數來提供需要排除的文件列表,但是這個參數的解釋跟我們的需求不一致:-X匹配目錄內所有的文件或文件夾,而我們需要的是相對跟目錄的路徑。詳細點說,如果給出的是index.php,-X會把目錄內所有的index.php文件排除,而我們只是想排除跟目錄的index.php
下面是增量發布代碼(跟全量發布代碼類似):
# 定義變量 root_path=$PWD code_name="HiCloudShop" # 清理歷史數據 rm -rf release* || echo "no dir" #download code if [ -d $code_name ]; then rm -rf $code_name fi # 從Git獲取代碼 git clone ssh://xxx@xxx.com:29418/xxx/$code_name # 獲取版本號 cd $code_name versionname=`cat VERSION` version=$versionname # 創建release目錄 mkdir ${root_path}/release_$version # 生成Git info cp /xxx/sh_script/git_info.sh . chmod +x git_info.sh ./git_info.sh mv git_info.txt git_info_${JOB_NAME}.txt cp git_info_${JOB_NAME}.txt ${root_path}/release_$version/ rm -rf .git # 壓縮源碼 cd $root_path cat ${root_path}/${code_name}/V_INCLUDE | awk -v code_name=$code_name '{print code_name"/"$1}' | xargs tar czvf $code_name.tgz # 把源碼轉移到release目錄 mv $code_name.tgz ${root_path}/release_$version/