目录
2.1 Jenkins中其他配置这里不重复了,重点说构建部分的命令
2.2 Jenkins中运行构建任务,在小程序页面检查上传结果,没问题
3.1 在Jenkins命令行(Windows批处理命令),用miniprogram-ci命令实现,项目源码从远程仓库中拉取,参数化某些选项的方式
4.1 在Jenkins命令行(Windows批处理命令),调用nodejs脚本的方式
4.2.2 编写upload.js文件,参数写死的情况如下:
4.2.3 编写upload.js文件,不写死信息,通过Jenkins命令行传参进来,脚本接住参数,运行脚本的情况如下
1. 实现要求
(1) 代码管理,需要从git拉取对应的代码
(2)参数化(appId,privateKey,版本...),并支持远程触发
(3)邮件报告设置
(4)除了命令行方式外,创建新的Jenkins job,需要支持nodejs脚本方式的运行(需要满足1,2,3)
2. 实现方式一
2.1 Jenkins中其他配置这里不重复了,重点说构建部分的命令
Win10中Jenkins的登录和配置,可参考此文:Win10中Jenkins的安装,基本使用流程
(1)这个方式演示了:从本地获取代码,并且写死所有选项信息。
(2)在Jenkins的Window Shell命令行,构建命令如下:
C:/Users/pearl/AppData/Roaming/npm/miniprogram-ci upload --pp '小程序代码本地路径' --pkp 'privateKey路径' --appid appid值 --uv 版本号 -r 开发者(机器人编号)
这个命令格式也是参考的:微信官方文档.小程序 ---> 开发辅助 --->CI
10.27补图:
2.2 Jenkins中运行构建任务,在小程序页面检查上传结果,没问题
3. 实现方式二
3.1 在Jenkins命令行(Windows批处理命令),用miniprogram-ci命令实现,项目源码从远程仓库中拉取,参数化某些选项的方式
构建部分的命令如下:
C:/Users/pearl/AppData/Roaming/npm/miniprogram-ci upload --pp "%WORKSPACE%" --pkp "%privateKey%" --appid %appid% --uv %version% -r %robot%
3.2 源码管理
3.3 参数化详解
(1)%WORKSPACE%:
环境变量,从git仓库拉取的项目代码存放在本地这个路径下。 后面要执行的项目从这里获取。
(2)%privateKey%:
在Jenkins中参数化privateKey, 然后在Windows命令中调用。(一般默认情况下,privateKey中的值,跟appid是一样的),可设默认值,点构建后,会提示让填写实参。
(3)%appid%:
参数化,可设默认值,点构建后,会提示让填写实参。
(4)%version%:
参数化,可设默认值,点构建后,会提示让填写实参。
(5)%robot%:
参数化,可设默认值,点构建后,会提示让填写实参。
10.27补图:
3.4 注意事项
(1)通常比较安全的做法,不会将appid和privateKey直接做String参数化,可以考虑choice 参数,然后用命令语句做判断选择。
(2)在Windows命令行中,调用参数用:%xx%
(3)在Jenkins自身环境中引用参数变量用:$
3.5 远程触发(带参数)
调用URL的格式大致如下,在浏览器中输入URL,确认后,可以看到jenkins页面的任务,自动实现构建运行。
http://localhost:8081/job/miniprogram-3-node/buildWithParameters?appid=xxx&version=2.2.2&desc=222&projectPath=xxx/&privateKeyPath=xxx&token=mini
10.27补图:
3.6 邮件设置
此处不赘述,可参考此文:Win10中Jenkins的使用:配置邮件
10.27补图:运行上面的任务,邮箱收到邮件如下,邮件模板可自行选择,我这个是最简单的。
3.7 构建运行结果(控制台输出+上传结果)
4. 实现方式三
4.1 在Jenkins命令行(Windows批处理命令),调用nodejs脚本的方式
构建部分的命令:
node C:/Users/xxxxxxxxx/WeChatProjects/miniprogram-ci/src/upload.js %WORKSPACE% %privateKey% %appid% %version% %desc%
解析:
(1)这里是使用node命令,运行所编写的upload.js脚本,实现上传功能。而非使用安装到本地的miniprogram-ci模块来上传。
(2)参数化声明和从gitee仓库拉取工程项目代码的设置,同3.2&3.3,不赘述
4.2 nodejs脚本的编写
4.2.1 新建项目
(1)在VSCode中,终端命令行,新建文件夹。
(2)cd到新建文件夹下。
(3)npm安装miniprogram-ci模块,生成项目相关的依赖等文件:npm install miniprogram-ci --save
(4)然后新建目录src, 在src目录下新建文件upload.js。
4.2.2 编写upload.js文件,参数写死的情况如下:
(1)先试试所有信息写死的情况,即该例子无传参。代码如下:
(如果要用传参的方式,可跳过这一步直接看下一步,这里我仅做练习记录)
const ci = require('miniprogram-ci')
const project = new ci.Project({
appid: 'xxx',
type: 'miniProgram',
projectPath: 'C:/xxx/',
privateKeyPath: 'C:/xxx/private.xxx.key',
ignores: ['node_modules/**/*'],
})
const uploadResult = ci.upload({
project,
version: '2.0.0',
desc: 'hello0905',
setting: {
es6: false,
},
onProgressUpdate: console.log,
})
console.log(uploadResult)
(2)编写好代码后,在Jenkins中创建任务,运行构建。
因为信息都写死了,所以也不需要参数化,也不需要从gitee拉取项目代码,而是直接从本地获取项目代码。直接用node命令执行upload.js脚本。
构建命令附图如下,执行结果图略:
4.2.3 编写upload.js文件,不写死信息,通过Jenkins命令行传参进来,脚本接住参数,运行脚本的情况如下
写在前面:
参数写死和从本地获取工程代码的方式,毕竟不够灵活。因此这里就延伸到:写好“上传功能的代码框架”,然后通过Jenkins的构建任务,传参到“上传功能的代码框架”,实现上传操作。
(1)upload.js接收参数的方式:process.argv
这是一个数组。
数组的第一第二位,默认接收的是node.exe路径和upload.js路径(所要执行的文件),
从第三位开始,就是对应运行命令node所携带的各个参数(按顺序)。
(2)带参数的代码,情况如下:
const ci = require('miniprogram-ci')
const projectPath = process.argv[2];
const privateKeyPath = process.argv[3];
const appid = process.argv[4];
const version = process.argv[5];
const desc = process.argv[6];
const project = new ci.Project({
appid: appid,
type: 'miniProgram',
projectPath: projectPath,
privateKeyPath: privateKeyPath,
ignores: ['node_modules/**/*'],
})
const uploadResult = ci.upload({
project,
version,
desc,
setting: {
es6: false,
},
onProgressUpdate: console.log,
})
console.log(uploadResult)
4.3 Jenkins构建中调用nodejs脚本命令
参数化声明和从gitee仓库拉取工程项目代码的设置,同3.2&3.3,不赘述。
构建命令:
node C:/Users/xxxxxxxxxxx/WeChatProjects/miniprogram-ci/src/upload.js %WORKSPACE% %privateKey% %appid% %version% %desc%
注意:
node命令中参数的先后顺序,要跟node.js脚本中参数的获取顺序(数组索引)保持一致。
参数从process的索引2开始,即process.argv[2],process.argv[3]...
附图:
4.4 邮件设置
略,参考3.6处的链接文章
4.5 远程触发(带参数)
类似3.5,不赘述。
补充:远程触发的好处:耦合低。缺点:每次都需要在URL中改参数。