前言
项目使用的是 Uniapp 编译小程序平台,区分有三种环境 production
& trial
& development
。
在 trial
环境中会编译到专用的 微信小程序A
,production
环境编译到 微信小程序B
。
trial
环境需要而外引入一些环境专用的 SDK,production
环境需要关联 UniCloud。
build script 有下面的两种:
pnpm run build:mp-weixin
pnpm run build:custom trial-mp-weixin
HBuilderX Cli
按照官方教程中的 使用 vue-cli 方式 创建的项目进行 cli 编译时是无法关联 UniCloud 服务空间的,编译完成后运行时会在控制台提示 应用未关联服务空间,请在uniCloud右键关联服务空间,要使用 HBuilderX 进行编译。
由于是在 CI 流程中,并不想手动点击 HBuilderX 操作,所以使用 HBuilderX Cli 进行发布操作。
HBulderX Cli 文档:hx.dcloud.net.cn/cli/README
然后才发现,HBuilderX 不能在 linux 上安装(只支持 Windows 和 macOS)...原有的 Ubuntu CI 机器就用不了,只能找了台 macOS 的 CI 机器,提前在机器上登录好 Uniapp 的账号,关联好 UniCloud。开始尝试进行发布。
# 发布微信小程序
/Applications/HBuilderX.app/Contents/MacOS/cli publish \
--platform MP-WEIXIN \
--project ${JOB_NAME} \
--appid ${wechat_mp_appId}
发布前一定要确保 HBuilderX 已经启动,否则不会执行任何操作(并且还是正常结束不会触发异常)
但是如果每次构建时都执行
/Applications/HBuilderX.app/Contents/MacOS/cli open
且 HBuilderX 已经启动的情况下,又会有机率让 HBuilderX 卡死... 错误如下13:49:02 + /Applications/HBuilderX.app/Contents/MacOS/cli open
13:49:04 The rpc request id: "100000" for method: "client verify" occur timeout with processEvents!
如果每次都执行
/Applications/HBuilderX.app/Contents/MacOS/cli app quit
退出 HBuilderX 的话是不是理论上就不会有上面的问题了?不不不..它会提示你账号没有登录...(当然也可以用cli user login
先进行一次登录解决这个问题)13:50:34 + /Applications/HBuilderX.app/Contents/MacOS/cli open
13:50:37 + /Applications/HBuilderX.app/Contents/MacOS/cli publish --platform MP-WEIXIN --project xxxx --appid xxxx
13:50:37 13:50:37.878 项目 'xxxx' 开始发布微信小程序...
13:50:37 13:50:37.906 此功能需要先登录!
有一个需要注意的地方是 project 参数是项目的名称,而在 HBuilderX 里项目名称是目录的名称,并且存在重名的可能。例如:/code/test-project
和 /code/test/test-project
两个目录都可以在 HBuilderX 中
存在,并且项目名称都是 test-project
。
我们直接使用了 CI 的 JOB_NAME 作为项目名称,通过 jenkins 来保障项目名称不会重复...
HBuilderX Cli 可以配置发布后上传,但是我们有些特殊参数 HBuilderX Cli 并不支持,所以这里只使用 HBuilderX Cli 进行发布(编译)操作。
使用 npm 编译
前言中有提到,项目中存在自定义平台,而 HBuilderX Cli 不支持自定义平台发布...
所以可以直接使用 npm 进行编译
pnpm run build:custom trial-mp-weixin
发布上线
将构建好的文件上传至微信小程序可以使用 miniprogram-ci,只需要提前在微信公众平台中生成小程序代码上传密钥即可。
miniprogram-ci upload \
--project-path $(readlink -f ./dist/build/mp-weixin) \
--private-key-path /example/private.xxxx.key \
--appid xxxx \
--upload-version 1.0.${BUILD_NUMBER} \
--upload-description ${GIT_COMMIT} \
--robot 1
启用上传 IP 白名单(可选)
由于 CI 机器在内网,没有固定的外网 IP,可以使用代理进行上传(IP 白名单中设置代理机的 IP 即可)。
在 miniprogram-ci 中指定 proxy 参数即可通过代理上传
miniprogram-ci upload \
--project-path $(readlink -f ./dist/build/mp-weixin) \
--private-key-path /example/private.xxxx.key \
--appid xxxx \
--upload-version 1.0.${BUILD_NUMBER} \
--upload-description ${GIT_COMMIT} \
--robot 1
--proxy http(s)://username:passsword@host:12345
代理服务器配置
服务器上使用 tinyproxy
启动一个 http / https 代理服务。
sudo apt-get install tinyproxy
修改 tinyproxy 的配置文件
# 默认端口是 8888 ,替换成一个随机的非常用端口
Port 12345
# 默认值为 100
MaxClient 5
# 默认只允许 127.0.0.1 (ipv4 & ipv6) 链接,我们需要从外部连入,注释禁用即可。
#Allow 127.0.0.1
#Allow ::1
# tinyproxy 支持 BasicAuth
BasicAuth user password
完整的 CI shell
rm -rf ./dist
pnpm install
if [ "${Platform}" = "mp-weixin" ];
then
if [ "${Env}" = "Production" ];
then
hx_cli=/Applications/HBuilderX.app/Contents/MacOS/cli
wechat_mp_appId="xxxx"
# ${hx_cli} project open --path $(readlink -f .)
${hx_cli} publish \
--platform MP-WEIXIN \
--project ${JOB_NAME} \
--appid ${wechat_mp_appId}
else
Platform="trial-mp-weixin"
wechat_mp_appId="xxxx"
pnpm run build:${Platform}
fi
miniprogram-ci upload \
--project-path $(readlink -f ./dist/build/mp-weixin) \
--private-key-path /example/private.${wechat_mp_appId}.key \
--appid ${wechat_mp_appId} \
--upload-version 1.0.${BUILD_NUMBER} \
--upload-description ${GIT_COMMIT} \
--robot 1 \
--proxy http(s)://user:passwsord@host:12345
fi