git 打包前检测当前分支是否落后master

201 阅读1分钟

前言

打包部署前检测当前打包分支是否有落后于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权限 - 点击生成即可