Jenkins + gradle + git 构建 Android CI 构建环境

GitHub 地址

前言

在项目开发中,我们需要将最新的代码更新,提供给测试人员进行测试,以及发布。

目前 Android 工作中都在使用很强大的开发、构建以及打包工具,例如: android-studio、Gradle、Git等。

然,在企业组织并不是很完善的公司里,开发打包发布等工作,时常会由开发人员进行操作,难免在一些地方疏忽掉。

因此,CI 构建的出现,使得这些繁琐的工作变得轻松起来。

对于开发工程师,只负责向版本库提交代码,不用关心打包,发布之类的流程。

对于产品和测试,只需要从发布页面下载 APK 安装文件,不需要每一次都去工程师哪里索取最新的安装文件。

CI 的基本工作流程如下:


图1

我们每一次提交代码(通过git/svn作为版本库)到主干上,根据 CI 的定时任务,检测到版本更新,通过 CI ,将进行打包发布等流程操作。

准备工作

本文使用 Linux Ubuntu 系统为大家介绍环境的搭建

环境工具

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

环境搭建

Java 环境 安装

Java JDK, Android SDK, Gradle 可从AndroidDevTools处下载获取。

git 安装

git 可通过终端进行安装

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 官方网站下载最新Jenkins.war包

Jenkins 下载

环境变量

打开 vi /etc/profile

将下列语句添加在文件的末尾后, 执行 esc->:wq

其中环境位置根据自己的所在位置进行相应的更改

环境变量

启动

激动的你,是不是已经被这些繁琐的东西搞的不耐烦了呢,下面我们开始启动 Jenkins

将下载好的 Jenkins.war 包, 放入 Tomcat 的 webapps 目录下,进入 bin 目录执行 ./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)

插件安装

系统管理-> 插件管理->可选插件:

在搜索框中搜索以下插件,并进行安装

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

安装完成后,重启。

系统设置

系统管理->系统设置:

配置Android 环境,将地址指向本机的 SDK 目录


Android environment

系统管理->全局工具配置

配置 Java, Git , Gradle 目录等

JDK:

Java JDK

Git:

git

Gradle:

gradle

到此,环境配置,已基本完成。

下面我们开始进行项目够将操作

项目构建

创建Job

新建->构建一个自由风格的软件项目:

创建CI工程

参数化构建

通常我们在使用 Android-studio 进行打包时以及签名时,都会用到build.gradle并在其中配置相关属性。再此,我们可以用Jenkins,配置我们的项目参数,例如发布的版本号,构建时间, 上传路径,发布地址,签名打包等等。

在这里我们先看看 build.gradle 中的构建信息:

在项目的 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中为这些参数赋值。

下面介绍 Jenkins 参数配置

勾选参数化构建过程,如下图:


参数化构建

按照下图,添加相关类型的参数,此处注意,Jenkins 配置的参数名要和在android-studio中配置的参数名保持一致

JENKINS_TIME

APP_VERSION

IS_JENKINS

ENVIRONMENT

源码管理

此处负责从版本库中拉去最新的代码

git 仓库

此处如果需要验证,点击 Add, 选择: Username with password

在对应窗口输入用户名和密码信息


用户身份验证

点击添加。

使用 gitlab 进行源码库管理。

触发器

触发器负责拉取代码,编译,打包,发布等操作。通过触发器,执行Jenkins。

触发器构建

构建环境

此处只是在Jenkins在打包时,配置任务名称即可。如下图:

构建环境

构建

这里是最重要滴,配置以下命令,才能进行打包签名等等。

如下配置,这里需要注意下,构建文件,根目录。在你的目录结构比较复杂的时候,即你的根目录没有 build.gradle 文件时,需要指定一下 build.gradle 目录的位置。

同时,也是最重要的,勾选上pass job parameters as gradle properties ,不然之前配置的参数无法传递给项目中的 gradle.properties。

构建

构建后操作

当项目构建完成后,我们可以通过邮件的方式将产生的Apk文件,以及测试报告,构建日志等信息,发送出来 如下图:

邮件发送
<hr/>
(本邮件是程序自动下发的,请勿回复!)<br/><hr/>
项目名称:${PROJECT_NAME}<br/><hr/>
构建编号:${BUILD_NUMBER}<br/><hr/>
构建状态:${BUILD_STATUS}<br/><hr/>
触发原因:${CAUSE}<br/><hr/>
测试报告:<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/>
构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console/</a><br/><hr/>
构建地址:<a href="${PROJECT_URL}">${PROJECT_URL}</a><br/><hr/>
构建报告:<a href="${BUILD_URL}testReport">${BUILD_URL}testReport</a><br/><hr/>
变更集:${JELLY_SCRIPT,template="html"}<br/>

<hr/>

开始构建

回到 Jenkins 首页,点击创建的项目,点击 build with parameters:

Build with Parameters

点击开始构建,启动 Jenkins 构建任务。

构建成功时,显示为蓝色, 失败为红色,如下图:

构建结果

构建后生成的 Apk 文件,存在 build.gradle 文件中配置的目录。同时也可以使用蒲公英或fir.im 进行发布管理。

谢谢~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 在项目的上个版本,老大说将Android打包搞到服务器上,让所有人都可以享受打包的乐趣,接着就有了这篇文章~Jen...
    zyyoona7阅读 55,869评论 89 312
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,454评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 这一章主要针对项目中可以用到的一些实用功能来介绍Android Gradle,比如如何隐藏我们的证书文件,降低风险...
    acc8226阅读 7,556评论 3 25
  • 总说,眼睛是心灵的窗户,而我,也觉得眼睛真的是人身上最美的部分。 看了好多眼睛,今儿个自己斗胆创作了一只,我会告诉...
    张鹿鹿阅读 373评论 0 0