【问题标题】:Reuse portion of github action across jobs跨作业重用部分 github 操作
【发布时间】:2020-05-02 13:41:58
【问题描述】:

我在 monorepo 中有一个 CI 工作流,对于这个工作流,最终构建了两个项目。作业运行良好,但是,我想知道是否有办法通过设置作业的运行器来删除此 workflow.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

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

【问题讨论】:

  • 我还没有确定正确的语法来实现它。但是,我正在尝试创建一个本地操作,该操作在我的主工作流程中运行重复的步骤。参考:github.community/t5/GitHub-Actions/… 这似乎是解决问题的方法,但目前工作失败并且还没有找到正确的语法来设置路径。
  • 当前错误:``` ##[error]在'/Users/runner/runners/2.163.1/work/-client/下找不到'action.yml'或'Dockerfile' -client/.github/actions/build-setup-action.yml'。您是否忘记在运行本地操作之前运行操作/结帐? ```

标签: github continuous-integration yaml github-actions


【解决方案1】:

据我所知,目前没有办法重复使用步骤
但在这种情况下,您可以使用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

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

【讨论】:

  • 太棒了。我试图解决一个类似但不同的问题,你的回答救了我
【解决方案2】:

自 2021 年 10 月起,“Reusable workflows are generally available

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

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

请参阅“Reusing workflows”了解更多信息。

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

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

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

例子:

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

# .github/actions/my-action.yml
# Note the special trigger 'on: workflow_call:'

on:
  workflow_call:
    inputs:
      username:
        required: true
        type: string
    secrets:
      envPAT:
        required: true

在可重用工作流中引用输入或密码。

jobs:
  reusable_workflow_job:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - uses: ./.github/actions/my-action
        with:
          username: ${{ inputs.username }}
          token: ${{ secrets.envPAT }}

./.github/actions/my-action 是您自己的存储库中 my-action.yml 文件的名称。

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

Davide Benvegnù aka CoderDave 说明在“Avoid Duplication! GitHub Actions Reusable Workflows”中:

【讨论】:

  • 通过添加演示如何使用该功能的代码 sn-ps 可以改进此答案。目前它是 IMO 的边界链接唯一答案。
  • @jtbandes 感谢您的反馈。我已经相应地编辑了答案。
  • 感谢您的更新。为了解决问题的精神,我认为仍然不清楚如何使用 sn-ps,因为 my-action 在第二个 sn-p 但不是第一个中引用 - my-action 应该是第一个sn-p?
  • @jtbandes 我已经进一步阐明了答案并添加了一个具体示例。
  • not the special trigger on: workflow_call 我想你的意思是注意?
猜你喜欢
  • 2022-08-23
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 2021-04-10
  • 2020-03-06
  • 2022-01-03
  • 2021-04-13
  • 2020-12-03
相关资源
最近更新 更多