Skip to main content
We publish frequent updates to our documentation, and translation of this page may still be in progress. For the most current information, please visit the English documentation.

将 OpenID Connect 与可重用的工作流程结合使用

您可以将可重用的工作流程与 OIDC 结合使用,以标准化您的部署步骤并加强其安全性。

注意:GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。 可以在 GitHub public roadmap 上查看有关未来支持计划的更多信息。

关于可重用工作流程

您可以创建一个可重用的工作流程来执行部署步骤,而不是将部署作业从一个工作流程复制并粘贴到另一个工作流程。 如果可重用工作流满足“重用工作流”中所述的访问要求之一,则可以由另一个工作流使用。

应熟悉“[重新使用工作流程]”和“关于使用 OpenID Connect 进行安全强化”中所述的概念。

定义信任条件

与 OpenID Connect (OIDC) 结合使用时,可重用工作流程可让您在存储库、组织或企业中实施一致的部署。 为此,可以基于可重用工作流程在云角色上定义信任条件。 可用选项因云提供商而异:

  • 使用 job_workflow_ref

    • 为了创建基于可重用工作流的信任条件,云提供商必须支持 job_workflow_ref 的自定义声明。 这允许您的云提供商确定作业最初来自哪个存储库。
    • 对于仅支持标准声明(受众 (aud) 和主题 (sub))的云,可以使用 API 自定义 sub 声明以包含 job_workflow_ref。 有关详细信息,请参阅“自定义令牌声明”。 对自定义声明的支持目前适用于 Google Cloud Platform 和 HashiCorp Vault。
  • 自定义令牌声明:

    • 可以通过自定义 JWT 中包含的颁发者 (iss) 和主题 (sub) 声明来配置更精细的信任条件。 有关详细信息,请参阅“自定义令牌声明”。

令牌如何与可重用工作流程配合使用

在工作流程运行期间,GitHub 的 OIDC 提供商会向云提供商提供一个 OIDC 令牌,其中包含有关作业的信息。 如果该作业是可重用工作流的一部分,则令牌将包括包含有关调用工作流的信息的标准声明,并且还将包括一个名为 job_workflow_ref 的自定义声明,其中包含有关被调用工作流的信息。

例如,以下 OIDC 令牌适用于作为被调用工作流程一部分的作业。 workflowref 及其他属性描述调用方工作流,而 job_workflow_ref 指被调用的工作流:

YAML
{
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "example-thumbprint",
  "kid": "example-key-id"
}
{
  "jti": "example-id",
  "sub": "repo:octo-org/octo-repo:environment:prod",
  "aud": "https://HOSTNAME/octo-org",
  "ref": "refs/heads/main",
  "sha": "example-sha",
  "repository": "octo-org/octo-repo",
  "repository_owner": "octo-org",
  "actor_id": "12",
  "repository_id": "74",
  "repository_owner_id": "65",
  "run_id": "example-run-id",
  "run_number": "10",
  "run_attempt": "2",
  "actor": "octocat",
  "workflow": "example-workflow",
  "head_ref": "",
  "base_ref": "",
  "event_name": "workflow_dispatch",
  "ref_type": "branch",
  "job_workflow_ref": "octo-org/octo-automation/.github/workflows/oidc.yml@refs/heads/main",
  "iss": "https://HOSTNAME/_services/token",
  "nbf": 1632492967,
  "exp": 1632493867,
  "iat": 1632493567
}

如果可重用工作流程执行部署步骤,则它通常需要访问特定的云角色,并且您可能希望允许组织中的任何存储库调用该可重用工作流程。 若要允许这样做,您将创建允许任何存储库和任何调用方工作流程的信任条件,然后筛选组织和被调用的工作流程。 有关一些示例,请参阅下一节。

示例

筛选特定存储库中的可重用工作流

您可以配置自定义声明,以筛选特定存储库中的任何可重用工作流程。 在此示例中,工作流运行必须源自在 octo-org/octo-automation 存储库的可重用工作流中定义的作业,以及由 octo-org 组织拥有的任何存储库中定义的作业。

  • 主题

    • 语法: repo:ORG_NAME/*
    • 示例: repo:octo-org/*
  • 自定义声明

    • 语法: job_workflow_ref:ORG_NAME/REPO_NAME
    • 示例: job_workflow_ref:octo-org/octo-automation@*

在特定引用处筛选特定的可重用工作流

您可以配置自定义声明,以筛选特定的可重用工作流程。 在此示例中,工作流运行必须源自在可重用工作流 octo-org/octo-automation/.github/workflows/deployment.yml 中定义的作业,以及由 octo-org 组织拥有的任何存储库中定义的作业。

  • 主题

    • 语法: repo:ORG_NAME/*
    • 示例: repo:octo-org/*
  • 自定义声明

    • 语法: job_workflow_ref:ORG_NAME/REPO_NAME/.github/workflows/WORKFLOW_FILE@ref
    • 示例:job_workflow_ref:octo-org/octo-automation/.github/workflows/deployment.yml@ 10040c56a8c0253d69db7c1f26a0d227275512e2