Jenkins 配置

1 安裝Jenkins

Jenkins是基于Java開發(fā)的一種持續(xù)集成工具腔丧。所以呢跃闹,要使用Jenkins必須使用先安裝JDK示辈。

JDK安裝:Java Development Kit


Jenkins安裝

注意: 1取胎、Jenkins 安裝成功后,會創(chuàng)建一個Jenkins用戶闽晦,而Jenkins的工作區(qū)間默認(rèn)是在【/用戶/共享/Jenkins/Home/jobs】目錄下劫窒,可以用Finder-->前往本今,進入。
2主巍、Jenkins目錄下的文件夾的讀寫權(quán)限只對Jenkins用戶開放诈泼,所以后面apple證書等必須在Jenkins用戶下安裝,項目的ipa導(dǎo)出也得在Jenkins用戶下操作煤禽。(或者用管理員權(quán)限修改該目錄針對用戶的權(quán)限)
3铐达、Jenkins的使用是每一個用戶都可以使用,所以有可能導(dǎo)致構(gòu)建版本的時候報錯檬果,還是老老實實在Jenkins用戶下操作吧瓮孙。

測試Jenkins安裝成功 會自動打開瀏覽器

如果出現(xiàn)下面情況,則JDK有問題重新安裝


下圖表明安裝成功

打開瀏覽器选脊,輸入http://localhost:8080杭抠,如果能夠正常打開Jenkins,則Jenkins安裝成功恳啥。

設(shè)置Jenkins用戶

2.1 進入 系統(tǒng)偏好設(shè)置->用戶與群組
2.2 點擊左下角的解鎖偏灿,輸入當(dāng)前用戶的密碼
2.3 此時Jenkins用戶還是一個空的無名用戶,可以在用戶列表中選擇Jenkins用戶钝的,右擊并選擇“高級選項”翁垂,輸入全名并確定。

2.4 **點擊“更改密碼”重設(shè)Jenkins用戶的密碼硝桩。為了后期方便沿猜,可勾選“運行用戶管理這臺電腦”,將Jenkins用戶設(shè)為管理員碗脊。 **
2.5 選擇用戶列表下方的登錄選項啼肩,將自動登錄用戶設(shè)為Jenkins。

3.初始化Jenkins
重啟以后,自動以Jenkins登錄了祈坠。找到/Users/Shared/Jenkins/Home/ 這個目錄下害碾,打開initialAdminPassword文件,復(fù)制出密碼赦拘,就可以填到網(wǎng)頁上去重置密碼了蛮原。

Unlock Jenkins
Customize Jenkins
Creast First Admin User

常用插件

Keychains and Provisioning Profiles Management
Post-Build Script Plug-in
SSH Slaves plugin
Subversion Tagging Plugin
GitLab Plugin
Extended Choice Parameter Plug-In

配置項目

Snip20170111_6.png
Snip20170112_8.png

配置代碼

echo "準(zhǔn)備開始打ipa包...................." 

#項目名稱
project_name="HeiPiaoFishingBusiness"

#工程環(huán)境路徑  
workspace_path="/Users/Shared/Jenkins/Home/workspace/IOS-B"

#build的路徑
build_path="$workspace_path/$project_name"

#證書
CODE_SIGN_IDENTITY="iPhone Distribution: Shenzhen Heipiao Technology Co., Ltd. (456PY4GRQJ)"

#描述文件
PROVISIONING_PROFILE_APPSTORE="eea7f8c4-08c8-459d-ae9d-9ca66a5e529b"
PROVISIONING_PROFILE_AD_Hoc="fc6bf319-0114-4c0b-8d1c-e9f90419ffe9"


#蒲公英USER_KEY
USER_KEY="7b19054ef2a2aa2678cddbd33d1b10d5"

#蒲公英API_KEY
API_KEY="cafcda0bf7a09201f1d39cb2965a2c6f"

svn upgrade
#解決沖突文件
svn resolve --accept theirs-full "${build_path}/${project_name}/Dev_info.plist"
# info.plist路徑
project_infoplist_path="$build_path/$project_name/Info.plist"

#取版本號
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")

#取build值
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${project_infoplist_path}")

DATE="$(date +%y-%m-%d-%H-%M-%S)"

#IPA名
appName_appStore="${project_name}_V${bundleShortVersion}_${DATE}_appStore"
appName_productNetTest="${project_name}_V${bundleShortVersion}_${DATE}_productNetTest"
appName_outNetTest="${project_name}_V${bundleShortVersion}_${DATE}_outNetTest"
appName_inNetTest="${project_name}_V${bundleShortVersion}_${DATE}_inNetTest"

#.app生成后的路徑
app_path=$build_path/build/Build/Products/Release-iphoneos/${project_name}.app
app_Dev_path=$build_path/build/Build/Products/Release-iphoneos/${project_name}_Dev.app


#添加解鎖
security unlock-keychain -p "0" "/Users/Shared/Jenkins/Library/Keychains/login.keychain-db"

cd $workspace_path



log=$(svn log |head -n 5) 
#  >不追加輸出 >>追加輸出
echo $log > log.txt

mkdir -p APPS


#IPA生成后的路徑
ipa_appStore_path=$workspace_path/APPS/${appName_appStore}.ipa
ipa_productNetTest_path=$workspace_path/APPS/${appName_productNetTest}.ipa
ipa_outNetTest_path=$workspace_path/APPS/${appName_outNetTest}.ipa
ipa_inNetTest_path=$workspace_path/APPS/${appName_inNetTest}.ipa


echo "第一步,進入項目工程文件: $build_path"
cd $build_path

echo "第二步另绩,執(zhí)行build clean命令"
xcodebuild clean



#參數(shù)構(gòu)建

#內(nèi)網(wǎng)測試
if [ $para = "innet" ]; then 
echo "第三步,執(zhí)行編譯生成.app命令"
xcodebuild -workspace $project_name.xcworkspace -scheme "${project_name}_Dev" -sdk iphoneos GCC_PREPROCESSOR_DEFINITIONS="DEVELOPMENT=1 API_TYPE=0" PROVISIONING_PROFILE="$PROVISIONING_PROFILE_AD_Hoc" CODE_SIGN_IDENTITY="$CODE_SIGN_IDENTITY" IPHONEOS_DEPLOYMENT_TARGET="8.0" -configuration Release -derivedDataPath build

echo "第四步, 導(dǎo)出ipa包"
xcrun -sdk iphoneos PackageApplication -v ${app_Dev_path} -o ${ipa_inNetTest_path}

echo "制作 outNetTest ipa 包完成......................."

#路徑寫入文件
#echo "${ipa_inNetTest_path}" > $workspace_path/path.txt

cd /Users/Shared/Jenkins/Home/workspace
./upload.sh ${ipa_inNetTest_path} ${log}




#外網(wǎng)測試
elif [ $para = "outnet" ]; then 
echo "第三步花嘶,執(zhí)行編譯生成.app命令"
xcodebuild -workspace $project_name.xcworkspace -scheme "${project_name}_Dev" -sdk iphoneos GCC_PREPROCESSOR_DEFINITIONS="DEVELOPMENT=1 API_TYPE=1" PROVISIONING_PROFILE="$PROVISIONING_PROFILE_AD_Hoc" CODE_SIGN_IDENTITY="$CODE_SIGN_IDENTITY" IPHONEOS_DEPLOYMENT_TARGET="8.0" -configuration Release -derivedDataPath build

#echo "第四步, 導(dǎo)出ipa包"
xcrun -sdk iphoneos PackageApplication -v ${app_Dev_path} -o ${ipa_outNetTest_path}
echo "制作 outNetTest ipa 包完成......................."

#上傳外網(wǎng)測試包到蒲公英
echo '++++++++++++++upload+++++++++++++'

#路徑寫入文件
#echo "${ipa_outNetTest_path}" > $workspace_path/path.txt

cd /Users/Shared/Jenkins/Home/workspace
./upload.sh ${ipa_outNetTest_path} ${log}



else

#生成APPSTORE包
echo "第三步笋籽,執(zhí)行編譯生成.app命令"
xcodebuild -workspace $project_name.xcworkspace    -scheme   $project_name   -sdk iphoneos GCC_PREPROCESSOR_DEFINITIONS="DEVELOPMENT=0 API_TYPE=2" PROVISIONING_PROFILE="$PROVISIONING_PROFILE_APPSTORE" CODE_SIGN_IDENTITY="$CODE_SIGN_IDENTITY" IPHONEOS_DEPLOYMENT_TARGET="8.0" -configuration Release -derivedDataPath build
echo "第四步, 導(dǎo)出ipa包"
xcrun -sdk iphoneos PackageApplication -v $app_path -o $ipa_appStore_path
echo "制作appStore ipa包完成......................."


#生產(chǎn)環(huán)境測試
echo "第二步,執(zhí)行build clean命令"
xcodebuild clean
echo "第三步椭员,執(zhí)行編譯生成.app命令"
xcodebuild -workspace $project_name.xcworkspace   -scheme   ${project_name}   -sdk iphoneos GCC_PREPROCESSOR_DEFINITIONS="DEVELOPMENT=0 API_TYPE=2" PROVISIONING_PROFILE="$PROVISIONING_PROFILE_AD_Hoc" CODE_SIGN_IDENTITY="$CODE_SIGN_IDENTITY" IPHONEOS_DEPLOYMENT_TARGET="8.0" -configuration Release -derivedDataPath build
echo "第四步, 導(dǎo)出ipa包"
xcrun -sdk iphoneos PackageApplication -v ${app_path} -o ${ipa_productNetTest_path}
echo "制作 productNetTest ipa 包完成......................."

#路徑寫入文件
#echo "${ipa_productNetTest_path}" > $workspace_path/path.txt

cd /Users/Shared/Jenkins/Home/workspace
./upload.sh ${ipa_productNetTest_path} ${log}


if [ $tag = "true" ]; then 
#tag
echo "打tag V${bundleShortVersion}_${DATE}"
svn cp -m  "打tag V${bundleShortVersion}_${DATE}"  https://192.168.1.201/svn/heipiao/app/ios/B/trunk/${project_name} https://192.168.1.201/svn/heipiao/app/ios/B/tags/V${bundleShortVersion}_${DATE}
fi

fi 

upload.sh代碼

#!/bin/sh
echo '==============='
echo $*

while result=$(curl --retry 10 -F "file=@$1" -F "uKey=7b19054ef2a2aa2678cddbd33d1b10d5" -F "_api_key=cafcda0bf7a09201f1d39cb2965a2c6f" -F "updateDescription=$2" "https://qiniu-storage.pgyer.com/apiv1/app/upload")
echo  ${result}
do
    if [[ $result == '' ]]; then
        echo "upload fail" 
    else
        echo "upload success"
        break
    fi
done

沒有Scheme车海,導(dǎo)致無法打包

命令行調(diào)用code sign時報錯

security unlock-keychain -p "你的用戶密碼" ~/Library/Keychains/login.keychain

Mac下Jenkins+SVN+Xcode構(gòu)建持續(xù)導(dǎo)出環(huán)境
Mac下Jenkins+SVN(Git)+Xcode搭建持續(xù)構(gòu)建環(huán)境
手把手教你利用Jenkins持續(xù)集成iOS項目
基于xcodebuild和xcrun的自動化打包

xcodebuild -sdk xxx -target xxx GCC_PREPROCESSOR_DEFINITIONS="API_TYPE=0"  
API_TYPE=0 ,后面只能為數(shù)字 在下圖配置
Snip20170111_1.png

基本配置

參數(shù)化構(gòu)建
測試腳本
Jenkins地址
xcodebuild路徑
設(shè)置編碼
svn方式構(gòu)建
構(gòu)建出發(fā)機制

安卓配置

QQ20170114-0.png
QQ20170114-1.png
  • 安卓shell腳本
#start
#項目名稱
PROJECT_NAME="Android_B"

#工程環(huán)境路徑
WORKSPACE_PATH="${JENKINS_HOME}/jobs/${PROJECT_NAME}/workspace"

#蒲公英USER_KEY
USER_KEY="7b19054ef2a2aa2678cddbd33d1b10d5"

#蒲公英API_KEY
API_KEY="cafcda0bf7a09201f1d39cb2965a2c6f"

# gradle.properties路徑
VERSION_CODE_PATH="${WORKSPACE_PATH}/gradle.properties"

#取版本號
VERSION_CODE=`cat ${VERSION_CODE_PATH} | sed -n 's/.*VERSION_NAME=\(\S\)/\1/p' | tr -d '\r'`

echo ${VERSION_CODE}

#時間
DATE="$(date +%Y-%m-%d)"


#svn路徑

SVN_TAG_PATH="https://192.168.1.201/svn/heipiao/app/andriod/B/tags"
#trunk_path
TRUNK_PATH="https://192.168.1.201/svn/heipiao/app/andriod/B/trunk"

SVN_USER="maimingliang"
SVN_PWD="maimingliang"

#tagName

TAG_NAME="v${VERSION_CODE}-${DATE}"


echo ${TAG_NAME}

 

 
if [ ${BUILD_TYPE} = 'ProductionRelease' ]&&[ ${IS_CREATE_TAG} = 'true' ]; then


echo "創(chuàng)建tag目錄"

svn mkdir ${SVN_TAG_PATH}/${TAG_NAME} -m "mkdir tags ${TAG_NAME}" --username "$SVN_USER" --password "$SVN_PWD" --non-interactive


echo "打tag"

svn cp $TRUNK_PATH $SVN_TAG_PATH/${TAG_NAME} -m "tag version ${TAG_NAME}-${DATE}"  --username "$SVN_USER" --password "$SVN_PWD" --non-interactive


else

echo '不符合打tag的條件'

fi
 
 


#日志

LOG_STR=$(svn log --limit 1 --username=$SVN_USER --password=$SVN_PWD ${WORKSPACE_PATH})

echo ${LOG_STR}




#判斷是否需要上傳蒲公英

if [ ${BUILD_TYPE} = 'BetaOutdebug' ]; then

curl --retry 10 -F "file=@${WORKSPACE_PATH}/app/build/outputs/apk/hp-b-v${VERSION_CODE}-beta-${DATE}-outdebug.apk" -F "uKey=${USER_KEY}" -F "_api_key=${API_KEY}" https://qiniu-storage.pgyer.com/apiv1/app/upload

else

echo ${BUILD_TYPE}

fi


#判斷是否需要打tag

#end

xcodebuild批量打包之區(qū)分不同的渠道

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隘击,一起剝皮案震驚了整個濱河市侍芝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埋同,老刑警劉巖州叠,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凶赁,居然都是意外死亡咧栗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門虱肄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來致板,“玉大人,你說我怎么就攤上這事咏窿≌寤颍” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵集嵌,是天一觀的道長萝挤。 經(jīng)常有香客問我,道長根欧,這世上最難降的妖魔是什么平斩? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮咽块,結(jié)果婚禮上绘面,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好揭璃,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布晚凿。 她就那樣靜靜地躺著,像睡著了一般瘦馍。 火紅的嫁衣襯著肌膚如雪歼秽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天情组,我揣著相機與錄音燥筷,去河邊找鬼。 笑死院崇,一個胖子當(dāng)著我的面吹牛肆氓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播底瓣,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼谢揪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捐凭?” 一聲冷哼從身側(cè)響起拨扶,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茁肠,沒想到半個月后患民,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡垦梆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年酒奶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奶赔。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡惋嚎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出站刑,到底是詐尸還是另有隱情另伍,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布绞旅,位于F島的核電站摆尝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏因悲。R本人自食惡果不足惜堕汞,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晃琳。 院中可真熱鬧讯检,春花似錦琐鲁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至投放,卻和暖如春奈泪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灸芳。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工涝桅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烙样。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓冯遂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親误阻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容