澳门威斯尼人平台登录Android自动化创设:Jenkins+Gradle

1.测试每次测试都需要让我们打包构建按转包很麻烦,如果我们自己不用打包,让测试自己打包可不可以呢,那么就是Jenkins这就是解放我们的。

简介

自动化打包目的:使打包脱离开发人员和个人电脑;减少出错率;打包流程规范化。

本文写怎么用 jenkins 和 shell 脚本打 QA 用的安装包

最基础的Jenkins 打包 Android

本文将会写 最基础的 jenkins 打包 Android 项目的
构建步骤。之后文章会写如何打测试环境和正式环境的包,如何自动打渠道包,和如何分发
安装包。


本文采用解压缩的方式来部署环境,所有的文件比如 jetty 、jenkins
都在当前目录,可以很方便的部署、移植和删除。

通过Jenkins自动构建项目,完成自动出包测试,省去手动打包的麻烦,

直接上图,按照流程一路畅通

搞完你可以安安心心的去撸代码了

需要安装的环境

JDK、Android SDK、Jenkins、Gradle、Git
本次进行环境搭建的电脑环境:OS(10.11.4)

1 . 配置 jenkins 构建环境

打开项目-> 打开 [配置]-在 [ General ] -> [参数化构建过程]
-> 选择 [添加参数]“Choice” 。[name] 处 输入
“build_type”,[Choices]处输入 “Test”
和“Release”,这些输入不是一定的,可以根据实际情况来输入。
比如 我们要打的包分两种,一种是给 QA 测试用的
安装包,会打出来两个安装包, Demo
环境的和正式环境的,这两个环境的区别是连接不同的主机,有不同的数据。另外一种是渠道包,会打出来几十个安装包,耗时比较久,一般等所有测试通过了才打渠道包。具体配置如下图

澳门威斯尼人平台登录 1

build type.png

1. 安装 Jetty

Jetty 是一个 Servlet 引擎。相比 tomcat
结构更加简单,配置起来也更加容易快速
可以到
Jetty官网
了解和下载。

tar -xvf jetty-distribution-9.3.14.v20161028.tar.gzip #解压

解压后目录为

➜  jetty pwd
/home/username/jetty
➜  jetty ls   #下载后的 jenkins.war 要放到 webapps 目录下
bin        etc  license-eplv10-aslv20.html  modules      README.TXT  start.ini  VERSION.txt
demo-base  lib  logs                        notice.html  resources   start.jar  webapps

➜  jetty java -jar ./start.jar    #启动 jetty,启动后可以打开 127.0.0.1:8080  检查是否启动成功

基本环境

(1)window 7系统

(2)Java JDK,我是用的是1.8

(3)Gradle 3.5

配置基本的环境变量就不强调了!

  • 准备一个tomcat版本不要太低软件环境:1、 windows7 64bit;2、 jdk1.83、
    android sdk4、 gradle2.10
  • 下载最新版的Jenkins-war包。下载地址
  • 启动tomcat。在地址栏输入http://localhost:8080/jenkins/,我们就可以看到如下界面澳门威斯尼人平台登录 2Paste_Image.png

1.环境安装

主要说下Mac下的Jenkins环境,其他环境请自行百度。
命令行执行:
#brew install jenkins
执行后结果:

澳门威斯尼人平台登录 3

jenkins_install_success.png

2 . 配置构建脚本

在 [构建]->选择 [Execute shell]-> 输入脚本

sh ./jenkins_build.sh ${BUILD_NUMBER} ${build_type} || exit -1

具体如下图

澳门威斯尼人平台登录 4

jenkins script

2. 安装 jenkins

在 Jenkins官网 下载
最新
war文件。将
war 文件放到 Jetty 的 webapps 目录下。
修改 jetty.xml 添加 JENKINS_HOME 为想安装的目录。

 vim /home/username/jetty/etc/jetty.xml 

添加下面配置

<Call class="java.lang.System" name="setProperty">
   <Arg>JENKINS_HOME</Arg>
   <Arg>/home/username/jettyjenkins</Arg>
</Call>

然后启动 jetty

➜  jetty java -jar ./start.jar 

打开浏览器访问 jenkins 时如果出现 HTTP ERROR 503 错误,如下。

HTTP ERROR: 503
Problem accessing /jenkins/. Reason:
   Service Unavailable
------------
Powered by Jetty

经查这是因为 Jetty
8.1.0之后对安全性有了一些要求,需要显示注明安全域(security
realm)。需要在 webapps 目录下添加 jenkins.xml 文件 并添加如下配置

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
        <Set name="contextPath">/jenkins</Set>
        <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/jenkins.war</Set>
        <Get name="securityHandler">
                <Set name="loginService">
                        <New class="org.eclipse.jetty.security.HashLoginService">
                                <Set name="name">Jenkins Realm</Set>
                                <Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
                        </New>
                </Set>
        </Get>
</Configure>

之后启动打开 127.0.0.1:8080/jenkins 即可看到 jenkins 界面。

Jenkins安装

3.安装所需要的插件,如果遇到插件列表为空,在系统管理里面-高级选项,升级站点选择这个地址

2.按安装提示

应该是开机启动的意思,也可以不执行该命令,影响暂不清楚。
要执行的话还是在命令行运行:
#ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents

3. jenkins 脚本

真正控制做构建的就在这了。脚本如下
jenkins_build.sh, 这个脚本文件放到 project 下,jenkins
打包时就能找到这个文件。

#!/bin/sh

build_number=$1

if [ -z $build_number ]; then
    build_number=0
fi

build_type=$2

if [ -z $build_type ]; then
    build_type="Test"
fi

root_path="`dirname $0`"
root_path_prefix=${root_path}
if [ "$root_path_prefix" != "/" ]; then
    root_path="`pwd`/${root_path}"
fi
root_path="`pwd`"
echo ${root_path}
if [ ! -z "$build_number" ]  && [ ! -z "$root_path" ]; then
        rm -rf ${root_path}/output/Build_${build_number}
fi

mkdir -p ${root_path}/output/Build_${build_number}

if [ "$build_type" = "Test" ]; then
    echo ${root_path}
    ${root_path}/gradlew --no-daemon clean assembleDemo官网Qa -PBUILD_NUMBER=${build_number} || exit -1
    ${root_path}/gradlew --no-daemon clean assembleOnline官网Qa -PBUILD_NUMBER=${build_number} || exit -1
else
    ${root_path}/gradlew --no-daemon clean assembleRelease -PBUILD_NUMBER=${build_number} || exit -1
fi

这个脚本所做的就是根据环境的不同执行不同的gradle命令。

哦,对了,这段脚本需要配合 build.gradle 使用。
还需要在 build.gralde 中添加 如下配置
这部分配置是用来打不同环境 的包的,有 本地开发用的Dev,有demo 和
online,渠道就一个官网。

  productFlavors {

        flavorDimensions "enviroment", "channel"

        Dev {
            dimension "enviroment"
            applicationId = ANDROID_BUILD_DEV_APP_ID
            manifestPlaceholders = [APP_NAME: 'UmuDev']
        }

        Demo {
            dimension "enviroment"
            applicationId = ANDROID_BUILD_DEMO_APP_ID
            manifestPlaceholders = [APP_NAME: 'UmuDemo']
        }

        Online {
            dimension "enviroment"
            applicationId = ANDROID_BUILD_APP_ID
            manifestPlaceholders = [APP_NAME: 'Umu']
        }

        官网 {
            dimension "channel"
            manifestPlaceholders = [CHANNEL_NAME: 'portal']
        }
    }

以下代码大部分功能是将 project/app/build/outpus 中打出的 apk 放到
project/output 中

 android.variantFilter { variant ->
        if (variant.buildType.name.equals('release') && variant.getFlavors().get(0).name.equals('Demo')) {
            variant.setIgnore(true);
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def buildRootDir = buildDir.getParentFile().getParentFile()
            def buildOutputRootDir = new File(buildRootDir, "output")
            def buildOutputDir = new File(buildOutputRootDir, "Build_${BUILD_NUMBER}")
            def version = defaultConfig.versionName;
            if (variant.buildType.versionNameSuffix) {
                version += variant.buildType.versionNameSuffix
            }
            def dirname = "umu-" + variant.productFlavors[0].name + "-" + variant.buildType.name + "-" + version + "-" + variant.productFlavors[1].name;

            def apkDir = new File(buildOutputDir, dirname)
            output.outputFile = new File(apkDir, dirname + ".apk");

            if (variant.buildType.minifyEnabled) {
                variant.assemble.doLast {
                    copy {
                        from variant.mappingFile
                        into "${apkDir.absolutePath}"
                        rename { String fileName ->
                            "${dirname}_mapping.txt"
                        }
                    }
                }
            }
        }
    }

3. 配置 jenkins

  • 安装插件 git plugin ssh

  • 配置 Android_HOME
    在 [系统管理]->[系统设置] 页面-> [全局属性]部分->
    勾选 [Environment variables] 添加键值对
    键 Android_HOME
    值 /android/sdk/path

下载Jenkins:

官网地址:Jenkins官网;将下载好了的.zip的jenkins解压,然后直接运行jenkins.msi程序进行安装即可

4.我们选择新建一个项目

3.启动Jenkins

运行命令:
#jenkins
会输出一些信息:包括Jenkins.war所在目录等,这个时候应该就是安装并且启动成功了

澳门威斯尼人平台登录 5

jenkins_start_success.png

4. 打包

配置好之后点击 [构建] 然后选 Test ,编译完成后可以看到 output
中多了俩文件,如下图。

澳门威斯尼人平台登录 6

4 新建Android项目

点击[新建]->选择[构建一个自由风格的软件项目],进入项目配置页面。

开始安装

安装的过程中一路next就行,但是安装路径自己决定,

注意点:1、这里需要填写的密码,根据你安装jenkin的路径下面早,然后将密码粘贴过来就ok

澳门威斯尼人平台登录 7

2、插件的安装,使用第一个建议安装项就可以了,基本上需要都在里面,网速可以的话基本上两分钟搞定

3、创建自己的账户,记住密码,免得还要找回麻烦

澳门威斯尼人平台登录 8image.png

4.验证启动是否真的成功了

浏览器打开:http://localhost:8080

如果能看到左上角的老人头,验证已经成功启动了。

澳门威斯尼人平台登录 9

verify_start_success.png

5 未完待续

下面会写上传安装包到蒲公英进行分发。

5 配置Git

源码管理选择 [Git],[Repository URL] 输入项目的 git 地址,
[Credentials] 我选择的默认的 “none” ,直接用的当前账号的ssh 目录
/home/username/.ssh 下 id_rsa。

配置Jenkins

系统配置,直接上图

澳门威斯尼人平台登录 10

=

配置Android
Home路径,这里必须要和你的系统配置的环境变量一样,切记,不然会后面报错

澳门威斯尼人平台登录 11

5.按照以下信息设置

5.在Jenkins中安装插件

系统管理 > 管理插件 > 可选插件
1.gradle:Gradle plugin,对Gradle的支持;
2.Gitlab:GitLab Plugin,因为代码在由GitLab管理。
安装可能需要一些时间,成功后重启Jenkins(在启动Jenkins的命令行窗口ctrl+c,然后启动服务,并刷新浏览器)。

6 配置 Gradle 编译代码

[构建] ->[增加构建步骤]->[Invoke Gradle script]-[task]
输入 “ clean build ”
然后 点击 [保存]
这样最简单可打包的项目配置就结束了。

下面开始配置全局工具,这里包含jdk,git,gradle 等等

澳门威斯尼人平台登录 12

澳门威斯尼人平台登录 13

澳门威斯尼人平台登录 14image.png

6.配置Jenkins中的环境变量

系统管理 > 系统设置
1.Android SDK

澳门威斯尼人平台登录 15

Android_SDK_config.png

2.JDK

澳门威斯尼人平台登录 16

JDK_config.png

3.Git

澳门威斯尼人平台登录 17

git_config.png

4.Gradle

澳门威斯尼人平台登录 18

Gradle_config.png

注意:路径根据具体的情况设置

7 项目构建

回到项目主页 -> 点击 [立即构建],可以看到 左下栏 [Build History]
窗口有项目进度条。点开进度条可以看到 此次构建的基本信息,点击 [Console
Output] 可以看到构建的控制台输出。项目构建完成后可以看到 “Build
Success”。进入 项目主页的 [工作空间] 可以看到项目结构,找到 output
即可看到构建生成的 apk 文件等。

下面就可以开始新建项目了

澳门威斯尼人平台登录 19

澳门威斯尼人平台登录 20

设置你的github项目的地址,添加自己的github的用户名和密码进去

澳门威斯尼人平台登录 21

澳门威斯尼人平台登录 22

=

澳门威斯尼人平台登录 23

澳门威斯尼人平台登录 24

澳门威斯尼人平台登录 25

澳门威斯尼人平台登录 26

点击保存,已经完成了哈,现在开始构建项目就成功了

澳门威斯尼人平台登录 27

这里面的用户名密码需要在此目录下面配置svn的用户名和密码

7.创建工程,并配置

点击左侧新建,创建一个新的需要被构建的工程;
点击OK之后成功创建并自动跳到工程对应的配置页。

8 未完待续

之后会讲如何打多渠道包,如何打不同环境的包,如何上传安装包到蒲公英进行分发。
Jenkins + Gradle 持续自动化构建
Android(2)

参考文章
http://smilejay.com/2013/06/deploy-jenkins-in-jetty/
http://www.pgyer.com/doc/view/jenkins

Jenkins注意事项:

(1)配置中的环境变量一定要和系统的环境变量一直

(2)这种一定不是什么图片的错误,而是你的路径名称太长了导致,很坑

19:33:53.873 [INFO] [org.gradle.api.Project] AAPT out(Facade for
759978323): Error

19:33:53.873 [INFO] [org.gradle.api.Project] AAPT out(Facade for
759978323): -> QueuedJob{

title=Cruncher abc_menu_hardkey_panel_mtrl_mult.9.png,

v4\abc_spinner_mtrl_am_alpha.9.png ERROR: Unable to open PNG file

19:33:53.878 [ERROR] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-xxhdpi-v4\abc_spinner_mtrl_am_alpha.9.png
ERROR: Unable to open PNG file

19:33:53.878 [INFO] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-mdpi-v4\abc_list_selector_disabled_holo_light.9.png
ERROR: Unable to open PNG file

19:33:53.878 [ERROR] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-mdpi-v4\abc_list_selector_disabled_holo_light.9.png
ERROR: Unable to open PNG file

19:33:53.879 [INFO] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-hdpi-v4\abc_list_longpressed_holo.9.png
ERROR: Unable to open PNG file

19:33:53.879 [ERROR] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-hdpi-v4\abc_list_longpressed_holo.9.png
ERROR: Unable to open PNG file

19:33:53.879 [INFO] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-xxhdpi-v4\abc_textfield_activated_mtrl_alpha.9.png
ERROR: Unable to open PNG file

19:33:53.879 [ERROR] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-xxhdpi-v4\abc_textfield_activated_mtrl_alpha.9.png
ERROR: Unable to open PNG file

19:33:53.879 [INFO] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-xhdpi-v4\abc_popup_background_mtrl_mult.9.png
ERROR: Unable to open PNG file

19:33:53.879 [ERROR] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-xhdpi-v4\abc_popup_background_mtrl_mult.9.png
ERROR: Unable to open PNG file

19:33:53.879 [INFO] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-hdpi-v4\abc_textfield_default_mtrl_alpha.9.png
ERROR: Unable to open PNG file

19:33:53.879 [ERROR] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-hdpi-v4\abc_textfield_default_mtrl_alpha.9.png
ERROR: Unable to open PNG file

19:33:53.879 [INFO] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-hdpi-v4\abc_list_pressed_holo_light.9.png
ERROR: Unable to open PNG file

19:33:53.879 [ERROR] [org.gradle.api.Project] AAPT err(Facade for
957753705):
\\?\C:\Windows\System32\config\systemprofile\.android\build-cache\dd3673254061818c939c03e7784200aafab51353\output\res\drawable-hdpi-v4\abc_list_pressed_holo_light.9.png
ERROR: Unable to open PNG file

澳门威斯尼人平台登录 28

修改方法,找了好久才找到的构建失败的原文

澳门威斯尼人平台登录 29

澳门威斯尼人平台登录 30image.png

必需配置:a.被构建的工程源码配置;b.Gradle构建配置;

6.配置Gradle版本和需要执行的task

可选配置:c.构建后操作,如失败发送邮件;d.构建触发器等;

主要说下必需的配置:

澳门威斯尼人平台登录 31image.png澳门威斯尼人平台登录 32image.png

a.被构建的工程源码配置;

源码配置:情况1.代码在电脑,没有上传到git之类的代码托管服务器;
情况2.代码在Git或者GitLab服务器中;

打 release 包app:cleanapp:assembleRelease解释:

针对情况1 是将本地工程路径配置为自定义的工作空间

澳门威斯尼人平台登录 33

local_project_config.png

app:clean : 清除……/app目录下的build文件夹app:assembleRelease :
编译并打Release的包打 debug 包app:cleanapp:assembleDebug解释:

针对情况2需要配置 源码管理 > Git > Repositories

澳门威斯尼人平台登录 34

git_project_config.png

app:clean : 清除……/app目录下的build文件夹app:assembleDebug:
编译并打Debug的包同时打 debug 包和 release
包app:cleanapp:assembleDebugapp:assembleRelease

b.Gradle构建配置;

选择Gradle版本;配置Gradle命令

澳门威斯尼人平台登录 35

project_gradle_config.png

如果我们想要打指定的渠道包app:assemblexiaomiDebug

8.立即构建

到这里关于Jenkins及对Gradle支持相关的所有的配置就结束了,回到首页进入工程下,点击左侧的立即构建就可以开始构建了。

附:
1.grade配置信息文件:
/Users/xxx/.jenkins/hudson.plugins.gradle.Gradle.xml
2.Android Studio升级为2.0,构建时出现:Error:Gradle version 2.10 is
required. Current version is 2.4. If using the gradle wrapper, try
editing the distributionUrl in …
解决问题:Jenkins添加gradle2.10的环境,添加方式同刚才:配置Jenkins中的环境变量Gradle的配置说明
参考:http://android-er.blogspot.com/2016/04/errorgradle-version-210-is-required.html

7.然后开始打包

澳门威斯尼人平台登录 36image.png

出现此界面代表打包成功

8.需要注意的问题:

  • 8.1 注意Gradle版本要和svn上保持一直

发表评论

电子邮件地址不会被公开。 必填项已用*标注