小程序-自动生成二维码-自动打码

目前公司小程序 是随M/pc/app一样正常版本迭代。开发小程序的流程也更加规范,人员也越多
每次 QA 或者PM 在 钉钉群里 @前端 “给我生成个 开发版的小程序二维码”,让前端很麻烦,要停止开发 切分支编译,还要耗时。
因此有了这个自动打码的需求

先上图

编译完给个链接

jenkins上的配置

为什么要自动打码?

1 . 避免打包编译结果不一致(win/mac/node版本/本地代码不是最新等等)

  1. 避免可互相覆盖的问题,没有统一版本
  2. QA/PM 不能自主控制 ,老是要等FE给我弄,你总不能让每个QA也安装开发者工具然后配环境吧。。
  3. 写代码写bug写开森呢,让我给你打码!?
  4. 编码一次半分钟,一会就要切换编译一次,累死了。。。
  5. ....等等问题

前期准备

  1. 翻了微信官方API,使用cli命令
    https://developers.weixin.qq.com/miniprogram/dev/devtools/cli.html
  2. 找一台mac 安装上微信开发者工具,配置好项目,把【project.config.json】配置好
  3. jenkins 配置好git项目,gitlab 上配置好基于事件的webhook,
  4. 这样 只要合并过 指定分支,就能触发jenkins编译啦

编译流程如下:

  1. QA 点击 jenkins 立即构建 或者 webhook触发编译
  2. 执行编译脚本,我们使用了 wepy ,需要先 npm run build
  3. 使用cli -p 判断是否需要登录
  4. 未登录 的情况 ,需要使用 cli -l 执行登录,扫码
  5. 登录情况下,直接生成二维码
  6. 然后使用钉钉 机器人这个东东,在群里反馈下
  7. curl 发一个请求给钉钉机器人就完事儿啦

说明

  1. 如果是本地跑的话,不用这么麻烦,照着https://developers.weixin.qq.com/miniprogram/dev/devtools/cli.html一步步走下去就行了
  2. 主要是因为jenkins不会展示 微信这个cli回调里面的图片,要不不会这么复杂
  3. 钉钉机器人里面的图片地址都要外网能解析的,所以我们选择了Link模式
  4. 下面的源码是没有放到 sy-cli 里面的,接下来会放到 sy-cli里面做统一维护
  5. 下面的源码没有经过测试,只是mac可以用嗷。。
  6. wepy部分可以看 <<迷死氧身后的男人,踩坑小程序开发>> 这篇文章
  7. 其实做过jenkins做编译的都了解,就是个持续集成的思想。
    把编译工作收敛,放在一个地方编译,减少上面那些问题,我司所有前端项目都在jenkins上编译啦

遇到问题

1.jenkins的编译机,必须要先配置好 微信开发者工具 和 开发者工具里面的项目,还有一堆配置。简单说就是不通过微信的cli 是个正常开发环境。

  1. 微信的cli 生成二维码没有回调,只有扫码成功和扫码失败的回调,所以写了先删除目录,再setTimeout去发钉钉消息
  2. 微信的cli 不会生成目录,要自己mkdir
  3. jenkins拿 微信的cli 二维码回调,不会显示图片,所以才另存图片发送
  4. jenkins上的图片,没有对外网解析,钉钉是拿不到的
  5. 必须要先编译,再预览/登录,才行,要不不能保证每次生成的代码都是最新
  6. jenkins的打包机器为 物理mac机器,所以不能在内部gitlab 使用webhook触发,需要主动触发
  7. dist目录里面要有 project.config.json,wepy 1.7.0之前要手工生成下,1.7.0以后不需要,详见 wepy传送门

简化版本

使用 https://github.com/soyoung616/sy-cli


// 在你的项目中
npm install sy-cli -D
// 新建 sy-cli-qr.json
// 修改package.json的scripts
// package.json

...
"scripts": {
    "dev": "wepy build --watch",
    "build": "cross-env NODE_ENV=production wepy build --no-cache",
    "test": "echo \"Error: no test specified\" && exit 1",
    "qr": "sy-cli qr \"./sy-cli-qr.json\""
  },
...
// sy-cli-qr.json

{
 "path":{
// mac上的cli路径都一样
   "cli":"/Applications/wechatwebdevtools.app/Contents/Resources/app.nw/bin/cli",
// wepy生成后的路径
   "wx":"./dist"
 },
 "source":{
// wepy的编译
   "scripts":"npm run build"
 },
// jenkins的工作空间里面
 "jenkinsURL":"http://XXXX/job/XXXX/ws/XXXX/",
// 钉钉机器人的token
 "dingtalkToken":"XXXX"
}


源码:

  1. 新建 sy-cli-qr.json 和qr.js,跟package.json平级
  2. 把sy-cli-qr.json里面的值替换掉
  3. node qr.js 或者 npm run qr
//qr.js

const shell = require('shelljs')
const path = require('path')
const config = require('./sy-cli-qr.json')
const cli = config.path.cli
const distProject = path.resolve(__dirname, config.path.wx)
const sourceProject = path.resolve(__dirname)
const sourceScripts = config.source.scripts
const dingtalkToken = config.dingtalkToken
const jenkinsURL = config.jenkinsURL

const QR = {
  picLogin: 'QR/login.png',
  picPreview: 'QR/preview.png',
  login() {
    let _this = this
    let _time = Date.parse(new Date())
    shell.rm('-rf','QR')
    shell.mkdir('QR')
    shell.exec(`${cli} -l --login-qr-output image@${path.resolve(__dirname, _this.picLogin)}`, (code, stdout, stderr) => {
      if (stdout.indexOf('login success') > -1) {
        _this.createQR()
      }
    })
    setTimeout(() => {
      let _txt = `小程序编译,请扫码登录,${_this.toDate(new Date())}`
      shell.exec(`curl 'https://oapi.dingtalk.com/robot/send?access_token=${dingtalkToken}' \
      -H 'Content-Type: application/json' \
      -d '
     {"msgtype": "actionCard",
       "actionCard": {
          "text": "${_txt}",
          "title": "${_txt}",
          "hideAvatar": "0",
          "btnOrientation": "1",
          "btns": [
              {
                  "title": "扫码登录",
                  "actionURL": "${jenkinsURL}${_this.picLogin}?t=${_time}"
              }
          ]
        }
     }'`)
    }, 2000)
  },
  createQR() {
    let _this = this
    let _time = Date.parse(new Date())
    shell.rm('-rf','QR')
    shell.mkdir('QR')
    shell.exec(`${cli} -p ${distProject} --preview-qr-output image@${path.resolve(__dirname, _this.picPreview)}`, (code, stdout, stderr) => {
      if (stderr.indexOf('需要重新登录') > -1) {
        _this.login()
      } else {
        let _txt = `小程序编译成功,请扫码查看,${_this.toDate(new Date())}`
        shell.exec(`curl 'https://oapi.dingtalk.com/robot/send?access_token=${dingtalkToken}' \
    -H 'Content-Type: application/json' \
    -d '
   {"msgtype": "actionCard",
     "actionCard": {
      "text": "${_txt}",
      "title": "${_txt}",
      "hideAvatar": "0",
      "btnOrientation": "1",
      "btns": [
          {
              "title": "扫码查看",
              "actionURL": "${jenkinsURL}${_this.picPreview}?t=${_time}"
          }
      ]
      }
   }'`)
      }
    })
  },
  build() {
    return new Promise((resolve, reject) => {
      shell.cd(`${sourceProject}`)
      shell.exec(`${sourceScripts}`, (code, stdout, stderr) => {
        if (code) {
          reject(stderr)
        } else {
          resolve(1)
        }
      })
    })
  },
  async init() {
    let _this = this
    let _build = await _this.build().catch((err) => {
      console.log(err)
      console.log('编译失败')
      process.exit(1)
    })
    if (_build) {
      _this.createQR()
    }
  },
  toDate (timeStamp, getMilliseconds) {
    let date = new Date(timeStamp)
    let time = [
      date.getFullYear(),
      date.getMonth() + 1,
      date.getDate(),
      date.getHours(),
      date.getMinutes(),
      date.getSeconds()
    ]

    getMilliseconds && time.push(date.getMilliseconds())

    for (var i = 0; i < time.length; i++) {
      var val = time[i]
      if (val <= 9) {
        time[i] = '0' + val
      }
    }
    if (getMilliseconds) {
      time = time.slice(0, 3).join('-') + ' ' + time.slice(3, time.length).join(':')
    } else {
      time = time.slice(0, 3).join('-') + ' ' + time.slice(3, 6).join(':')
    }
    return time
  }
}

QR.init()


// package.json

...
"scripts": {
    "dev": "wepy build --watch",
    "build": "cross-env NODE_ENV=production wepy build --no-cache",
    "test": "echo \"Error: no test specified\" && exit 1",
    "qr": "node qr.js"
  },
...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • title: 小程序教程之wepy 参考文档 中文文档:https://tencent.github.io/wep...
    采香行处蹙连钱阅读 11,891评论 8 24
  • 推送消息出现情景和处理办法 1. 当程序处于关闭状态收到推送消息时,点击推送图标会调用- (BOOL)applic...
    鱼与熊掌不能兼得阅读 211评论 0 0
  • 第二十七话 一切重来 夏菊薇的信到这里结束了,最后的一张纸是另外一份便签条。 “以前为了妈妈的病,我用尽了办法赚钱...
    紫上薰阅读 1,067评论 0 98
  • 我们9组亮剑队的金鹰们大家好! 非常感谢家人们一周来对笑看风云的帮助和鼓励,也越来越感觉到思涵系统的魅力。 老师们...
    笑看风云_9628阅读 134评论 -1 5