Jenkins一鍵發布「apk&ipa」 到Bugly

背景

一大早剛到公司沒多久,測試妹妹小韓跑過來:“老王,麻煩給我發一份xxx項目的最新安裝包唄?”

老王:“啥,昨天不是發你一個了嗎?”

小韓:“我要回歸下昨天已解決的bug,所以~”

于是,老王蹭蹭蹭打開IDE,N分鐘后一個安裝包通過QQ扔給了小韓。五分鐘后,小韓又跑過來了

小韓:“昨天你關閉的xxx bug好像沒解決吧,我操作給你看下~”

老王放下手中的山東煎餅,盯著小韓的操作看了一遍。

老王:“不科學哇,我昨天肯定解決了,你裝的是我剛發給你的嗎?”

小韓:“肯定是啊,我剛卸載了重新按裝的。。。”

老王:“難道是接口出問題了?你等下,我調試下。。。”

老王:“fuck,我用的正式環境的接口。。。稍等下,我一會兒再給你一個。”

N分鐘之后,測試小韓終于告訴老王昨天的那個bug沒問題了~

然后,小韓又跑去找iOS開發小李去了。。。此處省略500字~

反思

上面這個小故事,相信在不少公司都會存在。在測試階段,測試人員在不斷測試和回歸的過程中,會和開發人員溝通,期間可能會發布N個安裝包。

一般情況下,都是開發直接打包,然后發給測試人員。測試人員此時處于一個被動地位,只能被動的接受開發給的安裝包,然后去做相關測試。

另外,打包對于開發來講,可能覺得沒啥技術含量的事情,夾雜著情緒去做事情遲早也會出紕漏。

Jenkins

Jenkins是一個持續集成工具,它可以在設定的某個時間點(或者代碼有更新等情況)自動去構建安裝包,同時可以將安裝包上傳到第三方平臺,比如:Bugly蒲公英,這樣測試人員可以通過微信、QQ掃一掃直接安裝(Bugly的鏈接可以直接在微信內打開,這是我選擇它的原因)。

當然,如果你需要,也可以將構建的結果(成功、失敗),通過Email發送給相關人員,以便及時發現問題。

那么下面我們講解如何使用Jenkins構建Android和iOS安裝包,并自動上傳Bugly平臺吧~

軟件環境

  1. Mac OS X EI Capitan
  2. Jenkins 2.19.3
  3. Tomcat
  4. AndroidStudio & Gradle等Android開發環境
  5. Xcode & 企業證書

Jenkins安裝

打開Jenkins官網,選擇“Download Jenkins”

Jenkins

選擇左側的“LTS Release”相對穩定的版本,我們看到Jenkins提供了很多平臺的支持。

我是Mac環境,一般很多人都會去選擇Mac OS X,直接選擇這個可以省去Tomcat的安裝。但經過我反復的實踐,選擇安裝包安裝的話,會生成一個Jenkins用戶,后續的工作空間會在這個用戶下,我遇到了各種文件夾權限問題,如果你去授予了讀寫權限,又會遇到Jenkins打不開的問題了~

所以,后來我直接放棄了,雖然網上有各種辦法,可能他們的版本比較舊。最后,受到高人指點,我直接下載了.war文件,知道的朋友應該明白,這個文件是直接放在Tomcat下webapps下,然后你就可以使用了,它的權限就是當前用戶,所以就不存在問題了~

所以下載好.war文件之后,我們就開始安裝Tomcat吧。

Tomcat安裝
下載地址:http://tomcat.apache.org/download-70.cgi

Tomcat安裝

選擇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
運行Jenkins

打開瀏覽器,輸入http://localhost:8080/, 看到這個頁面表示Tomcat啟動成功了

Manager Apps

點擊“Manager Apps”,會提示輸入用戶名和密碼,Tomcat默認是沒有用戶名和密碼的,那怎么辦呢?

我們點擊取消,會出現這個頁面:

401登錄提示

它提示我們在conf/tomcat-users.xml文件中可以配置用戶,打開文件,在最后加入用戶:

conf/tomcat-users.xml

重新啟動Tomcat:

$ cd /Users/hiphonezhu/Desktop/D/software/apache-tomcat-8.5.8/bin
$ shutdown.sh
$ startup.sh

再次點擊“Manager Apps”,輸入用戶名和密碼,進入Tomcat管理界面:

Tomcat管理界面

如果你剛剛下載了Jenkins.war并放到了apache-tomcat-8.5.8/webapps目錄下,此時會看到/jenkins這個應用,如上圖紅色區域,點擊我們就打開Jenkins了。

安裝Jenkins插件

初次打開Jenkins會提示你輸入密碼,按照提示找到文件并打開,然后填入密碼即可,這里不貼圖了。

然后會提示你安裝插件,我們首先選擇推薦安裝推薦的插件。經過漫長的等待,我們終于進去Jenkins管理界面了

Jenkins管理界面

選擇“Manager Jenkins”,進入設置界面

Manage Plugins

選擇“Manage Plugins”進入插件管理界面

Install Plugins

我們額外需要安裝的插件有:

  1. Git
  2. Gradle
  3. Xcode

因為我的代碼托管在自建的gitblit上,所以源碼管理工具選擇了Git。如果你的代碼放在Github上,還需安裝GitHub插件。

當然,如果你使用SVN,那么還需安裝SVN相關插件,這里不做更多介紹。

新增構建項目(通用)

回到Jenkins主頁,點擊“New Item”

New Item

輸入項目名稱,點擊“OK”,進入配置界面

Source Code Management

選擇“Source Code Management”,設置Git的地址ssh://zhuhfxxxxxxxxx,選擇認證方式“Credentials”,點擊“Add”

Credentials

我們選擇“SSH Username with private key”認證方式,“Username”隨意填寫,只是Jenkins的存儲的用戶而已。

“Private Key”就是“SSH Key”,首先你要在本地生成一對“私鑰”和“公鑰”,然后把公鑰填到你的源碼管理庫里面去,這里的key填寫的是私鑰,不熟悉的朋友可以參考這篇文章:http://jingyan.baidu.com/article/a65957f4f0acc624e67f9bc1.html

設置成功后,選擇你剛剛填寫的用戶,如果認證成功,則沒有提示,如果失敗下圖紅色區域會出現紅色錯誤提示(寫本篇文章的時候,嘗試填寫錯誤的居然不提示了,我發誓一開始我輸錯了確實提示了~):

認證失敗

設置構建條件

Paste_Image.png

經常用到的是以下兩個:

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

Build選擇“Add build step”,因為Android使用Gradle打包的,所以我們選擇“Invoke Gradle script”。

Gradle

正常情況下,只需要設置Tasks的參數。

Tasks的參數其實就是./gradlew xxx后面的參數,比如我們填寫的assembleDebug,最終執行的命令就是:

$ ./gradlew assembleDebug

表示最終打包出來的是Debug版本,這個和你在AndroidStudio中使用命令行打包是一個道理,我們可以使用

$ ./gradlew tasks

來查看你的項目可以執行的任務

tasks

如果你的項目在命令行使用

$ ./gradlew assembleDebug
$ ./gradlew assembleRelease

或者其他命令(多個productFlavors)可以正常打包,那么Jenkins也是可以正常打包的。

這里需要說明的是,如果你需要打Release包,那么你的app/build.gradle文件中需要有簽名的配置:

signing config

配置完成后,點擊“Save”按鈕,回到你新建的項目。主動構建,點擊“Build Now”

Build Now

在“Build History”中:

  1. 正在構建的會顯示當前構建的進度;
  2. 如果最后顯示藍色的表示構建成功;
  3. 紅色表示構建失敗;
  4. 灰色表示構建被終止,可能是用戶主動點擊了“x”號。

選擇某一次構建記錄,點擊“Console Output”,可以查看構建的過程

Build Detail

成功情況,最后你會看到“BUILD SUCCESSFUL”字樣
Build Successful

最終apk的輸出目錄,和我們用AS開發一致,在app/build/outputs/apk文件夾中:

Apk

Android的構建,我們暫且到此,自動上傳至Bugly平臺因為Android和iOS基本是類似的,所以會在文章最后統一講解。

下面我們來看下iOS的構建步驟吧~

iOS構建

Xcode

Build選擇“Add build step”,選擇“Xcode”

General build settings

這里有一點需要說明,因為會影響到下面的配置。

以前我們在使用第三方庫的時候,一般都是手動下載到本地,然后加入到項目中。

現在很多項目都是用CocoaPods來管理第三方庫,這個和Android的Gradle非常類似,可以方便的安裝和升級使用第三方庫。

不使用CocoaPods,你的項目文件是xxx.xcodeproj,使用之后我們要通過xxx.xcworkspace來打開項目,這個非常重要,直接影響了我們接下來的配置。

如果你沒使用CocoaPods,那么Target這一項,需要填寫你項目的Target,也就是下圖紅色區域的文字:

Target

如果你使用了CocoaPods,那么這一項請留空,我們會在后面的scheme中填寫。

記住:target和project一起使用,scheme和workspace配套使用,更多信息請查看workspace, project, target, scheme 解析

我們繼續,點擊“General build settings”中的“Settings...”按鈕,展開更多選項:


General build settings-Settings...
  1. 我們將“Clean before build?”打鉤,build之前清理一下,總歸保險一點,有時候清理下,問題就沒了~
  2. Configuration有兩個值,“Debug”和“Release”,這個和Xcode “Edit Scheme”中的“Build Configuration”的值一致:
Edit Scheme
Build Configuration

Debug和Release最多的用途,還是用于測試環境和正式環境不同的配置,比如常用的接口API的地址:

API

它與發布AppStore或者第三方平臺內測,沒有太多直接的關系。

ipa命令規則:

Pack

“Pack application and build .ipa?”,選擇打鉤,表示需要生成ipa文件。

  1. .ipa filename pattern,ipa文件的命名規則,如果不填寫默認規則是:target-version-build,例如xxx-1.0.0-2.ipa。

你可以使用 ${VERSION} 、${BUILD_DATE} (yyyy.MM.dd)等系統的值來組合最終的名稱,也可以像紅色區域一樣,寫一個固定的名稱。

注意:這里不需要填寫.ipa后綴,Jenkins會自動幫我們加上的。
  1. Output directory,建議不清楚的不要填寫,它表示ipa輸出目錄,是一個相對路徑,相對于CONFIGURATION_BUILD_DIR這個默認的Build目錄或者你修改之后的Build目錄;
  2. 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


Code signing
  1. Change bundle ID?,用于動態修改bundle ID,你需要指定新的bundle ID和plist文件的路徑。一般情況不用修改,有時候測試包和正式包需要共存,這里可以修改下;
  2. Code Signing Identity,用于簽名的證書名稱,如果開發或者發布證書不是你創建的,讓創建者導出p12和mobileprovision文件給你,安裝p12之后,打開鑰匙串,把證書的名字復制填入即可


    Paste_Image.png

    這里涉及到iOS簽名證書的制作和生成,不是本文討論的重點,不懂的同學可以參考文章最后的鏈接。

  3. Sign IPA at build time,表示對編譯的時候對IPA包簽名,不打勾的話執行xcrun命令的時候,不會加上--sign 參數,這據說是Xcode的一個bug~
  4. Embedded Profile,這個是填寫mobileprovision描述文件的完整路徑。

Code Signing Identity和Embedded Profile這兩個空都可以不填,這樣會使用Xcode中的配置,如下圖:

Code Signing Identity & Embedded Profile

Unlock Keychain


Unlock Keychain?

IPA簽名的時候,需要你的Mac電腦當前登錄的用戶授予權限。保守起見,建議打鉤;并在“Keychain password”中,輸入Mac電腦當前用戶登錄的密碼。(測試下來,使用war包方式,此項不勾選也是ok的~)

Advanced Xcode build options


Advanced Xcode build options
  1. Xcode Schema File,如果你使用workspace而不是project此項必填,與target類似,填寫你需要構建的schema;
  2. Xcode Workspace File,.xcworkspace文件的路徑,$WORKSPACE表示的是當前項目的路徑,"/"后面就是.xcworkspace后綴的文件名,注意:這里不需要填寫后綴;
  3. Build output directory,
    系統默認的Build目錄是CONFIGURATION_BUILD_DIR,我們上文提到的ipa包的輸出目錄,其實就是相對于這個目錄的路徑;建議填寫,比如我們填寫的$WORKSPACE/jenkins-build,上文ipa的“Output directory”填寫ipa,那么最終編譯輸出的文件和ipa包的目錄結構如下:
build & ipa

點擊“Save”,保存我們的配置,我們來嘗試構建一下。

選擇某一次構建記錄,點擊“Console Output”,查看構建的過程:

Console Output

紅色區域可以看到,ipa成功打包出來了,路徑和我們上面一張圖的目錄結構一致。

至此,iOS的配置也結束了。下面我們重點講解下,如何上傳「apk&ipa」到第三方分發平臺Bugly~

上傳Bugly

  1. 打開Bugly官網,注冊完成后,新建一個項目:
    Bugly

    填寫完基本信息后,選擇平臺,然后保存。

注意:Android和iOS不能用同一個產品,否則下文執行上傳命令,即使參數正確,也會提示“文件上傳成功,但版本創建失敗!”

  1. 選擇第一步創建的產品,打開“產品設置”頁面:


    產品設置

    我們要使用App ID 和 App Key這兩個參數。

  2. 打開之前在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發行版中,并且有DOSWin32、Win64下的移植版本。

具體的參數的解釋:

curl

更多參數可以參考:Bugly官方文檔

  1. 上傳成功之后,我們再次打開“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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容