765DevOps

Thinking is the problem, Doing is the answer !

0%

禅道持续交付(六)-移动端CICD

我们其实有很多移动端的产品,所以在做完web端容器相关持续交付后,我们开始关注移动端相关的应用场景,这里我们重点切入的移动安卓打包及相关打渠道包和最终的市场投放环节,这里也和大家做个简单的分享。

在移动端母包构建和渠道打包上线后,给业务提效十分明显,尤其是渠道打包,基本能节省30-40%的时间,且自动化不易出错。

1、移动端CICD设计

1.1、原流程调研

其实持续交付的核心就是建立一个可靠的交付流水线,将软件交付整个周期进行串联起来,通过这条流水线,将交付过程标准化、自动化、可视化,同时实现关键流程和节点管控。基于此,我们分析目前移动端整体现状或者工作流程,

  • 项目管理使用禅道
  • 打包工具使用Jenkins(产运、开发、测试都是在Jenkins打包 😂)
  • 缺陷管理使用禅道
  • 包管理暂时是Jenkins打包后通过下载手动传送,或者上传至禅道附件保存
  • 渠道通过平台打包,手动下载、手动重命名、手动FTP投放、手动邮件通知等

1.2、新流程设计

针对原有流程,项目/需求管理还是使用禅道原有功能,将版本母包的功能集成到禅道的版本中,同时禅道支持渠道打包和市场投放功能。

版本母包

  • 版本母包管理(支持自测–>系统测试–>母包同步等)
  • 统一母包构建入口,支持定制化打包参数设置
  • 构建构成可视化

渠道打包

  • 批量打包管理(批量下载、自动重命名、二维码下载等)
  • 渠道包自动化抽签
  • FTP自动化投放
  • 渠道打包投放过程可视化

2、多APP统一页面实现定制化构建母包

2.1、母包构建页面

2.2、定制参数设计

通过业务项目代码的仓库的gradle.properties文件添加约定注解实现

  • 普通注解示例
1
2
3
4
5
6
7
8
#@name:是否展示获取数据的权限弹框@show:true@enableModify:true@type:bool@description:是否展示获取数据的权限弹框
SHOW_DATA_PERMISSION_DIALOG=false

#@name:限制升级时间(天)@show:true@enableModify:true@type:int@description:限制升级的时间
UPDATE_LIMIT_DAYS=0

#@name:是否开启1*1桌面组件@show:true@enableModify:true@type:bool@description:是否开启1*1桌面小组件
IS_USE_WIDGET_1_1=true
  • 新增附件上传注解

安卓项目有附件资源依赖,附件资源以注解形式给出,通过定制参数传入

1
2
3
4
5
6
#@name:桌面Icon压缩包@show:true@enableModify:true@type:uploadfile@fileType:zip@description:桌面Icon,必须是压缩包,目录结构符合要求,文件名为 ICON_RES.zip
ICON_RES=

#@name:启动页图片压缩包@show:true@enableModify:true@type:uploadfile@fileType:zip@description:启动页图片,必须是压缩包,目录结构符合要求,文件名为 SPLASH_RES.zip
SPLASH_RES=

2.3、构建打包Jenkins Job设计

入参说明

  • Jenkins主要入参
参数 说明
BUILD_ID 构建ID,构建唯一标识
BUILD_PARAMS_JSON 构建参数,json格式
CALLBACK_URLS_JSON 流水线回调url参数,json格式
other params 其他构建参数 【禅道无需关心】
主要由Jenkins自己维护参数
  • 通用 CALLBACK_URLS_JSON 参数示例说明
1
2
3
4
5
6
7
{
// 流水线Job执行结果回调
"resultCallbackUrl": {
"url": "http://demo.2345.com",
"host": "" // 是否绑定host返回,默认:""
}
}

BUILD_PARAMS_JSON参数说明

采用一个Json构建字符串,便于后期的扩展和维护

  • 字段说明
字段名 类型 是否必须 描述
commonParams object 构建 通用 参数Object
commonParams.gitMode string 拉取git仓库方式:branch-分支;tag-标签
commonParams.gitBranchName string git分支名,若gitMode为tag,字段传空值:""
commonParams.gitTagName string git标签名,若gitMode为branch,字段传空值:""
commonParams.buildType string 打包版本类型 test-内测、测试版本,release-正式版本
commonParams.appName string 应用名称,从properoties文件中解析对应选项
commonParams.packageName string 应用包名,从properoties文件中解析对应选项
commonParams.productFlavor string 定制的产品特性,从properoties文件中解析对应选项
commonParams.channel string 渠道号,多个渠道号请用英文逗号分隔
commonParams.versionName string 外部版本号,与内部版本号对应,如:2.3.4
主要用于显示给用户,服务端个别接口的逻辑
commonParams.versionCode string 内部版本号,与外部版本号对应,如:203040
主要用于升级
customParams object 构建 定制 参数Object,不存在定制参数传空object,
从properoties文件中解析生成对应的定制参数
  • 构建参数示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
// ====== 构建 通用 参数说明 =====
"commonParams": {
"gitMode": "branch", // 拉取git仓库方式:branch/tag
"gitBranchName": "branchName", // git分支名
"gitTagName": "tagName", //git标签名
"buildType": "test", // 打包版本类型 test-内测、测试版本,release-正式版本
"appName": "ABC", // 应用名称
"packageName": "demo", // 应用包名
"productFlavor": "demo123", // 定制的产品特性
"channel": "UMENG_CHANNEL_VALUE", // 渠道号,多个渠道号请用英文逗号分隔
"versionName": "2.3.4.5", // 外部版本号,主要用于显示给用户,服务端个别接口的逻辑,与内部版本号对应
"versionCode": "2345", // 内部版本号,主要用于升级,与外部版本号对应
"buildDesc": "" // 构建描述
},
// ====== 构建 定制 参数说明 =====
"customParams": {
"NEED_ENCYPT": true, // 是否加密
"IS_PATCH": true, // 是否patch包
"ICON_RES": "http://download.demo.com", // 资源附件url
}
}