搭建 uniapp CI 构建并发布微信小程序

938 阅读3分钟

前言

项目使用的是 Uniapp 编译小程序平台,区分有三种环境 production & trial & development

trial 环境中会编译到专用的 微信小程序Aproduction 环境编译到 微信小程序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