借助名为“Reusable Workflows”的新 GitHub Actions 功能,您现在可以使用单行配置引用现有工作流程,而不是从一个工作流程复制和粘贴到另一个工作流程。

基本上是类固醇上的 GitHub 操作模板!

什么是可重用工作流

因此,GitHub Actions 中的可重用工作流。借助此功能,您现在可以在另一个工作流程中引用整个操作工作流程,就像它是单个操作一样。

这个新功能建立在不久前介绍的复合动作之上。如果您不知道复合动作是什么,请查看这个帖子或这个视频,但简而言之,它们是打包在一起的一个或多个步骤,然后可以在 Actions 工作流程中由单线。

可重用工作流扩展了这一概念,允许您在另一个工作流中引用整个工作流。如果可以将复合操作视为模板,那么可重用工作流则处于另一个新的水平。

对了,让我们看看如何创建一个可重用的工作流。

视频

像往常一样,如果您是视觉学习者,或者只是喜欢看和听而不是阅读,这里有带有完整解释和演示的视频,公平地说,这是很多 more比这篇文章更完整

视频链接:https://youtu.be/lRypYtmbKMs

如果您更喜欢阅读,那么......让我们继续吧:)

创建可重用工作流

可重用的工作流是_normal_Actions YAML 文件,因此它们必须驻留在repo 根目录的.github/workflows文件夹中。

他们必须拥有的唯一特别的东西是_特殊触发器_:

on:
  workflow_call:

进入全屏模式 退出全屏模式

工作流文件也可以有不同的触发器,但要使其可重用,其中之一必须是workflow_call

您还可以通过触发器 parameters 将数据**传递到可重用的工作流程,该触发器可以是 2 种类型:

  • 个输入

  • 个秘密

inputs 用于传递 normal 数据(也称为非敏感信息):

    inputs:
      image_name:
        required: true
        type: string
      tag: 
        type: string

进入全屏模式 退出全屏模式

在上面的示例中,我想使用可重用工作流作为模板来构建 Docker 映像并将其推送到注册表,我们可以看到我们有 2 个类型为string的输入,一个是必需的,一个不是必需的。

注意:如果需要的输入没有传递到可重用工作流,它将失败

其他可用类型为booleannumber

相反,正如名称所述,secrets 用于将秘密值传递给工作流:

    secrets:
      registry_username:
        required: true
      registry_password:
        required: true

进入全屏模式 退出全屏模式

在这种情况下,您可以看到没有type,每个秘密都被视为字符串。

最后,您可以通过使用{{inputs.NAME_OF_THE_INPUT}}{{secrets.NAME_OF_THE_SECRET}}在工作流程中使用这些参数。

因此,在上面提到的示例中,我想使用可重用工作流来构建 Docker 映像并将其推送到注册表,可重用工作流将如下所示:

name: Create and Publish Docker Image

on:
  workflow_call:
    inputs:
      image_name:
        required: true
        type: string
      tag: 
        type: string
    secrets:
      registry_username:
        required: true
      registry_password:
        required: true

jobs:
  build:
    runs-on: ubuntu-latest

    steps:      
      - uses: actions/checkout@v2

      - name: Setup BuildX
        uses: docker/setup-buildx-action@v1

      - name: Login to the Registry
        uses: docker/login-action@v1
        with:
          username: ${{secrets.registry_username}}
          password: ${{secrets.registry_password}}

      - name: Set the tag
        run: |
          if [ -z "${{inputs.tag}}" ]
          then
            echo "final_tag=latest" >> $GITHUB_ENV
          else
            echo "final_tag=${{inputs.tag}}" >> $GITHUB_ENV
          fi

      - name: Build and Push the Image
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: ${{secrets.registry_username}}/${{inputs.image_name}}:${{env.final_tag}}


  do-something-else:
    runs-on: ubuntu-latest

    steps:
    - run: echo "Hello"

进入全屏模式 退出全屏模式

另请注意,可重用的工作流程可以有多个作业,如您在示例中所见(其中do-something-else什么都不做,但它是为了炫耀它)

容易吧?要记住的一件事是,如果可重用的工作流程除了workflow_call之外还有其他触发器,您可能需要确保它不会意外运行多次。

现在我们有了可重用的工作流程,让我们看看如何在另一个工作流程中使用它。并一直陪着我直到最后,因为我将讨论可重用工作流程的限制以及它们何时有用。

使用可重用工作流

现在我们已经准备好可重用的工作流程,是时候在另一个工作流程中使用它了。

为此,只需使用以下语法将其直接添加到您的工作流的作业中:

 job_name:
    uses: USER_OR_ORG_NAME/REPO_NAME/.github/workflows/REUSABLE_WORKFLOW_FILE.yml@TAG_OR_BRANCH

进入全屏模式 退出全屏模式

我们来分析一下:

1.您创建一个没有步骤的工作

2.您不要添加runs-on子句,因为它包含在可重用工作流中

3.您将其引用为uses传递:

  • 拥有存储可重用工作流的存储库的用户或组织的名称

  • 回购名称

  • 基本文件夹

  • 可重用工作流 yaml 文件的名称

  • 以及存储文件的标签或分支(如果您尚未为其创建标签/版本)

在我上面的真实示例中,这就是我在名为 docker 的作业中引用它的方式:

  docker:
    uses: n3wt0n/ReusableWorkflow/.github/workflows/buildAndPublishDockerImage.yml@main

进入全屏模式 退出全屏模式

现在当然我们必须传递参数。让我们从输入开始:

    with:
      image_name: my-awesome-app
      tag: $GITHUB_RUN_NUMBER

进入全屏模式 退出全屏模式

如您所见,我们只使用with子句,并指定输入的名称。

不用说,名称必须与可重用工作流定义中的名称相同。

相反,对于秘密,我们使用新的secrets部分:

    secrets:
      registry_username: ${{secrets.REGISTRY_USERNAME}}
      registry_password: ${{secrets.REGISTRY_PASSWORD}}

进入全屏模式 退出全屏模式

就是这样。所以完整的例子看起来像这样(你可以在这里找到):

# This is a basic workflow to showcase the use of Reusable Workflows

name: Reusable Workflow user

on:
  workflow_dispatch:

jobs:
  do-it:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Run a one-line script
        run: echo Hello, world!

  docker:
    uses: n3wt0n/ReusableWorkflow/.github/workflows/buildAndPublishDockerImage.yml@main
    with:
      image_name: my-awesome-app
      tag: $GITHUB_RUN_NUMBER
    secrets:
      registry_username: ${{secrets.REGISTRY_USERNAME}}
      registry_password: ${{secrets.REGISTRY_PASSWORD}}

进入全屏模式 退出全屏模式

再一次,如您所见,调用者工作流程也可以有多个作业。

如果我们运行工作流,这就是我们得到的:

[工作流程运行](https://res.cloudinary.com/practicaldev/image/fetch/s--i5tThZBo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/gklfn5vy2mklzhhcjbs1.png)

您可以在图像中看到,我们有调用者中存在的do-it作业的日志,然后是可重用工作流中的两个作业的日志。

由于这 2 个作业在调用者工作流的docker作业中运行,因此它们在日志中被引用为docker / builddocker /do-something-else

但除此之外,日志是完整的:

[日志](https://res.cloudinary.com/practicaldev/image/fetch/s--KwLbl8SS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/onltrx96m0d3fxlpffe4.png)

我们得到了发生的一切的完整细节

限制和注意事项

所以,让我们从一些注释开始。首先,请记住,可重用工作流目前处于 beta 中,因此在它们进入 GA 时情况可能会发生变化。

其次,要使工作流能够使用它,可重用工作流必须存储在与调用相同的存储库中,或者存储在公共存储库中,或者存储在具有允许访问它的设置的内部存储库中。

[回购访问设置](https://res.cloudinary.com/practicaldev/image/fetch/s--z4B4_QtA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/hw795lt2gzplxe64bfrp.png)

现在让我们谈谈限制。作为我们刚才所说的直接结果,存储在私有存储库中的可重用工作流只能由同一存储库中的其他工作流使用。

此外,可重用工作流不能调用和使用其他可重用工作流

最后,您需要记住这一点,在调用者工作流程中在工作流程级别设置的环境变量不会传递给可重用工作流程。因此,如果您需要在可重用工作流程中使用这些变量中的任何一个,您必须通过上面显示的参数将它们传递给工作流程。

结论

重用工作流程可避免重复。这使工作流程更易于维护,并允许您通过构建其他人的工作来更快地创建新工作流程,就像您对操作所做的那样。

工作流重用还通过帮助您使用设计良好、已经过测试并被证明有效的工作流来促进最佳实践。您的组织可以建立一个可重复使用的工作流库,可以集中维护

在下面的评论部分让我知道您对这些新的可重用工作流程的看法,您是否计划以及如何使用它们,以及您认为是否缺少任何功能。

您可能还想观看这个视频,其中我将复合动作作为模板进行讨论。

喜欢、分享和关注我 🚀 了解更多内容:

📽YouTube

☕给我买杯咖啡

💖Patreon

📧通讯

🌐CoderDave.io 网站

👕商品

👦🏻脸书专页

🐱u200d💻GitHub

👲🏻推特

👴🏻领英

🔉播客

给我买杯咖啡

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐