微信小程序自动化部署

公司先阶段使用的是通过 ansible 来进行多服务器的部署。而微信小程序开发者工具官方只放出来了 windowsmac 版本。

MacOS 老早就听说虚拟机需要超高的配置,而且也会很卡。自己也没有操作过,对 mac 的虚拟机没什么兴趣。估计以后也用不大上。否则也不会有那么多人去用黑苹果了。

所以就开始了这次在 windows 机器上的踩坑之旅。

本次操作是在 win 10 上进行的。

远程操作使用的 jenkins 是 Ubuntu 系统。

默认 linux 都是有 python 环境的。但是不一定有 pip。这是 python 的一个包管理工具。很多需要用到的工具包,都需要用 pip 来进行安装。

操作步骤

  1. 在 Ubuntu 中,可以使用 apt install python-pip 命令安装。
  2. 输入 pip 命令,确认安装完成。
  3. Pip install pywinrm

由于 windows 和 mac/linux 不一样,没有 ssh 远程连接。所以 ansible 是通过 pywinrm 模块,进行操作的。

系统要求

  1. Net 要 3.0 以上。在 powershell 输入 $host 获取 net 版本。
  2. Powershell 也要 3.0 以上。在 powershell 输入 $psversiontable 获得 ps 版本。
  3. 系统推荐使用 win 10。

操作步骤

  1. Set-executionpolicy remotesigned (可以用 get-executionpolicy 验证)
  2. 下载并使用管理员 powershell 运行 此配置脚本
  3. Winrm quickconfig 快速配置启用
  4. Winrm set winrm/config/service ‘@{AllowUnencrypted=“true”}’
  5. Winrm set winrm/config/service/auth ‘@{Basic=“true”}’

toml

[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

由于很多东西不方便直接贴代码,所以这里列出大概的流程

  1. Jenkins 拉下代码以后,开始执行 ansible 脚本。(在 jenkins 内部把用户名和密码等变量写好,通过 –extra-vars 方式传递)
  2. 通过 win_file 模块创建文件夹,win_copy 模块拷贝代码到 windows 机器上。

yml

- name: 拷贝最新代码到win目录
  win_copy:
    src: "/local_workspace_path/"
    dest: D:\wechat_workspace\{{ build_number }}
  1. 用 win_command 来安装依赖。构建代码同理

yml

- name: 在win上安装依赖
  win_command: cmd.exe /c npm i
  args:
    chdir: D:\wechat_workspace\{{ build_number }}
  1. 开始部署

yml

- name: 尝试开始部署
  win_command: cmd.exe /c mini-deploy
  args: 
    chdir: D:\wechat_workspace\{{ build_number }}\dist
  1. 把预览图拷贝到本地

yml

- name: 把生成的预览图片拷贝到本地
  fetch:
    src: D:\wechat_workspace\{{ build_number }}\dist\preview.png
    dest: "/local_workspace_path/preview.png"
    flat: yes
  1. 通过 base 64 获取图片 encode 编码,md 5 sum 获取图片的 md 5 值。通过 curl 发送到企业机器人,群内就可以通过扫码进行代码代码测试了。

Npm 在 install 过程过,有需要调用 node 命令。因为存在微信 node 和本身环境的 node,会出现问题,需要通过如下指令进行配置!

bash

npm config set scripts-prepend-node-path true

Mini-deploy 代码中默认设置查找路径为

js

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 中新增了一个路径,顺利完成。

长期开启小程序工具,每一次的代码都存放到不同的文件夹。只能以后再去删除了。

由于 base 64 数据量大,发送的请求数据不可读。所以这个问题折腾了我差不多 3 个小时。

Base 64 命令默认会有一个 w 参数为 76,导致换行。上传后的 base 64 数据就会与 md 5 校验码不同。

需要添加参数,具体命令为 base -w 0 preview.png

  1. 推荐先了解 scoop,类似于 centos 的 yum、Ubuntu 的 apt 命令。可以很方便的安装和卸载所需的工具。例如 wget、git、python、nodejs、java 等常用命令。
  2. 所有 win_command 需要使用 cmd.exe /c dir 这样的方法调用,可以避免很多问题。
  3. Shell 代码内,一对双引号,里面包一对单引号。在单引号内就可以通过 $ 符号使用变量。
  4. Ansible 的 fetch 可以用来同步回本地单个文件。无论是 linux 或 windows