笔者搞了一年多微前端我的项目,一个团队治理十个微利用,换成docker镜像部署后,公布操作一下从原来的脚本直连服务器的1分钟变成了几十分钟,尤其上传每个利用到各自的阿里云仓库。这里就再写个脚本一键打包docker镜像并上传阿里云。
本文只讲怎么制作一个脚本帮忙去加重开发人员累赘,对于docker-compose的配置见:应用各种姿态难受的部署微前端我的项目(上:打包与上传)

效果图

间接上代码

/** * @name docker镜像打包上传脚本 * @author weilan * @time 2021.02.22 */const fs = require('fs');const path = require('path');const util = require('util');const { log } = require('../utils/log');const exec = util.promisify(require('child_process').exec);const sub_app_ath = path.resolve();let sub_apps = fs.readdirSync(sub_app_ath).filter(i => /^subapp|master/.test(i));const inquirer = require('inquirer'); // 用于命令行交互/** * @name 命令行交互配置项 */const question = [  {    type: 'confirm',    name: 'dist',    message: '是否须要打包前端动态资源?',  },  {    type: 'confirm',    name: 'env',    message: '请抉择是否须要打包成不联网的内网部署',    when: function (answers) { // 当answer为true的时候才会发问以后问题      return answers.dist    }  },  {    type: 'checkbox',    name: 'apps',    message: '请抉择要公布的模块',    choices: sub_apps,    validate: function (val) {      if (val.length) { // 校验        return true;      }      return "抉择不能为空";    }  },]/** * @name 依据命令交互配置后果做逻辑解决 */inquirer.prompt(question).then(async (answer) => {  let subApps = answer.apps;  let buildScript = answer.env ? 'yarn build --Intranet' : 'yarn build';  let needDist = answer.dist;  let now = +new Date();  // 登录阿里云  const { error: loginError } = await exec('docker login --username=哈哈哈 --password=嘿嘿 registry.cn-zhangjiakou.aliyuncs.com');  if (loginError) {    log.red(loginError, '登录镜像核心失败')    return;  }  console.log(`开始顺次解决 ${JSON.stringify(subApps)} ......`);  subApps.reduce((chain, item) => {    return chain.then(() => publishIamge(item, now, needDist, buildScript))  }, Promise.resolve())});/** * @name 打包镜像并推送阿里云 * @param {String} moduleName 模块名 * @param {String} now 以后版本工夫戳 * @param {Boolean} needDist 是否须要打包前端动态资源 * @param {String} buildScript 前端动态资源打包命令 */async function publishIamge(moduleName, now, needDist, buildScript) {  // 打包前端动态资源  if (needDist) {    console.log('开始打包前端动态资源' + moduleName);    const { error } = await exec(buildScript, { cwd: path.resolve(moduleName) });    if (error) {      log.red(moduleName, '前端代码打包谬误:', error)      return;    }    log.green(moduleName + '前端代码打包胜利')  }  // 打包镜像  console.log(`开始打包镜像 ${moduleName} ......`);  const { stdout: buildStdout, error: buildError } = await exec('docker-compose build ' + moduleName);  if (buildError) {    log.red(buildError, '镜像打包谬误')    return;  }  log.cyan(buildStdout)  log.green('镜像打包实现,开始制作镜像标签')  // 更新镜像标签  const imageName = 'ibp2fe_' + moduleName;  const { error: tagError } = await exec(`docker tag ${imageName} registry.cn-zhangjiakou.aliyuncs.com/futureweb/${imageName}:${now}`);  if (tagError) {    log.red(tagError, '镜像标签异样')    return;  }  log.green('镜像版本标签更新结束,开始更新last标签')  // 更新镜像标签last版本  const { error: tagLastError } = await exec(`docker tag ${imageName} registry.cn-zhangjiakou.aliyuncs.com/futureweb/${imageName}`);  if (tagLastError) {    log.red(tagError, '镜像last标签异样')    return;  }  log.green('镜像last标签更新结束,开始上传')  const { stdout: pushStdout, error: pushError } = await exec('docker push registry.cn-zhangjiakou.aliyuncs.com/futureweb/' + imageName);  if (pushError) {    log.red(pushError, '镜像上传失败')    return;  }  log.cyan(pushStdout)  log.green('镜像上传胜利')}process.on('unhandledRejection', (reason, p) => {  console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);  // application specific logging, throwing an error, or other logic here});

实现思路和注意事项

  1. 首先思考命令行交互的形式,将须要做的配置以抉择的形式让开发人员确认,最初抉择要公布的模块
  2. 提前登录阿里云账号
  3. 这里能够抉择并发执行所选全副模块,然而这样日志输入会无序,且电脑压力极大会临时死机;因而这里我用顺次解决的形式
  4. 打包所选模块的前端动态资源
  5. 执行docker-compose build xxx 打包所选模块镜像
这里有个须要留神的点,因为是工具函数解决,每个模块的门路由node读取,因而你的模块名和docker-compose.yml里的服务名、容器名最好都统一;另外留神你的镜像打包后是你docker-compose.yml外的根目录下划线连贯你的docker-compose服务名,因而你的阿里云镜像仓库命名最好和这个组合后镜像名统一;以上都是为了不便工具函数可能通用解决各个模块镜像。
  1. 制作镜像标签。这里我会制作一个本次公布工夫戳的版本和一个lastet版本,后面不便回退,前面不便运维部署时无需关怀标签版本。也能够拉取git tag来做镜像的tag。
  2. 制作镜像后上传至阿里云镜像核心