搭建Jenkins持续集成服务

安装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下:

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";
    }
}

猜你喜欢

转载自blog.csdn.net/xiaoru5127/article/details/79611348