fix: 修复 AI 自动审查工作流中的基准分支检出逻辑,确保使用默认分支

This commit is contained in:
QLHazyCoder
2026-04-12 12:59:06 +08:00
parent 1629f3ed3d
commit 4570c9885b
2 changed files with 78 additions and 11 deletions
+76 -9
View File
@@ -10,7 +10,7 @@ const DEFAULT_TARGET_BRANCH = 'dev';
const DEFAULT_MAX_FILES = 40;
const DEFAULT_MAX_PATCH_CHARS_PER_FILE = 12000;
const DEFAULT_MAX_PATCH_CHARS_TOTAL = 120000;
const DEFAULT_TRUSTED_ASSOCIATIONS = ['COLLABORATOR', 'CONTRIBUTOR', 'MEMBER', 'OWNER'];
const DEFAULT_TRUSTED_ASSOCIATIONS = [];
class ReviewBlockedError extends Error {
constructor(message) {
@@ -36,7 +36,21 @@ async function main() {
if (currentBaseRef !== targetBranch) {
if (currentBaseRef === 'master') {
await retargetPullRequest(repo, prNumber, targetBranch);
const retargetResult = await retargetPullRequest(repo, pr, targetBranch);
if (retargetResult.status === 'duplicate') {
await upsertManagedComment(
repo,
prNumber,
renderDuplicateTargetPrComment({
targetBranch,
duplicatePrNumber: retargetResult.pull.number
})
);
await appendSummary(
`PR #${prNumber} 没有自动转到 ${targetBranch},因为已存在同源分支的 PR #${retargetResult.pull.number} 指向 ${targetBranch}`
);
return;
}
await upsertManagedComment(
repo,
prNumber,
@@ -336,13 +350,51 @@ async function ensureBranchExists(repo, branchName) {
await githubRequest(`/repos/${repo}/branches/${encodeURIComponent(branchName)}`);
}
async function retargetPullRequest(repo, prNumber, targetBranch) {
await githubRequest(`/repos/${repo}/pulls/${prNumber}`, {
method: 'PATCH',
body: JSON.stringify({
base: targetBranch
})
});
async function listOpenPullRequestsByHeadAndBase(repo, headOwner, headRef, baseRef) {
const query = [
'state=open',
`head=${encodeURIComponent(`${headOwner}:${headRef}`)}`,
`base=${encodeURIComponent(baseRef)}`,
'per_page=100'
].join('&');
return githubRequestJson(`/repos/${repo}/pulls?${query}`);
}
async function retargetPullRequest(repo, pr, targetBranch) {
try {
await githubRequest(`/repos/${repo}/pulls/${pr.number}`, {
method: 'PATCH',
body: JSON.stringify({
base: targetBranch
})
});
return { status: 'retargeted' };
} catch (error) {
const message = String(error?.message || '');
if (!message.includes('(422)') || !message.includes("A pull request already exists for base branch")) {
throw error;
}
const headOwner = String(pr.head?.repo?.owner?.login || '').trim();
const headRef = String(pr.head?.ref || '').trim();
if (!headOwner || !headRef) {
throw error;
}
const pulls = await listOpenPullRequestsByHeadAndBase(repo, headOwner, headRef, targetBranch);
const duplicatePull = Array.isArray(pulls)
? pulls.find((pull) => Number(pull.number) !== Number(pr.number))
: null;
if (!duplicatePull) {
throw error;
}
return {
status: 'duplicate',
pull: duplicatePull
};
}
}
function buildReviewInput({ repo, pr, files, maxFiles, maxPatchCharsPerFile, maxPatchCharsTotal }) {
@@ -643,6 +695,21 @@ function renderRetargetedComment({ fromBranch, targetBranch }) {
return `${lines.join('\n').trim()}\n`;
}
function renderDuplicateTargetPrComment({ targetBranch, duplicatePrNumber }) {
const lines = [
MARKER,
'## 已存在对应的开发分支 PR',
'',
`系统原本想把这个 PR 自动转到 \`${targetBranch}\`,但同一个来源分支已经有一个指向 \`${targetBranch}\` 的 PR#${duplicatePrNumber}`,
'',
`为了避免重复 PR 混淆,本次没有继续自动转向,也没有执行自动合并。`,
'',
`请优先处理已有的 PR #${duplicatePrNumber},或者手动关闭其中一个重复 PR。`
];
return `${lines.join('\n').trim()}\n`;
}
async function upsertManagedComment(repo, prNumber, body) {
const comments = await listIssueComments(repo, prNumber);
const existing = comments.find((comment) => typeof comment.body === 'string' && comment.body.includes(MARKER));
+2 -2
View File
@@ -26,10 +26,10 @@ jobs:
issues: write
pull-requests: write
steps:
- name: 检出当前基准分支上的工作流文件
- name: 检出默认分支上的自动化脚本
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.base.ref }}
ref: ${{ github.event.repository.default_branch }}
fetch-depth: 1
persist-credentials: false