安装Jenkins服务器
安装git并配置(略)
apt-get install git
安装jdk并配置(略)
sudo apt-get install openjdk-7-jdk
安装sdk并配置(略)
wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
安装gradle并配置(略)
wegt https://services.gradle.org/distributions/gradle-4.1-all.zip
看下最后/etc/profile的配置文件
安装Jenkins
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
vim /etc/apt/sources.list 把deb http://pkg.jenkins-ci.org/debian binary/ 加到末尾
sudo apt-get update
sudo apt-get install jenkins
创建一个名为Jenkins的Linux用户
sudo cat /etc/shadow
Jenkins 默认端口是8080,在配置文件/etc/default/jenkins 中
获取管理员密码
cat /var/lib/jenkins/secrets/initialAdminPassword
访问127.0.0.1:8080输入密码
选择安装推荐插件
这是推荐安装的插件,而我们所需的插件列表有:
- Git plugin
- Gradle Plugin
- Email Extension Plugin
- description setter plugin
- build-name-setter
- user build vars plugin
- Post-Build Script Plug-in
- Branch API Plugin
- SSH plugin
- Scriptler
- Dynamic Parameter Plug-in
- Git Parameter Plug-In
没有的需要手动安装下:系统管理–插件管理
到 系统管理–全局工具配置对jdk git gradle进行配置下
还有在全局属性下设置 ANDROID_HOME
创建一个任务
第一个重点是配置项目git地址,要确认能把git拉下来。
Credentials的配置
PS:确认你服务器的公钥已经保存到git服务器上,你可以在自己服务里用git命令拉下来看看能否成功。
第二个重点是配置gradle
在构建里选择【Invoke Gradle】
这里有两个选择 【Invoke Gradle】自己配置选取前面全局配置里设置了的gradle版本 或者 选择【Use Gradle Wrapper】 gradle会自动去根据项目下载所需gradle 。我这边选择【Use Gradle Wrapper】,Make gradlew executable的钩记得打上
【配置好之后就可以构建跑跑看了,不过你会发现会报各种错,fix fix fix】
第一种 git没拉到项目,基本上是公钥问题 跟你用git命令拉其实一样
第二种 项目拉下来报各种sdk tools没有,在jenkins服务器里自己下载即可
eg:failed to find Build Tools revision 17.0.0
解决方案: 运行sdk下tools目录下的android命令
ubuntu@VM-0-4-ubuntu:/var/lib/jdk/android-sdk-linux/tools$ sudo ./android list sdk -a
在列出的列表中找到自己需要下载的 根据编号进行下载
android update sdk -u -a -t 编号
第三种 gradlew没有权限问题
FATAL: command execution failed
java.io.IOException: Cannot run program “/var/lib/jenkins/workspace/your-project-name/gradlew” (in directory “/var/lib/jenkins/workspace/your-project-name”): error=13, Permission denied
思路是:为gradlew添加权限并提交到git服务器上
ubunutu下:
chmod +x gradlew
git add gradlew
git commit
git push
win下:
![](/qrcode.jpg)
git update-index
git add gradlew
git commit
git push
最后关于搭建,附上一篇文章,主要是ubuntu上配置的各种问题
http://www.felixyan.com/14927588460540.html
使用篇
构建参数
创建参数
在【构建】允许Jenkins去修改gradle文件,同时自定义的参数可以在git gradle等命令中运用;Jenkins也会把参数设置到gradle.properties文件中,这样我们在项目中就可以根据这些配置做一些处理了。
最后我们在构建项目的时候就会发现,构建需要输入我们定义的参数了
触发器
构建触发器的选择为复合选项,若选择多种类型,则任一类型满足构建条件时就会执行构建工作。一般团队小项目都是有代码更新就会构建,选择【Poll SCM】。而大型项目,一般定时(晚上)构建【Build periodically】,第二天提供测试包。
这边定时,每10分钟检测一次是否有代码更新,若有更新则触发构建任务
下载地址生成
方法一:
步骤:将编译生成的的apk上传到文件服务器,获得下载地址,二维码信息等。我这边用fir
先安装fir的Jenkins插件
http://blog.fir.im/jenkins/
PS:fir.im目前上传需要身份认证,手动登录后上传随意一个apk就会引导你填写信息,之后jenkins插件才能正常上传,否则会报错
方法二:
步骤:【构建后操作】 -> 【Archive the artifacts】配置下
最后将这个地址提供出去,以供下载
通知
这边通过钉钉机器人进行通知,到Jenkins的插件管理中搜下【钉钉】,安装即可
在【增加构建后操作步骤】中加入【钉钉通知】即可,Token从钉钉群自定义机器人处获取
将结果推送到钉钉,提供给测试、开发使用
安装Dingding Json Pusher
填写Token以及要推送的json文件
编程成功后会将json中的内容推送到与Token的群里
json的格式详细看Dingding文档,这里选择markdown形式
我们只需将要推送的内容写入这个json文件中即可,另该文件的位置位于项目根目录
Jenkins目录如下
其中jobs目录下是每次编译都会东西都会在这里
workspace则是从git上拉取下来的代码,即【工作空间】,dingding.json就在这里创建
ok , 重点来了,怎么把我们的需要信息拿到手写入这个文件呢
结果图
这个步骤主要在gradle里做,先添加一个jenkins.gradle并在项目下的build.gradle进行引用
apply from:’jenkins.gradle’
最后看下jenkins.gradle的代码
task savepushinfo << {
if (isInJeknins()) {
ext.env = System.getenv()
def buildNumber = env.BUILD_NUMBER?.toInteger()
def nodeLabels = env.NODE_LABELS?.toString()
def jobName = env.JOB_NAME?.toString()
def buildUrl = env.BUILD_URL?.toString()
def urls = ""
def path = buildUrl + "artifact/app/build/outputs/apk/"
File dingding = new File('dingding.json')
File file1 = new File('app/build/outputs/apk')
file1.listFiles().findAll{
urls = urls + "[" + it.name +"(" + getSizeString(it.size()) + ")" + "](" + path + it.name+") \n"
}
def json = "{" +
" \"msgtype\": \"markdown\"," +
" \"markdown\": {" +
" \"title\":\"构建信息\",\n" +
" \"text\":\"#### [#"+ buildNumber +"] 构建信息 \n " +
jobName + " branch: " + nodeLabels + " \n" +
" versionCode:" + rootProject.ext.android.versionCode + " versionName:" + rootProject.ext.android.versionName + "\n" +
" > " + urls + "<br/> \"" +
" }" +
" }"
dingding.deleteOnExit()
dingding.createNewFile()
dingding.write(json)
}
}
savepushinfo.dependsOn {
tasks.findAll {
task -> !task.name.contentEquals("savepushinfo")
}
}
boolean isInJeknins() {
Map<String, String> map = System.getenv()
if (map == null) {
return false
}
String str = map.get("Path")
if (str != null) {
return false;
} else {
str = ""
Iterator it = map.iterator();
while (it.hasNext()) {
str += it.next();
}
if (str.contains("jenkins")) {
return true
} else {
return false;
}
}
return false
}
String getSizeString(long size) {
double value = (double) size;
if (value < 1024) {
return String.valueOf(value) + "B";
} else {
value = new BigDecimal(value / 1024).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
}
if (value < 1024) {
return String.valueOf(value) + "KB";
} else {
value = new BigDecimal(value / 1024).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
}
if (value < 1024) {
return String.valueOf(value) + "MB";
} else {
value = new BigDecimal(value / 1024).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
return String.valueOf(value) + "GB";
}
}