Jenkins分为两种,一种是自带服务也就是安装版本(不需要tomcat服务器自带servlet), 另外是提供war版本,我这次是使用的安装版本,我个人建议的时还是使用tomcat + war的方式(会少很多坑,但是也有不足首先所有的东西会在C盘生成.Jenkins文件夹,有一些强迫症的,喜欢目录整洁,还是选择安装板吧),下面给出三种下载地址:

  • 安装版官网地址
  • war包地址
  • tomcat9地址 安装板的安装非常的简单,一直下一步下一步就好接着往下走我们上主菜了
  1. 安装好了之后,直接打开网页输入http://locahost:8080,首次运行会要求输入管理员密码,如下图所示,图片上会显示密码的放置地址,看到没/Users/dmx/.jenkins/secrets/initialAdminPassword,这个地址就代表放置密码的位置,打开文件拷贝出密码输入就行
  2. 接着会跳出下面的界面,一般我们会选择第一项推荐安装,等安装完成后进入到页面
  3. 下面就是创建用户页面,这里建议创建用户,下面提供了Continue as admin按钮也可进入主页,但是后期想创建用户还是很麻烦的,所以建议创建用户 创建好用户,就可以进入到主页了~选择系统管理->管理插件->可选插件来开始安装我们需要的插件Git pluginGradle PluginEmail Extension Plugindescription setter pluginbuild-name-setteruser build vars pluginPost-Build Script Plug-inBranch API PluginSSH pluginScriptlerDate Parameter Plug-inGit Parameter Plug-In 必要的插件列表: 1.Branch API Plugin
    2.build timeout plugin
    3.build-name-setter
    4.Credentials Binding Plugin
    5.description setter plugin
    6.Dynamic Parameter Plug-in
    7.Environment Injector Plugin
    9.GIT server Plugin
    10.Gradle Plugin
    11.Git Parameter Plug-In
    12.Pipeline: Basic Steps
    13.Pipeline: Build Step
    14.Pipeline: Input Step
    15.Pipeline: Nodes and Processes
    16.Pipeline: Stage Step
    17.Workspace Cleanup Plugin
    18.Post-Build Script Plug-in
    19.Email Extension Plugin
    20.SSH Slaves plugin
    21.Timestamper
    如果你使用的SVN 还需要安装 Subversion Plug-in
    Subversion Release Manager plugin

上面的这些插件你先全部安装下来选择的时候点直接安装就好(安装好后重启服务输入http://127.0.0.1:8080/restart),这里面有些我是写重复了,还有一些是已经过时了搜索不到了,这个可以不用管,你把能装的全部先安装上去就行,注意插件比较多,保证网络状态良好否则个别容易失败,需要重新安装 4. Jenkins配置(这是重点) 进入:系统管理→系统设置 先设置3个变量的环境(这么做是为了在打包的时候遇到坑,血的教训啊!相信我没错的) 选择环境变量点击增加如图:


PYTHON是以后生成二维码图片用到的,还没到那一步可以先不用设置,ANDROID_HOME是SDK的路径(不要忘记环境变量G:\android\android-sdk\platform-tools;G:\android\android-sdk\tools的添加) GRADLE_USER_HOME这个是干嘛的呢,说来就是血泪史了,困惑了我好久,我打包时因为一个java aapt的异常一直打包失败,这个异常跟aapt2不同,aapt2只需要在gradle.properties中加上android.enableAapt2=false就好,而这错误就是因为路径问题导致到,再仔细查看错误日志之后才发现路径错了,所以如果你使用的时安装版记得加上这个路径 环境配置: 找到 JDK、Gradle、Git 三个模块最好把jdk和git加入电脑的环境变量。 JDK : 别名=随意。 JAVA_HOME=即环境变量中JAVA_HOME中的内容

Git 别名=随意 Path to Git = git.exe文件的全路径(d:\Git\bin\git.exe)



Gradle: 别名=随意 GRADLE_HOME= gradle的安装目录路径xx/gradle\gradle-2.14.1


可以直接配置android studio 安装目录中的gradle 如果你使用android studio 直接更新过gradle,他们在 系统盘\users\用户名.gradle\wrapper\dist目录下。 gradle可以配置多个,兼容不同编译版本我配置了2个4.1和2.14.1 5.打包设置 新建→构建一个自由风格的软件项目,进入到新建项目后,填写名称及说明。 找到→源码管理,选择对应的代码管理工具,我这里使用的是git 填写信息: 使用git还需要添加认证,即账号登陆,点击Add输入git账号信息 接下来选择→构建插件 我们准备的是gradle,所以选择 Invoke Gradle script 选择配置的gradle的版本,在 taks 栏输入 命令:clean assembleRelease --stacktrace --debug点击保存 无属性构建 点击立即构建,在 build history可看到任务执行。 任务前有个蓝色小圆点,如果项目构建失败,任务前的小圆点为红色,构建成功依然为蓝色。 同时在Console Output中可查看构建日志, 日志最后出现Finished: SUCCESS,即构建成功。 如果出现 Finished:Failed构建失败,日志内容比较多,直接全局搜索error查看报错信息。 进入→工作空间中可看到和工程目录一样的结构,找到apk包。 以上就完成了简单的部署和构建 6. Jenkins自定义参数配置,和二维码生成 自定义属性配置 使用自定义属性,我们需要使用到gradle文件和properties文件 配置需要使用的自定义属性 gradle.properties文件


android.enableAapt2=false
APP_VERSION = 1.0.0
IS_JENKINS = false
BUILD_TYPE = debug
PRODUCT_FLAVORS = xiaomi
ALIAS_PASSWORD = 123456
STORE_PASSWORD = 123456
BUILD_PATH_JENKINS = E:\\Jenkins\\workspace\\StarTeacher\\JenkinsApk
BUILD_PATH_LOCAL = E:\\AS_PROJECT\\TestJenkins
BUILD_TIME= ''
STORE_FILE=G:/android/zhangwork/StarTeacher/keystore/star.jks
APPNAME=starteacher
复制代码

BUILD_PATH_JENKINS 这个设定的目录我是建立在Jenkins安装目录的workspace里面的项目里面,这样做是问了方便访问的到路径 app的.gradle文件

apply plugin: 'com.android.application'

def getDate() {
    def date = new Date()
    def formattedDate = date.format('yyyyMMddHHmm')
    return formattedDate
}
def verCode = 1000000
android {
    compileSdkVersion 26
    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
    defaultConfig {
        applicationId "com.shinyread.starteacher"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode verCode
        versionName APP_VERSION
        multiDexEnabled true
        flavorDimensions "versionCode"
        // 打包排除以下文件,屏蔽因as自身bug,在没有重复引用jar时,提示jar重复引用的问题
        packagingOptions {
            exclude 'META-INF/rxjava.properties'
            exclude 'META-INF/DEPENDENCIES.txt'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/NOTICE.txt'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/LICENSE.txt'
        }
    }
    signingConfigs {
        signingConfig {
            keyAlias 'star'
            keyPassword ALIAS_PASSWORD
            storeFile file(STORE_FILE)
            storePassword STORE_PASSWORD
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            zipAlignEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.signingConfig
        }
        debug {
            signingConfig signingConfigs.signingConfig
        }
    }

    flavorDimensions "default"
    productFlavors {
        commonsoon {dimension "default"}
        xiaomi {dimension "default"}
    }

    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
    //修改生成的apk名字及输出文件夹
    applicationVariants.all { variant ->
        variant.outputs.all {
            //新名字
            def newName
            //时间戳
            def timeNow
            //输出文件夹
            def outDirectory
            //是否为Jenkins打包,输出路径不同
            if ("true".equals(IS_JENKINS)) {
                //Jenkins打包输出到服务器路径
                timeNow = BUILD_TIME
                //BUILD_PATH为服务器输出路径
                outDirectory = BUILD_PATH_JENKINS

                variant.getPackageApplication().outputDirectory = new File(outDirectory + "/" + timeNow)

                //AutoBuildTest-v1.0.1-xiaomi-release.apk
                newName=APPNAME+'_'+APP_VERSION+"_${variant.productFlavors[0].name}_"+variant.buildType.name+'.apk'
            } else {
                //本机打包输出在本机路径
                timeNow = getDate()
                outDirectory = BUILD_PATH_LOCAL
                if ('debug'.equals(variant.buildType.name)) {
                    newName=APPNAME+"_${variant.productFlavors[0].name}_"+"${APP_VERSION}_debug.apk"
                } else {
                    variant.getPackageApplication().outputDirectory = new File(outDirectory + "/" + timeNow)
                    //AutoBuildTest-v1.0.1-xiaomi-release.apk
                    newName=APPNAME+"_${variant.productFlavors[0].name}_"+APP_VERSION+'_'+variant.buildType.name+'.apk'
                }
            }
            outputFileName=newName
        }
    }

}
复制代码

其中variant.getPackageApplication().outputDirectory = new File(outDirectory + "/" + timeNow)是为了自定义apk的输出路径这个跟旧版本的方法不一样 下面我们进入到Jenkins对上述参数进行对应配置。 找到 参数化构建过程选项→打勾 选择→添加参数

  • 选项参数使用 Peristent Choice Paramete
  • 字符输入参数使用 String Parameter
  • 时间参数使用 Date Parameter
  • 在添加参数时,配置Name的值必须与.properties文件中定义的参数名称相同


参数引用 找到上面我们使用Gradle 插件的 Invoke Gradle script 修改tasks命令

clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE} --stacktrace --debug
复制代码

并勾选选项如下图


最后进入项目配置找到→构建环境→勾选Set build Name 设置参数 点击应用保存,回到项目首页 就可以看到,原先的立即构建已经变成了Build with Parameter 点击参数构建,就可以看到如下上面我们配置的参数。 等待构建完成,前往在.Gradle文件中配置的路径中即可找到我们配置的命名apk,同时也可以看到我们生成好的项目如图 7. 生成二维码 这里必须用到Python这个语言 下载安装 Python 注意安装时要选上pip这个选项打钩 依次配置环境变量在path里面配置E:\Python\Scripts;E:\Python;这两项路径填你自己的路径 然后命令行输入 pip list 检查是否安装成功


安装图片支持插件Pillow和二维码生成库**qrcode** 安装Pillow命令:pip install -I --no-cache-dir -v Pillow 安装qrcode 命令:pip install myqr 这时我们要配置PYTHON的全局环境了,上面开始的时候我已经放了图片,具体位置看上图 生成二维码 进入项目→构建→增加构建步骤,选择Execute windows batch command, 填写生成二维码的命令如下

myqr http://127.0.0.1:8080/job/StarTeacher/ws/JenkinsApk/%BUILD_TIME%/%APPNAME%_%APP_VERSION%_%PRODUCT_FLAVORS%_%BUILD_TYPE%.apk -v 1 -l L -d E:/Jenkins/workspace/StarTeacher/JenkinsApk/%BUILD_TIME%
复制代码

如果你是tomcat呢要怎么做? 进入tomcat安装目录conf找到server.xml文件,在Host节点中添加如下配置

<Context  reloadable="true" docBase="E://JenkinsApk" crossContext="true"         path="/JenkinsApk"/>
复制代码

重启确保你能访问http://localhost:8080/JenkinsApk,最后只需要在二维码的命令中替换地址就好 展示二维码 找到构建后操作 → 增加构建后操作步骤→Set build description如下图


完整写法

<img src='http://127.0.0.1:8080/job/StarTeacher/ws/JenkinsApk/${BUILD_TIME}/qrcode.png' width=200px height=200px > <br> <a href='http://127.0.0.1:8080/job/StarTeacher/ws/JenkinsApk/${BUILD_TIME}/${APPNAME}_${APP_VERSION}_${PRODUCT_FLAVORS}_${BUILD_TYPE}.apk'>点击下载-V${APP_VERSION}.apk</a>
复制代码

OK大功告成看看最后的效果吧!惊喜不惊喜啊记得在全局安全配置里面把Markup Formatter的设置更改为Safe HTML,不然是不支持HTML显示的