2017.09.28更新:
關(guān)于xcode9 升級(jí)后悔据,關(guān)于打包報(bào)錯(cuò)的修復(fù):
Error Domain=IDEProvisioningErrorDomain Code=9 ""Dandanjia.app" requires a provisioning profile with the Push Notifications feature." UserInfo={NSLocalizedDescription="Dandanjia.app" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}
** EXPORT FAILED **
具體解決在 第四步,新建構(gòu)建項(xiàng)目? 5.構(gòu)建 中
2017.08.24更新:
有朋友說(shuō)post build script plugin 鏈接失效了,貼個(gè)網(wǎng)盤吧
鏈接: https://pan.baidu.com/s/1gfkshSB 密碼: pdua
本人處女文章就奉獻(xiàn)在這了勃教,我的第一次啊私痹。脐嫂。。紊遵。雹锣。。
做人嘛就得懶癞蚕,只有你想懶的時(shí)候才能想出懶人解決問(wèn)題的方法蕊爵。最近真是被打包搞煩了,因?yàn)楸救颂貏e懶桦山,連切個(gè)分支打個(gè)包這么簡(jiǎn)單的活都不想干攒射,所以找到了Jenkins這個(gè)神器醋旦。真是懶人必備神器,媽媽再也不用擔(dān)心我同時(shí)為多人打包了会放。廢話不多說(shuō)饲齐,開(kāi)始教程。
網(wǎng)上也是先找了一些教程咧最,但多多少少還是遇到了一些坑捂人。所以想把自己整個(gè)流程寫(xiě)在這里吧。
第一步矢沿,安裝Jenkins
兩種方法们衙,1.下載安裝包,2.命令行
推薦命令行赔桌,因?yàn)榘惭b包直接運(yùn)行有可能什么反應(yīng)都沒(méi)有,命令行起碼還有一些輸出信息方便找問(wèn)題。
方法1:
我的版本是2.60.2
運(yùn)行Jenkins:
open /Applications/Jenkins/Jenkins.war
ps:我本著省事原則一開(kāi)始用的方法一男旗,但是后來(lái)發(fā)現(xiàn)缺少java峭状,就先安裝了brew蛛砰,然后又安裝了java
安裝Java環(huán)境:
brew cask install java
或者:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
方法2:
安裝 home-brew(安裝指導(dǎo))
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安裝 Jenkins
$ brew install jenkins
運(yùn)行 Jenkins
$ jenkins
ps:這里可能提示你先安裝java芍殖,安裝完了java,接著安裝jenkins
安裝總結(jié):這里因?yàn)槲沂潜镜赜衅渌?wù)環(huán)境所以占用了8080端口外厂,所以運(yùn)行jenkins的時(shí)候提示我端口占用冕象,解決方法在這里:
java -jar 路徑 --httpPort=端口號(hào)
我這里用的是方法一安裝的路徑,沒(méi)用命令行安裝的Jenkins汁蝶,命令行只是確保安裝了Jenkins需要的必要環(huán)境渐扮。
所以我的命令如下:
java -jar /Applications/Jenkins/Jenkins.war --httpPort=8787
具體帖子參考:
http://blog.csdn.net/bosbear/article/details/43307899
第二步,運(yùn)行并使用Jenkins
1.瀏覽器輸入:http://localhost:8787/(我的是8787穿仪,沒(méi)占用應(yīng)該是8080)
初始化的圖忘截取了席爽。意荤。啊片。反正大概的意思就是輸入一個(gè)從命令行獲取的密碼,隨時(shí)去看一下命令行就對(duì)了玖像,然后把這個(gè)一長(zhǎng)串的密碼記在小本本上紫谷,以后可能會(huì)用。然后就是自定義插件還是系統(tǒng)默認(rèn)插件捐寥,當(dāng)然選擇默認(rèn)插件笤昨,插件后續(xù)還能改。然后就進(jìn)入了下圖:
ps:恭喜恭喜握恳,離成功只剩下一大步了瞒窒。
第三步,安裝插件和配置
系統(tǒng)管理->插件管理
我們要用到的插件
1.Xcode integration(xcode打包用)
2.Git plugin(git管理乡洼,svn類似)
3.Post-Build Script Plug-in(用來(lái)構(gòu)建ipa后執(zhí)行腳本傳到fir或其它平臺(tái)的)
4.github plugin(這個(gè)github的我應(yīng)該沒(méi)用到)
多說(shuō)一句崇裁,在某個(gè)版本之后Post-Build Script Plug-in這個(gè)插件被下架了匕坯,我是廢了好大勁找到了
貼個(gè)地址:(地址無(wú)效可以私信我)
http://www.filewatcher.com/m/postbuildscript.hpi.659688-0.html
這個(gè)安裝方式比較特殊:系統(tǒng)管理-》插件管理 里面的高級(jí)選項(xiàng)卡 下的上傳插件拔稳,選擇hpi即可葛峻。
第四步,新建構(gòu)建項(xiàng)目
前戲剛剛結(jié)束巴比,這才是真正的開(kāi)始术奖,慢慢享受。
構(gòu)建分6個(gè)塊:
1.General
這部分主要就是對(duì)一些基本信息填寫(xiě)轻绞,項(xiàng)目名稱采记,描述基本選擇,我這里選項(xiàng)都沒(méi)選铲球,直接上圖挺庞,
2.源碼管理
這部分主要是從哪獲取代碼,SVN或者GIT稼病,這里我是GIT
輸入GIT倉(cāng)庫(kù)地址选侨,
然后選擇一個(gè)認(rèn)證(credentials),
然后選擇分支
這里劃重點(diǎn):(看文字和下圖3)
這里重點(diǎn)說(shuō)一下credentials,這個(gè)不是隨便建個(gè)用戶名就行的然走,是要和當(dāng)初配置GIT一樣援制,正常應(yīng)該是SSH的,
下面圖里選擇SSH Username with privatekey
Username應(yīng)該不是隨便添的芍瑞,反正我是GIT的賬號(hào)名字
PrivateKey就是在ssh目錄下獲取的晨仑,目錄是~/.ssh/id_rsa,把中間一段復(fù)制進(jìn)來(lái)
Passphprase就是當(dāng)時(shí)生成PrivateKey時(shí)的密碼,如果不填拆檬,稍后拉分支代碼時(shí)會(huì)在命令行提示Enter passphrase for key洪己。
PS:到這里保存完了,構(gòu)建項(xiàng)目正常應(yīng)該可以拉到代碼了竟贯。(保存返回上個(gè)頁(yè)面點(diǎn)擊立即構(gòu)建)
但這里肯能會(huì)有個(gè)小問(wèn)題答捕,就是10分鐘超時(shí),如果項(xiàng)目過(guò)大屑那,10分鐘拉不下來(lái)就超時(shí)失敗了拱镐,看下錯(cuò)誤信息如果timeout,那么可以這么改持际,在圖2沃琅,源碼管理選項(xiàng)卡中,點(diǎn)擊“add”蜘欲,點(diǎn)擊 "Advanced clone behaviours"益眉,然后設(shè)置Timeout (in minutes) for clone and fetch operation單位分鐘。
3.構(gòu)建觸發(fā)器
說(shuō)明:這個(gè)可以根據(jù)需求來(lái)設(shè)置或不設(shè)置
這里在網(wǎng)上粘了一段關(guān)于pull scm時(shí)間設(shè)置的:
This field followsthesyntaxofcron (withminor differences). Specifically,eachlineconsistsof5fields separatedbyTABorwhitespace:
MINUTE HOUR DOM MONTH DOW
MINUTE Minuteswithinthehour (0-59)
HOUR The houroftheday (0-23)
DOM The dayofthemonth (1-31)
MONTH The month (1-12)
DOW The dayoftheweek (0-7) where0and7are Sunday.
To specify multiple valuesforonefield,thefollowing operators are available. Intheorderofprecedence,
*'*'can be usedtospecify all valid values.
*'M-N'can be usedtospecifyarange, suchas"1-5"*'M-N/X'or'*/X'can be usedtospecify skipsofX''svaluethroughtherange, suchas"*/15"intheMINUTE fieldfor"0,15,30,45"and"1-6/2"for"1,3,5"*'A,B,...,Z'can be usedtospecify multiple values, suchas"0,30"or"1,3,5"Emptylinesandlinesthat startwith'#'will be ignoredascomments.
In addition, @yearly, @annually, @monthly, @weekly, @daily, @midnight, @hourly are supported.
舉兩個(gè)例子:
// every minute** ** *
// every 5 mins past the hour5* ** *
4.構(gòu)建環(huán)境
我沒(méi)做什么配置姥份。郭脂。空繁。
5.構(gòu)建
如果是xcode9 請(qǐng)看一 否則 請(qǐng)看二
一 :xcode9版本
構(gòu)建點(diǎn)增加構(gòu)建步驟,選excute shell
然后增加一段打包腳本:
#!/bin/bash -l
SHCEME=xxxxxxx
CONFIGURATION=Debug
WORKSPACE_PATH=${WORKSPACE}/xxxx.xcworkspace
#PROFILE_NAME="xxxx adhoc"
#CODE_SIGN="iPhone Distribution: xxx xxx (xxxxxxxx)"
EXPORT_OPTIONS=${WORKSPACE}/ExportOptions.plist
ArchivePath=${WORKSPACE}/build/xxxxx.xcarchive
PacktName=${WORKSPACE}/build/xxxxx.ipa
#CODE_SIGN_IDENTITY="$CODE_SIGN" PROVISIONING_PROFILE_SPECIFIER="$PROFILE_NAME"
#xcodebuild clean -project xxxxx.xcodeproj -scheme $SHCEME -configuration $CONFIGURATION -alltargets
xcodebuild archive -workspace ${WORKSPACE_PATH} -scheme ${SHCEME} -configuration ${CONFIGURATION} -sdk iphoneos -archivePath ${ArchivePath}
xcodebuild -exportArchive -archivePath ${ArchivePath} -exportPath ${PacktName} -exportOptionsPlist ${EXPORT_OPTIONS}
重點(diǎn)在于ExportOptions.plist是要自己放在指定目錄里的朱庆,否則就會(huì)報(bào)錯(cuò)盛泡。
這個(gè)文件可以自己archive 然后export一個(gè),也可以照著下面圖做一個(gè)
二:xcode8.3.3及以下
Target與Xcode項(xiàng)目中Target名字對(duì)應(yīng)
Clean before build 設(shè)置為YES
Configuration Release的時(shí)候Archive
.ipa filename pattern 隨便起個(gè)名字不帶后綴
Outout directory 為ipa的輸出路徑娱颊,我這里是${WORKSPACE}/build/
這里說(shuō)下${WORKSPACE}這個(gè)環(huán)境變量:
我這里代表的是:/Users/用戶名/.jenkins/workspace
上圖的Team ID在下圖這里找到
PS:如果使用了cocoapods,需要配置Advanced Xcode build options
Workspace File(不用加.xcworkspace)
xcode workspace file的路徑:
我這里的絕對(duì)路徑是:/Users/用戶名/.jenkins/workspace/build_ipa/test.workspace
build_ipa是上面填寫(xiě)的項(xiàng)目名稱,所以我這里填寫(xiě)test就可以了
以上保存傲诵,然后構(gòu)建正常應(yīng)該可以生成ipa了。現(xiàn)在還差最后一步箱硕,傳fir或者做別的事情拴竹。
6.構(gòu)建后操作
上傳fir:
1)fir插件
這個(gè)我用了,但是一直報(bào)錯(cuò):Can not found mapping or dysm file剧罩,誰(shuí)成功了栓拜,說(shuō)下咋弄的,謝啦惠昔。
但也說(shuō)下我的步驟吧幕与,安裝插件:http://blog.fir.im/jenkins/
安裝完了,構(gòu)建后操作會(huì)有upload to fir:
2)執(zhí)行腳本上傳
執(zhí)行腳本之前需要安裝fir上傳用的命令:
sudo gem install -n /usr/local/bin fir-cli --no-ri --no-rdoc
上面的命令來(lái)自 fir.im 的工具 fir-cli镇防,這是他們的官方使用說(shuō)明官方工具 fir-cli 使用說(shuō)明
還記得上面裝的Post-Build Script Plug-in插件么啦鸣,這次派上用場(chǎng)了,
點(diǎn)擊add generic script来氧,然后content里輸入
#!/bin/sh
fir p ipa路徑 -T fir的token -Q
我這里的ipa路徑是./Build/xxx.ipa
到這里應(yīng)該就可以完美的構(gòu)建并上傳到fir上了诫给。
參考文章:
http://www.reibang.com/p/13e34671788f
2017.09.01更新:
用了一段時(shí)間發(fā)現(xiàn),雖然根據(jù)教程弄完方便多了啦扬,但是因?yàn)閼新镏锌瘢傁胫詣?dòng)化,所以發(fā)現(xiàn)了參數(shù)化構(gòu)建扑毡,讓我們變得更懶吧胃榕!下面說(shuō)說(shuō)參數(shù)構(gòu)建:
1.配置工程:
General下選中 參數(shù)化構(gòu)建過(guò)程,然后點(diǎn)擊下面添加參數(shù)僚楞,里面有很多選項(xiàng)勤晚,我這里選的是String Parameter,更多的等我研究一下枉层,目標(biāo)是沒(méi)有copy 和 paste泉褐。但有參數(shù)構(gòu)建已經(jīng)很方便了目前。
這里說(shuō)個(gè)題外話鸟蜡,如果有朋友關(guān)心如何通過(guò)Develop和Release來(lái)控制測(cè)試服務(wù)器和線上服務(wù)器的話膜赃,請(qǐng)先參考一篇文章www.reibang.com/p/51a2bbe877aa
其實(shí)就是通過(guò)類似ifdef(DEBUG)或者ifdef(RELEASE)來(lái)控制的,而Develop和Release和就是環(huán)境參數(shù),不懂的在來(lái)問(wèn)我吧揉忘。
2.使用添加的變量:
就是在要用到的地方寫(xiě) ${branch}
branch是變量名跳座,定義了什么就用什么
3.用參數(shù)構(gòu)建: