Vue打包并自动部署到服务器,并请求飞书群机器人发送部署消息

1. 自动部署

安装

yarn add scp2 chalk ssh2 -D
yarn add npm-run-all -D
  1. scp2:上传文件
  2. ssh2:运行指令
  3. chalk:改变console.log样式
  4. npm run all:并行或者顺序执行npm指令 https://www.jianshu.com/p/4ccff715a6a9

在vue项目根目录新建以下文件

├── deploy                     # 部署相关
    ├── deploy.dev.mjs         # dev服务器部署配置
    ├── deploy.mjs             # 服务器连接
    ├── deploy.test.mjs        # test服务器部署配置
    └── notice.mjs             # 请求飞书群机器人

deploy.dev.mjs

import deploy from './deploy.mjs'

const server = {
    name: '', // 项目名
    env: 'dev', // 部署环境
    notice: [], // [{openId: 飞书openId,name: 姓名}]
    url: '', // 飞书机器人
    host: '', // 服务器的IP地址
    port: '22', // 服务器端口
    username: 'root', // 用户名
    password: '', // 密码
    path: '/data/dist/', // 项目部署的服务器目标位置
    command: '' // 删除命令 rm -rf /var/www/html/*
}
deploy(server)

deploy.mjs

import scpClient from 'scp2'
import chalk from 'chalk'
import ssh2 from 'ssh2'
import sendNotice from './notice.mjs'

var Client = ssh2.Client
var conn = new Client()

export default function (server) {
  console.log(chalk.blue('正在部署' + server.env + '...'))
  sendNotice(server, 1)
  conn
    .on('ready', () => {
      conn.exec(server.command, (err, stream) => {
        if (err) {
          throw err
        }
        stream
          .on('close', () => {
            scpClient.scp(
              './dist/', // 本地打包文件的位置
              {
                host: server.host,
                port: server.port,
                username: server.username,
                password: server.password,
                path: server.path
              },
              (err) => {
                if (err) {
                  sendNotice(server, 2)
                  console.log(chalk.red(server.env + '部署失败!'))
                  throw err
                } else {
                  sendNotice(server, 3)
                  console.log(chalk.green(server.env + '部署成功!'))
                }
              }
            )
            conn.end()
          })
          .on('data', (data) => {
            console.log('STDOUT: ' + data)
          })
          .stderr.on('data', (data) => {
            console.log('STDERR: ' + data)
          })
      })
    })
    .connect({
      host: server.host,
      port: server.port,
      username: server.username,
      password: server.password
    })
}

package.json

"build": "vue-cli-service build", // 打包
"build:all": "run-s build deploy:all", // 打包并部署dev test
"build:dev": "run-s build deploy:dev", // 打包并部署dev
"build:test": "run-s build deploy:test", // 打包并部署test
"deploy:all": "run-p deploy:dev deploy:test",  // 部署dev test
"deploy:dev": "node ./deploy/deploy.dev.mjs", // 部署dev
"deploy:test": "node ./deploy/deploy.test.mjs" // 部署test

2. 飞书群机器人发送部署消息

添加飞书机器人

群设置->群机器人->添加机器人->自定义机器人


image.png

notice.mjs

import axios from 'axios'

// name:项目名称 env:部署环境 notice:通知@
export default function ({ name, env, notice, url }, noticeType) {
  var startText = noticeType == 1 ? '开始' : '结束'

  var envText = '💻 服务器环境:' + env

  var success = noticeType == 2 ? '失败' + ' ❌' : noticeType == 3 ? '成功' + ' ✅' : ''
  var successText = noticeType != 1 ? '\n🌟 构建结果:' + success : ''

  var timeText = '\n🕐 当前时间:' + new Date().toLocaleString()

  var atUser = ''
  if (notice && notice.length > 0 && noticeType != 1) {
    atUser = '\n👤 提醒:'
    notice.forEach((item) => {
      atUser = atUser + ' <at user_id = "' + item.openId + '">' + item.name + '</at>'
    })
  }

  var content = envText + successText + atUser + timeText

  var stateIcon = noticeType == 2 ? ' 😥' : noticeType == 3 ? ' 😀' : ' 🙏'
  // 消息模板
  var data = {
    msg_type: 'interactive',
    card: {
      config: {
        wide_screen_mode: true,
        enable_forward: true
      },
      elements: [
        {
          tag: 'hr'
        },
        {
          tag: 'div',
          text: {
            content: content,
            tag: 'lark_md'
          }
        }
      ],
      header: {
        template: 'blue',
        title: {
          content:
            '🔔 ' + name + '前端' + ' - ' + '构建' + startText + '(' + env + ')' + stateIcon,
          tag: 'plain_text'
        }
      }
    }
  }
  // 请求机器人发送消息
  axios({
    method: 'post',
    url: url,
    headers: {
      'Content-Type': 'application/json'
    },
    data: data
  })
}

群机器人部署通知

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

推荐阅读更多精彩内容