基于Jenkins + Git的PHP項(xiàng)目編譯腳本
本文針對的是了解或已經(jīng)在使用Jenkins和Git的開發(fā)者或團(tuán)隊(duì)。
本團(tuán)隊(duì)使用了Jenkins作為持續(xù)集成平臺,Git作為版本管理工具,而本人負(fù)責(zé)的項(xiàng)目是PHP項(xiàng)目,所謂發(fā)布項(xiàng)目就是復(fù)制文件。
通常有兩種發(fā)布方式:全量發(fā)布和增量發(fā)布。
這兩種發(fā)布方式并沒有本質(zhì)的區(qū)別,主要區(qū)別在于不同的應(yīng)用場景。
全量發(fā)布:代碼改動比較大,基本上覆蓋了項(xiàng)目的大部分代碼,這個(gè)時(shí)候可以選擇把整個(gè)項(xiàng)目打包,當(dāng)然可能會排除掉少量文件或目錄(通常需要排除配置文件)。另外需要注意的是如果有運(yùn)行期目錄比如用于存放臨時(shí)文件則需要保持其空框架,但如果項(xiàng)目有上傳文件等的目錄,則不太合適全量發(fā)布,因?yàn)槟菢右馕吨枰岩焉蟼魑募浞莶⒒謴?fù),如果文件數(shù)量比較大,則是一項(xiàng)很耗時(shí)的工作。
全量發(fā)布意味著發(fā)布時(shí)通常會把之前的代碼刪除或重命名。
增量發(fā)布:代碼改動不大,則可以直接指定改動的文件或文件夾。
增量發(fā)布意味著發(fā)布時(shí)不需要?jiǎng)h除原來的代碼,而是直接COPY覆蓋。
結(jié)合Jenkins和Git,具體實(shí)現(xiàn)思路如下:
在源碼根目錄維護(hù)三個(gè)文本文件:VERSION,V_INCLUDE, V_EXCLUSE
其中VERSION存放每次要發(fā)布的版本號;
V_INCLUDE用于存放增量發(fā)布時(shí)要發(fā)布的文件(夾)列表,一個(gè)一行;
V_EXCLUDE用于存放全量發(fā)布時(shí)要排除的文件(夾)列表,一個(gè)一行。
(后面兩個(gè)文件以V開頭是為了出現(xiàn)在VERSION文件的附近,不容易被遺忘)。
在Jenkins中創(chuàng)建兩個(gè)任務(wù):全量發(fā)布任務(wù)、增量發(fā)布任務(wù)。
全量發(fā)布任務(wù)的腳本中,先從Git獲取代碼,然后從VERSION讀取版本號,從V_EXCLUSE讀取要排除的文件列表。
增量發(fā)布任務(wù)的腳本中,先從Git獲取代碼,然后從VERSION讀取版本號,從V_INCLUSE讀取要包含的文件列表。
下面給出全量發(fā)布的腳本:
# 定義變量
root_path=$PWD
code_name="HiCloudShop"
# 清理歷史數(shù)據(jù)
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
# 創(chuàng)建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
# 把源碼轉(zhuǎn)移到release目錄
mv $code_name.tgz ${root_path}/release_$version/
tar行用到了awk和xargs:
先用cat取出V_EXCLUDE文件的內(nèi)容(需要排除的文件列表);然后用awk在每個(gè)文件名前面綴上源碼文件夾的名稱(因?yàn)槲覀冃枰谠创a文件夾的上一層執(zhí)行tar);然后使用xargs把這個(gè)列表傳給tar作為參數(shù)。
其中awk使用了-v參數(shù)把shell中code_name的值傳到awk。
PS: 之前tar中是使用-X參數(shù)來提供需要排除的文件列表,但是這個(gè)參數(shù)的解釋跟我們的需求不一致:-X匹配目錄內(nèi)所有的文件或文件夾,而我們需要的是相對跟目錄的路徑。詳細(xì)點(diǎn)說,如果給出的是index.php,-X會把目錄內(nèi)所有的index.php文件排除,而我們只是想排除跟目錄的index.php
下面是增量發(fā)布代碼(跟全量發(fā)布代碼類似):
# 定義變量
root_path=$PWD
code_name="HiCloudShop"
# 清理歷史數(shù)據(jù)
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
# 創(chuàng)建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
# 把源碼轉(zhuǎn)移到release目錄
mv $code_name.tgz ${root_path}/release_$version/
浙公網(wǎng)安備 33010602011771號