微信小程序持续集成方案 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 小程序相关 >

微信小程序持续集成方案

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:75

主要是通过小程序提供的miniprogram-ci,然后结合gitlab-ci,docker实现

解决测试,开发频繁找开发编译二维码导致开发效率低,测试到生产因人为导致配置错误等问题

1.需要了解miniprogram-ci

npm install miniprogram-ci --save
miniprogram-ci 目前提供以下能力:
1.上传代码,对应小程序开发者工具的上传
2.预览代码,对应小程序开发者工具的预览
3.构建 npm,对应小程序开发者工具的: 菜单-工具-构建npm
4.上传云开发云函数代码,对应小程序开发者工具的上传云函数能力
5.代理,配置 miniprogram-ci 的网络请求代理方式
6.支持获取最近上传版本的 sourceMap
7.支持 node 脚本调用方式和 命令行 调用方式

要使用这些功能需要在微信公众平台-开发-开发设置,获取代码上传秘钥,以及配置IP白名单,这里需要注意一下IP白名单暂时只能配置两个,建议配置测试和生产两个服务器IP

2.需要了解前端项目部署方式

可查看此篇:https://blog.csdn.net/qq_31930427/article/details/108849049

3.编写miniprogram-ci脚本,通过node方式调用

这里是通过在gitlab-ci中执行 node ci.js脚本方式调用,可传环境参数进来对应环境配置,测试环境会生成预览图片在项目目录下,然后DOCKERFILE文件中通过COPY命令将图片考到docker容器内形成静态资源。

// 小程序自动打包上传和预览脚本

const mpenv = {

dev: `import configEnv from './config-dev.js'\n//import configEnv from './config-test.js'\n// import configEnv from './config-prod.js'\nconst config = configEnv\nexport default config`,

test: `//import configEnv from './config-dev.js'\nimport configEnv from './config-test.js'\n// import configEnv from './config-prod.js'\nconst config = configEnv\nexport default config`,

prod: `//import configEnv from './config-dev.js'\n//import configEnv from './config-test.js'\nimport configEnv from './config-prod.js'\nconst config = configEnv\nexport default config`

}

const dockerfile = {

dev: `FROM nginx:alpine\n#COPY ./qrcode-test.jpg /var/www/html/\nCOPY ./mp.conf /etc/nginx/conf.d/\nRUN rm /etc/nginx/conf.d/default.conf\nEXPOSE 80\nCMD ["nginx","-g","daemon off;"]`,

test: `FROM nginx:alpine\nCOPY ./qrcode-test.jpg /var/www/html/\nCOPY ./mp.conf /etc/nginx/conf.d/\nRUN rm /etc/nginx/conf.d/default.conf\nEXPOSE 80\nCMD ["nginx","-g","daemon off;"]`,

prod: `FROM nginx:alpine\n#COPY ./qrcode-test.jpg /var/www/html/\nCOPY ./mp.conf /etc/nginx/conf.d/\nRUN rm /etc/nginx/conf.d/default.conf\nEXPOSE 80\nCMD ["nginx","-g","daemon off;"]`

}

const mpPreviewDesc = {

dev: '开发环境二维码',

test: '测试环境二维码',

prod: '生产环境二维码'

}

const miniprogramRoot = './'

const ci = require('miniprogram-ci')

const projectConfig = require('./project.config.json')

const versionConfig = require('./version.js')

const args = process.argv.splice(2)

if (args.length == 0) {

throw new Error('node ci.js 缺少对应的环境参数!');

}

const fs = require("fs")

try {

fs.writeFileSync('./config.js', mpenv[args[0]])

fs.writeFileSync('./Dockerfile', dockerfile[args[0]])

} catch (error) {

throw error;

}

// new ci实例

const project = new ci.Project({

appid: projectConfig.appid,

type: 'miniProgram',

projectPath: miniprogramRoot,

privateKeyPath: './ci-private.key',

ignores: ['node_modules/**/*'],

});

/** 上传 */

async function upload({version, desc}) {

await ci.upload({

project,

version,

desc,

setting: {

es6: true,

minify: true,

autoPrefixWXSS: true

}

})

}

/** 预览 */

async function preview({desc}) {

await ci.preview({

project,

desc,

setting: {

es6: true,

minify: true,

autoPrefixWXSS: true

},

qrcodeFormat: 'image',

qrcodeOutputDest: './qrcode-test.jpg'

})

}

if (args[0] == 'test') {

preview({desc: mpPreviewDesc[args[0]]})

}

if (args[0] == 'prod') {

upload({version: versionConfig.version, desc: versionConfig.desc})

}

4.可编写通知脚本,结合企业微信机器人等进行发版通知等

#!/bin/bash

messageurl="xxx"

version=`grep 'version:' ./version.js | sed -r 's/.*'\''(.+)'\''.*/\1/'`

desc=`grep 'desc:' ./version.js | sed -r 's/.*'\''(.+)'\''.*/\1/'`

contentStr=""

people=""

if [ "$1" == "success" ];then

if [ "$2" == "dev" ];then

contentStr="小程序开发环境二维码已更新,地址:http://47.115.170.133/mp/qrcode-test.jpg"

elif [ "$2" == "test" ];then

contentStr="小程序测试环境二维码已更新,地址:https://tcmvc.kwmzy.com/mp/qrcode-test.jpg"

elif [ "$2" == "prod" ];then

contentStr="小程序$version已上传到体验版,备注:$desc"

people="@all"

else

contentStr="sh notify.sh缺少环境参数!"

fi

elif [ "$1" == "fail" ];then

contentStr="小程序CI失败,请前去查看原因!"

else

contentStr="sh notify.sh缺少状态参数!"

fi

curl "$messageurl" \

-H 'Content-Type: application/json' \

-d '

{

"msgtype": "text",

"text": {

"content": "'"$contentStr"'",

"mentioned_list":["'"$people"'"]

}

}'

5.设置gitlab日程表

因小程序二维码有时效限制,在gitlab项目的CICD的日程表中进行配置,

6.若因小程序CI导致内存不足,可采用定时调度进行清理

可在小程序项目的gitlab-ci配置中执行成功后执行docker rm $(docker ps -a | grep node | grep Exited | awk '{print $1}')命令进行指定清除,docker rm删除 括号中的docker ps进行筛选出容器ID 这里是筛选出 名称带node,然后状态已停止的容器,对应的清理镜像的 一样docker rmi $(docker images | grep test | awk '{print $3}')

相关案例查看更多