背景
由于公司需要对公司内部的软件需要对外部署,对于前端的部署,需要一套部署的方案。尝试了写了一个适配多模块可配置的部署脚本,本文对实现的过程进行一个记录。
目的
脚本采用的是node,前端同学的首选。脚本的目的就是实现k8s中的自动化部署中的部分功能
熟悉k8s的同学或许了解在k8s的自动构建过程中,大概实现了以下几个步骤
- 从指定的代码仓库中获取代码
- 执行npm i或者npm ci(如果项目依赖内网npm还需要在这之前设置一下内网镜像)
- 执行npm build
- 将生成的静态文件放在指定的文件内
我们的node脚本就需要实现以上功能即可。
实现过程
第一步,从指定的代码仓库中获取代码
从指定仓库获取代码,需要怎么指定。
我们平时克隆代码的时候执行的是git clone xxx
,xxx
就是指定的代码地址,如果我们模仿一下node index.js xxx
,这样的话如果需要克隆多个后面就会很长,不太美观。
这里我选择通过写入配置文件的方式进行clone。并且提供两种clone方式。
1.给一个全量的仓库配置文件,通过手动选择其中的仓库进行clone。
2.创建一个默认的配置,对里面所有的git地址进行clone。
创建一个config.js
和一个customeConfig.js
文件
// config.js 全量仓库
export default [{url: 'https://github.com/yourProject1.git', // 代码地址modulesName: 'yourProject1', // 项目简称或者标识desc: '项目一' // 项目描述
},{url: 'https://github.com/yourProject2.git',modulesName: 'yourProject2', desc: '项目二'
},{url: 'https://github.com/yourProject3.git',modulesName: 'yourProject3', desc: '项目三'
},{url: 'https://github.com/yourProject4.git',modulesName: 'yourProject4', desc: '项目四'
}]
// customConfig.js 不在全量仓库里面的地址,全部下载
export default [{url: 'https://github.com/yourProject1.git', // 代码地址modulesName: 'yourProject1', // 项目简称或者标识desc: '项目一' // 项目描述
},{url: 'https://github.com/yourProject2.git',modulesName: 'yourProject2', desc: '项目二'
}]
使用者如果需要clone的仓库不在config.js里面,可以直接修改customConfig.js里面的文件。
我们还是分步骤实现
flowchart TD
A[选择clone方式 chooseDownLoadType] --> B{选择项目clone?}
B --是 选择config中的clone --> C[chooseGit]
C --选择需要clone的仓库地址 --> E[downLoadGit]
B --否 根据customConfig中的clone ----> E[downLoadGit]
根据上面流程图,我们需要实现三个方法
- chooseDownLoadType(); // 选择克隆方式
- chooseGit(); // 选择克隆仓库
- downLoadGit(); // 实现git clone
Talking is cheap show me your code 话不多说直接实现代码吧
这里通过inquirer
实现控制台的交互效果,具体使用方法可以查看npm官网的使用方法 www.npmjs.com/package/inq…
- 实现chooseDownLoadType()
function chooseDownLoadType () {inquirer.prompt([{type: "list",name: "preset",message: "请选择克隆的方式",choices: ["选择项目clone", "根据customConfig配置clone"]}]).then(choice => {if(choice.preset === '选择项目clone') { // 按照config文件clonechooseGit(); // 选择git地址}else { // 按照customConfig文件配置downLoadGits = customConfig.map(res => res.url); // 收集地址downLoadGit(); // 下载git}})
}
- 实现chooseGit()
function chooseGit () {inquirer.prompt([{type: "checkbox",name: "gits",message: "请选择需要克隆的项目地址:",choices: config.map(res => {return {name: `${res.modulesName}_(${res.desc})`,...res}}),default: [] // 默认选中的git}]).then(choice => {// 收集地址choice.gits.forEach(git => {const moduleName = git.split("_")[0]; // 获取nameif(config.map(conf => conf.modulesName).includes(moduleName)) {downLoadGits.push(config.find(gitConf => gitConf.modulesName === moduleName).url);}})downLoadGit();})
}
详细代码如下:
import { createRequire } from "module";
const require = createRequire(import.meta.url);
import inquirer from "inquirer";
import config from "./config.js";
import customConfig from "./customConfig.js";
let downLoadGits = [] // 收集需要clone的地址
function chooseDownLoadType () {inquirer.prompt([{type: "list",name: "preset",message: "请选择克隆的方式",choices: ["选择项目clone", "根据customConfig配置clone"]}]).then(choice &