{"meta":{"title":"使用 GitHub Actions 进行部署","intro":"GitHub Actions 通过环境、并发组和保护规则，可以精细地控制部署。","product":"GitHub Actions","breadcrumbs":[{"href":"/zh/actions","title":"GitHub Actions"},{"href":"/zh/actions/how-tos","title":"操作方法"},{"href":"/zh/actions/how-tos/deploy","title":"部署"},{"href":"/zh/actions/how-tos/deploy/configure-and-manage-deployments","title":"配置和管理部署"},{"href":"/zh/actions/how-tos/deploy/configure-and-manage-deployments/control-deployments","title":"控制部署"}],"documentType":"article"},"body":"# 使用 GitHub Actions 进行部署\n\nGitHub Actions 通过环境、并发组和保护规则，可以精细地控制部署。\n\n## 先决条件\n\n你应该熟悉GitHub Actions的语法。 有关详细信息，请参阅“[撰写工作流程](/zh/actions/how-tos/write-workflows)”。\n\n## 触发部署\n\n您可以使用各种事件来触发您的部署工作流程。 一些最常见的事件包括：`pull_request`、`push` 和 `workflow_dispatch`。\n\n例如，具有以下触发器的工作流在以下情况下会运行：\n\n* 存在针对 `main` 分支的推送。\n* 以 `main` 分支为目标的拉取请求已打开、已同步或重新打开。\n* 有人手动触发它。\n\n```yaml\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n  workflow_dispatch:\n```\n\n有关详细信息，请参阅“[触发工作流的事件](/zh/actions/reference/workflows-and-actions/events-that-trigger-workflows)”。\n\n## 使用环境\n\n环境用于描述常规部署目标，例如 `production`、`staging` 或 `development`。\nGitHub Actions当工作流部署到环境时，环境将显示在存储库的主页上。 可以使用环境来要求审批作业以继续，限制可以触发工作流的分支，使用自定义部署保护规则控制部署，或限制对机密的访问权限。 有关创建环境的详细信息，请参阅“[管理部署环境](/zh/actions/how-tos/deploy/configure-and-manage-deployments/manage-environments)”。\n\n您可以使用保护规则和机密配置环境。 当工作流程引用环境时，作业在环境的所有保护规则通过之前不会开始。 在所有部署保护规则通过之前，作业也不能访问在环境中定义的机密。 若要了解详细信息，请参阅本文中的[使用自定义部署保护规则](#using-custom-deployment-protection-rules)。\n\n## 使用并发处理\n\n并发确保只有使用相同并发组的单一作业或工作流程才会同时运行。 可以使用并发，使环境在任意时刻最多有一个部署在进行中。 有关并发的详细信息，请参阅“[控制工作流和作业的并发性](/zh/actions/how-tos/write-workflows/choose-when-workflows-run/control-workflow-concurrency)”。\n\n## 在没有部署的情况下使用环境\n\n默认情况下，当工作流作业引用环境时， GitHub 创建一个部署对象来跟踪部署。 可以通过在环境配置中设置`deployment`为`false`来选择不创建部署。 有效值为 `true` （默认值） 和 `false`。 还可以使用表达式，例如 `deployment: ${{ github.ref_name == 'main' }}`。\n\n```yaml\njobs:\n  test:\n    runs-on: ubuntu-latest\n    environment:\n      name: staging\n      deployment: false\n    steps:\n      - name: run tests\n        env:\n          API_KEY: ${{ secrets.API_KEY }}\n        run: echo \"Running tests with staging secrets\"\n```\n\n当 `deployment` 被设置为 `false` 时：\n\n* 该作业对环境机密和变量具有完全访问权限。\n* 未 GitHub 创建部署对象 - 不会更新环境的部署历史记录。\n* 等待计时器保护规则仍然适用 - 作业将在配置的持续时间内等待。\n* 所需的审阅者仍然适用 - 审阅者在作业运行之前仍然必须批准。\n\n如果想要使用以下环境，这非常有用：\n\n* **组织机密** - 在环境名称下对相关机密进行分组，而无需创建部署记录。\n* **访问控制** - 限制哪些分支可以通过环境分支策略使用某些机密，而无需进行部署跟踪。\n* **CI 和测试作业** - 引用其配置的环境，而不会向部署历史记录添加干扰。\n\n### 与保护规则交互\n\n属性 `deployment` 控制哪些保护规则适用：\n\n\\| 保护规则 |\n`deployment: true`（默认值） | `deployment: false` |\n\\|----------------|------------------------------|---------------------|\n\\| **没有** | 已创建部署，作业正在运行 | 无需部署，即可运行作业 |\n\\| **等待计时器** | 强制实施等待计时器 | 仍强制实施等待计时器 |\n\\| **所需的审阅者** | 审阅者必须批准 | 审阅者必须批准 |\n\\| **自定义部署保护规则应用** | 已发送应用 Webhook，必须进行批准 |\n**作业失败并出现错误** |\n\n自定义部署保护规则 （GitHub Apps） 需要部署对象才能正常运行。 如果在具有自定义部署保护规则的环境中设置 `deployment: false` ，作业将立即失败，并显示注释或错误消息，说明环境的保护规则不兼容 `deployment: false`。 从工作流中删除 `deployment: false` ，或者从环境中删除自定义部署保护规则。\n\n请注意，`concurrency` 和 `environment` 未连接。 并发值可以是任何字符串；它无需是环境名称。 此外，如果另一个工作流程使用相同的环境，但未指定并发性，则该工作流程将不受任何并发规则的约束。\n\n例如，当以下工作流运行时，如果使用 `pending` 并发组的任何作业或工作流正在进行中，则它将暂停并且状态为 `production`。 它还将取消使用 `production` 并发组且状态为 `pending` 的任何作业或工作流。 这意味着，由于使用了 `production` 并发组，因此最多有一个正在运行和一个待处理的作业或工作流。\n\n```yaml\nname: Deployment\n\nconcurrency: production\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  deployment:\n    runs-on: ubuntu-latest\n    environment: production\n    steps:\n      - name: deploy\n        # ...deployment-specific steps\n```\n\n您也可以在作业级别指定并发性。 这将允许工作流中的其他作业继续，即使并发作业的状态为 `pending`。\n\n```yaml\nname: Deployment\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  deployment:\n    runs-on: ubuntu-latest\n    environment: production\n    concurrency: production\n    steps:\n      - name: deploy\n        # ...deployment-specific steps\n```\n\n还可以使用 `cancel-in-progress` 取消同一并发组中任何当前正在运行的作业或工作流。\n\n```yaml\nname: Deployment\n\nconcurrency:\n  group: production\n  cancel-in-progress: true\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  deployment:\n    runs-on: ubuntu-latest\n    environment: production\n    steps:\n      - name: deploy\n        # ...deployment-specific steps\n```\n\n有关如何编写特定于部署的步骤的指导，请参阅“[查找部署示例](#finding-deployment-examples)”。\n\n## 查看部署历史记录\n\nGitHub Actions当工作流部署到环境时，环境将显示在存储库的主页上。 有关查看部署到环境的详细信息，请参阅“[查看部署历史记录](/zh/actions/how-tos/deploy/configure-and-manage-deployments/view-deployment-history)”。\n\n您的组织可以通过将数据上传到 linked artifacts page，在一个地方收集所有构建版本的部署记录。 请参阅“[关于关联的项目](/zh/code-security/concepts/supply-chain-security/linked-artifacts)”。\n\n## 监控工作流程运行\n\n每个工作流程运行都会生成一个实时图表，说明运行进度。 您可以使用此图表来监控和调试部署。 有关详细信息，请参阅“[使用可视化图表](/zh/actions/how-tos/monitor-workflows/use-the-visualization-graph)”。\n\n您还可以查看每个工作流程运行的日志和工作流程运行的历史记录。 有关详细信息，请参阅“[查看工作流程运行历史记录](/zh/actions/how-tos/monitor-workflows/view-workflow-run-history)”。\n\n## 在工作流中使用必要的审核\n\n引用配置了所需审查者的环境的作业将等待审批后再开始。 当作业正在等待批准时，其状态为“等待”。 如果作业在 30 天内未获得批准，它将自动失败。\n\n有关环境和所需的审批的详细信息，请参阅“[管理部署环境](/zh/actions/how-tos/deploy/configure-and-manage-deployments/manage-environments)”。 有关如何使用 REST API 查看部署的信息，请参阅“[工作流运行的 REST API 终结点](/zh/rest/actions/workflow-runs)”。\n\n## 使用自定义部署保护规则\n\n> \\[!NOTE]\n> 自定义部署保护规则目前为 公开预览，可能随时更改。\n\n可以启用自己的自定义保护规则来限制第三方服务的部署。 例如，可以使用 Datadog、Honeycomb 和 ServiceNow 等服务为部署到 GitHub 提供自动审批。\n\n自定义部署保护规则由 GitHub Apps 提供支持，并基于 Webhook 和回调运行。 工作流作业的批准或拒绝基于 `deployment_protection_rule` Webhook 的使用情况。 有关详细信息，请参阅“[Webhook 事件和有效负载](/zh/webhooks/webhook-events-and-payloads#deployment_protection_rule)”和“[批准或拒绝部署](/zh/actions/how-tos/deploy/configure-and-manage-deployments/create-custom-protection-rules#approving-or-rejecting-deployments)”。\n\n创建自定义部署保护规则并将其安装在存储库中后，自定义部署保护规则将自动用于存储库中的所有环境。\n\n可以基于任何外部服务中定义的条件（例如 IT 服务管理 (ITSM) 系统中的已批准票证、依赖项上易受攻击的扫描结果或云资源的稳定运行状况指标）批准或拒绝环境部署。 批准或拒绝部署的决定由集成的第三方应用程序以及在其中定义的限制条件决定。 下面是几个可以为其创建部署保护规则的用例。\n\n* ITSM 与安全运营：可以通过验证用于验证部署就绪情况的质量、安全性和合规性过程来检查服务就绪情况。\n* 可观测性系统：可以咨询监视或可观测性系统（资产性能管理系统和日志记录聚合器、云资源健康验证系统等），以验证安全性和部署就绪情况。\n* 代码质量和测试工具：可以检查需要部署到环境的 CI 生成的自动测试。\n\n或者，可以为上述任一用例编写自己的保护规则，也可以定义任何自定义逻辑，以安全地批准或拒绝从预生产环境到生产环境的部署。\n\n## 通过应用跟踪部署\n\n如果在 GitHub 上的个人帐户或组织与 Microsoft Teams 或 Slack 集成，可以通过 Microsoft Teams 或 Slack 跟踪使用环境的部署。 例如，当部署正在等待批准、部署获得批准或部署状态更改时，您可以通过应用接收通知。 有关集成 Microsoft Teams 或 Slack 的详细信息，请参阅 [特色GitHub集成](/zh/integrations/concepts/featured-github-integrations#team-communication-tools)。\n\n你还可以构建一个应用，该应用使用部署和部署状态 web 挂钩来跟踪部署。\n当引用环境的工作流作业运行时，它将创建一个部署对象并将 `environment` 属性设置为环境名称。 随着工作流的进行，它还将创建部署状态对象，并将 `environment` 属性设置为环境名称，将 `environment_url` 属性设置为环境的 URL（如果在工作流中指定），以及将 `state` 属性设置为作业的状态。 有关详细信息，请参阅 [GitHub 应用文档](/zh/apps) 和 [Webhook 事件和有效负载](/zh/webhooks/webhook-events-and-payloads#deployment)。\n\n## 选择运行器\n\n您可以在GitHub-托管的运行器或自托管的运行器上运行部署工作流。 来自 GitHub 托管的运行器的流量可能来自[各种网络地址](/zh/rest/meta/meta#get-github-meta-information)。 如果要部署到内部环境，并且公司将外部流量限制到专用网络，则在 GitHub Actions 托管的运行器上运行的 GitHub 工作流可能无法与内部服务或资源通信。 为了克服这一点，您可以托管自己的运行器。 有关详细信息，请参阅 [自托管运行程序](/zh/actions/concepts/runners/self-hosted-runners) 和 [GitHub 托管的运行程序](/zh/actions/concepts/runners/github-hosted-runners)。\n\n## 显示状态徽章\n\n您可以使用状态徽章来显示您的部署工作流程状态。 状态徽章显示工作流程目前失败还是通过。 添加状态徽章的常见位置是存储库的 `README.md` 文件，但也可将其添加到你喜欢的任何网页。 默认情况下，徽章显示默认分支的状态。 如果默认分支上没有工作流运行，它将显示所有分支中最近运行的状态。 也可以在 URL 中使用 `branch` 和 `event` 查询参数显示特定分支或事件的工作流运行的状态。\n\n![工作流状态徽章的屏幕截图。 从右到左显示：GitHub 徽标、工作流名称（“GitHub Actions 演示”）和状态（“正在传递”）。](/assets/images/help/repository/actions-workflow-status-badge.png)\n\n有关详细信息，请参阅“[添加工作流状态徽章](/zh/actions/how-tos/monitor-workflows/add-a-status-badge)”。\n\n## 查找部署示例\n\n本文演示了 GitHub Actions 的特性，这些特性可以添加到您的部署工作流中。\n\nGitHub为多个常用服务（例如Azure Web 应用）提供部署工作流模板。 若要了解如何开始使用工作流模板，请参阅 [使用工作流模板](/zh/actions/how-tos/write-workflows/use-workflow-templates) 或[浏览部署工作流模板的完整列表](https://github.com/actions/starter-workflows/tree/main/deployments)。 还可以查看有关特定部署工作流的详细指南，例如 [将 Node.js 部署到Azure App Service](/zh/actions/how-tos/deploy/deploy-to-third-party-platforms/nodejs-to-azure-app-service)。\n\n许多服务提供商还提供可在 GitHub Marketplace 上使用的操作，用于部署到其服务。 有关完整列表，请参阅 [GitHub Marketplace](https://github.com/marketplace?category=deployment\\&type=actions)。"}