yj-deploy
v0.0.8
Published
ssh sftp
Readme
yj-deploy
yj-deploy 是为解决公司内部项目部署到镜像服务器开发的工具,可帮助开发者自动构建镜像,并自动部署到镜像服务器上。
目前已实现如下功能
- ✔ 项目打包完成后自动上传到跳板机
- ✔ 自动生成项目目录,自动创建dockerfile,upload.sh脚本文件
- ✔ 自动运行脚本,自动打包镜像,自动推送到镜像服务器(全程不用手动操作)
- ✔ 直接集成到vite,webpack项目
- ✔ 支持手动上传其他任何类型项目
- ✔ 支持灵活配置dockerfile,upload.sh等脚本内容
- ✔ 支持多种方式配置
镜像仓库镜像环境等参数 - ✔ 支持懒上传,仅上传新增部分文件,提升上传效率
- ✔ 支持失败自动重新上传,支持配置次数,防止网络不稳定可能导致上传失败
全程不需要连接跳板机做任何操作即可完成镜像推送
运行情况

安装

$ yarn add yj-deploy
$ npm i yj-deploy -D简单配置
import path from 'path'
import yjDeploy from 'yj-deploy'
const deploy = new yjDeploy({
host: '', // ip
port: '', // 端口
username: '', // 账号
password: '', // 密码
namespace: '', // 项目名称,等同git地址目录名称
// 本地文件目录
fileDir: path.resolve('./dist'),
})完整配置(包含默认配置)
{
host: '', // ip (必填)
port: '', // 端口 (必填)
username: '', // 账号 (必填)
password: '', // 密码 (必填)
namespace: '', // 项目名称,等同git地址目录名称(必填)
imageStore: 'dev-images', // 镜像仓库, 默认为 dev-images
tmpName: 'dev', // 镜像环境, 默认 dev
delay: 0, // 延迟上传时间 (部分项目构建需要时间,延迟上传可以解决)
fileDir: '', // 本地文件目录(必填)
rootDir: '/home/yjweb', // 远程sftp服务根目录 默认为 /home/yjweb
// dockerfile文件信息
dockerfile: {
name: 'Dockerfile',
content: [
'FROM harbor.yunjingtech.cn:30002/yj-base/nginx:latest',
'RUN rm -rf /usr/share/nginx/html/\*',
'COPY dist /usr/share/nginx/html/'
]
},
// upload.sh文件信息(可覆盖,但需要注意 $1 和 $2参数的顺序)
upload: {
name: 'upload.sh',
content: [
'#!/bin/sh',
'tag=`basename \\`pwd\\``:$2-`date +%Y%m%d`',
'echo "- 镜像仓库: $1"',
'echo "- 镜像环境: $2"',
'docker build -t harbor.yunjingtech.cn:30002/$1/$tag .',
'docker push harbor.yunjingtech.cn:30002/$1/$tag',
'if [ $? -eq 0 ];then',
'echo - 推送成功',
'echo - 镜像地址: harbor.yunjingtech.cn:30002/$1/$tag',
'else',
'echo - 镜像推送失败,请重试或联系运维人员,如需查看全部docker日志,请在命令后添加 --allLog查看更多信息',
'fi',
]
},
// 上传dist目录信息 (除非运维改变,否则不要配置)
dist: {
name: 'dist'
},
parallelDir: 20, // 文件夹并行创建数量,如果在创建文件夹阶段报错,可以尝试减少此配置
parallelFile: 50, // 文件并行上传数量,如果在上传文件阶段报错,可以减少此配置
allLog: false, // 是否打印所有log信息,主要是包含推送镜像阶段的日志,如果报错可以打开此开关
lazyUpload: false, // 是否开启懒上传,针对小程序图片等仅需要部署新增部分文件的项目有奇效
rePushNum: 3, // 重新推送次数,为0代表不重新推送
}使用
配合打包命令使用
可以配合项目脚手架使用
webpack 中使用
//vue.config.js
const path = require('path')
const yjDeploy = require('yj-deploy')
module.exports = {
configureWebpack: config => {
return {
plugins: [
new yjDeploy({
host: '',
port: '',
username: '',
password: '',
namespace: '', // 项目名称,等同git地址目录名称
// 本地文件目录
fileDir: path.resolve('./dist'),
})
]
}
}
}
// package.json
"scripts": {
"deploy": "vue-cli-service build --mode development --deploy"
}
// 使用 yarn deploy 或 npm run deployvite 项目中使用
//vite.config.js
import path from 'path'
import yjDeploy from 'yj-deploy'
export default defineConfig({
plugins: [
new yjDeploy({
host: '',
port: '',
username: '',
password: '',
namespace: '', // 项目名称,等同git地址目录名称
// 本地文件目录
fileDir: path.resolve('./dist'),
})
]
})
// package.json
"scripts": {
"deploy": "vite build --mode development -- --deploy"
}
// 使用 yarn deploy 或 npm run deploy上传任意项目
// 1、在项目中创建uploader.js
// 2、配置和webpack插件模式相同
const deploy = new yjDeploy({
host: '',
port: '',
username: '',
password: '',
namespace: '', // 项目命名空间,等同于镜像地址目录名称
// 本地文件目录
fileDir: path.resolve('./dist'),
})
deploy.upload() // 开始上传
// 然后在项目根目录终端下运行如下命令(node直接上传不需要加--deploy动态指令)
node uploader.js
// 增加动态配置
node uploader.js --tmpName=test动态配置项
由于部分项目可能需要区分环境,所以需要动态配置项,目前支持动态配置项如下:
--deploy
--deploy :是否启用自动部署功能,在配合vite或webpack时需要使用,如果启用,在命令后跟上 --deploy即可
// vite项目 package.json
"scripts": {
"deploy": "vite build --mode development -- --deploy"
}
// webpack项目 package.json
"scripts": {
"deploy": "vue-cli-service build --mode development --deploy"
}::: warning 由于vite的自定义命令需要在vite专属配置后加 -- 分割,所以vite项目的命令中间会多一个 -- 分割,这就是vite和webpack执行命令的差异,后续不再提及 :::
--reset
--reset :是否重置项目(默认为不重置),如果配置了此选项,则每次执行命令时会删除 dockerfile upload.sh 配置文件,然后重新初始化项目
--imageStore
--imageStore :镜像仓库名称(默认为dev-images),在测试或者正式环境可能需要配置,需要推送到指定的镜像仓库时配置,增加此动态配置可以使用更灵活,同一套主配置可以满足多个环境推送到不同的镜像仓库,如:
"scripts": {
// 开发环境
"deploy": "vite build --mode development -- --deploy"
// 测试环境
"deploy-test": "vite build --mode test -- --deploy --imageStore=sot-admin"
}--tmpName
--tmpName :镜像环境名称(默认为 dev),在测试或者正式环境可能需要配置,需要推送到指定的镜像环境时配置,防止镜像名重复导致覆盖,同一套主配置可以满足多个环境推送到不同的镜像地址,如:
"scripts": {
// 开发环境
"deploy": "vite build --mode development -- --deploy --tmpName=dev"
// 测试环境
"deploy-test": "vite build --mode test -- --deploy --tmpName=test"
// 正式环境
"deploy-prod": "vite build --mode production -- --deploy --tmpName=prod"
}--allLog
--allLog :是否打印所有log信息,主要是包含推送镜像阶段的日志,如果报错可以打开此开关
--lazyUpload
--lazyUpload :是否开启懒上传,如果开启,则不会上传全部文件,仅上传新增的文件。针对小程序图片等仅需要部署新增部分文件的项目有奇效
::: warning 如果小程序修改了相同路径和文件名的文件,会存在无法判断的情况(使用hash值能判断,但是成本过高),这种情况请关掉此选项,或使用 --reset 重置项目 :::
最后
如有意见或建议,或bug或文档不清晰等问题,可随时向我反馈,或直接修改后提交,共同完善这个工具。
项目已提交到git:https://gitlab.yunjingtech.cn:10010/frontend/yj-deploy
升级日志
v0.0.8
支持判断是否推送成功,如果推送失败,则自动重试三次,可以手动配置重试次数
v0.0.6
支持懒上传文件,大幅提升上传速度
v0.0.5
兼容根据运维文档手动创建的脚本推送镜像
v0.0.4
解决因为并行上传文件太多导致上传失败的问题,支持动态配置并行上传数据量
v0.0.3
解决文件夹嵌套太深,可能会导致上传文件时文件夹还没有创建导致报错的问题
