#!/bin/bash
set -e
set +x
REPO_URL=${REPO_URL}
echo "[INFO] 代码仓: ${REPO_URL}"
PR_ID=${PR_ID}
echo "[INFO] PR号: ${PR_ID}"
TARGET_BRANCH=${TARGET_BRANCH}
echo "[INFO] 目标分支: ${TARGET_BRANCH}"
if [[ -z "${REPO_URL}" || -z "${PR_ID}" || -z "${TARGET_BRANCH}" ]]; then
echo "[ERROR] REPO_URL / PR_ID / TARGET_BRANCH 环境变量不能为空"
exit 1
fi
echo "================================================"
echo " Pre-Commit CI 增量检查"
echo "================================================"
if [[ -n "${GIT_TOKEN}" ]]; then
echo "GIT_TOKEN已传入,开始设置代码仓凭据"
REPO_DOMAIN=$(echo "${REPO_URL}" | awk -F/ '{print $3}')
git config --global credential.helper store
echo "https://oauth2:${GIT_TOKEN}@${REPO_DOMAIN}" >~/.git-credentials
fi
SOURCE_CODE_DIR="source_code"
rm -rf ${SOURCE_CODE_DIR}
git clone ${REPO_URL} -b ${TARGET_BRANCH} ${SOURCE_CODE_DIR}
cd ${SOURCE_CODE_DIR}
git config --global user.email "openlibing-robot@openlibing.com"
git config --global user.name "openlibing-robot"
git config core.quotePath false
echo -e "\n[INFO] 拉取源分支代码"
LOCAL_SOURCE_BRANCH="pr_${PR_ID}"
git fetch origin refs/merge-requests/${PR_ID}/head:${LOCAL_SOURCE_BRANCH}
git pull
git checkout ${LOCAL_SOURCE_BRANCH}
git merge ${TARGET_BRANCH} --no-edit
PRE_COMMIT_CONFIG_YAML=".pre-commit-config.yaml"
if [ ! -f ${PRE_COMMIT_CONFIG_YAML} ]; then
echo "[SUCCESS] 未找到${PRE_COMMIT_CONFIG_YAML},检查通过"
exit 0
fi
echo -e "\n[INFO] 获取变更文件列表"
FILES_ARR=()
while IFS= read -r file; do
FILES_ARR+=("$file")
done < <(git diff --name-only --diff-filter=ACMR origin/${TARGET_BRANCH} HEAD | sort -u)
FILTERED_FILES=()
for f in "${FILES_ARR[@]}"; do
if [[ "$f" =~ target/ || "$f" =~ generated/ || "$f" =~ \.class$ || "$f" =~ \.jar$ ]]; then
continue
fi
FILTERED_FILES+=("$f")
done
FILES_ARR=("${FILTERED_FILES[@]}")
if [ ${#FILES_ARR[@]} -eq 0 ]; then
echo "[INFO] 无变更文件,检查通过"
exit 0
fi
echo -e "\n[INFO] 变更文件数量: ${#FILES_ARR[@]}"
echo "[INFO] 变更文件列表:"
for f in "${FILES_ARR[@]}"; do echo " $f"; done
echo -e "\n[INFO] 安装 pre-commit"
pip config set global.index-url https://repo.huaweicloud.com/repository/pypi/simple
pip config set global.trusted-host repo.huaweicloud.com
pip install pre-commit
pre-commit --version
echo -e "\n[INFO] 开始 pre-commit 检查"
echo "[COMMAND] pre-commit run --files ${FILES_ARR[*]}"
set +e
pre-commit run --show-diff-on-failure --files "${FILES_ARR[@]}"
CODE=$?
set -e
echo -e "\n================================================================"
if [ ${CODE} -eq 0 ]; then
echo "[INFO] pre-commit 检查全部通过"
else
echo "[ERROR] pre-commit 检查失败"
echo "[INFO] 请在本地执行以下命令修复后重新提交:"
echo ""
echo "1. 安装/初始化环境"
echo "pip install pre-commit && pre-commit install --install-hooks"
echo ""
echo "2. 检查并修复变更文件(密钥/拼写/配置文件类问题)"
echo "pre-commit run --files ${FILES_ARR[*]}"
echo ""
echo "3. Scala/Java代码格式问题(本脚本不校验,单独执行Maven格式化)"
echo "进入对应子模块目录执行:mvn spotless:apply"
fi
echo "================================================================"
cd ../
rm -rf ${SOURCE_CODE_DIR}
exit ${CODE}