懶人做iOS系列之jenkins+git+fir打包(xCode9)

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:

下載地址:http://jenkins-ci.org/

我的版本是2.60.2


1


2
3

運(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)入了下圖:


1

ps:恭喜恭喜握恳,離成功只剩下一大步了瞒窒。


第三步,安裝插件和配置

系統(tǒng)管理->插件管理


1

我們要用到的插件

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)選铲球,直接上圖挺庞,


1


2.源碼管理

這部分主要是從哪獲取代碼,SVN或者GIT稼病,這里我是GIT

輸入GIT倉(cāng)庫(kù)地址选侨,

然后選擇一個(gè)認(rèn)證(credentials),

然后選擇分支

2

這里劃重點(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洪己。


3

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


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è)

1

二: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


5
6

上圖的Team ID在下圖這里找到

7

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就可以了

8

以上保存傲诵,然后構(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:

9

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

10


到這里應(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)建:

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

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)我吧揉忘。

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

2.使用添加的變量:

就是在要用到的地方寫(xiě) ${branch}

branch是變量名跳座,定義了什么就用什么

3.用參數(shù)構(gòu)建:

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


參數(shù)構(gòu)建4
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末端铛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疲眷,更是在濱河造成了極大的恐慌禾蚕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狂丝,死亡現(xiàn)場(chǎng)離奇詭異换淆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)几颜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門倍试,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蛋哭,你說(shuō)我怎么就攤上這事县习。” “怎么了谆趾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵躁愿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我沪蓬,道長(zhǎng)攘已,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任怜跑,我火速辦了婚禮样勃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘性芬。我一直安慰自己峡眶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布植锉。 她就那樣靜靜地躺著辫樱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俊庇。 梳的紋絲不亂的頭發(fā)上狮暑,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音辉饱,去河邊找鬼搬男。 笑死,一個(gè)胖子當(dāng)著我的面吹牛彭沼,可吹牛的內(nèi)容都是我干的缔逛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼褐奴!你這毒婦竟也來(lái)了按脚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤敦冬,失蹤者是張志新(化名)和其女友劉穎辅搬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體脖旱,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伞辛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夯缺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚤氏。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖踊兜,靈堂內(nèi)的尸體忽然破棺而出竿滨,到底是詐尸還是另有隱情,我是刑警寧澤捏境,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布于游,位于F島的核電站,受9級(jí)特大地震影響垫言,放射性物質(zhì)發(fā)生泄漏贰剥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一筷频、第九天 我趴在偏房一處隱蔽的房頂上張望蚌成。 院中可真熱鬧,春花似錦凛捏、人聲如沸担忧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瓶盛。三九已至,卻和暖如春示罗,著一層夾襖步出監(jiān)牢的瞬間惩猫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蚜点, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轧房,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓禽额,卻偏偏與公主長(zhǎng)得像锯厢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脯倒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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