Jenkins+gradle+git部署

感謝博友分享,這邊記錄下https://blog.csdn.net/jiankeufo/article/details/78228334html

 

 

個人密碼7789cc2b62114e9da9fb78b0aa3cb0c8   帳號  adminjava

安裝

上來就是乾的,首先到Jenkins的官網下載https://jenkins.io,點擊Download Jenkins按鈕會彈出兩個版本選擇:LTS Release(長期支持版本),Weekly Release(每週更新版本)。首先說一下這兩個版本,我的以爲和MIUI的更新相似,一個開發版本一個穩定版,你們能夠自行選擇,功能上幾乎沒區別。點擊尖角號會彈出操做系統,能夠選擇對應的操做系統安裝,也能夠直接下載2.xx.x.war包而後放在Tomcat(下文會詳細介紹Tomcat一些功能)的webapps目錄,新建Jenkins文件夾再放入。python

我選擇的是Windows安裝版的,首先安裝版和war版我都嘗試過,功能是沒區別的,主要的區別在於目錄上,安裝版指定安裝目錄之後幾乎全部的東西都會在對應的文件夾下生成,好比Jobs(即存放工程目錄),不會在其餘磁盤再生成多餘的文件夾,而war版放在Tomcat目錄下之後,用瀏覽器打開,全部的東西會在C盤生成.Jenkins文件夾。我本身是有一些強迫症的,喜歡目錄整潔,不生成多餘文件夾的。還有一個理由就是安裝版能夠不依賴Tomcat,即便本機沒有安裝Tomcat,安裝版安裝完成後依然能夠用本機ip:port啓動。你們能夠自行選擇喜歡的版本。linux

因爲安裝部分比較簡單,就不上圖了。android

插件

1.進入管理插件

接下來就要說說,Jenkins最強大的部分之一了,那就是插件。Jenkins提供了很是多的插件,幾乎你想要的插件全有,前提是你能找的到~官網提供了插件搜索功能,選擇Plugins頁就能夠各類搜索了。git

重點來了(敲黑板,啪啪啪~):首次進入,首先要輸入一個密鑰來進入Jenkins,接下來...接下來...上圖github


setup.png


通常選擇第一項便可,會自動安裝推薦的插件,注意:這裏並非全部插件都能安裝成功,有的安裝失敗也不影響,全部的安裝完進行下一步就能夠了。web

But,有時候點擊之後會發生下面的狀況瀏覽器


setup_error.png


怎麼點擊Retry按鈕依然是錯誤,這時候不要慌張,我們選擇第一張圖中的第二項,進行本身選擇,這裏系統推薦的插件默認也是選中的,直接點安裝便可。But,個別狀況依然會出現上圖的錯誤頁面,那麼解決辦法就是:進入自行選擇頁面,清空選項即全部都不選,而後點安裝按鈕,進入下一頁。服務器

下一頁就是建立用戶頁面,這裏建議建立用戶,下面提供了Continue as admin按鈕也可進入主頁,可是後期想建立用戶仍是很麻煩的,因此建議建立用戶。

建立好用戶,就能夠進入到主頁了~選擇系統管理->管理插件->可選插件來開始安裝咱們須要的插件。

2.插件列表

注意:列表中爲主要插件,而Jenkins的插件是有依賴關係的,安裝一個插件可能要先安裝它依賴的插件,不然會安裝失敗。在可選插件勾選列表中的插件便可,依賴插件會自動下載,是否是很棒。

1.Global Tool Configuration

在系統管理選項中找到Global Tool Configuration進入,若是上面的插件安裝成功,在這裏會看到三個板塊,如圖


Global_Tool_Configuration.png


分別是JDK,Git,Gradle板塊,分別配置這三個的路徑。

  • JDK:別名=任意,JAVA_HOME=JDK目錄
  • Git:別名=任意, Path to Git executable=Git安裝目錄\bin\git.exe
  • Gradle:別名=任意,GRADLE_HOME=Gradle下載目錄\Gradle\gradle-2.xx
    Gradle儘可能配置多個,由於項目的gradle版本可能不同,因此須要選擇不一樣的Gradle版本進行編譯

這個Gradle的目錄,能夠是Android Studio默認下載的Gradle目錄,在用戶目錄的.gradle\wrapper\dists文件夾下,可是目錄不是很整潔;也能夠到http://www.androiddevtools.cn找到gradle資源處下載經常使用的gradle版本,放到一個指定的文件夾,而後配置路徑便可,目錄比較整潔。

2.全局屬性

在這裏最好配置一下全局屬性,這裏先說一個,就是配置Android SDK目錄,在打包是有可能會出現ANDROID_HOME not found的狀況,因此在系統管理->系統設置->全局屬性版塊勾選上Environment variables選項,而後添加


android_home.png


記得更改值內的路徑爲本機sdk目錄。

注意:這裏的鍵須要和本機環境變量內的Android SDK目錄的鍵一致

打包

1.建立項目

距離開始打包又近了一步,接下來就開始建立新項目了,點擊首頁的新建,進入下圖界面


create.png


給本身的項目起個名字,而後選擇構建一個自由風格的軟件項目,點擊OK按鈕,進入項目的配置界面。

2.項目配置

直接選擇源碼管理tab或者向下滾動找到源碼管理,如圖;


source_manage.png


選中Git選項,會出現上圖的界面,配置Git項目的URL,我測試用的是Github項目,而且傳輸協議選擇的是HTTP,須要選擇Credentials選項,選擇通行證,第一次須要點擊Add添加通行證,如圖:


credentials.png


Kind種類選擇默認的Username with password,而後在Username和Pasword處分別輸入Git帳戶的用戶名和密碼,而後滾動到下方點擊Add,而後在Credentials中選擇咱們剛纔添加的通行證。

接着滾動到構建Tab,點擊添加構建步驟,而後選擇Invoke Gradle script,如圖:


build.png


而後配置構建時的Gradle版本,和須要執行的任務,如圖:


build1.png


這個Tasks是先clean工程,而後打包全部渠道的Release版本,這是Gradle的命令,很少說了。而後點擊保存按鈕,立刻就能夠打包了。

3.開始構建

點擊保存後,進入項目界面,如圖:


project.png


點擊左側菜單欄的當即構建,開始構建項目,這時候Build History版塊會出現構建任務列表,點擊進入能夠查看構建詳情頁,如圖


project_build.png


又不少菜單能夠選擇來查看狀態,點擊Console Output來查看構建輸出的日誌,全部的信息都會顯示,日誌最後輸出Finished: SUCCESS即構建成功。

成功以後,返回項目地址就能夠點擊工做空間,在app的build目錄下面查看apk生成狀況。

以上就是Jenkins打包最簡單的配置,我知道你們想要的不止這些,更精彩的還在後面。

定製想要的功能

1.參數化構建

在咱們打包的時候,咱們大多時候不想只是簡簡單單打一個版本的包,咱們想經過配置一下參數,來知足一些需求,好比根據渠道打不一樣版本的包、根據Tag打不一樣的包等,下面就來講一下Jenkins參數化構建。

在咱們項目中須要配置的選項有:版本(Release 或 Debug),版本號,渠道包,根據Tag打包。另外咱們還須要加上打包途徑,AS打包仍是Jenkins打的包,還要加一個時間戳。全部的參數列出來了,下面就配置Jenkins的參數化構建吧~

在Jenkins項目主頁選擇配置,進入配置頁,在General tab將參數化構建過程選中,如圖:


General.png


接下來就能夠添加參數了,下面我先列出參數表格:

參數名 參數類型 參數值列表
BUILD_TYPE Choice Release or Debug
IS_JENKINS Choice true
PRODUCT_FLAVORS Choice Xiaomi 、Wandoujia等
BUILD_TIME Dynamic Parameter 2016-12-21-11-11
APP_VERSION Choice 1.0.0、1.0.1等
GIT_TAG Git Parameter tag1.0.0等

下面直接放個人配置截圖:


build_type.png

product_flavor.png

app_version.png

is_jenkins.png

build_time.png

git_tag.png


配置完參數還不算完,咱們要在下方構建時候引用,首先找到構建標籤處,將Tasks屬性值修改成:

clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE} --stacktrace --debugclean assemble${PRODUCT_FLAVORS}${BUILD_TYPE} --stacktrace --debug

其中${PRODUCT_FLAVORS}&{BUILD_TYPE}分別對應上面的參數名。配置如圖:


build2.png


看了圖你們確定留意到了紅色框內的選項並且很好奇吧,這個選項是APP_VERSION、IS_JENKINS、BUILD_TIME須要用到的,由於這三個參數須要注入到Android項目中的配置同樣,而紅色框中的這個選項能夠幫咱們侵入到gradle.properties文件中替換值,而且build.gradle文件可以直接引用gradle.properties文件中的屬性,因此起到了侵入的效果。下面分別是個人gradle.properties和主項目的build.gradle文件全代碼:

  1. //gradle.properties
  2.  
  3. # Project-wide Gradle settings.
  4. # IDE (e.g. Android Studio) users:
  5. # Gradle settings configured through the IDE *will override*
  6. # any settings specified in this file.
  7. # For more details on how to configure your build environment visit
  8. # http://www.gradle.org/docs/current/userguide/build_environment.html
  9. # Specifies the JVM arguments used for the daemon process.
  10. # The setting is particularly useful for tweaking memory settings.org.gradle.jvmargs=-Xmx1536m
  11. # When configured, Gradle will run in incubating parallel mode.
  12. # This option should only be used with decoupled projects. More details, visit
  13. #http://www.gradle.org/docs/current/userguide/multi_project_builds.html
  14. #sec:decoupled_projects
  15. #org.gradle.parallel=true
  16. APP_VERSION=1.0.1
  17. IS_JENKINS=true
  18. BUILD_TIME=''
  19.  
  20. //build.gradle
  21.  
  22. apply plugin: 'com.android.application'
  23. def getDate() {
  24. def date = new Date()
  25. def formattedDate = date.format('yyyy-MM-dd-HH-mm')
  26. return formattedDate
  27. }
  28. def verCode = 14
  29. android {
  30. compileSdkVersion 25
  31. buildToolsVersion "25.0.0"
  32. defaultConfig {
  33. applicationId "com.zyyoona7.autobuildtest"
  34. minSdkVersion 15
  35. targetSdkVersion 23
  36. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  37. multiDexEnabled true
  38. versionCode verCode
  39. versionName APP_VERSION
  40. }
  41. signingConfigs {
  42. signingConfig {
  43. //因爲本地打包使用的是本機上的KeyStore
  44. //而Jenkins打包用的是服務器上的KeyStore
  45. //兩個路徑不同
  46. if("true".equals(IS_JENKINS)){
  47. storeFile file("服務器上KeyStore的路徑")
  48. }else {
  49. storeFile file(STORE_FILE_PATH)
  50. }
  51. keyAlias KEY_ALIAS
  52. keyPassword KEY_PASSWORD
  53. storePassword STORE_FILE_PASSWORD
  54. }
  55. }
  56. buildTypes {
  57. release {
  58. minifyEnabled true
  59. zipAlignEnabled true
  60. shrinkResources true
  61. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  62. signingConfig signingConfigs.signingConfig
  63. }
  64. debug { }
  65. }
  66. dexOptions {
  67. javaMaxHeapSize "2g"
  68. }
  69. //渠道Flavors
  70. productFlavors {
  71. wandoujia {
  72. manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
  73. }
  74. xiaomi {
  75. manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
  76. }
  77. }
  78. //修改生成的apk名字及輸出文件夾
  79. applicationVariants.all { variant ->
  80. variant.outputs.each { output ->
  81. //新名字
  82. def newName
  83. //時間戳
  84. def timeNow
  85. //輸出文件夾
  86. def outDirectory
  87. //是否爲Jenkins打包,輸出路徑不一樣
  88. if ("true".equals(IS_JENKINS)) {
  89. //Jenkins打包輸出到服務器路徑
  90. timeNow = BUILD_TIME
  91. //BUILD_PATH爲服務器輸出路徑
  92. outDirectory = BUILD_PATH
  93. //AutoBuildTest-v1.0.1-xiaomi-release.apk
  94. newName = 'AutoBuildTest-v' + APP_VERSION + '-' + variant.productFlavors[0].name + '-' + variant.buildType.name + '.apk'
  95. } else {
  96. //本機打包輸出在本機路徑
  97. timeNow = getDate()
  98. outDirectory = output.outputFile.getParent()
  99. if ('debug'.equals(variant.buildType.name)) {
  100. newName = "AutoBuildTest-v${APP_VERSION}-debug.apk"
  101. } else {
  102. //AutoBuildTest-v1.0.1-xiaomi-release.apk
  103. newName = 'AutoBuildTest-v' + APP_VERSION + '-' + variant.productFlavors[0].name + '-' + variant.buildType.name + '.apk'
  104. }
  105. }
  106. output.outputFile = new File(outDirectory+'/'+timeNow, newName)
  107. }
  108. }
  109. }
  110.  
  111. dependencies {
  112. compile fileTree(dir: 'libs', include: ['*.jar'])
  113. androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
  114. exclude group: 'com.android.support', module: 'support-annotations'
  115. })
  116. compile 'com.android.support:appcompat-v7:25.0.0'
  117. testCompile 'junit:junit:4.12'
  118. }

這樣在Jenkins打包的時候上面三個參數就會隨着選擇變化而變化了。

GIT_TAG參數使用配置,只需在源碼管理處的Branch引用改成$GIT_TAG引用參數名,如圖:


git_tag_use.png


參數配置完畢,看一下主頁面的效果吧,如今當即構建選項變成了 Build with Parameters,完成圖:


build_with_parameters.png

提示:

  • 若是選中了GIT_TAG中的任意版本都沒法取消選中,只能刷新;
  • 還有使用GIT_TAG時最好選擇tag版本大於等於支持Jenkins打包的版本,由於以前版本代碼中沒加須要侵入的屬性

2.按時打包

因爲篇幅緣由加上這個功能我沒用在項目中,因此請參考使用Jenkins搭建iOS/Android持續集成打包平臺配置構建觸發器部分。

3.構建命名

每次構建的時候,Build History模塊顯示是這樣的,如圖:


build_history.png


每次構建都只顯示數字(#xx),這樣很很差看,咱們想要它顯示更多的信息怎麼辦呢?好比加入構建者姓名、構建的app版本、構建的類型等。請看下圖:


set_build_name.png


配置完之後再次打包,變成了這個樣子,如圖:


build_history1.png


是否是很Nice,固然你們還能夠根據需求自行發揮~

4.Tomcat配置下載地址

打完包放在服務器上,咱們得配置一下下載環境才能下載,首先是Tomcat的安裝,這裏對Tomcat安裝就不作詳細的介紹了,若是不熟悉的請自行谷歌或百度,下面內容需基於Tomcat環境進行,個人Tomcat版本爲8.0+。

這裏說一下如何使用Tomcat配置下載地址,首先進入Tomcat目錄下的conf文件夾,而後打開server.xml文件在最後添加如圖代碼:


erver.png
  1. <!-- docBase爲絕對路徑即板寸apk文件的文件夾,path爲相對地址即在地址欄訪問的地址-->
  2. <Context reloadable="true" docBase="C://android/downloadApk" crossContext="true" path="/downloadApk"/>

添加完這句話之後啓動Tomcat服務,打開瀏覽器輸入IP:Port/downloadApk,就能夠訪問了點擊你想要的文件下載吧。

5.二維碼下載

二維碼下載功能,如今網上大多數的作法是經過蒲公英或者fir.im來生成二維碼,這兩個都是內測平臺,我體驗過蒲公英,須要將文件傳到蒲公英網站而後他們生成二維碼返回,傳到別處總感受怪怪的,因而我決定本身生成二維碼而後放在下載地址的文件夾中,經過連接顯示。

首先要在電腦上安裝python環境,請看http://www.cnblogs.com/yuanzm/p/4089856.html(Python問題一)python 安裝PIL (Python Imaging Library )來進行安裝,若是已經安裝繼續往下看。生成二維碼我用了qrcode這個庫,感謝大神的分享,這個庫如何使用就不介紹了,我只說一下Jenkins如何執行python。

添加python的環境變量到Jenkins的環境變量中,文章前面有提到過,在系統管理->系統設置中,如圖添加python環境變量:


python.png


注意:鍵名須要和電腦上系統環境變量內的鍵名保持一致。

而後打開項目配置頁面,在構建版塊點擊添加構建步驟,如圖:


add_build.png


在編輯框內輸入qrcode項目的使用命令


python_build.png

注意:下載地址須要本身拼接,生成路徑也須要本身拼接。

這樣每次打包後都會在生成apk的文件夾內生成一個對應的二維碼。掃一掃就能夠下載啦~~~

6.構建後操做

構建完成後,我但願將下載地址和二維碼放在Build History的版塊中,方便下載,那麼咱們就來設置一下,打開項目配置頁,如圖操做:


build_after.png


Description輸入框內添加

  1. <!-- 需替換連接地址 -->
  2. ![](http:/192.168.1.88:8088/downloadApk/${BUILD_TIME}/qrcode.png) <br>
  3. <a href="http://192.168.1.88:8088/downloadApk/${BUILD_TIME}/AutoBuildTest-v${APP_VERSION}-${PRODUCT_FLAVOR}-${BUILD_TYPE}.apk">下載鏈接</a>

7.郵件通知

打完包,我想通知須要下載的人怎麼辦?發郵件~~Jenkins自帶了郵件功能,可是不太好用,因此我選擇了Email Extension Plugin這個插件來實現發郵件功能(已經在插件列表中)。進入系統管理->系統設置頁面,如圖:



mail.png


郵件格式:

  1. [Jenkins構建通知]$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
  2.  
  3. (郵件由Jenkins自動發出,請勿回覆~) <br>
  4. 項目名稱:$PROJECT_NAME <br>
  5. 構建編號:$BUILD_NUMBER <br>
  6. 構建狀態:$BUILD_STATUS <br>
  7. 觸發緣由:${CAUSE} <br>
  8. 構建地址: <A HREF="${BUILD_URL}">${BUILD_URL}</A><br>
  9. 構建輸出日誌: <a href="http://192.168.1.201:8090/job/${PROJECT_NAME}/${BUILD_NUMBER}/console">http://192.168.1.201:8090/job/${PROJECT_NAME}/${BUILD_NUMBER}/console</a><br>
  10. 下載地址: <a href="http://192.168.1.88:8088/downloadApk">http://192.168.1.88:8088/downloadApk</a><br><br>
  11. 二維碼下載:![](http://192.168.1.88:8088/downloadApk/${BUILD_TIME}/qrcode.png) <br>
  12. 最近修改: <br>${CHANGES, showPaths=false, format="%a:\"%m\"<br>", pathFormat="\n\t- %p"}

注意:請自行修改對應的地址,關於最近修改請參照http://stackoverflow.com/questions/7773010/how-to-include-git-changelog-in-jenkins-emails

最終的效果圖是介個樣子的:


mail1.png

遇到的錯誤

1.AAPT err(Facade for 26390200):build-tools/23.0.1/aapt: /lib/libc.so.6: version `GLIBC_2.11' not found /23.0.1/aapt)

在將Jenkins部署到linux服務器的時候出現了這個錯誤,lib/libc.so.6是linux系統的c庫,因爲咱們公司服務器的linux系統太老,致使最高支持GLIBC_2.5,雖然能夠經過升級內核來解決,可是有風險,因此最後決定仍是部署到了Windows服務器上面。因此在部署到Linux服務器上面以前先檢查你的Linux系統所支持的GLIBC_2.xx的版本,Android Build-Tools 25.0.0的須要GLIBC_2.14

2.local.properties:sdk.dir not found or ANDROID_HOME not found

很差意思,由於沒及時記錄因此這個錯誤我只記了大概,並且配置完之後,想出現這個錯誤居然沒復現,因此只能看個大概了。這個錯誤主要是配置Android SDK路徑爲ANDROID_HOME環境變量沒有配置。Windows上面配置一下環境變量;名字ANDROID_HOME:值爲Android SDK路徑。還有一種方法,配置Jenkins的環境變量名字和值和上面同樣,添加到系統管理->系統設置->全局屬性下面有一個Environment variables 勾上,而後添加環境變量便可

總結

Jenkins打包並不難,最難的地方就是安裝插件,因爲公司網絡不太給力致使安裝插件至少半天,坑啊~~~

若是在Linux系統上和Mac上使用Jenkins的化設置起來幾乎無差異,只是須要的文件格式大同小異而已。

因爲篇幅比較多,但願你們看完多多反饋,有什麼問題也能夠留言。

參考

使用Jenkins搭建iOS/Android持續集成打包平臺
利用Jenkins玩轉Android自動打包發包

相關文章
相關標籤/搜索