一文入门Github Action复用工作流

794 阅读10分钟

一 概述

Github Action 作为代码仓库的持续集成工具,允许我们创建自定义的工作流来自动化软件开发过程中的任务。

但是,如果多个仓库有相同的工作流需求,在每个仓库中定义完全相同的工作流就很麻烦,且不利于后期的维护。

Github Action 提供了可复用工作流功能,可以将工作流定义为独立的 YAML 文件,存储在公共仓库中,其他仓库可以轻松调用这些工作流。

采用可复用工作流可以简化我们仓库的设置,减少重复劳动,从而提高效率与质量。要使用可复用工作流,首先需要在公共仓库中创建 YAML 文件来定义工作流。其文件名需要以 “.github/workflows/” 开头,结尾为 “.yml”。

然后,在其他仓库中使用 “uses” 关键字来调用公共仓库中的工作流文件。我们还可以传入输入参数以定制工作流,也可以覆盖部分步骤来修改工作流的某些行为。

二 特点

2.1 Github Action 可复用工作流的优点

  1. 减少重复工作。无需在每个仓库中定义相同的工作流,可以集中维护并共享,简化仓库设置和管理。
  2. 实现流程标准化。通过在组织层面共享工作流,可以推行流程和最佳实践的标准化,统一开发团队的流程与质量。
  3. 更易发现与使用。工作流以文件的形式在仓库中,易于其他成员发现与使用,降低了使用门槛。
  4. 更易更新与测试。作为独立文件,工作流更易被更新,并且可以在非生产环境下测试后再应用于生产环境,减少了错误发布的风险。
  5. 高度定制化。调用工作流的仓库仍可以传入参数和覆盖某些步骤来对工作流进行定制,兼顾了标准化和定制化。

2.2 可复用工作流的缺点:

  1. 依赖外部仓库。如果外部仓库发生变化,可能会影响调用工作流的仓库,需要注意版本控制和变更管理。
  2. 调试困难。如果工作流执行出现问题,调试会比较困难,需要协作外部仓库的维护人员进行 issue 追踪与修复。
  3. 权限管理繁琐。如果工作流定义在私有仓库,调用方需要有权限访问,这会增加权限管理的难度与复杂度。
  4. 无法完全定制。对于定制化程度高的需求,调用方仓库难以通过覆盖步骤完全实现定制,这时需要另行定义工作流。
  5. 学习成本较高。要共享高质量的工作流,维护人员需要精通Github Action与YAML,并关注工作流的可重用性和参数化设计,这相对较高的学习与运维成本。

总的来说,可复用工作流提供了很多优点,但是也需要注意其潜在的缺点和局限性。在使用时需要根据实际情况综合权衡,才能达到简化管理、标准化流程的目的。掌握相关知识与技能,对于团队来说意义重大。

三 介绍

可以使工作流可重用,而不是从一个工作流复制和粘贴到另一个工作流。然后,您和任何有权访问可重用工作流的人都可以从另一个工作流调用可重用工作流。 重用工作流可以避免重复。这使得工作流更容易维护,并允许您通过构建其他工作更快地创建新工作流,就像您使用操作一样。工作流重用还通过帮助您使用设计良好、已经过测试并已被证明有效的工作流来促进最佳实践。您的组织可以建立一个可集中维护的可重用工作流库。 下图显示了一个正在运行的工作流,它使用了一个可重用的工作流。

  • 在图左侧的三个构建作业成功完成后,将运行一个名为“Deploy”的依赖作业。
  • “Deploy”作业调用一个可重用的工作流,该工作流包含三个作业:“Staging”、“Review”和“Production”。
  • “生产”部署作业仅在“登台”作业成功完成后运行。
  • 当作业以环境为目标时,工作流运行将显示进度条,其中显示作业中的步骤数。在下面的图表中,“Production”作业包含8个步骤,目前正在处理第6步。
  • 使用可重用的工作流运行部署作业允许您为每个构建运行这些作业,而无需在工作流中复制代码。

使用另一个工作流的工作流被称为“调用者”工作流。可重用工作流是一个“被调用的”工作流。一个调用工作流可以使用多个被调用工作流。每个被调用的工作流都在一行中引用。结果是调用者工作流文件可能只包含几行YAML,但在运行时可能执行大量任务。重用工作流时,将使用整个被调用的工作流,就好像它是调用方工作流的一部分一样。 如果重用来自不同存储库的工作流,则被调用工作流中的任何操作都将作为调用方工作流的一部分运行。例如,如果被调用的工作流使用操作/签出,则操作签出承载调用方工作流的存储库的内容,而不是被调用的工作流。 当可重用工作流被调用方工作流触发时,github上下文总是与调用方工作流相关联。被调用的工作流被自动授予访问github的权限。token和secrets.GITHUB_TOKEN。有关github上下文的更多信息,请参阅“上下文”。 您可以在包含工作流的存储库的依赖关系图中查看在GitHub Actions工作流中引用的重用工作流。有关更多信息,请参见“关于依赖关系图”。

可重用工作流和启动器工作流

Starter工作流允许组织中有权创建工作流的每个人更快速、更轻松地创建工作流。当人们创建一个新的工作流时,他们可以选择一个初始工作流,并且编写工作流的部分或全部工作将为他们完成。在启动器工作流中,您还可以引用可重用的工作流,以方便人们从重用集中管理的工作流代码中获益。如果在引用可重用工作流时使用提交SHA,则可以确保重用该工作流的每个人总是使用相同的YAML代码。然而,如果您通过标记或分支引用可重用的工作流,请确保您可以信任该工作流版本。有关更多信息,请参见“GitHub操作的安全加固”。

访问可重用工作流

一个可重用的工作流可以被另一个工作流使用,前提是:

  • 两个工作流都在同一个存储库中。

  • 所调用的工作流存储在公共存储库中,您的组织允许您使用公共可重用工作流。

  • 被调用的工作流存储在私有存储库中,该存储库的设置允许对其进行访问。有关详细信息,请参见“与组织共享操作和工作流”和“从您的私有存储库共享操作和工作流”。

使用runners

使用GitHub-hosted runners

github托管的运行程序的赋值总是只使用调用者的上下文来计算。为github托管的运行程序计费总是与调用者相关联。调用者工作流不能从被调用的存储库中使用github托管的运行程序。有关更多信息,请参见“关于github托管的跑步者”。

使用self-hosted runners

与调用者工作流属于同一用户或组织的被调用工作流可以从调用者的上下文中访问自托管运行程序。这意味着一个被调用的工作流可以访问自托管的运行程序,包括:

  • 在调用方存储库中
  • 在调用方存储库的组织中,前提是运行器已对调用方存储库可用

限制

  • 您最多可以连接四个级别的工作流。有关更多信息,请参见“嵌套可重用工作流”。
  • 您可以从单个工作流文件中调用最多20个可重用工作流。此限制包括可能从顶层调用者工作流文件开始调用的嵌套可重用工作流的任何树。 例如,顶级调用者工作流。Yml→被调用的工作流-1。Yml→称为工作流-2。Yml算作2个可重用工作流。
  • 在调用方工作流中工作流级别定义的env上下文中设置的任何环境变量都不会传播到被调用方工作流。更多信息请参见“变量”和“上下文”。
  • 要在多个工作流中重用变量,请在组织、存储库或环境级别设置它们,并使用vars上下文引用它们。更多信息请参见“变量”和“上下文”。

创建一个可重用的工作流

可重用工作流是yaml格式的文件,非常类似于任何其他工作流文件。与其他工作流文件一样,您可以在存储库的.github/workflows目录中定位可重用工作流。不支持工作流目录下的子目录。 对于可重用的工作流,on的值必须包括workflow_call:

on:
  workflow_call:

在可重用工作流中使用输入和秘密

您可以定义输入和秘密,它们可以从调用方工作流传递,然后在被调用的工作流中使用。在可重用工作流中使用输入或秘密有三个阶段。

  • 在可重用工作流中,使用输入和秘密关键字来定义将从调用方工作流传递的输入或秘密。
on:
  workflow_call:
    inputs:
      config-path:
        required: true
        type: string
    secrets:
      envPAT:
        required: true

有关定义输入和秘密的语法的详细信息,请参见on.workflow_call。输入和on.workflow_call.secrets。

  • 在可重用工作流中,引用您在上一步中的on键中定义的输入或秘密。
jobs:
  reusable_workflow_job:
    runs-on: ubuntu-latest
    environment: production
    steps:
    - uses: actions/labeler@v4
      with:
        repo-token: ${{ secrets.envPAT }}
        configuration-path: ${{ inputs.config-path }}

在上面的示例中,envPAT是添加到生产环境中的环境秘密。因此,该环境在作业中被引用。

  • 从调用者工作流传递输入或秘密。

要将命名输入传递给被调用的工作流,请在作业中使用with关键字。使用secrets关键字传递已命名的秘密。对于输入,输入值的数据类型必须与被调用工作流中指定的类型匹配(布尔值、数字或字符串)。

jobs:
  call-workflow-passing-data:
    uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main
    with:
      config-path: .github/labeler.yml
    secrets:
      envPAT: ${{ secrets.envPAT }}

四 总结

可复用工作流的主要优点在于:

  1. 减少重复工作,无需在每个仓库中定义相同的工作流;实现流程标准化,可以在组织层面共享工作流并推行最佳实践;
  2. 更易被发现与使用,工作流以文件形式在仓库中,易于其他成员发现;更易更新与测试,可以在非生产环境下测试后再应用到生产环境。

Github Action 作为github仓库的持续集成服务,为我们实现高效软件交付提供了重要保障。理解可复用工作流等功能,并熟练运用,可以极大地增强我们对Github Action的运用能力,构建简单高效的开发与交付流程。这对开发团队而言意义重大。熟练使用Github Action的各项功能,有助我们构建简单高效的开发与交付流程。这是软件工程师必备的重要技能。