1、下载和安装jenkins
1、安装tomcat
2、下载jenkins
下载后是一个 .war 文件,放到 apache 目录下的 webapps 文件夹下
浏览器内输入 http://127.0.0.1:8080/jenkins
先跳过插件安装
接下来设置账号等,配置完成后就可以看到 jenkins 管理界面了
2、插件安装
勾选以下这些插件
Git
Gradle
Email Extension
description setter
Build Name and Description Setter
user build vars
PostBuildScript
Branch API
SSH
Scriptler
Git Parameter
OWASP Markup Formatter:能让 description 中显示 html,例如展示二维码和下载链接
点击 Down now and install after restart,等下载完重启 jenkins 就安装好了
在 Installed 选项卡下可以看到已经安装过的插件,比你自己安装的多,因为很多依赖的插件是自动下载的
3、配置
1、Manage Jenkins -> Global Tools Configuration
设置 JDK
设置 Git
设置 Gradle ,可以设置成固定版本,这里我不设置了,后边加入项目的时候用项目里的版本
2、Manage Jenkins -> Configure System
勾选 Environment variables
,添加 ANDROID_HOME
变量,这个值是sdk路径,可以去系统变量看下填的什么
4、项目配置
1、点击左侧 New Item 来新建一个项目
输入项目名称,选择 Freestyle project
2、Source Code Management
选择 Git,填入项目地址
Credentials add 一个用户,填入 git 账号信息
3、Build
Build 中选中 Invoke Gradle Script,Task 填写 clean assembleRelease --stacktrace --debug
(清理build文件夹,编译并打Release的包,打印堆栈日志,调试模式)
5、项目构建
点击保存就进入到项目主页了,点击 Build Now 开始构建,Build History 会出现构建任务列表,点击进入可以查看构建详情页
如果前边的圆圈变成红色说明构建失败,点击进入构建详情页,然后点击左侧 Console Output 查看日志输出
因为信息比较多,可以直接搜索 What went wrong
,找到报错原因
如果圆圈变为蓝色说明构建成功,可以在 Workspace -> app/build/outpus 找到apk
以上就完成了简单的部署和构建。但还不是我们的最终目的。我们想通过配置一下参数,来满足一些需求,比如根据渠道打不同版本的包、根据Tag打不同的包等,下面就来说一下Jenkins参数化构建
在项目的 gradle.properties 中,我们有 VERSION_CODE
和 VERSION_NAME
COMPILE_SDK_VERSION=29
BUILD_TOOLS_VERSION=29.0.2
APPLICATION_ID=com.szy.supermarket
MIN_SDK_VERSION=19
TARGET_SDK_VERSION=29
VERSION_CODE=1
VERSION_NAME=1.0.0
MAVEN_URL=https://dl.bintray.com/yishopcustomer/maven/
android.useAndroidX=true
android.enableJetifier=true
在 build.gradle 中会用到
apply plugin: 'com.android.application'
......
android {
......
defaultConfig {
multiDexEnabled true
applicationId APPLICATION_ID
minSdkVersion MIN_SDK_VERSION
targetSdkVersion TARGET_SDK_VERSION
versionCode VERSION_CODE as int
versionName VERSION_NAME
ndk {
abiFilters 'armeabi'
}
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
......
productFlavors {
szy {
applicationId 'com.xx.xx'
manifestPlaceholders = [
app_name : "云小店正式",
......
]
}
szytest {
applicationId 'com.xx.xx'
manifestPlaceholders = [
app_name : "云小店测试",
......
]
}
}
}
......
项目设置主页 -> General -> 勾选 This project is parameterized
下面开始添加参数
参数名 | 参数类型 | 参数值列表 |
---|---|---|
GIT_TAG | Git Parameter | dev、master等 |
BUILD_TYPE | Choice | Release or Debug |
PRODUCT_FLAVORS | Choice | Xiaomi、Huawei等 |
VERSION_NAME | String | 1.0.0 |
我们要在下方构建时候引用,首先找到Build标签处,将Tasks属性值修改为:clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE}
同时点击右下角的 Advanced…,勾选以下选项
这个选项是 VERSION_NAME 和 VERSION_CODE 需要用到的,因为这两个参数需要注入到Android项目中的配置,而红色框中的这个选项可以帮我们侵入到 gradle.properties 文件中替换值,并且 build.gradle 文件能够直接引用 gradle.properties 文件中的属性,所以起到了侵入的效果,这样在 Jenkins 打包的时候上面两个参数就会随着选择变化而变化了
Source Code Management处修改打包版本如图:
设置好参数后,Build Now 选项变成了 Build with Parameters,再打包页面就变成了这样
原命名只是构建编号,没有识别度
改为构建编号_构建者姓名_构建渠道版本_构建的类型_app版本号,找到 Build Environment,勾选 Set Build Name,Build Name 填入#${BUILD_NUMBER}_${BUILD_USER}_${PRODUCT_FLAVORS}_${BUILD_TYPE}_${VERSION_NAME}
再次构建成功后,名称变为了
Tomcat安装目录下 -> conf -> server.xml 在 Host
节点最后添加代码:
<Context reloadable="true" docBase="D:\apache-tomcat-9.0.36\webapps\app" crossContext="true" path=""/>
docBase 为绝对路径即保存 apk 文件的文件夹,默认我们打包完在 \app\build\outputs\apk\szytest\debug
这种目录下,我们可以自己修改,方法查看 本文的 其他设置 - 修改apk输出路径
path为相对地址即在地址栏访问的地址
添加完这句话以后重启Tomcat,打开浏览器输入ip:port/apk名称,就可以下载了,例如我在浏览器输入 127.0.0.1:8080/app-szytest-Debug_5.apk
就可以直接下载 apk 了
首先要安装 python,步骤可以查看我的另一篇文章:【Python】安装和第一个程序
然后在系统命令行(cmd)执行 两条命令即可安装 qrcode:
pip install Pillow
pip install myqr
使用命令行生成二维码 myqr 要生成二维码的内容 -n 指定二维码名称 -d 指定二维码存放位置
因此我们在 Build 中的 windows 批处理命令(上一步添加的)最后增加以下代码
myqr http://192.168.3.215:8080/%apkName%_%BUILD_ID%.apk -n %BUILD_ID%.jpg -d %outputs%/qrcode
ip 替换成你本机的 ip
这样会在 D:\apache-tomcat-9.0.36\webapps\app\qrcode
下生成以 BUIID_ID.jpg 命名的二维码图片
接下来要展示二维码图片,找到 Post-build Actions,增加 Set build description
在 Description 中增加代码如下,也就是增加一个二维码展示和一个点击下载的链接
<img src='http://192.168.3.215:8080/qrcode/${BUILD_ID}.jpg' style='width:200px;height:200px'>
<br/>
<a href='http://192.168.3.215:8080/app-${PRODUCT_FLAVORS}-${BUILD_TYPE}_${BUILD_ID}.apk'>点击下载a>
想要在 Build history 中展示 html ,还需要将 Manage Jenkins -> Configure Global Security 中的 Markup Formatter 改为 Safe Html(依赖于OWASP Markup Formatter插件,否则没有 Safe HTML 这个选项)
这样打包完以后就展示了二维码和下载链接
这里以QQ邮箱为例
首先 Manage Jenkins -> Configure System -> Jenkins Location
System Admin e-mail address 填入qq邮箱
然后Manage Jenkins -> Configure System -> E-mail Notification中填入信息进行测试
有几点需要注意:
邮件服务器地址可以通过邮箱内的帮助中心找到,搜索 “smtp” 关键字查找即可。例如qq邮箱
邮箱密码需要在 设置 -> 账户 中开启 POP3/SMTP 服务,得到授权码,把这个授权码填到邮箱密码这里才可以
填写成功后,发送测试邮件,成功后填写上边的 Extended E-mail Notification 模块,内容和刚才的相同就可以,不同的有以下
默认邮件类型:
默认收件人,多个的话用英文逗号隔开:
邮件标题和内容:
其中 Default Content 为邮件内容:
<html>
<head>
<meta charset="UTF-8">
<title>${PROJECT_NAME}-第${BUILD_NUMBER}次构建日志title>
head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<table width="95%" cellpadding="0" cellspacing="0"
style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<td>(本邮件是程序自动下发的,请勿回复!)td>
tr>
<tr>
<td><br />
<b><font color="#0B610B">构建信息($BUILD_STATUS)font>b>
<hr size="2" width="100%" align="center" />td>
tr>
<tr>
<td>
<ul>
<li>项目名称 : ${PROJECT_NAME}li>
<li>构建编号 : 第${BUILD_NUMBER}次构建li>
<li>触发原因 : ${CAUSE}li>
<li>构建日志 : <a href="${BUILD_URL}console">点击查看a>li>
<li>工作目录 : <a href="${PROJECT_URL}ws">点击查看a>li>
<li>Allure Report : <a href="${BUILD_URL}allure">点击查看a>li>
ul>
td>
tr>
<tr>
<td><b><font color="#0B610B">构建日志(最后100行):font>b>
<hr size="2" width="100%" align="center" />td>
tr>
<tr>
<td><textarea cols="80" rows="30" readonly="readonly"
style="font-family: Courier New">${BUILD_LOG, maxLines=100}textarea>
td>
tr>
table>
body>
html>
点击右下角的 Default Triggers设置邮件发送时机
然后还需要在项目构建后的操作,也就是 Post-build Actions 中增加一个 Editable Email Notification
这里使用 360加固 做演示。根据360加固助手使用手册 中的 命令行加固模式 一章中的方法进行加固。首先我们先在本机测试下
打开 cmd ,使用java -jar jiagu.jar -login
登录
使用 java -jar jiagu.jar -importsign
导入签名 keystore 信息
加固操作会使原 APK 包的签名失效,所以加固后的 APK包需要重 新使用原应用的 keystore 签名文件重新签名,APK 文件才可以正常安装使用
最后 提示 签名成功
接下来我们放到 jenkins 中,首先在 General 中增加一个 Boolean Parameter 表示是否加固
在 Build 选项卡中,批处理命令中修改
set outputs=D:\apache-tomcat-9.0.36\webapps\app
set apkName=app-%PRODUCT_FLAVORS%-%BUILD_TYPE%
set storeFile=D:\YishopSellerKey.jks
set storePassword=szyapp1234
set keyAlias=yishopseller
del /q /s %outputs%\jiagu\*.*
if %IS_JIAGU%==true goto A else goto B
:A
java -jar "D:\jiagu\jiagu.jar" -login yulili@68ecshop.com yll@123456
java -jar "D:\jiagu\jiagu.jar" -importsign %storeFile% %storePassword% %keyAlias% %storePassword%
java -jar "D:\jiagu\jiagu.jar" -jiagu %WORKSPACE%\app\build\outputs\apk\%PRODUCT_FLAVORS%\%BUILD_TYPE%\%apkName%.apk %outputs%\jiagu -autosign
for /r %outputs%\jiagu\ %%i in (*.apk) do copy %%i %outputs%\%apkName%_%BUILD_ID%.apk
if "%errorlevel%"=="0" goto C
if "%errorlevel%"=="1" goto A
:B
copy %WORKSPACE%\app\build\outputs\apk\%PRODUCT_FLAVORS%\%BUILD_TYPE%\%apkName%.apk %outputs%\%apkName%_%BUILD_ID%.apk
goto C
:C
myqr http://192.168.3.215:8080/%apkName%_%BUILD_ID%.apk -n %BUILD_ID%.jpg -d %outputs%\qrcode
exit
增加了加固的操作,如果勾选了加固,goto A(进行加固操作,加固后保存到 jiagu 文件夹;然后把加固好的apk复制到app文件夹;如果没有错误,goto C;如果有错误,重新 goto A)
如果没有加固 goto B(直接将 build 下的 apk 复制到 app 文件夹)
c的操作就是生成二维码的操作
再次打包,勾选加固
这样打包成功后,每次加固时,jiagu 文件夹的文件先被清空,然后生成一个 名称为 *_jiagu_sign.apk 的文件
然后这个文件会被拷贝到 app 文件夹下
这样
解决办法:
当前页面选中 Advanced,最下面的 update site 由 https
改为 http
然后重新打开jenkins即可
what went wrong 上面,可以看到 build.gradle 路径包含中文字符。因为我们创建项目时项目名称叫 “云小店”,所以这里默认创建了“云小店”的目录
所以只要修改这个项目的workspace即可,修改方法看 文章后边的 其他设置 - 项目workspace修改
初始密码在 C:\Users\00lix\.jenkins\secrets\initialAdminPassword
密码太长,想改一个简单的密码,例如 123456,我们在 Eclipse 中
public class Main {
public static void main(String[] args) {
// 这是加密方式
String hashed = BCrypt.hashpw("123456", BCrypt.gensalt());
System.out.println(hashed);
// 这是解密方式
if (BCrypt.checkpw("123456", hashed))
System.out.println("It matches");
else
System.out.println("It does not match");
}
}
需要导入jar包,jar包下载
然后导入
运行程序
打开 C:\Users\00lix\.jenkins\users\admin_xxx\config.xml
,找到
节点,用刚才的字符串替换 #jbcrypt:
后边的内容
重启 jenkins(关闭 apache 再打开)即可
Source Code Management 中 Credentials 有重复的,现在删除
点击左侧 凭据,找到重复删除即可
workspace 就是工作目录,一般就是 Down 下来的源代码目录,默认的在 C:\Users\00lix\.jenkins\workspace
,修改某个项目的 workspace 可以这样操作
进入项目主页 Configure -> General -> Advanced…
勾选 Use custom workspace,填入自定义的工作空间
在项目设置中,找到 Build 标签,点击 Advanced…,点击下面链接即可
打开的链接是 /jenkins/env-vars.html/
可以看到 jenkins 内置参数
在 Build 标签下 Add build step,新增一个 Execute Windows batch command(执行 windows批处理命令)
获取原来路径D:\workspace\SuperMarket\app\build\outputs\apk\szytest\debug
,拷贝到指定目录D:\apache-tomcat-9.0.36\webapps\app
set outputs=D:\apache-tomcat-9.0.36\webapps\app
set apkName=app-%PRODUCT_FLAVORS%-%BUILD_TYPE%
copy %WORKSPACE%\app\build\outputs\apk\%PRODUCT_FLAVORS%\%BUILD_TYPE%\%apkName%.apk %outputs%\%apkName%_%BUILD_ID%.apk
参考
Android Jenkins+Git+Gradle持续集成-实在太详细