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

2017.09.28更新:

關于xcode9 升級后,關于打包報錯的修復:

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 **

具體解決在 第四步,新建構建項目? 5.構建 中

2017.08.24更新:

有朋友說post build script plugin 鏈接失效了,貼個網盤吧

鏈接: https://pan.baidu.com/s/1gfkshSB 密碼: pdua


本人處女文章就奉獻在這了,我的第一次啊。。。。。。

做人嘛就得懶,只有你想懶的時候才能想出懶人解決問題的方法。最近真是被打包搞煩了,因為本人特別懶,連切個分支打個包這么簡單的活都不想干,所以找到了Jenkins這個神器。真是懶人必備神器,媽媽再也不用擔心我同時為多人打包了。廢話不多說,開始教程。

網上也是先找了一些教程,但多多少少還是遇到了一些坑。所以想把自己整個流程寫在這里吧。

第一步,安裝Jenkins

兩種方法,1.下載安裝包,2.命令行

推薦命令行,因為安裝包直接運行有可能什么反應都沒有,命令行起碼還有一些輸出信息方便找問題。

方法1:

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

我的版本是2.60.2


1


2
3

運行Jenkins:

open /Applications/Jenkins/Jenkins.war

ps:我本著省事原則一開始用的方法一,但是后來發現缺少java,就先安裝了brew,然后又安裝了java

安裝Java環境:

brew cask install java

或者:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

方法2:

安裝 home-brew(安裝指導

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安裝 Jenkins

$ brew install jenkins

運行 Jenkins

$ jenkins

ps:這里可能提示你先安裝java,安裝完了java,接著安裝jenkins

安裝總結:這里因為我是本地有其他服務環境所以占用了8080端口,所以運行jenkins的時候提示我端口占用,解決方法在這里:

java -jar 路徑 --httpPort=端口號

我這里用的是方法一安裝的路徑,沒用命令行安裝的Jenkins,命令行只是確保安裝了Jenkins需要的必要環境。

所以我的命令如下:

java -jar /Applications/Jenkins/Jenkins.war --httpPort=8787

具體帖子參考:

http://blog.csdn.net/bosbear/article/details/43307899


第二步,運行并使用Jenkins

1.瀏覽器輸入:http://localhost:8787/(我的是8787,沒占用應該是8080)

初始化的圖忘截取了。。。反正大概的意思就是輸入一個從命令行獲取的密碼,隨時去看一下命令行就對了,然后把這個一長串的密碼記在小本本上,以后可能會用。然后就是自定義插件還是系統默認插件,當然選擇默認插件,插件后續還能改。然后就進入了下圖:


1

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


第三步,安裝插件和配置

系統管理->插件管理


1

我們要用到的插件

1.Xcode integration(xcode打包用)

2.Git plugin(git管理,svn類似)

3.Post-Build Script Plug-in(用來構建ipa后執行腳本傳到fir或其它平臺的)

4.github plugin(這個github的我應該沒用到)

多說一句,在某個版本之后Post-Build Script Plug-in這個插件被下架了,我是廢了好大勁找到了

貼個地址:(地址無效可以私信我)

http://www.filewatcher.com/m/postbuildscript.hpi.659688-0.html

這個安裝方式比較特殊:系統管理-》插件管理 里面的高級選項卡 下的上傳插件,選擇hpi即可。


第四步,新建構建項目

前戲剛剛結束,這才是真正的開始,慢慢享受。

構建分6個塊:

1.General

這部分主要就是對一些基本信息填寫,項目名稱,描述基本選擇,我這里選項都沒選,直接上圖,


1


2.源碼管理

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

輸入GIT倉庫地址,

然后選擇一個認證(credentials),

然后選擇分支

2

這里劃重點:(看文字和下圖3)

這里重點說一下credentials,這個不是隨便建個用戶名就行的,是要和當初配置GIT一樣,正常應該是SSH的,

下面圖里選擇SSH Username with privatekey

Username應該不是隨便添的,反正我是GIT的賬號名字

PrivateKey就是在ssh目錄下獲取的,目錄是~/.ssh/id_rsa,把中間一段復制進來

Passphprase就是當時生成PrivateKey時的密碼,如果不填,稍后拉分支代碼時會在命令行提示Enter passphrase for key。


3

PS:到這里保存完了,構建項目正常應該可以拉到代碼了。(保存返回上個頁面點擊立即構建)

但這里肯能會有個小問題,就是10分鐘超時,如果項目過大,10分鐘拉不下來就超時失敗了,看下錯誤信息如果timeout,那么可以這么改,在圖2,源碼管理選項卡中,點擊“add”,點擊 "Advanced clone behaviours",然后設置Timeout (in minutes) for clone and fetch operation單位分鐘。


3.構建觸發器

說明:這個可以根據需求來設置或不設置

這里在網上粘了一段關于pull scm時間設置的:

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.

舉兩個例子:

// every minute** ** *

// every 5 mins past the hour5* ** *

4


4.構建環境

我沒做什么配置。。。


5.構建

如果是xcode9 請看一 否則 請看二

一 :xcode9版本

構建點增加構建步驟,選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}

重點在于ExportOptions.plist是要自己放在指定目錄里的,否則就會報錯。

這個文件可以自己archive 然后export一個,也可以照著下面圖做一個

1

二:xcode8.3.3及以下

Target與Xcode項目中Target名字對應

Clean before build 設置為YES

Configuration Release的時候Archive

.ipa filename pattern 隨便起個名字不帶后綴

Outout directory 為ipa的輸出路徑,我這里是${WORKSPACE}/build/

這里說下${WORKSPACE}這個環境變量:

我這里代表的是:/Users/用戶名/.jenkins/workspace


5
6

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

7

PS:如果使用了cocoapods,需要配置Advanced Xcode build options

Workspace File(不用加.xcworkspace)

xcode workspace file的路徑:

我這里的絕對路徑是:/Users/用戶名/.jenkins/workspace/build_ipa/test.workspace

build_ipa是上面填寫的項目名稱,所以我這里填寫test就可以了

8

以上保存,然后構建正常應該可以生成ipa了。現在還差最后一步,傳fir或者做別的事情。


6.構建后操作

上傳fir:

1)fir插件

這個我用了,但是一直報錯:Can not found mapping or dysm file,誰成功了,說下咋弄的,謝啦。

但也說下我的步驟吧,安裝插件:http://blog.fir.im/jenkins/

安裝完了,構建后操作會有upload to fir:

9

2)執行腳本上傳

執行腳本之前需要安裝fir上傳用的命令:

sudo gem install -n /usr/local/bin fir-cli --no-ri --no-rdoc

上面的命令來自 fir.im 的工具 fir-cli,這是他們的官方使用說明官方工具 fir-cli 使用說明

還記得上面裝的Post-Build Script Plug-in插件么,這次派上用場了,

點擊add generic script,然后content里輸入

#!/bin/sh

fir p ipa路徑 -T fir的token -Q

我這里的ipa路徑是./Build/xxx.ipa

10


到這里應該就可以完美的構建并上傳到fir上了。


參考文章:

http://www.lxweimin.com/p/13e34671788f



2017.09.01更新:

用了一段時間發現,雖然根據教程弄完方便多了,但是因為懶嘛,總想著更自動化,所以發現了參數化構建,讓我們變得更懶吧!下面說說參數構建:

參數構建1

1.配置工程:

General下選中 參數化構建過程,然后點擊下面添加參數,里面有很多選項,我這里選的是String Parameter,更多的等我研究一下,目標是沒有copy 和 paste。但有參數構建已經很方便了目前。

這里說個題外話,如果有朋友關心如何通過Develop和Release來控制測試服務器和線上服務器的話,請先參考一篇文章www.lxweimin.com/p/51a2bbe877aa

其實就是通過類似ifdef(DEBUG)或者ifdef(RELEASE)來控制的,而Develop和Release和就是環境參數,不懂的在來問我吧。

參數構建2

2.使用添加的變量:

就是在要用到的地方寫 ${branch}

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

3.用參數構建:

參數構建3


參數構建4
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容