小程序结合Jenkins实现CICD
在将公司前后端大多数项目都接入了 CI
流程后,发布效率快的一批。但是我最近发现我司在微信小程序这的发布,居然还是手动??? 程序员天生就对重复的事情敏感,这些事情得想个法弄成自动的。
但是在微信小程序出现,上传体验版/生成开发版都需要利用微信开发者工具,最开始是依赖于人手动去点 ide
上的上传按钮,再然后就是,微信开放出了命令行调用接口
之前看了一些利用 Mac Os + Jenkins
做 CI
,这个方案并不能够适用所有项目组,我们重点还是希望通过服务器进行 CI
,于是就去翻找小程序文档以及网上文章, 天无绝人之路,发现小程序的文档多了 CI
这一项
miniprogram-ci 从 1.0.28 开始支持第三方平台开发的上传和预览,调用方式与普通开发模式无异
整理目录结构
因为 miniprogram-ci
需要依赖于 npm
安装,但是又不需要与我们项目的包相关,所以就有了如下结构
npm install miniprogram-ci
获取小程序代码上传秘钥
在公众平台的开发管理 -> 开发设置中,需要先将秘钥下载下来,我们可以写入到项目的根目录的 ci-private.key
文件中,加入版本管理,因为我们有 IP
白名单,所以泄露也不打紧
配置本次版本更新内容
我们将配置放入到根目录中,方便自动更新的时候获取
- version.config.json
{ "version":"1.1.5", "versionDesc":"Test Jenkins" }
CI程序编写
- start.js
const ci = require('miniprogram-ci'); const fs = require('fs'); /* 项目配置 */ const projectConfig = require('./project.config.json'); // 就是小程序的配置文件 const versionConfig = require('./version.config.json'); // new ci实例 const project = new ci.Project({ appid: projectConfig.appid, type: 'miniProgram', projectPath: projectConfig.miniprogramRoot, privateKeyPath: './ci-private.key', ignores: ['node_modules/**/*'], }); /** 上传 */ async function upload({version = '0.0.0', versionDesc ='test'}) { await ci.upload({ project, version, desc: versionDesc, setting: { es7: true, minify: true, autoPrefixWXSS: true }, onProgressUpdate: console.log, }) } /** 入口函数 */ async function init() { // 上传 await upload(versionConfig); } init();
测试能否上传成功
node start.js
这样就是可以成功了,然后我们利用 Jenkins
让我提交代码时自动发布体验版
接入Jenkins
- git秘钥等凭据添加
- 安装钉钉通知插件、NodeJs环境插件
- 配置钉钉机器人、Node别名
- 创建流水线项目
- 项目基本配置 webhook、构建记录滚动配置等
编写Jenkinsfile
pipeline { agent any // 环境变量 environment { GIT_ADDRESS = 'git@xxxx/wechat-blog.git' BRANCH_NAME = 'master' } stages { // 拉取git代码 stage('git pull') { steps { git branch: "${BRANCH_NAME}", credentialsId: '1', url: "${GIT_ADDRESS}" } } // 构建 stage('build') { steps { nodejs('nodejs') { sh "npm install" sh "node start.js" } } } } post { success { dingtalk ( robot: '58f10219-2cd3-4de7-a1af-f85f4010c10a', type: 'MARKDOWN', title: "水商城构建通知 - $BRANCH_NAME", text: [ '# 水商城构建通知 - $BRANCH_NAME', '', '---', "- 任务: ${env.BUILD_NUMBER}", '- 状态: <font color=blue>构建成功</font>', ] ) } failure { dingtalk ( robot: '58f10219-2cd3-4de7-a1af-f85f4010c10a', type: 'MARKDOWN', title: "构建通知 - $BRANCH_NAME", text: [ '# 构建通知 - $BRANCH_NAME', '', '---', "- 任务: ${env.BUILD_NUMBER}", '- 状态: <font color=red>构建失败</font>', ] ) } } }
Git提交测试
钉钉通知成功
注意
如果上传失败,要记得去增加 IP白名单