在實(shí)際項(xiàng)目中, 一個(gè)構(gòu)建任務(wù)對(duì)應(yīng)一份svn代碼, 但是可以通過Jenkins的參數(shù)化構(gòu)建, 實(shí)現(xiàn)打包時(shí)的環(huán)境切換. 這需要對(duì)我們的工程進(jìn)行改造, 將環(huán)境參數(shù)和Jenkins提供的參數(shù)進(jìn)行關(guān)聯(lián), 實(shí)現(xiàn)此功能.
通過General - 參數(shù)化構(gòu)建過程的配置, 可以看到, 該配置提供了很多數(shù)據(jù)類型, 我們選用了 列表和布爾值做實(shí)例說明.
創(chuàng)建參數(shù)名為HOST_NAME的列表類型的參數(shù)來(lái)設(shè)置三個(gè)測(cè)試環(huán)境的切換.
再創(chuàng)建一個(gè)isDarkModel的布爾值類型的參數(shù)來(lái)控制測(cè)試程序的黑暗模式的開啟與關(guān)閉.
創(chuàng)建好以后參數(shù)以后, 應(yīng)用保存, 可以看到, 以前的立即構(gòu)建變成了 Build with parameters (參數(shù)化構(gòu)建) . 之前配置的 "名稱"/"選項(xiàng)"/"描述" 均可在該頁(yè)面中看到.
指的注意的是, "名稱"是以后要在腳本中獲取來(lái)用的, 所以一般采用英文命名, 這樣一來(lái), 用漢語(yǔ)將描述部分寫清楚就十分有必要了, 這對(duì)使用該項(xiàng)目的打包的人來(lái)說會(huì)更友好.
另外, 列表在配置選項(xiàng)項(xiàng)時(shí), 不同選項(xiàng)用回車換行即可. 比如該示例中, HOST_NAME 三個(gè)選項(xiàng)分別是 測(cè)試環(huán)境1 / 2 / 3 , 在構(gòu)建時(shí)的下拉列表顯示的就是這三個(gè)選項(xiàng), 在以后shell腳本中可以使用$HOST_NAME來(lái)獲取, 如果你選擇了 "測(cè)試環(huán)境2"的選項(xiàng), 那么 $HOST_NAME="測(cè)試環(huán)境2".
那么, 如何把該這些參數(shù)傳入我們的工程呢?
首先對(duì)工程做一下改造, 工程添加一下文件:
- GlobalConfig.h
- JenkinsConfig.h
- ConfigShell.sh
如圖:
首先, ConfigShell.sh 文件是腳本文件, 在該腳本中, 通過 $參數(shù)名稱 的方式獲取Jenkins中配置的打包參數(shù), 通過判斷后將得到相應(yīng)的環(huán)境名寫入JenkinsConfig.h 文件中. 而ConfigShell.sh 文件則負(fù)責(zé)將所有環(huán)境列出來(lái), 通過引用JenkinsConfig.h頭文件, 根據(jù)該文件的配置項(xiàng), 選擇性編譯定義的環(huán)境變量的宏. (比如選擇的是 測(cè)試環(huán)境2, 則在JenkinsConfig.h插入#define HOST_DEBUG_2, 這樣GlobalConfig.h文件中引后, 便會(huì)編譯HOST_DEBUG_2中定義的環(huán)境的宏)
之所以放到工程中, 而沒有完全寫到Jenkins的執(zhí)行腳本的配置項(xiàng)里, 是因?yàn)槲矣X得這樣可以讓執(zhí)行腳本隨著svn一起管理起來(lái), 以后開了分支也比較方便,不需要重復(fù)寫.
//GlobalConfig.h
#import "JenkinsConfig.h"
//環(huán)境變量配置
//#define HOST_DEBUG
//#define HOST_DEBUG_2
//#define HOST_RELEASE
#ifndef HOST_DEBUG
#else
#define HOST @"測(cè)試環(huán)境1"
#endif
#ifndef HOST_DEBUG_2
#else
#define HOST @"測(cè)試環(huán)境2"
#endif
#ifndef HOST_RELEASE
#else
#define HOST @"發(fā)布環(huán)境"
#endif
//暗黑模式配置
//#define DarkModel
#ifndef DarkModel
#define kIsDarkModel NO
#else
#define kIsDarkModel YES
#endif
//ConfigShell.sh
#!/bin/sh
#變量1 HOST_NAME 環(huán)境切換 (list 測(cè)試環(huán)境1 | 測(cè)試環(huán)境2 | 測(cè)試環(huán)境3 )
#變量2 isDarkModel 是否暗黑模式 (BOOL 默認(rèn)值 false: 不是暗黑模式 true: 暗黑模式)
echo "http://環(huán)境配置注釋">JenkinsConfig.h
echo "------ Jenkins_編譯配置項(xiàng)打印日志: ------"
echo "HOST_NAME(環(huán)境切換)"
echo "http://HOST_NAME(環(huán)境切換)">>JenkinsConfig.h
echo "value=測(cè)試環(huán)境1:說明..."
echo "http://value=測(cè)試環(huán)境1:說明...">>JenkinsConfig.h
echo "value=測(cè)試環(huán)境2:說明..."
echo "http://value=測(cè)試環(huán)境2:說明...">>JenkinsConfig.h
echo "value=測(cè)試環(huán)境3:說明..."
echo "http://value=測(cè)試環(huán)境3:說明...">>JenkinsConfig.h
echo "當(dāng)前配置環(huán)境:"$HOST_NAME
echo "\n">>JenkinsConfig.h
if [ $HOST_NAME = "測(cè)試環(huán)境1" ] ; then
hostConfig="#define HOST_DEBUG"
elif [ $HOST_NAME = "測(cè)試環(huán)境2" ] ; then
hostConfig="#define HOST_DEBUG_2"
elif [ $HOST_NAME = "測(cè)試環(huán)境3" ] ; then
hostConfig="#define HOST_RELEASE"
else
echo "HOST_NAME參數(shù)無(wú)效!!!"
fi
echo $hostConfig>>JenkinsConfig.h
echo "\n">>JenkinsConfig.h
echo "isDarkModel(是否啟用暗黑模式)"
echo "http://isDarkModel(是否啟用暗黑模式)">>JenkinsConfig.h
echo "當(dāng)前是否啟用暗黑模式:"$isDarkModel
if [ $isDarkModel = true ] ; then
darkModel="#define DarkModel"
else
darkModel="http://#define DarkModel"
fi
echo $darkModel>>JenkinsConfig.h
echo "------ Jenkins_編譯配置項(xiàng)打印日志_end ------"
注釋
$hostConfig>JenkinsConfig.h #將變量hostConfig的值寫入JenkinsConfig.h文件中,覆蓋該文件之前的全部?jī)?nèi)容
$hostConfig>>JenkinsConfig.h #將變量hostConfig的值寫入JenkinsConfig.h文件中的最后,不會(huì)覆蓋該文件之前的內(nèi)容
如果用戶選擇了 測(cè)試環(huán)境2 和 開啟暗黑模式, 可以看到JenkinsConfig.h文件的如下
//JenkinsConfig.h
//環(huán)境配置注釋
//HOST_NAME(環(huán)境切換)
//value=測(cè)試環(huán)境1:說明...
//value=測(cè)試環(huán)境2:說明...
//value=測(cè)試環(huán)境3:說明...
#define HOST_DEBUG_2
//isDarkModel(是否啟用暗黑模式)
#define DarkModel
可以得知, JenkinsConfig.h文件會(huì)據(jù)此, 編譯 HOST_DEBUG_2 和 DarkModel兩部分內(nèi)容.
至此, 回到Jenkins當(dāng)中去, 在構(gòu)建模塊中, 添加 執(zhí)行shell, 添加如下腳本:
cd $WORKSPACE/JenkinsTest
sh ConfigShell.sh
注意, 該腳本需要添加在 xcode配置之前. 如圖:
至此, 回到構(gòu)建頁(yè)面, 選擇相應(yīng)的參數(shù), 執(zhí)行構(gòu)建, 即可.