GitHub 操作:在工作流之间共享/引用作业

Tom*_*iak 3 continuous-integration github continuous-deployment devops github-actions

正如这里所讨论的,在 GitHub Actions 中有一种使用关键字引用job其他jobs 中的 s的好方法need,例如

name: Share data between jobs
on: [push]

jobs:
  job_1:
    name: Add 3 and 7
    runs-on: ubuntu-latest
    steps:
        # Steps

  job_2:
    name: Multiply by 9
    needs: job_1
    # The rest of the job
Run Code Online (Sandbox Code Playgroud)

我在文档中找不到答案的问题是:有没有办法job在其他工作流中引用/共享s?(即单独的yml文件)

我的项目由几个单独的工作流组成,每个工作流都需要执行相同的初始steps。我试图避免在不同的workflows 中复制粘贴相同的步骤。

Dan*_*nyB 5

目前,我认为无法指定工作流之间的依赖关系。在此 GitHub 社区论坛中对此进行了讨论:

如何指定在另一个工作流中运行的作业依赖项?

您可以做的是使用相同的工作流文件,然后使用条件来触发或不触发特定作业。

如果您只想在推送到 master 分支时运行作业,您可以这样做:

   deploy:
       if: github.event_name == 'push' && github.ref == 'refs/heads/master'
Run Code Online (Sandbox Code Playgroud)


小智 5

听起来您想在多个工作流程中重用单个作业,以保持您的工作 DRY/SPOT(单点事实),这样您就不必重复自己并引入错误。这可以通过重用工作流程来完成。

本质上有一个“调用者”工作流程,它使用可选的输入和输出来调用(运行)“被调用”工作流程。

以下 .yml 文件“使用”被调用工作流的相对路径(但可以引用其他存储库的版本等 - 请参阅文档)。

name: Caller for a reusable workflow
on:
  push:
    branches:
      - main
jobs:
  example_job:
    uses: ./.github/workflows/reusable-workflow-example-called.yml
    with:
      BUILD_ENV: "Dev"
    secrets:
      TESTING: ${{ secrets.TESTING }}
Run Code Online (Sandbox Code Playgroud)

上面的工作流程调用下面的工作流程,并选择性地传入变量和秘密。

name: Called reusable workflow

on:
  workflow_call:
    inputs:
      BUILD_ENV:
        required: true
        type: string
    secrets:
      TESTING:
        required: true

jobs:
  called-workflow:
    name: Blippedy
    runs-on: ubuntu-latest
    steps:
      - id: do-a-thing
        run: |
          echo "${BUILD_ENV} is ${TESTING}!"
          echo $BUILD_ENV
          echo "${{ inputs.BUILD_ENV }} ${{ secrets.TESTING }}"
Run Code Online (Sandbox Code Playgroud)

我使用它在为不同环境配置的多个工作流程中运行相同的作业(通过 Postman 测试newman)。

或者,如果您正在寻找跨作业/工作流程使用单个步骤,请查看复合操作