背景
一大早剛到公司沒多久,測試妹妹小韓跑過來:“老王,麻煩給我發一份xxx項目的最新安裝包唄?”
老王:“啥,昨天不是發你一個了嗎?”
小韓:“我要回歸下昨天已解決的bug,所以~”
于是,老王蹭蹭蹭打開IDE,N分鐘后一個安裝包通過QQ扔給了小韓。五分鐘后,小韓又跑過來了
小韓:“昨天你關閉的xxx bug好像沒解決吧,我操作給你看下~”
老王放下手中的山東煎餅,盯著小韓的操作看了一遍。
老王:“不科學哇,我昨天肯定解決了,你裝的是我剛發給你的嗎?”
小韓:“肯定是啊,我剛卸載了重新按裝的。。。”
老王:“難道是接口出問題了?你等下,我調試下。。。”
老王:“fuck,我用的正式環境的接口。。。稍等下,我一會兒再給你一個。”
N分鐘之后,測試小韓終于告訴老王昨天的那個bug沒問題了~
然后,小韓又跑去找iOS開發小李去了。。。此處省略500字~
反思
上面這個小故事,相信在不少公司都會存在。在測試階段,測試人員在不斷測試和回歸的過程中,會和開發人員溝通,期間可能會發布N個安裝包。
一般情況下,都是開發直接打包,然后發給測試人員。測試人員此時處于一個被動地位,只能被動的接受開發給的安裝包,然后去做相關測試。
另外,打包對于開發來講,可能覺得沒啥技術含量的事情,夾雜著情緒去做事情遲早也會出紕漏。
Jenkins
Jenkins是一個持續集成工具,它可以在設定的某個時間點(或者代碼有更新等情況)自動去構建安裝包,同時可以將安裝包上傳到第三方平臺,比如:Bugly、蒲公英,這樣測試人員可以通過微信、QQ掃一掃直接安裝(Bugly的鏈接可以直接在微信內打開,這是我選擇它的原因)。
當然,如果你需要,也可以將構建的結果(成功、失敗),通過Email發送給相關人員,以便及時發現問題。
那么下面我們講解如何使用Jenkins構建Android和iOS安裝包,并自動上傳Bugly平臺吧~
軟件環境
- Mac OS X EI Capitan
- Jenkins 2.19.3
- Tomcat
- AndroidStudio & Gradle等Android開發環境
- Xcode & 企業證書
Jenkins安裝
打開Jenkins官網,選擇“Download Jenkins”
選擇左側的“LTS Release”相對穩定的版本,我們看到Jenkins提供了很多平臺的支持。
我是Mac環境,一般很多人都會去選擇Mac OS X,直接選擇這個可以省去Tomcat的安裝。但經過我反復的實踐,選擇安裝包安裝的話,會生成一個Jenkins用戶,后續的工作空間會在這個用戶下,我遇到了各種文件夾權限問題,如果你去授予了讀寫權限,又會遇到Jenkins打不開的問題了~
所以,后來我直接放棄了,雖然網上有各種辦法,可能他們的版本比較舊。最后,受到高人指點,我直接下載了.war文件,知道的朋友應該明白,這個文件是直接放在Tomcat下webapps下,然后你就可以使用了,它的權限就是當前用戶,所以就不存在問題了~
所以下載好.war文件之后,我們就開始安裝Tomcat吧。
Tomcat安裝
下載地址:http://tomcat.apache.org/download-70.cgi
選擇zip壓縮文件,下載完成后解壓縮到你的目錄,我放在
/Users/hiphonezhu/Desktop/D/software/apache-tomcat-8.5.8
,
然后,把上面一步下載好的Jenkins.war放到apache-tomcat-8.5.8/webapps
目錄下。
運行Jenkins
命令行進入Tomcat安裝目錄bin文件夾下,執行如下命令:
$ cd /Users/hiphonezhu/Desktop/D/software/apache-tomcat-8.5.8/bin
$ startup.sh
打開瀏覽器,輸入http://localhost:8080/, 看到這個頁面表示Tomcat啟動成功了
點擊“Manager Apps”,會提示輸入用戶名和密碼,Tomcat默認是沒有用戶名和密碼的,那怎么辦呢?
我們點擊取消,會出現這個頁面:
它提示我們在conf/tomcat-users.xml
文件中可以配置用戶,打開文件,在最后加入用戶:
重新啟動Tomcat:
$ cd /Users/hiphonezhu/Desktop/D/software/apache-tomcat-8.5.8/bin
$ shutdown.sh
$ startup.sh
再次點擊“Manager Apps”,輸入用戶名和密碼,進入Tomcat管理界面:
如果你剛剛下載了
Jenkins.war
并放到了apache-tomcat-8.5.8/webapps
目錄下,此時會看到/jenkins
這個應用,如上圖紅色區域,點擊我們就打開Jenkins了。
安裝Jenkins插件
初次打開Jenkins會提示你輸入密碼,按照提示找到文件并打開,然后填入密碼即可,這里不貼圖了。
然后會提示你安裝插件,我們首先選擇推薦安裝推薦的插件。經過漫長的等待,我們終于進去Jenkins管理界面了
選擇“Manager Jenkins”,進入設置界面
選擇“Manage Plugins”進入插件管理界面
我們額外需要安裝的插件有:
- Git
- Gradle
- Xcode
因為我的代碼托管在自建的gitblit上,所以源碼管理工具選擇了Git。如果你的代碼放在Github上,還需安裝GitHub插件。
當然,如果你使用SVN,那么還需安裝SVN相關插件,這里不做更多介紹。
新增構建項目(通用)
回到Jenkins主頁,點擊“New Item”
輸入項目名稱,點擊“OK”,進入配置界面
選擇“Source Code Management”,設置Git的地址ssh://zhuhfxxxxxxxxx
,選擇認證方式“Credentials”,點擊“Add”
我們選擇“SSH Username with private key”認證方式,“Username”隨意填寫,只是Jenkins的存儲的用戶而已。
“Private Key”就是“SSH Key”,首先你要在本地生成一對“私鑰”和“公鑰”,然后把公鑰填到你的源碼管理庫里面去,這里的key填寫的是私鑰,不熟悉的朋友可以參考這篇文章:http://jingyan.baidu.com/article/a65957f4f0acc624e67f9bc1.html
設置成功后,選擇你剛剛填寫的用戶,如果認證成功,則沒有提示,如果失敗下圖紅色區域會出現紅色錯誤提示(寫本篇文章的時候,嘗試填寫錯誤的居然不提示了,我發誓一開始我輸錯了確實提示了~):
設置構建條件
經常用到的是以下兩個:
Build periodically:周期進行項目構建(它不care源碼是否發生變化)。
Poll SCM:定時檢查源碼變更(根據SCM軟件的版本號),如果有更新就checkout最新code下來,然后執行構建動作。
參數配置參考:
http://blog.csdn.net/xueyingqi/article/details/53216506
http://blog.csdn.net/yezicjj/article/details/52763700
通用的設置介紹完了,下面我們介紹Android和iOS不同的構建參數設置。
Android構建
Build選擇“Add build step”,因為Android使用Gradle打包的,所以我們選擇“Invoke Gradle script”。
正常情況下,只需要設置Tasks的參數。
Tasks的參數其實就是./gradlew xxx
后面的參數,比如我們填寫的assembleDebug
,最終執行的命令就是:
$ ./gradlew assembleDebug
表示最終打包出來的是Debug版本,這個和你在AndroidStudio中使用命令行打包是一個道理,我們可以使用
$ ./gradlew tasks
來查看你的項目可以執行的任務
如果你的項目在命令行使用
$ ./gradlew assembleDebug
$ ./gradlew assembleRelease
或者其他命令(多個productFlavors)可以正常打包,那么Jenkins也是可以正常打包的。
這里需要說明的是,如果你需要打Release包,那么你的app/build.gradle文件中需要有簽名的配置:
配置完成后,點擊“Save”按鈕,回到你新建的項目。主動構建,點擊“Build Now”
在“Build History”中:
- 正在構建的會顯示當前構建的進度;
- 如果最后顯示藍色的表示構建成功;
- 紅色表示構建失敗;
- 灰色表示構建被終止,可能是用戶主動點擊了“x”號。
選擇某一次構建記錄,點擊“Console Output”,可以查看構建的過程
成功情況,最后你會看到“BUILD SUCCESSFUL”字樣
最終apk的輸出目錄,和我們用AS開發一致,在
app/build/outputs/apk
文件夾中:
Android的構建,我們暫且到此,自動上傳至Bugly平臺因為Android和iOS基本是類似的,所以會在文章最后統一講解。
下面我們來看下iOS的構建步驟吧~
iOS構建
Build選擇“Add build step”,選擇“Xcode”
這里有一點需要說明,因為會影響到下面的配置。
以前我們在使用第三方庫的時候,一般都是手動下載到本地,然后加入到項目中。
現在很多項目都是用CocoaPods來管理第三方庫,這個和Android的Gradle非常類似,可以方便的安裝和升級使用第三方庫。
不使用CocoaPods,你的項目文件是xxx.xcodeproj,使用之后我們要通過xxx.xcworkspace來打開項目,這個非常重要,直接影響了我們接下來的配置。
如果你沒使用CocoaPods,那么Target這一項,需要填寫你項目的Target,也就是下圖紅色區域的文字:
如果你使用了CocoaPods,那么這一項請留空,我們會在后面的scheme中填寫。
記住:target和project一起使用,scheme和workspace配套使用,更多信息請查看workspace, project, target, scheme 解析。
我們繼續,點擊“General build settings”中的“Settings...”按鈕,展開更多選項:
- 我們將“Clean before build?”打鉤,build之前清理一下,總歸保險一點,有時候清理下,問題就沒了~
- Configuration有兩個值,“Debug”和“Release”,這個和Xcode “Edit Scheme”中的“Build Configuration”的值一致:
Debug和Release最多的用途,還是用于測試環境和正式環境不同的配置,比如常用的接口API的地址:
它與發布AppStore或者第三方平臺內測,沒有太多直接的關系。
ipa命令規則:
“Pack application and build .ipa?”,選擇打鉤,表示需要生成ipa文件。
- .ipa filename pattern,ipa文件的命名規則,如果不填寫默認規則是:target-version-build,例如xxx-1.0.0-2.ipa。
你可以使用 ${VERSION} 、${BUILD_DATE} (yyyy.MM.dd)等系統的值來組合最終的名稱,也可以像紅色區域一樣,寫一個固定的名稱。
注意:這里不需要填寫.ipa后綴,Jenkins會自動幫我們加上的。
- Output directory,建議不清楚的不要填寫,它表示ipa輸出目錄,是一個相對路徑,相對于CONFIGURATION_BUILD_DIR這個默認的Build目錄或者你修改之后的Build目錄;
- Manifest Plist URL,打ipa包的時候可以直接生成plist文件,它的plist的url填寫成你的服務的地址,這個地址加上文件名就組成了可下載ipa包的https服務地址url。這個plist url中jenkins會自動后面加上ipa文件名。
如果你用的自己的HTTPS服務器,來提供Ad Hoc或者In-House類型的ipa包發布,那么這里可以填寫你的服務器地址(現在要權威機構頒發的證書才能使用,自建的https無法訪問)。
因為我們使用bugly作為分發平臺,所以這里就不配置了,有興趣的自行搜索下~
Code signing & OS X Keychain options
- Change bundle ID?,用于動態修改bundle ID,你需要指定新的bundle ID和plist文件的路徑。一般情況不用修改,有時候測試包和正式包需要共存,這里可以修改下;
-
Code Signing Identity,用于簽名的證書名稱,如果開發或者發布證書不是你創建的,讓創建者導出p12和mobileprovision文件給你,安裝p12之后,打開鑰匙串,把證書的名字復制填入即可
Paste_Image.png
這里涉及到iOS簽名證書的制作和生成,不是本文討論的重點,不懂的同學可以參考文章最后的鏈接。
- Sign IPA at build time,表示對編譯的時候對IPA包簽名,不打勾的話執行xcrun命令的時候,不會加上--sign 參數,這據說是Xcode的一個bug~
- Embedded Profile,這個是填寫mobileprovision描述文件的完整路徑。
Code Signing Identity和Embedded Profile這兩個空都可以不填,這樣會使用Xcode中的配置,如下圖:
Unlock Keychain
IPA簽名的時候,需要你的Mac電腦當前登錄的用戶授予權限。保守起見,建議打鉤;并在“Keychain password”中,輸入Mac電腦當前用戶登錄的密碼。(測試下來,使用war包方式,此項不勾選也是ok的~)
Advanced Xcode build options
- Xcode Schema File,如果你使用workspace而不是project此項必填,與target類似,填寫你需要構建的schema;
- Xcode Workspace File,.xcworkspace文件的路徑,$WORKSPACE表示的是當前項目的路徑,"/"后面就是.xcworkspace后綴的文件名,注意:這里不需要填寫后綴;
- Build output directory,
系統默認的Build目錄是CONFIGURATION_BUILD_DIR,我們上文提到的ipa包的輸出目錄,其實就是相對于這個目錄的路徑;建議填寫,比如我們填寫的$WORKSPACE/jenkins-build,上文ipa的“Output directory”填寫ipa,那么最終編譯輸出的文件和ipa包的目錄結構如下:
點擊“Save”,保存我們的配置,我們來嘗試構建一下。
選擇某一次構建記錄,點擊“Console Output”,查看構建的過程:
紅色區域可以看到,ipa成功打包出來了,路徑和我們上面一張圖的目錄結構一致。
至此,iOS的配置也結束了。下面我們重點講解下,如何上傳「apk&ipa」到第三方分發平臺Bugly~
上傳Bugly
- 打開Bugly官網,注冊完成后,新建一個項目:
Bugly
填寫完基本信息后,選擇平臺,然后保存。
注意:Android和iOS不能用同一個產品,否則下文執行上傳命令,即使參數正確,也會提示“文件上傳成功,但版本創建失敗!”
-
選擇第一步創建的產品,打開“產品設置”頁面:
產品設置
我們要使用App ID 和 App Key這兩個參數。
-
打開之前在Jenkins創建的項目,選擇“Configure”來修改配置項:
選擇Build,“Add build step”新增一個腳本“Execute shell”
Execute shell
輸入腳本
Shell
具體如下:cd $WORKSPACE/jenkins-build/ipa curl —-insecure -F "file=@xxx.ipa" -F "app_id=xxx" -F "pid=2" -F "title=xxx" -F "description=xxx" https://api.bugly.qq.com/beta/apiv1/exp?app_key=xxx
cd $WORKSPACE/jenkins-build/ipa,表示進入ipa輸出文件夾;
curl xxx,curl是一個命令,百度百科解釋如下:
curl是利用URL語法在命令行方式下工作的開源文件傳輸工具。它被廣泛應用在Unix、多種Linux發行版中,并且有DOS和Win32、Win64下的移植版本。
具體的參數的解釋:
更多參數可以參考:Bugly官方文檔
-
上傳成功之后,我們再次打開“Console Output”查看構建日志:
Paste_Image.png
可以看到已經成功上傳到Bugly了,
內測分發
點擊“下載”安裝包,或者打開“預覽”界面,通過微信、QQ掃一掃來安裝
掃一掃
相信,寫到這里,測試妹子小韓一定很開心的笑了,以后不需要再去找“隔壁老王”了。。。
也許你跟著本文的步驟,還是會出現各種問題,你的環境或者配置錯誤都可能是引起的原因。有問題的同學可以先搜索下,一般都能找到解決辦法,如果還是不能解決,可以給我留言~
參考文章:
Jenkins:
http://www.tuicool.com/articles/7Z3aYna
http://blog.csdn.net/wyb199026/article/details/52225345
http://blog.csdn.net/youtk21ai/article/details/48719807
iOS打包:
http://www.cnblogs.com/zengshuilin/p/5771401.html
http://www.cnblogs.com/tangyuanby2/p/5848230.html
http://www.cnblogs.com/wangbinios/p/5709386.html
http://blog.csdn.net/he_jiabin/article/details/49275191