安装 Jenkins

下载Jenkins 最新版本: https://www.jenkins.io/download/

        jenkins项目有两条发布线,分别是LTS长期支持版(或稳定版)和每周更新版(最新版)。建议选择LTS长期支持版,下载通用java项目war包;

另外需要安装 jdk ,这里不赘述;

        在dos命令行运行命令解压war包:java -jar jenkins.war (默认情况下端口是8080,如果要使用其他端口启动,可以通过命令行”java –jar Jenkins.war --httpPort=80”的方式修改);

        运行指令中可以看到会输出密码,记住留待后用,或者在具体文件路径中找到:

         之后在浏览器中访问 http://localhost:8080 (如果你没特殊指定端口的话)可以看到解锁界面,输入之前的密码吧

        进入后就是插件安装了,根据自己需要选择,补充一点就是 会有一些插件安装失败,是因为这些插件的安装是有前置条件的,等安装结束后,按右下角“重试”,继续安装,之前失败的插件就都能安装了;

        插件安装完成后就进入到创建管理员账号的步骤了, 这不用人教都会吧; 保存并完成账号信息后实例配置Jenkins 吧:

        保存完成后就开始 Jenkins 之旅吧

任务

新建任务,拉取 git 远端代码到本地,选择文件夹:

之后在主页看到之前创建的文件夹了: 

进入任务创建新的 item : git_subject

        接下来配置 源码管理中的 url 以及分支等,认证部分只选择针对当前文件夹范围的证书,填写相关仓库所有者的用户名和密码, 

 credentials 选择之前添加的认证信息:

        设置好相关属性并且保存好之后,点击立即构建按钮,等待运行结束,查看 console outputs 输出成功后,打开工作空间,查看相关源码是否已从 git 拉取。

拓展1

         以上代码是从 master 分支拉取的,随着功能的开发,功能分支也将增多,那么假如需要切换其他分支代码怎么办呢,总不能每次去修改任务配置中的 branch specifier 吧;

        返回Jenkins 主页,添加 git 参数 插件: 系统设置-> 插件管理->available filter -> git parameter:

        插件安装好之后呢,重新回到任务,打开配置界面,找到并且勾选参数化构建过程(This project is parameterized),选择 git 参数 (git parameter): 

最后在源码管理的指定分支部分将分支改成 $ + git参数名称:

 保存之后发现旁边的 Build Now 已经变成了 Build with Parameters:

 查看具体详情,可以发现这里的 branch 会列出该仓库所有的分支,选择我们需要的分支,点击开始构建 按钮就可以拉取特定分支的代码了;

 其他的参数就自己实验吧。

拓展2

        上面演示了利用 git 作为源码管理的步骤,如果说我们文件在本地咋办,简单,源码管理选择无,然后打开Jenkins安装目录,找到 item 名对应的工作空间:

        直接将文件拷贝到文件里面(这中方式有点简单粗暴),回到Jenkins页面 -> 刷新 -> 工作空间,就可以看到之前拷贝的文件都在了:

        当然还有更高明的方式, 在 General 模块,选择高级,勾选使用自定义的工作空间,填写上已存在的文件目录吧,源码管理勾选无,保存后 build now 之后就能看到我们指定的目录成为了工作空间。 

打包 & 整理

以下是 Mac 下简单的打包命令: execute shell (而在Windows中选择 execute windows batch command)

echo %cd% 
git checkout master
echo --------start clean project---------------
git reset --hard HEAD
git clean -f
echo --------start git pull--------------------
git pull
cd app
echo --------start gradle clean--------------------
/Users/user_name/.gradle/wrapper/dists/gradle-4.8.1-bin/e8p42vx1m7a3mz9ydmjagn6wn/gradle-4.8.1/bin/gradle clean
echo %cd% 
echo --------start gradle release build--------------------
/Users/user_name/.gradle/wrapper/dists/gradle-4.8.1-bin/e8p42vx1m7a3mz9ydmjagn6wn/gradle-4.8.1/bin/gradle assembleRelease
echo --------end gradle release build--------------------
echo --------clean desktop android-apk directory--------------------
rmdir /Users/user_name/Desktop/android-apk\ /S /Q

for /f "tokens=2 delims= " %%i in ('findstr /c:" versionName " /Users/user_name/StudioProjects/android_app/app/build.gradle') do (set versionStr=%%i)
set versionStr=%versionStr:~1,-1%
echo %versionStr%

echo --------copy all apk to desktop android-apk directory:/Users/user_name/Desktop/android-apk\ --------------------
xcopy /Users/klook/StudioProjects/android_app/app/build/apk/**.apk  /Users/user_name/Desktop/android-apk/v%versionStr%-for-jenkinse/  /D /Y /e

拓展3

        上面的 gradle assembleRelease 意思是打包所有渠道的 release 包,如果是我们在 build.gradle 中配置了多种渠道,那么  assembleRelease 说不定会耗费好几个小时将所有渠道的release 包都打好,如果说我们只需要某个特殊渠道的安装包验证问题怎么办呢?

        首先附上多渠道包怎么配置的链接:Android 多渠道包_贰叁得陆的博客-CSDN博客,在android app模块的 build.gradle 中配置以下几个渠道:

flavorDimensions "default"
productFlavors {
    channel_yingyongbao {
            dimension "default"
            manifestPlaceholders = [label:"test_yyb",CHANNEL_NAME: "yyb"]
        }
    channel_huawei {
            dimension "default"
            manifestPlaceholders = [label:"test_huawei",CHANNEL_NAME: "hw"]
        }
    channel_wandoujia {
            dimension "default"
            manifestPlaceholders = [label:"test_wdj",CHANNEL_NAME: "wdj"]
        }
    channel_xiaomi {
            dimension "default"
            manifestPlaceholders = [label:"test_xm",CHANNEL_NAME: "xm"]
        }
    channel_oppo {
            dimension "default"
            manifestPlaceholders = [label:"test_oppo",CHANNEL_NAME: "oppo"]
        }
    channel_vivo {
            dimension "default"
            manifestPlaceholders = [label:"test_vivo",CHANNEL_NAME: "vivo"]
        }
    channel_samsung {
            dimension "default"
            manifestPlaceholders = [label:"test_samsung",CHANNEL_NAME: "samsung"]
        }
}

        (因为我项目里配置了 UMeng 推送,所以 CHANNEL_NAME 是必须要的,大家可以忽略)

        回到Jenkins 配置页,在 This project is parameterized 中新增一个 choice parameter;设置名称,在选项中预制几个选项,用换行进行分割;

 

修改构建步骤中的指令:

echo %cd% 
echo --------start gradle release build--------------------
/Users/user_name/.gradle/wrapper/dists/gradle-4.8.1-bin/e8p42vx1m7a3mz9ydmjagn6wn/gradle-4.8.1/bin/gradle assembleChannel_$productType
echo --------end gradle release build--------------------

        进入到 build with parameter 页面,选择一个 huawei 试试看,在控制台输出里可以看到指令运行时将我们的选择项自动替换过来了:

        最终运行完在可以在output 目录下看到对应的华为渠道的apk已经输出在了debug & release 文件夹内:

        当然啦,因为我们没有指定打包类型,所以 release & debug 都有输出,同理,如果我们配置了多种打包类型,什么 release / innerRelease / innerTest / dev / debug / 等,你也可以通过跟上面一样的方式新增 choice parameter 将参数拼接到指令后指定打包类型:

/Users/user_name/.gradle/wrapper/dists/gradle-4.8.1-bin/e8p42vx1m7a3mz9ydmjagn6wn/gradle-4.8.1/bin/gradle assembleChannel_$productType$buildType

 这里就不再做截图赘述了,ending。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐