前言
打包部署前检测当前打包分支是否有落后于master的提交,可以有效避免漏发少发导致的线上故障。下面将通过一个js脚本去自动化完成检测,若当前分支落后于master则自动取消后续打包流程。
一、创建check-branch.js脚本文件
const axios = require('axios');
const { execSync } = require('child_process');
// 配置 GitLab API
const config = {
GITLAB_API_URL: 'https://git.example.com/api/v4', // 自托管gitlab实例需替换为自己的域名
PROJECT_ID: '4709', // 项目ID
BASE_BRANCH: 'master', // 需对比的主分支名
CURRENT_BRANCH: execSync('git rev-parse --abbrev-ref HEAD').toString().trim(), // 当前打包分支
};
const EXIT_SUCCESS = 0;
const EXIT_FAILURE = 1;
// gitlab的个人访问令牌
const PRIVATE_TOKEN = process.env.GITLAB_PRIVATE_TOKEN;
if (!PRIVATE_TOKEN) {
console.error('错误:未设置 GITLAB_PRIVATE_TOKEN 环境变量');
process.exit(EXIT_FAILURE);
}
/**
* 比较两个分支并检查是否有未合并的提交
* @returns {Promise<void>}
*/
async function compareBranches() {
try {
const url = `${config.GITLAB_API_URL}/projects/${config.PROJECT_ID}/repository/compare?from=${config.CURRENT_BRANCH}&to=${config.BASE_BRANCH}`;
const response = await axios.get(url, {
headers: {
'PRIVATE-TOKEN': PRIVATE_TOKEN,
},
});
const data = response.data;
// 检查 master 是否有未包含在当前分支的提交
if (data.commits && data.commits.length > 0) {
console.log(`${config.CURRENT_BRANCH} 分支落后于 ${config.BASE_BRANCH},以下提交未合并:`);
data.commits.forEach((commit) => {
console.log(`- ${commit.title} (by ${commit.author_name})`);
});
// 退出并返回错误码,阻止后续打包流程
process.exit(EXIT_FAILURE);
} else {
console.log(`${config.CURRENT_BRANCH} 分支与 ${config.BASE_BRANCH} 同步或领先`);
process.exit(EXIT_SUCCESS); // 正常退出,继续后续流程
}
} catch (error) {
console.error('请求 GitLab API 时出错:', error);
process.exit(EXIT_FAILURE); // 请求错误时中断打包流程
}
}
// 运行分支比较函数
compareBranches();
二、在package.json文件中配置
配置一个 prebuild 命令,该命令会在执行 npm run build 之前自动执行
"scripts": {
"prebuild": "GITLAB_PRIVATE_TOKEN=hKLMpXreMdCy1iSP9-AU node ./scripts/check-branch.js",
"build": "cross-env NODE_ENV=production PACKAGE_ENV=production webpack --progress --config ./scripts/webpack.prod.js"
},
三、如何获取gitlab的个人访问令牌
gitlab - 右上角头像 - Preferences - Access Tokens - 手动输入name并勾选api以及read_repository权限 - 点击生成即可