微信小程序自动化部署
简介
公司先阶段使用的是通过 ansible 来进行多服务器的部署。而微信小程序开发者工具官方只放出来了 windows 和 mac 版本。
MacOS 老早就听说虚拟机需要超高的配置,而且也会很卡。自己也没有操作过,对 mac 的虚拟机没什么兴趣。估计以后也用不大上。否则也不会有那么多人去用黑苹果了。
所以就开始了这次在 windows 机器上的踩坑之旅。
基本环境介绍
本次操作是在 win 10 上进行的。
远程操作使用的 jenkins 是 Ubuntu 系统。
远程操控端 Ubuntu 环境搭建
默认 linux 都是有 python 环境的。但是不一定有 pip。这是 python 的一个包管理工具。很多需要用到的工具包,都需要用 pip 来进行安装。
操作步骤
- 在 Ubuntu 中,可以使用
apt install python-pip
命令安装。 - 输入 pip 命令,确认安装完成。
- Pip install pywinrm
Win 10 被控端环境搭建
由于 windows 和 mac/linux 不一样,没有 ssh 远程连接。所以 ansible 是通过 pywinrm 模块,进行操作的。
系统要求
- Net 要 3.0 以上。在 powershell 输入 $host 获取 net 版本。
- Powershell 也要 3.0 以上。在 powershell 输入 $psversiontable 获得 ps 版本。
- 系统推荐使用 win 10。
操作步骤
- Set-executionpolicy remotesigned (可以用 get-executionpolicy 验证)
- 下载并使用管理员 powershell 运行 此配置脚本
- Winrm quickconfig 快速配置启用
- Winrm set winrm/config/service ‘@{AllowUnencrypted=“true”}’
- Winrm set winrm/config/service/auth ‘@{Basic=“true”}’
在 ansible 脚本内配置变量
[windows]
1.1.1.1
[windows:vars]
ansible_ssh_user=username
ansible_ssh_pass=password
ansible_ssh_port=5985
ansible_winrm_transport=ntlm
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
具体流程
由于很多东西不方便直接贴代码,所以这里列出大概的流程
- Jenkins 拉下代码以后,开始执行 ansible 脚本。(在 jenkins 内部把用户名和密码等变量写好,通过 –extra-vars 方式传递)
- 通过 win_file 模块创建文件夹,win_copy 模块拷贝代码到 windows 机器上。
- name: 拷贝最新代码到win目录
win_copy:
src: "/local_workspace_path/"
dest: D:\wechat_workspace\{{ build_number }}
- 用 win_command 来安装依赖。构建代码同理。
- name: 在win上安装依赖
win_command: cmd.exe /c npm i
args:
chdir: D:\wechat_workspace\{{ build_number }}
- 开始部署
- name: 尝试开始部署
win_command: cmd.exe /c mini-deploy
args:
chdir: D:\wechat_workspace\{{ build_number }}\dist
- 把预览图拷贝到本地
- name: 把生成的预览图片拷贝到本地
fetch:
src: D:\wechat_workspace\{{ build_number }}\dist\preview.png
dest: "/local_workspace_path/preview.png"
flat: yes
- 通过 base 64 获取图片 encode 编码,md 5 sum 获取图片的 md 5 值。通过 curl 发送到企业机器人,群内就可以通过扫码进行代码代码测试了。
问题处理
Npm i 的安装问题
Npm 在 install 过程过,有需要调用 node 命令。因为存在微信 node 和本身环境的 node,会出现问题,需要通过如下指令进行配置!
npm config set scripts-prepend-node-path true
Mini-deploy 的问题
Mini-deploy 代码中默认设置查找路径为
wxPaths = ['C:\\Program Files (x86)\\Tencent\\微信web开发者工具\\cli.bat', 'C:\\Program Files\\Tencent\\微信web开发者工具\\cli.bat']
然后去注册表 REG QUERY "HKLM\\SOFTWARE\\Wow6432Node\\Tencent\\微信web开发者工具
查询真正的安装位置,放在数组的第一位作为启动项。
由于微信开发工具默认安装到 c 盘,路径中包含有空格,在 ansible 的执行过程中,会出现报错。
于是改动到了 D 盘。于是路径出现了问题。
最终在 wxPaths 中新增了一个路径,顺利完成。
无法删除 dist,最终代码文件夹
长期开启小程序工具,每一次的代码都存放到不同的文件夹。只能以后再去删除了。
微信机器人 base 64 的问题
由于 base 64 数据量大,发送的请求数据不可读。所以这个问题折腾了我差不多 3 个小时。
Base 64 命令默认会有一个 w 参数为 76,导致换行。上传后的 base 64 数据就会与 md 5 校验码不同。
需要添加参数,具体命令为 base -w 0 preview.png
补充说明
- 推荐先了解 scoop,类似于 centos 的 yum、Ubuntu 的 apt 命令。可以很方便的安装和卸载所需的工具。例如 wget、git、python、nodejs、java 等常用命令。
- 所有 win_command 需要使用
cmd.exe /c dir
这样的方法调用,可以避免很多问题。 - Shell 代码内,一对双引号,里面包一对单引号。在单引号内就可以通过 $ 符号使用变量。
- Ansible 的 fetch 可以用来同步回本地单个文件。无论是 linux 或 windows