【调整】增加部署雨云

This commit is contained in:
cai
2026-01-13 17:47:39 +08:00
parent 4e49ca075a
commit 367c1a1096
1094 changed files with 179074 additions and 45 deletions

View File

@@ -0,0 +1,421 @@
import { createBuildTools, helpers, presets } from '../src/index.js';
import { task, series, parallel } from 'gulp';
// 创建构建工具实例
const buildTools = createBuildTools({
verbose: true,
cwd: process.cwd(),
tempDir: './temp'
});
// ===== 基础功能示例 =====
// 1. 文件重命名示例
task('example:rename', buildTools.renameFiles({
src: 'src/**/*.js',
rename: helpers.rename.addPrefix('bundle-'),
dest: 'dist'
}));
// 2. 内容替换示例
task('example:replace', buildTools.replaceContent({
src: 'src/**/*.html',
replacements: [
helpers.replace.version('2.0.0'),
helpers.replace.htmlTitle('我的应用'),
{
search: /{{API_URL}}/g,
replace: 'https://api.example.com'
}
],
dest: 'dist'
}));
// 3. 文件压缩示例
task('example:compress', buildTools.compressFiles({
src: 'dist/**/*',
filename: helpers.compress.timestampedFilename('release'),
dest: 'releases',
type: 'zip',
level: helpers.compress.getCompressionLevel('balanced')
}));
// 4. Git 操作示例
task('example:git-commit', buildTools.gitOperation({
action: 'commit',
message: `自动构建 - ${new Date().toLocaleString()}`,
files: ['dist/**/*', 'package.json']
}));
task('example:git-push', buildTools.gitOperation({
action: 'push',
remote: 'origin',
branch: 'main'
}));
// 5. 文件上传示例(需要配置真实服务器信息)
task('example:upload-sftp', buildTools.uploadFiles({
type: 'sftp',
host: 'your-server.com',
username: 'deploy',
password: 'your-password',
// 或使用私钥: privateKey: '/path/to/private/key',
remotePath: '/var/www/html',
src: 'dist/**/*',
parallel: true,
clean: false
}));
// 6. SSH 命令执行示例(需要配置真实服务器信息)
task('example:ssh', buildTools.sshExecution({
host: 'your-server.com',
username: 'deploy',
password: 'your-password',
commands: [
helpers.ssh.commands.checkDiskSpace(),
helpers.ssh.commands.checkMemory(),
helpers.ssh.commands.restartService('nginx')
],
verbose: true
}));
// ===== 组合任务示例 =====
// 简单的构建流水线
task('example:simple-build', buildTools.createBuildPipeline({
replace: [{
src: 'src/**/*.js',
replacements: [
{ search: 'development', replace: 'production' },
{ search: /console\.log\([^)]*\);?/g, replace: '' }
],
dest: 'dist'
}],
rename: [{
src: 'dist/**/*.js',
rename: helpers.rename.addSuffix('.min'),
dest: 'dist'
}],
compress: helpers.compress.createConfig(
'dist/**/*',
'app.zip',
'releases'
)
}));
// 前端项目部署流水线
task('example:frontend-deploy', () => {
const config = presets.frontend.vueDeploy({
buildDir: 'dist',
serverConfig: {
type: 'sftp',
host: 'your-server.com',
username: 'deploy',
password: 'your-password',
remotePath: '/var/www/html',
src: 'dist/**/*',
clean: true
},
sshConfig: {
host: 'your-server.com',
username: 'deploy',
password: 'your-password',
commands: [
'sudo nginx -s reload',
'echo "部署完成"'
]
}
});
return buildTools.createBuildPipeline(config)();
});
// 复杂的部署流水线
task('example:complex-deploy', buildTools.createBuildPipeline({
// 步骤1: 更新版本号和构建信息
replace: [{
src: 'src/**/*.js',
replacements: [
helpers.replace.version('1.2.0'),
helpers.replace.buildNumber('2024.001'),
helpers.replace.timestamp(),
{ search: 'DEBUG_MODE = true', replace: 'DEBUG_MODE = false' }
],
dest: 'dist'
}],
// 步骤2: 重命名和优化文件
rename: [{
src: 'dist/**/*.{js,css}',
rename: (path) => {
// 添加哈希后缀用于缓存破坏
const hash = Math.random().toString(36).substring(2, 8);
path.basename += `.${hash}`;
},
dest: 'dist'
}],
// 步骤3: 创建备份
compress: {
src: 'dist/**/*',
filename: `backup-${new Date().toISOString().slice(0, 10)}.zip`,
dest: 'backups',
type: 'zip',
level: 9
},
// 步骤4: Git 提交
git: {
action: 'commit',
message: `部署版本 1.2.0 - ${new Date().toLocaleString()}`,
files: '.'
},
// 步骤5: 上传文件
upload: {
type: 'sftp',
host: 'production-server.com',
username: 'deploy',
privateKey: '/path/to/deploy/key',
remotePath: '/var/www/production',
src: 'dist/**/*',
parallel: true,
clean: true
},
// 步骤6: 服务器端操作
ssh: {
host: 'production-server.com',
username: 'deploy',
privateKey: '/path/to/deploy/key',
commands: [
// 备份当前版本
'cp -r /var/www/production /var/backups/$(date +%Y%m%d_%H%M%S)',
// 更新依赖
'cd /var/www/production && npm install --production',
// 重启服务
'pm2 restart production-app',
// 重新加载 Nginx 配置
'sudo nginx -s reload',
// 健康检查
'sleep 5 && curl -f http://localhost/health || exit 1',
// 清理旧备份保留最近5个
'ls -t /var/backups/ | tail -n +6 | xargs -I {} rm -rf /var/backups/{}'
],
verbose: true
}
}));
// ===== 并行任务示例 =====
// 多服务器并行部署
task('example:multi-server-deploy', buildTools.createParallelTasks({
'deploy-server1': buildTools.uploadFiles({
type: 'sftp',
host: 'server1.com',
username: 'deploy',
password: 'password1',
remotePath: '/var/www/html',
src: 'dist/**/*'
}),
'deploy-server2': buildTools.uploadFiles({
type: 'sftp',
host: 'server2.com',
username: 'deploy',
password: 'password2',
remotePath: '/var/www/html',
src: 'dist/**/*'
}),
'deploy-server3': buildTools.uploadFiles({
type: 'ftp',
host: 'server3.com',
username: 'deploy',
password: 'password3',
remotePath: '/public_html',
src: 'dist/**/*'
})
}));
// ===== 串行任务示例 =====
// 完整的 CI/CD 流水线
task('example:cicd-pipeline', buildTools.createSeriesTasks({
'prepare': buildTools.replaceContent({
src: 'src/**/*.js',
replacements: [
{ search: '{{ENVIRONMENT}}', replace: 'production' },
{ search: '{{BUILD_TIME}}', replace: new Date().toISOString() }
],
dest: 'dist'
}),
'test': buildTools.sshExecution({
host: 'test-server.com',
username: 'tester',
password: 'test-password',
commands: [
'cd /var/www/test',
'npm test',
'npm run e2e'
]
}),
'build': buildTools.compressFiles({
src: 'dist/**/*',
filename: 'production-build.zip',
dest: 'releases'
}),
'backup': buildTools.sshExecution({
host: 'production-server.com',
username: 'deploy',
privateKey: '/path/to/key',
commands: [
'mkdir -p /var/backups/$(date +%Y%m%d)',
'cp -r /var/www/production /var/backups/$(date +%Y%m%d)/'
]
}),
'deploy': buildTools.uploadFiles({
type: 'sftp',
host: 'production-server.com',
username: 'deploy',
privateKey: '/path/to/key',
remotePath: '/var/www/production',
src: 'dist/**/*',
clean: true
}),
'restart': buildTools.sshExecution({
host: 'production-server.com',
username: 'deploy',
privateKey: '/path/to/key',
commands: [
'pm2 restart production-app',
'sudo nginx -s reload'
]
})
}));
// ===== 预设模板使用示例 =====
// 使用前端部署预设
task('example:preset-frontend', () => {
const deployConfig = presets.frontend.vueDeploy({
buildDir: 'dist',
serverConfig: {
type: 'sftp',
host: 'cdn-server.com',
username: 'cdn-user',
password: 'cdn-password',
remotePath: '/var/www/cdn',
src: 'dist/**/*'
}
});
return buildTools.createBuildPipeline(deployConfig)();
});
// 使用后端部署预设
task('example:preset-backend', () => {
const deployConfig = presets.backend.nodeDeploy({
appPath: '/var/www/myapp',
serverConfig: {
type: 'sftp',
host: 'app-server.com',
username: 'app-user',
privateKey: '/path/to/app/key',
remotePath: '/var/www/myapp',
src: 'dist/**/*'
},
sshConfig: {
host: 'app-server.com',
username: 'app-user',
privateKey: '/path/to/app/key',
commands: []
}
});
return buildTools.createBuildPipeline(deployConfig)();
});
// ===== 实用工具示例 =====
// 自定义任务:环境特定的构建
function createEnvironmentBuild(env: 'development' | 'staging' | 'production') {
const envConfig = {
development: {
apiUrl: 'http://localhost:3000',
debugMode: true,
minify: false
},
staging: {
apiUrl: 'https://staging-api.example.com',
debugMode: true,
minify: true
},
production: {
apiUrl: 'https://api.example.com',
debugMode: false,
minify: true
}
}[env];
return buildTools.createBuildPipeline({
replace: [{
src: 'src/**/*.js',
replacements: [
{ search: '{{API_URL}}', replace: envConfig.apiUrl },
{ search: '{{DEBUG_MODE}}', replace: envConfig.debugMode.toString() },
...(envConfig.minify ? [
{ search: /console\.log\([^)]*\);?/g, replace: '' },
{ search: /\s+/g, replace: ' ' }
] : [])
],
dest: `dist/${env}`
}],
compress: {
src: `dist/${env}/**/*`,
filename: `${env}-build.zip`,
dest: 'releases'
}
});
}
// 为不同环境创建构建任务
task('example:build-dev', createEnvironmentBuild('development'));
task('example:build-staging', createEnvironmentBuild('staging'));
task('example:build-prod', createEnvironmentBuild('production'));
// 构建所有环境
task('example:build-all', parallel(
createEnvironmentBuild('development'),
createEnvironmentBuild('staging'),
createEnvironmentBuild('production')
));
// ===== 主要任务 =====
// 开发环境任务
task('dev', series('example:replace', 'example:rename'));
// 构建任务
task('build', series('example:simple-build', 'example:compress'));
// 部署任务(需要配置真实服务器)
task('deploy', series('build', 'example:git-commit', 'example:upload-sftp', 'example:ssh'));
// 完整流水线
task('full-pipeline', series('example:complex-deploy'));
// 默认任务
task('default', series('build'));
export default buildTools;

View File

@@ -0,0 +1,336 @@
import { series, parallel } from 'gulp';
import { GulpBuildTools, createBuildTools, CompressConfig } from '../src/index.js';
/**
* 多压缩任务示例
* 展示如何使用 Gulp Build Tools 进行多个文件的并行和串行压缩
*/
// 创建构建工具实例
const buildTools = createBuildTools({
cwd: process.cwd(),
verbose: true,
tempDir: './temp'
});
/**
* 示例 1: 串行多压缩任务
* 按顺序依次压缩多个文件包
*/
const serialMultiCompressConfigs: CompressConfig[] = [
{
src: ['src/**/*.ts'],
filename: 'source-code.zip',
dest: './dist/archives',
type: 'zip',
level: 6
},
{
src: ['docs/**/*.md'],
filename: 'documentation.tar.gz',
dest: './dist/archives',
type: 'gzip',
level: 9
},
{
src: ['assets/**/*'],
filename: 'assets-bundle.zip',
dest: './dist/archives',
type: 'zip',
level: 4
}
];
export const serialMultiCompress = buildTools.multiCompress(serialMultiCompressConfigs, false);
/**
* 示例 2: 并行多压缩任务
* 同时压缩多个文件包,提高效率
*/
const parallelMultiCompressConfigs: CompressConfig[] = [
{
src: ['build/**/*.js', 'build/**/*.css'],
filename: 'production-assets.zip',
dest: './releases',
type: 'zip',
level: 9
},
{
src: ['tests/**/*.spec.ts'],
filename: 'test-files.tar',
dest: './backups',
type: 'tar'
},
{
src: ['config/**/*.json', 'config/**/*.yaml'],
filename: 'configurations.zip',
dest: './backups',
type: 'zip',
level: 6
}
];
export const parallelMultiCompress = buildTools.multiCompress(parallelMultiCompressConfigs, true);
/**
* 示例 3: 多环境部署包压缩
* 为不同环境创建对应的部署包
*/
const environmentPackages: CompressConfig[] = [
{
src: ['dist/dev/**/*'],
filename: 'app-dev-v1.0.0.zip',
dest: './releases/dev',
type: 'zip',
level: 6
},
{
src: ['dist/staging/**/*'],
filename: 'app-staging-v1.0.0.zip',
dest: './releases/staging',
type: 'zip',
level: 6
},
{
src: ['dist/production/**/*'],
filename: 'app-production-v1.0.0.zip',
dest: './releases/production',
type: 'zip',
level: 9
}
];
export const multiEnvironmentCompress = buildTools.multiCompress(environmentPackages, true);
/**
* 示例 4: Monorepo 模块压缩
* 为 Monorepo 中的每个模块单独打包
*/
const monorepoPackages: CompressConfig[] = [
{
src: ['packages/ui-components/dist/**/*'],
filename: 'ui-components-v2.1.0.zip',
dest: './releases/packages',
type: 'zip',
level: 8
},
{
src: ['packages/utils/dist/**/*'],
filename: 'utils-v1.5.2.zip',
dest: './releases/packages',
type: 'zip',
level: 8
},
{
src: ['packages/api-client/dist/**/*'],
filename: 'api-client-v3.0.1.zip',
dest: './releases/packages',
type: 'zip',
level: 8
},
{
src: ['apps/web-app/dist/**/*'],
filename: 'web-app-v1.0.0.tar.gz',
dest: './releases/apps',
type: 'gzip',
level: 9
}
];
export const monorepoMultiCompress = buildTools.multiCompress(monorepoPackages, false);
/**
* 示例 5: 备份归档系统
* 创建不同类型的备份文件
*/
const backupConfigs: CompressConfig[] = [
{
src: ['src/**/*.ts', 'src/**/*.js'],
filename: `source-backup-${new Date().toISOString().slice(0, 10)}.zip`,
dest: './backups/daily',
type: 'zip',
level: 9
},
{
src: ['database/**/*.sql'],
filename: `database-backup-${new Date().toISOString().slice(0, 10)}.tar.gz`,
dest: './backups/database',
type: 'gzip',
level: 9
},
{
src: ['logs/**/*.log'],
filename: `logs-backup-${new Date().toISOString().slice(0, 10)}.tar`,
dest: './backups/logs',
type: 'tar'
},
{
src: ['uploads/**/*'],
filename: `uploads-backup-${new Date().toISOString().slice(0, 10)}.zip`,
dest: './backups/uploads',
type: 'zip',
level: 6
}
];
export const backupMultiCompress = buildTools.multiCompress(backupConfigs, true);
/**
* 示例 6: 不同压缩级别的性能测试
* 使用不同压缩级别创建相同文件的多个版本
*/
const compressionLevelTest: CompressConfig[] = [
{
src: ['test-data/**/*'],
filename: 'test-data-speed.zip',
dest: './performance-test',
type: 'zip',
level: 1 // 最快压缩
},
{
src: ['test-data/**/*'],
filename: 'test-data-balanced.zip',
dest: './performance-test',
type: 'zip',
level: 6 // 平衡压缩
},
{
src: ['test-data/**/*'],
filename: 'test-data-maximum.zip',
dest: './performance-test',
type: 'zip',
level: 9 // 最大压缩
}
];
export const compressionTestMultiCompress = buildTools.multiCompress(compressionLevelTest, false);
/**
* 示例 7: 混合格式多压缩
* 创建不同格式的压缩文件以满足不同需求
*/
const mixedFormatConfigs: CompressConfig[] = [
{
src: ['build/**/*'],
filename: 'release.zip',
dest: './releases',
type: 'zip',
level: 6
},
{
src: ['build/**/*'],
filename: 'release.tar.gz',
dest: './releases',
type: 'gzip',
level: 9
},
{
src: ['build/**/*'],
filename: 'release.tar',
dest: './releases',
type: 'tar'
}
];
export const mixedFormatMultiCompress = buildTools.multiCompress(mixedFormatConfigs, true);
/**
* 完整的部署流水线示例
* 包含多压缩任务的完整部署流程
*/
export const deploymentPipeline = series(
// 首先创建环境特定的压缩包
multiEnvironmentCompress,
// 然后创建备份
backupMultiCompress,
// 最后打包 Monorepo 模块
parallel(
monorepoMultiCompress,
mixedFormatMultiCompress
)
);
/**
* 使用助手函数创建压缩配置的示例
*/
import { compressHelpers } from '../src/modules/compress.js';
const dynamicConfigs: CompressConfig[] = [
compressHelpers.createConfig(
['src/**/*.ts'],
compressHelpers.timestampedFilename('source-code'),
'./releases',
{
type: 'zip',
level: compressHelpers.getCompressionLevel('balanced')
}
),
compressHelpers.createConfig(
['docs/**/*.md'],
compressHelpers.timestampedFilename('documentation', 'tar.gz'),
'./releases',
{
type: 'gzip',
level: compressHelpers.getCompressionLevel('size')
}
)
];
export const dynamicMultiCompress = buildTools.multiCompress(dynamicConfigs, true);
/**
* 条件压缩示例
* 根据环境变量决定压缩策略
*/
const conditionalConfigs: CompressConfig[] = [];
// 根据环境添加不同的压缩配置
if (process.env.NODE_ENV === 'production') {
conditionalConfigs.push({
src: ['dist/**/*'],
filename: 'production-release.zip',
dest: './releases',
type: 'zip',
level: 9 // 生产环境使用最大压缩
});
} else {
conditionalConfigs.push({
src: ['dist/**/*'],
filename: 'development-build.zip',
dest: './builds',
type: 'zip',
level: 1 // 开发环境优先速度
});
}
// 总是创建源码备份
conditionalConfigs.push({
src: ['src/**/*'],
filename: compressHelpers.timestampedFilename('source-backup'),
dest: './backups',
type: 'zip',
level: 6
});
export const conditionalMultiCompress = buildTools.multiCompress(conditionalConfigs, false);
/**
* 定义所有任务,方便在 gulpfile 中使用
*/
export const multiCompressTasks = {
'multi-compress:serial': serialMultiCompress,
'multi-compress:parallel': parallelMultiCompress,
'multi-compress:environments': multiEnvironmentCompress,
'multi-compress:monorepo': monorepoMultiCompress,
'multi-compress:backup': backupMultiCompress,
'multi-compress:performance-test': compressionTestMultiCompress,
'multi-compress:mixed-format': mixedFormatMultiCompress,
'multi-compress:dynamic': dynamicMultiCompress,
'multi-compress:conditional': conditionalMultiCompress,
'deploy:full-pipeline': deploymentPipeline
};
// 导出默认任务
export default deploymentPipeline;

View File

@@ -0,0 +1,379 @@
import { createBuildTools, multiTaskOperations, parallelOperations } from '../src/index.js';
import { task, series, parallel } from 'gulp';
// 创建构建工具实例
const buildTools = createBuildTools({
verbose: true
});
// ===== Git 多任务示例 =====
// 串行执行多个 Git 操作
task('git:multi-serial', buildTools.multiGitOperation([
{
action: 'commit',
message: '提交当前更改',
files: '.'
},
{
action: 'push',
remote: 'origin',
branch: 'main'
}
], false)); // false = 串行执行
// 并行执行多个 Git 操作(不同仓库)
task('git:multi-parallel', buildTools.multiGitOperation([
{
action: 'pull',
repoPath: '/path/to/repo1',
remote: 'origin',
branch: 'main'
},
{
action: 'pull',
repoPath: '/path/to/repo2',
remote: 'origin',
branch: 'develop'
},
{
action: 'pull',
repoPath: '/path/to/repo3',
remote: 'upstream',
branch: 'main'
}
], true)); // true = 并行执行
// ===== 多服务器上传示例 =====
// 串行上传到多个服务器
task('upload:multi-serial', buildTools.multiUpload([
{
type: 'sftp',
host: 'server1.example.com',
username: 'deploy',
privateKey: '/path/to/key1',
remotePath: '/var/www/app',
src: 'dist/**/*',
clean: true
},
{
type: 'sftp',
host: 'server2.example.com',
username: 'deploy',
privateKey: '/path/to/key2',
remotePath: '/var/www/app',
src: 'dist/**/*',
clean: true
}
], false));
// 并行上传到多个服务器
task('upload:multi-parallel', buildTools.multiUpload([
{
type: 'sftp',
host: 'server1.example.com',
username: 'deploy',
password: 'password1',
remotePath: '/var/www/app',
src: 'dist/**/*',
parallel: true
},
{
type: 'ftp',
host: 'server2.example.com',
username: 'deploy',
password: 'password2',
remotePath: '/public_html',
src: 'dist/**/*'
},
{
type: 'sftp',
host: 'server3.example.com',
username: 'deploy',
privateKey: '/path/to/key',
remotePath: '/var/www/app',
src: 'dist/**/*',
clean: false
}
], true)); // 并行上传到 3 个服务器
// ===== 多 SSH 任务示例 =====
// 串行执行多个 SSH 任务
task('ssh:multi-serial', buildTools.multiSSHExecution([
{
host: 'server1.example.com',
username: 'deploy',
privateKey: '/path/to/key',
commands: [
'cd /var/www/app',
'npm install --production',
'pm2 restart app'
],
verbose: true
},
{
host: 'server2.example.com',
username: 'deploy',
password: 'password',
commands: [
'sudo systemctl restart nginx',
'sudo systemctl status nginx'
]
}
], false));
// 并行执行多个 SSH 任务
task('ssh:multi-parallel', buildTools.multiSSHExecution([
{
host: 'web1.example.com',
username: 'deploy',
privateKey: '/path/to/key',
commands: [
'pm2 restart web-app',
'pm2 status'
]
},
{
host: 'web2.example.com',
username: 'deploy',
privateKey: '/path/to/key',
commands: [
'pm2 restart web-app',
'pm2 status'
]
},
{
host: 'api.example.com',
username: 'deploy',
privateKey: '/path/to/key',
commands: [
'docker restart api-container',
'docker ps'
]
}
], true)); // 并行执行,提高部署效率
// ===== 复合部署流水线示例 =====
// 生产环境多服务器部署
task('deploy:production', series(
// 1. 构建和压缩
buildTools.replaceContent({
src: 'src/**/*.js',
replacements: [
{ search: '{{ENV}}', replace: 'production' },
{ search: '{{VERSION}}', replace: '2.0.0' }
],
dest: 'dist'
}),
buildTools.compressFiles({
src: 'dist/**/*',
filename: 'production-release.zip',
dest: 'releases'
}),
// 2. Git 操作
buildTools.multiGitOperation([
{
action: 'commit',
message: 'Production release 2.0.0',
files: '.'
},
{
action: 'push',
remote: 'origin',
branch: 'main'
}
]),
// 3. 并行上传到多个生产服务器
buildTools.multiUpload([
{
type: 'sftp',
host: 'prod-web1.example.com',
username: 'deploy',
privateKey: '/path/to/prod-key',
remotePath: '/var/www/app',
src: 'dist/**/*',
clean: true
},
{
type: 'sftp',
host: 'prod-web2.example.com',
username: 'deploy',
privateKey: '/path/to/prod-key',
remotePath: '/var/www/app',
src: 'dist/**/*',
clean: true
},
{
type: 'sftp',
host: 'prod-api.example.com',
username: 'deploy',
privateKey: '/path/to/prod-key',
remotePath: '/var/www/api',
src: 'dist/**/*',
clean: true
}
], true),
// 4. 并行重启所有服务
buildTools.multiSSHExecution([
{
host: 'prod-web1.example.com',
username: 'deploy',
privateKey: '/path/to/prod-key',
commands: [
'pm2 restart web-app',
'sudo nginx -s reload'
]
},
{
host: 'prod-web2.example.com',
username: 'deploy',
privateKey: '/path/to/prod-key',
commands: [
'pm2 restart web-app',
'sudo nginx -s reload'
]
},
{
host: 'prod-api.example.com',
username: 'deploy',
privateKey: '/path/to/prod-key',
commands: [
'pm2 restart api-app',
'curl -f http://localhost:3000/health'
]
}
], true)
));
// 开发环境多分支同步
task('sync:dev-branches', buildTools.multiGitOperation([
{
action: 'checkout',
branch: 'develop'
},
{
action: 'pull',
remote: 'origin',
branch: 'develop'
},
{
action: 'checkout',
branch: 'feature/new-ui'
},
{
action: 'merge',
branch: 'develop'
}
]));
// 多环境部署
task('deploy:multi-env', parallel(
// 测试环境
series(
buildTools.replaceContent({
src: 'src/**/*.js',
replacements: [{ search: '{{ENV}}', replace: 'testing' }],
dest: 'dist-test'
}),
buildTools.uploadFiles({
type: 'sftp',
host: 'test.example.com',
username: 'deploy',
password: 'test-password',
remotePath: '/var/www/test',
src: 'dist-test/**/*'
})
),
// 预发布环境
series(
buildTools.replaceContent({
src: 'src/**/*.js',
replacements: [{ search: '{{ENV}}', replace: 'staging' }],
dest: 'dist-staging'
}),
buildTools.uploadFiles({
type: 'sftp',
host: 'staging.example.com',
username: 'deploy',
privateKey: '/path/to/staging-key',
remotePath: '/var/www/staging',
src: 'dist-staging/**/*'
})
)
));
// 备份和清理任务
task('maintenance:backup-and-clean', buildTools.multiSSHExecution([
{
host: 'server1.example.com',
username: 'admin',
privateKey: '/path/to/admin-key',
commands: [
'mysqldump -u root -p myapp > /backups/myapp_$(date +%Y%m%d).sql',
'find /var/log -name "*.log" -mtime +7 -delete',
'docker system prune -f'
],
verbose: true
},
{
host: 'server2.example.com',
username: 'admin',
privateKey: '/path/to/admin-key',
commands: [
'tar -czf /backups/www_$(date +%Y%m%d).tar.gz /var/www',
'find /tmp -mtime +3 -delete',
'pm2 flush'
],
verbose: true
}
], true));
// 健康检查任务
task('health:check-all', buildTools.multiSSHExecution([
{
host: 'web1.example.com',
username: 'monitor',
privateKey: '/path/to/monitor-key',
commands: [
'df -h',
'free -m',
'pm2 status',
'curl -f http://localhost/health'
]
},
{
host: 'web2.example.com',
username: 'monitor',
privateKey: '/path/to/monitor-key',
commands: [
'df -h',
'free -m',
'pm2 status',
'curl -f http://localhost/health'
]
},
{
host: 'db.example.com',
username: 'monitor',
privateKey: '/path/to/monitor-key',
commands: [
'df -h',
'free -m',
'systemctl status mysql',
'mysql -e "SHOW PROCESSLIST;"'
]
}
], true));
// 默认任务
task('default', series('deploy:production'));
export default buildTools;