跳至主要内容

对必需的状态检查进行故障排除

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

谁可以使用此功能?

受保护分支适用于具有 GitHub 免费版和 GitHub 免费版(适用于组织)的公共存储库,以及具有 GitHub Pro、GitHub Team、GitHub Enterprise Cloud 和 GitHub Enterprise Server 的公共和私有存储库。有关更多信息,请参阅“GitHub 的计划”。

如果你有一个具有相同名称的检查和状态,并且你选择该名称作为必需状态检查,那么检查和状态都是必需的。有关更多信息,请参阅“用于检查的 REST API 端点”。

注意:要成为必需的,状态检查必须在过去七天内在所选存储库中成功完成。

启用必需的状态检查后,在合并之前,你的分支可能需要与基础分支保持最新。这可确保你的分支已使用基础分支中的最新代码进行测试。如果你的分支已过时,则需要将基础分支合并到你的分支中。有关更多信息,请参阅“关于受保护分支”。

注意:您还可以使用 Git rebase 将您的分支更新到基础分支。有关详细信息,请参阅“关于 Git rebase”。

在所有必需的状态检查通过之前,您将无法将本地更改推送到受保护分支。相反,您将收到类似于以下内容的错误消息。

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

注意:已更新且通过必需状态检查的拉取请求可以在本地合并并推送到受保护分支。这可以在不针对合并提交本身运行状态检查的情况下完成。

必需的检查需要针对最新的提交 SHA 成功

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

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

有时,测试合并提交和头部提交的状态检查结果会发生冲突。如果测试合并提交具有状态,则测试合并提交必须通过。否则,在合并分支之前,头部提交的状态必须通过。

如果测试合并提交和头部提交之间存在冲突,则测试合并提交的检查会显示在拉取请求状态检查框中。拉取请求状态框中以从 显示合并提交的检查 开始的一行表示这一点。有关测试合并提交的详细信息,请参阅“拉取请求的 REST API 端点”。

处理跳过的但必需的检查

警告:如果由于 路径筛选分支筛选提交消息 而跳过某个工作流,则与该工作流关联的检查将保持在“挂起”状态。需要这些检查才能成功的拉取请求将无法合并。

但是,如果由于条件而跳过工作流中的某个作业,则它将报告其状态为“成功”。有关更多信息,请参阅“使用条件控制作业执行”。

当某个作业失败时,任何依赖于该失败作业的作业都将被跳过,并且不会报告失败。可能不会阻止需要该检查的拉取请求。要在依赖于其他作业的作业上使用必需检查,请使用 always() 条件表达式以及 needs,请参阅“在工作流中使用作业”。

示例

以下示例显示了一个工作流,该工作流需要 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 应用的状态检查。如果你看到类似于以下内容的消息,则应验证合并框中列出的检查是由预期应用设置的。

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