婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 使用腳本一鍵打包并上傳docker鏡像的實現代碼

使用腳本一鍵打包并上傳docker鏡像的實現代碼

熱門標簽:南充電銷外呼系統 株洲電銷 宿州外呼系統公司 海外工廠地圖標注 地圖標注小程序 陜西辦理400電話 南昌外呼系統定制 貴陽網絡外呼系統軟件 信陽電銷外呼系統怎么樣

筆者搞了一年多微前端項目,一個團隊管理十個微應用,換成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
});

實現思路和注意事項

  • 首先考慮命令行交互的方式,將需要做的配置以選擇的方式讓開發人員確認,最后選擇要發布的模塊
  • 提前登錄阿里云賬號
  • 這里可以選擇并發執行所選全部模塊,但是這樣日志輸出會無序,且電腦壓力極大會暫時死機;因此這里我用依次處理的方式
  • 打包所選模塊的前端靜態資源
  • 執行docker-compose build xxx 打包所選模塊鏡像

這里有個需要注意的點,因為是工具函數處理,每個模塊的路徑由node讀取,因此你的模塊名和docker-compose.yml里的服務名、容器名最好都一致;另外注意你的鏡像打包后是你docker-compose.yml外的根目錄下劃線連接你的docker-compose服務名,因此你的阿里云鏡像倉庫命名最好和這個組合后鏡像名一致;以上都是為了方便工具函數能夠通用處理各個模塊鏡像。

  1. 制作鏡像標簽。這里我會制作一個本次發布時間戳的版本和一個lastet版本,前面方便回退,后面方便運維部署時無需關心標簽版本。也可以拉取git tag來做鏡像的tag。
  2. 制作鏡像后上傳至阿里云鏡像中心

標簽:汕頭 晉城 玉林 拉薩 開封 鄭州 三明 石嘴山

巨人網絡通訊聲明:本文標題《使用腳本一鍵打包并上傳docker鏡像的實現代碼》,本文關鍵詞  使用,腳本,一鍵,打包,并,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用腳本一鍵打包并上傳docker鏡像的實現代碼》相關的同類信息!
  • 本頁收集關于使用腳本一鍵打包并上傳docker鏡像的實現代碼的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 绍兴县| 阿克苏市| 化隆| 太保市| 东明县| 秦安县| 宜州市| 兴和县| 嘉鱼县| 彰化市| 长岭县| 济宁市| 德阳市| 沧源| 五台县| 巴林右旗| 东乡县| 正蓝旗| 赤水市| 余姚市| 枣阳市| 穆棱市| 郸城县| 商城县| 汉川市| 海宁市| 韶山市| 安泽县| 拉萨市| 富平县| 英山县| 韶关市| 平舆县| 清苑县| 霍城县| 鄂托克旗| 黔东| 济南市| 邵东县| 卢湾区| 滦南县|