Skip to main content

Enterprise Server 3.15 目前作为候选发布提供。

必需状态检查故障排除

您可以检查必需状态检查的常见错误并解决问题,

谁可以使用此功能?

受保护分支可以在对组织具有 GitHub Free 和 GitHub Free 的公共存储库中可用。 受保护分支还可以在具有 GitHub Pro、GitHub Team、GitHub Enterprise Cloud 和 GitHub Enterprise Server 的公共和专用存储库中使用。

如果您有名称相同的检查和状态,并且选择该名称作为必需状态检查,则检查和状态都是必需的。 有关详细信息,请参阅“检查的 REST API 终结点”。

注意: 根据要求,必须在过去 7 天内在所选存储库中成功完成状态检查。

在启用必需状态检查后,您的分支在合并之前可能需要使用基础分支更新。 这可确保您的分支已经使用基本分支的最新代码做过测试。 如果您的分支过期,则需要将基本分支合并到您的分支。 有关详细信息,请参阅“关于受保护分支”。

注意:也可以使用 Git 变基以基础分支更新分支。 有关详细信息,请参阅“关于 Git 变基”。

在通过所有必需状态检查之前,无法向受保护分支推送本地更改。 反而会收到类似如下的错误消息。

remote: error: GH006: Protected branch update failed for refs/heads/main.
remote: error: Required status check "ci-build" is failing

注意:最新且通过所需状态检查的拉取请求可以在本地合并,并推送到受保护的分支。 此操作无需对合并提交本身运行状态检查。

所需的检查需要通过最新的提交 SHA 才能成功

为了合并拉取请求,所有所需的检查都必须通过最新的提交 SHA 。 这样可以确保在合并之前验证最近更改并满足所需的标准。 使用先前的提交 SHA 触发的检查将不会用作所需检查的一部分。

头部提交与测试合并提交之间的冲突

有时,测试合并提交与头部提交的状态检查结果存在冲突。 如果测试合并提交具有状态,则测试合并提交必须通过。 否则,必须传递头部提交的状态后才可合并该分支。

如果测试合并提交和头提交之间存在冲突,则测试合并提交的检查将显示在拉取请求状态复选框中。 这在拉取请求状态框中由以 Showing checks for the merge commit 开头的行指示。 有关测试合并提交的详细信息,请参阅“用于拉取请求的 REST API 终结点”。

处理已跳过但需要检查

警告:如果因路径筛选分支筛选提交消息而跳过某工作流,则与该工作流关联的检查将保持为“挂起”状态。 要求这些检查成功的拉取请求将被阻止合并。

如果工作流需要在合并之前通过,则不应使用路径或分支筛选来跳过工作流运行。 有关详细信息,请参阅“跳过工作流程运行”和“规则集的可用规则”。

但是,如果由于某条件而跳过工作流内的作业,该作业状态将报告为“成功”。 有关详细信息,请参阅“使用条件控制作业执行”。

如果作业失败,则将跳过依赖于已失败的作业的任何作业,并且不报告失败。 可能无法阻止需要该检查的拉取请求。 要对依赖于其他作业的作业使用必需的检查,则除 needs 之外,还应使用 always() 条件表达式,具体请参阅“在工作流程中使用作业”。

示例

以下示例显示了要求 build 作业为“成功”完成状态的工作流,但如果拉取请求未更改 scripts 目录中的任何文件,则将跳过该工作流。

name: ci
on:
  pull_request:
    paths:
      - 'scripts/**'
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [12.x, 14.x, 16.x]
    steps:
    - uses: actions/checkout@v4
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
    - run: npm ci
    - run: npm run build --if-present
    - run: npm test

由于路径筛选,仅更改存储库根目录中文件的拉取请求不会触发此工作流,并且将被阻止合并。 在拉取请求上,你将看到“正在等待报告状态”。

如果工作流需要在合并之前通过,则不应使用路径或分支筛选来跳过工作流运行。 有关详细信息,请参阅“跳过工作流程运行”和“规则集的可用规则”。

使用 GitHub Actions 和合并队列进行状态检查

将拉取请求添加到合并队列时,必须使用 merge_group 事件触发 GitHub Actions 工作流。

**注意:**如果存储库使用 GitHub Actions 执行所需检查 ,或者如果需要通过存储库中的拉取请求上的组织规则集要求工作流,则需要更新工作流以包含 merge_group 事件作为其他触发器。 否则在将拉取请求添加到合并队列时不会触发状态检查。 合并将失败,因为没有报告必要的状态检查。 事件 merge_group 独立于 pull_requestpush 事件。

报告目标分支保护所需的检查的工作流如下所示:

on:
  pull_request:
  merge_group:

有关 merge_group 事件的详细信息,请参阅“触发工作流的事件”。

要求从意外源进行状态检查

受保护的分支也可能要求从特定的 GitHub App 进行状态检查。 如果看到类似于以下内容的消息,则应验证合并框中列出的检查项是否由预期的应用设置。

Required status check "build" was not set by the expected GitHub App.