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:
我的版本是2.60.2
運行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)
初始化的圖忘截取了。。。反正大概的意思就是輸入一個從命令行獲取的密碼,隨時去看一下命令行就對了,然后把這個一長串的密碼記在小本本上,以后可能會用。然后就是自定義插件還是系統默認插件,當然選擇默認插件,插件后續還能改。然后就進入了下圖:
ps:恭喜恭喜,離成功只剩下一大步了。
第三步,安裝插件和配置
系統管理->插件管理
我們要用到的插件
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
這部分主要就是對一些基本信息填寫,項目名稱,描述基本選擇,我這里選項都沒選,直接上圖,
2.源碼管理
這部分主要是從哪獲取代碼,SVN或者GIT,這里我是GIT
輸入GIT倉庫地址,
然后選擇一個認證(credentials),
然后選擇分支
這里劃重點:(看文字和下圖3)
這里重點說一下credentials,這個不是隨便建個用戶名就行的,是要和當初配置GIT一樣,正常應該是SSH的,
下面圖里選擇SSH Username with privatekey
Username應該不是隨便添的,反正我是GIT的賬號名字
PrivateKey就是在ssh目錄下獲取的,目錄是~/.ssh/id_rsa,把中間一段復制進來
Passphprase就是當時生成PrivateKey時的密碼,如果不填,稍后拉分支代碼時會在命令行提示Enter passphrase for key。
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.構建環境
我沒做什么配置。。。
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一個,也可以照著下面圖做一個
二: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
上圖的Team ID在下圖這里找到
PS:如果使用了cocoapods,需要配置Advanced Xcode build options
Workspace File(不用加.xcworkspace)
xcode workspace file的路徑:
我這里的絕對路徑是:/Users/用戶名/.jenkins/workspace/build_ipa/test.workspace
build_ipa是上面填寫的項目名稱,所以我這里填寫test就可以了
以上保存,然后構建正常應該可以生成ipa了。現在還差最后一步,傳fir或者做別的事情。
6.構建后操作
上傳fir:
1)fir插件
這個我用了,但是一直報錯:Can not found mapping or dysm file,誰成功了,說下咋弄的,謝啦。
但也說下我的步驟吧,安裝插件:http://blog.fir.im/jenkins/
安裝完了,構建后操作會有upload to fir:
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
到這里應該就可以完美的構建并上傳到fir上了。
參考文章:
http://www.lxweimin.com/p/13e34671788f
2017.09.01更新:
用了一段時間發現,雖然根據教程弄完方便多了,但是因為懶嘛,總想著更自動化,所以發現了參數化構建,讓我們變得更懶吧!下面說說參數構建:
1.配置工程:
General下選中 參數化構建過程,然后點擊下面添加參數,里面有很多選項,我這里選的是String Parameter,更多的等我研究一下,目標是沒有copy 和 paste。但有參數構建已經很方便了目前。
這里說個題外話,如果有朋友關心如何通過Develop和Release來控制測試服務器和線上服務器的話,請先參考一篇文章www.lxweimin.com/p/51a2bbe877aa
其實就是通過類似ifdef(DEBUG)或者ifdef(RELEASE)來控制的,而Develop和Release和就是環境參數,不懂的在來問我吧。
2.使用添加的變量:
就是在要用到的地方寫 ${branch}
branch是變量名,定義了什么就用什么
3.用參數構建: