Jenkins + gradle + git 構(gòu)建 Android CI 構(gòu)建環(huán)境

GitHub 地址

前言

在項(xiàng)目開發(fā)中,我們需要將最新的代碼更新,提供給測試人員進(jìn)行測試州疾,以及發(fā)布。

目前 Android 工作中都在使用很強(qiáng)大的開發(fā)皇拣、構(gòu)建以及打包工具严蓖,例如: android-studio、Gradle氧急、Git等颗胡。

然,在企業(yè)組織并不是很完善的公司里吩坝,開發(fā)打包發(fā)布等工作毒姨,時(shí)常會由開發(fā)人員進(jìn)行操作,難免在一些地方疏忽掉钉寝。

因此弧呐,CI 構(gòu)建的出現(xiàn),使得這些繁瑣的工作變得輕松起來嵌纲。

對于開發(fā)工程師俘枫,只負(fù)責(zé)向版本庫提交代碼,不用關(guān)心打包疹瘦,發(fā)布之類的流程崩哩。

對于產(chǎn)品和測試巡球,只需要從發(fā)布頁面下載 APK 安裝文件言沐,不需要每一次都去工程師哪里索取最新的安裝文件邓嘹。

CI 的基本工作流程如下:


圖1

我們每一次提交代碼(通過git/svn作為版本庫)到主干上,根據(jù) CI 的定時(shí)任務(wù)险胰,檢測到版本更新汹押,通過 CI ,將進(jìn)行打包發(fā)布等流程操作起便。

準(zhǔn)備工作

本文使用 Linux Ubuntu 系統(tǒng)為大家介紹環(huán)境的搭建

環(huán)境工具

  1. PC 機(jī)(mac/linux)
  2. Java JDK
  3. Android SDK
  4. Gradle
  5. Git
  6. Tomcat
  7. Jenkins

環(huán)境搭建

Java 環(huán)境 安裝

Java JDK, Android SDK, Gradle 可從AndroidDevTools處下載獲取棚贾。

git 安裝

git 可通過終端進(jìn)行安裝

sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

安裝完成之后通過git --version 檢查是否成功

安裝后 git 存儲在 /usr/bin/git

Jenkins

通過 Jenkins 官方網(wǎng)站下載最新Jenkins.war包

Jenkins 下載

環(huán)境變量

打開 vi /etc/profile

將下列語句添加在文件的末尾后, 執(zhí)行 esc->:wq

其中環(huán)境位置根據(jù)自己的所在位置進(jìn)行相應(yīng)的更改

環(huán)境變量

啟動

激動的你榆综,是不是已經(jīng)被這些繁瑣的東西搞的不耐煩了呢妙痹,下面我們開始啟動 Jenkins

將下載好的 Jenkins.war 包, 放入 Tomcat 的 webapps 目錄下鼻疮,進(jìn)入 bin 目錄執(zhí)行 ./startup.sh 啟動 Tomcat怯伊。

啟動后,在瀏覽器中輸入: localhost:8080/jenkins

![jenkinsmain.png](http://upload-images.jianshu.io/upload_images/1550996-cbdb39d4f2f4a85f.png?
imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

插件安裝

系統(tǒng)管理-> 插件管理->可選插件:

在搜索框中搜索以下插件判沟,并進(jìn)行安裝

git plugin
gitlab plugin
grade plugin
Android Lint Plugin
Build Pipeline plugin
build timeout plugin
build name plugin
change assembly-version plugin
credentials binding plugin
description setter plugin
Dynamic parameter plugin
Email Extension plugin
FindBugs plugin
JaCoco plugin
Unit attachments plugin
Project Description plugin
Timestamper
Workspace cleanup plugin

安裝完成后耿芹,重啟。

系統(tǒng)設(shè)置

系統(tǒng)管理->系統(tǒng)設(shè)置:

配置Android 環(huán)境挪哄,將地址指向本機(jī)的 SDK 目錄


Android environment

系統(tǒng)管理->全局工具配置

配置 Java吧秕, Git , Gradle 目錄等

JDK:

Java JDK

Git:

git

Gradle:

gradle

到此迹炼,環(huán)境配置砸彬,已基本完成。

下面我們開始進(jìn)行項(xiàng)目夠?qū)⒉僮?/p>

項(xiàng)目構(gòu)建

創(chuàng)建Job

新建->構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目:

創(chuàng)建CI工程

參數(shù)化構(gòu)建

通常我們在使用 Android-studio 進(jìn)行打包時(shí)以及簽名時(shí)斯入,都會用到build.gradle并在其中配置相關(guān)屬性拿霉。再此,我們可以用Jenkins咱扣,配置我們的項(xiàng)目參數(shù)绽淘,例如發(fā)布的版本號,構(gòu)建時(shí)間闹伪, 上傳路徑沪铭,發(fā)布地址,簽名打包等等偏瓤。

在這里我們先看看 build.gradle 中的構(gòu)建信息:

在項(xiàng)目的 moudle 下 build.gradle 文件

def getDate () {
    def date = new Date()
    def formattedDate = date.format("yyyyMMddHHmm")
    return formattedDate
}

def verName = APP_VERSION
def verCode = 14

android {
    ....
    signingConfigs {
        release {
          keyAlias ''
          keyPassword ''
          storeFile file ('')
          storePassword ''
       }   
   }

  defaultConfig {
      applicationId "cn.zhuangbudong.example"
      minSdkVersion 18
      targetSdkVersion 25
      multiDexEnabled true
      versionCode verCode
      versionName verName

      resValues("string", 'app_version', verName)
  }
  buildTypes {
    release {
      signingConfig signingConfigs.release
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }

   lintOptions {
    abortOnError false
   }

   dexOptions {
      javaMaxHeapSize '2g'
   }

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def newName
        def timeNow
        def oldFile = output.outputFile
        def outDirectory = oldFile.parent
        if ("true".equals(IS_JENKINS)) { 
            timeNow = JENKINS_TIME
            outDirectory = "/media/nexd/work/android/package/release/"
            newName = 'zhuangbudong_example_' + verName + "_" + timeNow + "_" + variant.buildType.name + ".apk" 
       } else {
            timeNow = getDate()
            if (variant.buildType.name.equals('debug')) { 
               newName = 'zhuangbudong_example_' + verName + "_debug.apk"  
          } else { 
               newName = 'zhuangbudong_example_' + verName + "_" + timeNow + "_" + variant.buildType.name + ".apk" 
           } 
       } 
       output.outputFile = new File(outDirectory, newName)
    }}

  }
}

gradle.properties:

APP_VERSION=2.0.2
IS_JENKINS=false
JENKINS_TIME=''

在工程中添加以上代碼杀怠,并在Jenkins中為這些參數(shù)賦值。

下面介紹 Jenkins 參數(shù)配置

勾選參數(shù)化構(gòu)建過程厅克,如下圖:


參數(shù)化構(gòu)建

按照下圖赔退,添加相關(guān)類型的參數(shù),此處注意,Jenkins 配置的參數(shù)名要和在android-studio中配置的參數(shù)名保持一致

JENKINS_TIME

APP_VERSION

IS_JENKINS

ENVIRONMENT

源碼管理

此處負(fù)責(zé)從版本庫中拉去最新的代碼

git 倉庫

此處如果需要驗(yàn)證硕旗,點(diǎn)擊 Add窗骑, 選擇: Username with password

在對應(yīng)窗口輸入用戶名和密碼信息


用戶身份驗(yàn)證

點(diǎn)擊添加。

使用 gitlab 進(jìn)行源碼庫管理漆枚。

觸發(fā)器

觸發(fā)器負(fù)責(zé)拉取代碼创译,編譯,打包墙基,發(fā)布等操作软族。通過觸發(fā)器,執(zhí)行Jenkins残制。

觸發(fā)器構(gòu)建

構(gòu)建環(huán)境

此處只是在Jenkins在打包時(shí)立砸,配置任務(wù)名稱即可。如下圖:

構(gòu)建環(huán)境

構(gòu)建

這里是最重要滴初茶,配置以下命令仰禽,才能進(jìn)行打包簽名等等。

如下配置纺蛆,這里需要注意下吐葵,構(gòu)建文件,根目錄桥氏。在你的目錄結(jié)構(gòu)比較復(fù)雜的時(shí)候温峭,即你的根目錄沒有 build.gradle 文件時(shí),需要指定一下 build.gradle 目錄的位置字支。

同時(shí)凤藏,也是最重要的,勾選上pass job parameters as gradle properties 堕伪,不然之前配置的參數(shù)無法傳遞給項(xiàng)目中的 gradle.properties揖庄。

構(gòu)建

構(gòu)建后操作

當(dāng)項(xiàng)目構(gòu)建完成后,我們可以通過郵件的方式將產(chǎn)生的Apk文件欠雌,以及測試報(bào)告蹄梢,構(gòu)建日志等信息,發(fā)送出來 如下圖:

郵件發(fā)送
<hr/>
(本郵件是程序自動下發(fā)的富俄,請勿回復(fù)禁炒!)<br/><hr/>
項(xiàng)目名稱:${PROJECT_NAME}<br/><hr/>
構(gòu)建編號:${BUILD_NUMBER}<br/><hr/>
構(gòu)建狀態(tài):${BUILD_STATUS}<br/><hr/>
觸發(fā)原因:${CAUSE}<br/><hr/>
測試報(bào)告:<a href="${PROJECT_URL}ws/${PROJECT_NAME}app/build/reports/tests/release/index.html">${PROJECT_URL}ws/${PROJECT_NAME}app/build/reports/tests/release/index.html</a><br/><hr/>
構(gòu)建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console/</a><br/><hr/>
構(gòu)建地址:<a href="${PROJECT_URL}">${PROJECT_URL}</a><br/><hr/>
構(gòu)建報(bào)告:<a href="${BUILD_URL}testReport">${BUILD_URL}testReport</a><br/><hr/>
變更集:${JELLY_SCRIPT,template="html"}<br/>

<hr/>

開始構(gòu)建

回到 Jenkins 首頁,點(diǎn)擊創(chuàng)建的項(xiàng)目霍比,點(diǎn)擊 build with parameters:

Build with Parameters

點(diǎn)擊開始構(gòu)建幕袱,啟動 Jenkins 構(gòu)建任務(wù)。

構(gòu)建成功時(shí)悠瞬,顯示為藍(lán)色们豌, 失敗為紅色涯捻,如下圖:

構(gòu)建結(jié)果

構(gòu)建后生成的 Apk 文件,存在 build.gradle 文件中配置的目錄望迎。同時(shí)也可以使用蒲公英或fir.im 進(jìn)行發(fā)布管理障癌。

謝謝~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市擂煞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趴乡,老刑警劉巖对省,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晾捏,居然都是意外死亡枯冈,警方通過查閱死者的電腦和手機(jī)秫舌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贪庙,你說我怎么就攤上這事〕μ祝” “怎么了栗柒?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呀伙。 經(jīng)常有香客問我补履,道長,這世上最難降的妖魔是什么剿另? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任箫锤,我火速辦了婚禮,結(jié)果婚禮上雨女,老公的妹妹穿的比我還像新娘谚攒。我一直安慰自己,他們只是感情好氛堕,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布馏臭。 她就那樣靜靜地躺著,像睡著了一般讼稚。 火紅的嫁衣襯著肌膚如雪位喂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天乱灵,我揣著相機(jī)與錄音塑崖,去河邊找鬼。 笑死痛倚,一個(gè)胖子當(dāng)著我的面吹牛规婆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼抒蚜,長吁一口氣:“原來是場噩夢啊……” “哼掘鄙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嗡髓,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤操漠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后饿这,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浊伙,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年长捧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚣鄙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡串结,死狀恐怖哑子,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肌割,我是刑警寧澤卧蜓,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站把敞,受9級特大地震影響烦却,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜先巴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一其爵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伸蚯,春花似錦摩渺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挥萌,卻和暖如春绰姻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背引瀑。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工狂芋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人憨栽。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓帜矾,卻偏偏與公主長得像翼虫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子屡萤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 在項(xiàng)目的上個(gè)版本珍剑,老大說將Android打包搞到服務(wù)器上,讓所有人都可以享受打包的樂趣死陆,接著就有了這篇文章~Jen...
    zyyoona7閱讀 55,964評論 89 312
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,262評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理招拙,服務(wù)發(fā)現(xiàn),斷路器措译,智...
    卡卡羅2017閱讀 134,693評論 18 139
  • 這一章主要針對項(xiàng)目中可以用到的一些實(shí)用功能來介紹Android Gradle别凤,比如如何隱藏我們的證書文件,降低風(fēng)險(xiǎn)...
    acc8226閱讀 7,640評論 3 25
  • 總說瞳遍,眼睛是心靈的窗戶闻妓,而我菌羽,也覺得眼睛真的是人身上最美的部分掠械。 看了好多眼睛,今兒個(gè)自己斗膽創(chuàng)作了一只注祖,我會告訴...
    張鹿鹿閱讀 376評論 0 0