Jenkins+Gradle 實現 Android 自動化構建
Jenkins簡介
Jenkins是一個開源軟體專案,旨在提供一個開放易用的軟體平臺,使軟體的持續整合變成可能。目前大部分公司都在使用Jenkins來持續構建。
Jenkins下載與安裝配置
Jenkins下載
安裝Jenkins有兩種方式:
第一種就是下載安裝包直接安裝,下載地址:http://mirrors.jenkins-ci.org
第二種就是下載war包,放到Tomcat中啟動。war包下載地址:http://mirrors.jenkins-ci.org/war/,
或者http://updates.jenkins-ci.org/download/war/
這裡因為我電腦上面之前裝了Tomcat,所以我使用直接下載war包的方式進行安裝。
Jenkins安裝
將下載的jenkins.war放到Tomcat下的webapps目錄下,然後啟動Tomcat。在瀏覽器中訪問”Tomcat訪問地址/jenkins”即可安裝,因為我的Tomcat裝在本機,並且埠為8080,所以訪問http://localhost:8080/jenkins/即可進行安裝。
Jenkins配置
Jenkins安裝之後可以進行使用者的許可權設定、外掛的安裝等配置。
使用者許可權設定
系統管理–>Configure Global Security
如下圖所示,在此處可以新增、刪除使用者以及配置使用者許可權。
外掛安裝
搭建Android自動化打包環境需要安裝Gradle外掛,如果使用Git還需要Git的外掛,安裝Jenkins時預設已經安裝了這兩個外掛。如果沒有安裝可以進入“系統管理>管理外掛”進行外掛的安裝。
建立Jenkins任務
要想Jenkins能夠幫我們自動構建專案,我們需要建立一個任務,並且配置這個任務要它幫我們執行什麼操作,以及什麼時候執行等。
如上圖所示,點選“新建”按鈕並且選擇“構建一個自由風格的軟體專案”,完了之後會進入到任務的配置介面,配置好之後任務會出現在如上圖右邊的任務列表中。
任務配置
建立一個任務之後,會自動跳轉到任務的配置介面對該任務進行配置,大概包括如下配置:
原始碼管理
構建專案,當然得有程式碼了。Jenkins支援使用版本控制工具來進行原始碼管理,比如Git或者SVN。這裡我使用的是Git,專案使用的是我的github上面的一個多渠道打包的demo。在Repository URL中輸入專案地址,點選Add按鈕新增認證資訊,然後選擇構建的分支,我這裡使用的是master分支。
構建觸發器
Jenkins支援上圖所示的觸發時機配置,如果都不選,則為手動構建,需要點選“立即構建”按鈕才構建。
Build periodically:週期進行專案構建(它不關心原始碼是否發生變化);
Build when a change is pushed to GItHub:表示只要GitHub上面原始碼一更新即進行構件;
Poll SCM:定時檢查原始碼變更(根據SCM軟體的版本號),如果有更新就checkout最新code下來,然後執行構建動作。
Build periodically和Poll SCM都支援日程表的設定,這個與Spring框架中定時器的日程表配置類似,有5個引數:
第一個引數代表的是分鐘 minute,取值 0~59;
第二個引數代表的是小時 hour,取值 0~23;
第三個引數代表的是天 day,取值 1~31;
第四個引數代表的是月 month,取值 1~12;
最後一個引數代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。
如:
選擇Build periodically並設定日程表為“0 4 ”,則表示每天凌晨4點構建一次原始碼。
選擇Poll SCM並設定日程表為“/10 ”,則表示每10分鐘檢查一次原始碼變化,如果有更新才進行構建。
構建工具
因為現在Android專案預設都是使用Gradle來進行構建的,所以在構建中我選擇的是Invoke Gradle script。當然你也可以選擇其它的構建工具,比如Ant。
選擇Invoke Gradle script之後可以選Invoke Gradle和Use Gradle Wrapper,選擇Invoke Gradle就是呼叫本地安裝配置好的Gradle,此時需要指定Gradle路徑。為了方便所有開發者同意Gradle版本,一般都使用Gradle Wrapper。關於Gradle和Gradlew的區別可以看這篇文章https://www.zybuluo.com/xtccc/note/275168。
Tasks中填上需要執行的gradle的task。上面我填的clean assembleRelease,即執行gradlew clean assembleRelease。
構建後的操作
配置構建後的操作可以讓Jenkins在構建完之後執行什麼操作,比如郵件通知、構建其它專案等。
這裡我配置了Archive the artifacts,在“用於存檔的檔案”中填寫需要存檔的檔名,可以使用萬用字元。比如上面我配置了app/build/outputs/apk/v*.apk,表示疑v開頭的apk檔案都存檔。構建完之後在任務首頁可以下載存檔的檔案。
任務配置完成之後,點選任務首頁的“立即構建”按鈕,即可開始構建,構建過程首先會將原始碼下載下來,位於jenkins目錄下的workspace中。然後執行配置好的gradle命令,如果使用gradlew,第一次應該會下載gradlew設定的版本的gradle,最後執行構建任務。構建完之後,如下圖,可以看到存檔的檔案,點選即可下載。
附:Android工程build.gradle檔案
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.lauren.multichanneldemo" minSdkVersion 17 targetSdkVersion 23 versionCode 1 versionName "1.0" } signingConfigs { release { def liulingStoreFile = System.getenv("LIULING_STORE_FILE") def liulingKeyAlias = System.getenv("LIULING_KEY_ALIAS") def liulingKeyPassword = System.getenv("LIULING_KEY_PASSWORD") def liulingStorePassword = System.getenv("LIULING_STORE_PASSWORD") def isSigning = (liulingStoreFile != null) && (liulingKeyAlias != null) && (liulingKeyPassword != null) && (liulingStorePassword != null) if(isSigning){ storeFile file(liulingStoreFile) keyAlias liulingKeyAlias keyPassword liulingKeyPassword storePassword liulingStorePassword } else { storeFile file("debug.keystore") keyAlias "AndroidDebugKey" keyPassword "android" storePassword "android" } } debug { storeFile file("debug.keystore") keyAlias "AndroidDebugKey" keyPassword "android" storePassword "android" } } buildTypes { release { // 不顯示Log buildConfigField "boolean", "LOG_DEBUG", "false" //啟用混淆程式碼的功能 minifyEnabled true //壓縮對齊生成的apk包 zipAlignEnabled true //指定混淆規則,需要壓縮優化的混淆要把proguard-android.txt換成proguard-android.txt proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' shrinkResources true signingConfig signingConfigs.release //打包命令列:gradlew assembleRelease } debug { signingConfig signingConfigs.debug } } lintOptions { abortOnError false } // productFlavors { // _91 { // manifestPlaceholders = [MTA_CHANNEL_VALUE: "91"] // } // wandoujia { // manifestPlaceholders = [MTA_CHANNEL_VALUE: "wandoujia"] // } // xiaomi { // manifestPlaceholders = [MTA_CHANNEL_VALUE: "xiaomi"] // } // // _360shoufa{ // manifestPlaceholders = [MTA_CHANNEL_VALUE: "360shoufa"] // } // anzhi{ // manifestPlaceholders = [MTA_CHANNEL_VALUE: "anzhi"] // } // baidushoufa{ // manifestPlaceholders = [MTA_CHANNEL_VALUE: "baidushoufa"] // } // huaweishoufa{ // manifestPlaceholders = [MTA_CHANNEL_VALUE: "huaweishoufa"] // } // } // 如果嫌上面寫法麻煩,也可以這樣簡寫,加上一個批量處理即可. productFlavors { _91 {} wandoujia {} xiaomi {} _360shoufa{} anzhi{} baidushoufa{} huaweishoufa{} } //批量處理 productFlavors.all { flavor -> def channel = name.startsWith("_") ? name.substring(1) : name flavor.manifestPlaceholders = [MTA_CHANNEL_VALUE: channel] } applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (variant.buildType.name.equals('release')) { //可自定義自己想要生成的格式 def channel = variant.productFlavors[0].name.startsWith("_") ? variant.productFlavors[0].name.substring(1) : variant.productFlavors[0].name def fileName = "v${defaultConfig.versionName}_${releaseTime()}_${channel}.apk" output.outputFile = new File(outputFile.parent, fileName) } } } apply from: 'productFlavors.gradle' } def releaseTime() { return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC")) } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' }
相關文章
- Gradle自動實現Android元件化模組構建GradleAndroid元件化
- 通過Gradle自動實現Android元件化模組構建GradleAndroid元件化
- Jenkins + Gitee 實現程式碼自動化構建JenkinsGitee
- Android Jenkins自動化構建之路AndroidJenkins
- Webpack自動化構建實踐指南Web
- 前端之路: 用github的webhooks實現專案自動化構建前端GithubWebHook
- Android Gradle Groovy自動化構建進階篇AndroidGradle
- 用 Jenkins 自動化構建 Android 和 iOS 應用JenkinsAndroidiOS
- Mac 環境下 Android 使用 Jenkins 構建自動化打包MacAndroidJenkins
- Window下采用ant 指令碼構建Android自動化編譯指令碼Android編譯
- 淺談自動化構建之grunt
- 淺談自動化構建之gulp
- Grunt自動化構建環境搭建
- tomcat+svn+maven+jenkins實現自動構建TomcatMavenJenkins
- Android自動化測試工具實現簡述Android
- Android UI 自動化測試實現過程AndroidUI
- Selenium自動化實現web自動化-1Web
- Jenkins自動化前端專案構建Jenkins前端
- 構建高效的自動化測試框架框架
- Android Gradle基於引數化配置實現差異化構建AndroidGradle
- 【CMS實戰】第二彈 構建運營自動化平臺
- 優酷 Android 構建速度優化實踐Android優化
- 解密prompt系列5. APE+SELF=自動化指令集構建程式碼實現解密
- IT 自動化:如何去實現
- Element-UI 中 Make 自動化構建分析UI
- 使用Kubernetes 構建自動化平臺
- 如何構建自動化的前端開發流程前端
- Jenkins和maven自動化構建java程式JenkinsMavenJava
- 前端自動化:Node 命令列前端自動構建釋出系統前端命令列
- android自動化測試_uiautomator方案實現要點AndroidUI
- 使用Jenkins自動構建Android問題總結JenkinsAndroid
- Android無障礙自動化結合opencv實現支付寶能量自動收集AndroidOpenCV
- 利用fastlane進行專案的自動化構建AST
- Jenkins 構建自動化 .NET Core 釋出映象Jenkins
- 使用gulp編寫常用自動化構建任務
- 「移動開發」iuap mobile玩轉前端自動化構建移動開發前端
- iOS如何實現自動化打包iOS
- 使用gulp實現前端自動化前端