跨作业重用 github 操作的一部分

Bra*_*tin 12 continuous-integration yaml github github-actions

我在 monorepo 中有一个 CI 工作流,为此工作流最终构建了两个项目。作业运行良好,但是,我想知道是否有办法通过为作业设置运行程序来删除此工作流.yml 文件中的重复项。我将它们分开,以便它们并行运行,因为它们不相互依赖并且可以更快地完成。等待 CI 完成时,5 分钟与 10 分钟以上的时间相差很大。

jobs:
  job1:
    name: PT.W Build
    runs-on: macos-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v1

      - name: Setup SSH-Agent
        uses: webfactory/ssh-agent@v0.2.0
        with:
          ssh-private-key: |
            ${{ secrets.SSH_PRIVATE_KEY }}

      - name: Setup JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8

      - name: Setup Permobil-Client
        run: |
          echo no | npm i -g nativescript
          tns usage-reporting disable
          tns error-reporting disable
          npm run setup.all

      - name: Build PT.W Android
        run: |
          cd apps/wear/pushtracker
          tns build android --env.uglify

  job2:
    name: SD.W Build
    runs-on: macos-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v1

      - name: Setup SSH-Agent
        uses: webfactory/ssh-agent@v0.2.0
        with:
          ssh-private-key: |
            ${{ secrets.SSH_PRIVATE_KEY }}

      - name: Setup JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8

      - name: Setup Permobil-Client
        run: |
          echo no | npm i -g nativescript
          tns usage-reporting disable
          tns error-reporting disable
          npm run setup.all

      - name: Build SD.W Android
        run: |
          cd apps/wear/smartdrive
          tns build android --env.uglify
Run Code Online (Sandbox Code Playgroud)

您可以在此处看到作业的流程几乎相同,只是构建不同的应用程序本身。我想知道是否有办法在作业中获取重复的块并创建一种只编写一次并在两个作业中重用它的方法。

Car*_*nal 108

GitHub Actions 中的代码重用主要有 3 种方法:

以下详细信息来自我描述其优缺点的文章:

重用工作流程

显而易见的选择是使用“可重用工作流程”功能,该功能允许您将某些步骤提取到单独的“可重用”工作流程中,并将此工作流程称为其他工作流程中的作业。

要点:

  • 允许嵌套的可重用工作流调用(最多 4 层),但不允许循环。
  • 环境变量不被继承。可以使用特殊的secrets: inherit作业参数继承秘密。
  • 如果您需要提取并重用一项作业中的多个步骤,则不太方便。
  • 由于它作为单独的作业运行,因此您必须使用构建工件在可重用工作流程和主工作流程之间共享文件。
  • 您可以以同步或异步方式调用可重用工作流程(通过使用needs键进行作业排序来管理它)。
  • 可重用的工作流程可以定义从执行的步骤中提取输出/结果的输出。它们可以轻松地用于将数据传递到“主”工作流程。

分派工作流程

GitHub 为我们提供的另一种可能性是workflow_dispatch事件,它可以触发工作流运行。简而言之,您可以手动或通过 GitHub API 触发工作流程并提供其输入。

Marketplace 上提供了一些操作,允许您触发“分派”工作流程作为“主”工作流程的一个步骤。

其中一些还允许以同步方式执行此操作(等到分派的工作流程完成)。值得一提的是,该功能是通过轮询存储库工作流状态来实现的,这不太可靠,尤其是在并发环境中。此外,它还受到 GitHub API 使用限制的限制,因此在查找已调度工作流程的状态方面存在延迟。

要点

  • 您可以有多个嵌套调用,从另一个触发的工作流程触发一个工作流程。如果不小心,可能会导致无限循环。
  • 您需要一个具有“工作流程”权限的特殊令牌;您通常secrets.GITHUB_TOKEN不允许您调度工作流程。
  • 您可以在一项作业中触发多个分派工作流程。
  • 没有一种简单的方法可以将一些数据从分派工作流程返回到主工作流程。
  • 在“即发即忘”场景中效果更好。等待分派工作流完成有一些限制。
  • 您可以观察分派的工作流程运行并手动取消它们。

复合动作

在这种方法中,我们将步骤提取到不同的复合操作,该操作可以位于相同或单独的存储库中。

从您的“主”工作流程来看,它看起来像一个常见的操作(单个步骤),但在内部它由多个步骤组成,每个步骤都可以调用自己的操作。

要点:

  • 支持嵌套:复合动作的每一步都可以使用另一个复合动作。
  • 内部步骤运行的可视化效果不佳:在“主”工作流程中,它显示为通常的步骤运行。在原始日志中,您可以找到内部步骤执行的详细信息,但看起来不太友好。
  • 与父作业共享环境变量,但不共享秘密,秘密应通过输入显式传递。
  • 支持输入和输出。输出是根据内部步骤的输出/结果准备的,并且可以轻松用于将数据从复合操作传递到“主”工作流程。
  • 复合操作在“主”工作流的作业内运行。由于它们共享一个公共文件系统,因此无需使用构建工件将文件从复合操作传输到“主”工作流程。
  • 您不能continue-on-error在复合操作中使用选项。


Von*_*onC 13

自 2021 年 10 月起,“可重用工作流程普遍可用

\n
\n

可重用的工作流程现在已普遍可用。
\n可重复使用的工作流程使您能够像操作一样重复使用整个工作流程,从而帮助您减少重复。自 10 月份发布测试版以来,已经进行了多项改进:

\n
    \n
  • 您可以利用输出将数据从可重用工作流程传递到调用者工作流程中的其他作业
  • \n
  • 您可以将环境机密传递给可重用的工作流程
  • \n
  • 审核日志包含有关使用哪些可重用工作流程的信息
  • \n
\n
\n

有关更多信息,请参阅“重用工作流程”。

\n

工作流程

\n
\n

使用另一个工作流的工作流称为“调用者”工作流
\n可重用工作流程是“被调用”工作流程

\n

一个调用者工作流程可以使用多个被调用工作流程
\n每个被调用的工作流都在一行中引用。

\n

结果是调用者工作流文件可能只包含几行 YAML,但在运行时可能会执行大量任务。当您重用工作流时,将使用整个被调用的工作流,就像它是调用者工作流的一部分一样。

\n
\n

例子:

\n
\n

在可重用工作流程中,使用inputssecrets关键字来定义将从调用方工作流程传递的输入或机密。

\n
\n
# .github/actions/my-action.yml\n# Note the special trigger \'on: workflow_call:\'\n\non:\n  workflow_call:\n    inputs:\n      username:\n        required: true\n        type: string\n    secrets:\n      envPAT:\n        required: true\n
Run Code Online (Sandbox Code Playgroud)\n
\n

引用可重用工作流程中的输入或机密。

\n
\n
jobs:\n  reusable_workflow_job:\n    runs-on: ubuntu-latest\n    environment: production\n    steps:\n      - uses: ./.github/actions/my-action\n        with:\n          username: ${{ inputs.username }}\n          token: ${{ secrets.envPAT }}\n
Run Code Online (Sandbox Code Playgroud)\n

使用您自己的存储库中的文件./.github/actions/my-actionmy-action.yml

\n

可重用工作流程不必位于同一个存储库中,也可以位于另一个公共存储库中。

\n

Davide Benvegn\xc3\xb9 又名 CoderDave在“避免重复!GitHub Actions 可重用工作流程”中说明了这一点,其中:

\n\n

  • 感谢更新。为了解决问题的实质,我认为目前还不清楚如何使用这些片段,因为第二个片段中引用了“my-action”,而不是第一个片段 - my-action 是否应该是第一个片段的文件名? (3认同)

小智 11

据我所知,目前无法重用步骤,
但在这种情况下,您可以strategy用于并行构建和不同的变化:

jobs:
  build:
    name: Build
    runs-on: macos-latest
    strategy:
      matrix:
        build-dir: ['apps/wear/pushtracker', 'apps/wear/smartdrive']
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v1

      - name: Setup SSH-Agent
        uses: webfactory/ssh-agent@v0.2.0
        with:
          ssh-private-key: |
            ${{ secrets.SSH_PRIVATE_KEY }}

      - name: Setup JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8

      - name: Setup Permobil-Client
        run: |
          echo no | npm i -g nativescript
          tns usage-reporting disable
          tns error-reporting disable
          npm run setup.all

      - name: Build Android
        run: |
          cd ${{ matrix.build-dir }}
          tns build android --env.uglify
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请访问https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstrategy