Github 动作条件触发器

Github Actions Conditional Trigger

我需要帮助解决问题,我正在尝试根据 2 个不同的发布标签触发 2 个不同的工作流程。我希望 prod-* 触发生产工作流,并希望 dev-* 触发开发工作流。

问题是两个标签都会触发两个工作流,我不知道如何解决这个问题

(我已经取消了这两个操作,但如您所见,它们触发了)

这里的两种情况都使用 published 触发器(独立于标签),因为您的工作流将从已发布的 OR 标签(具有通知模式)事件开始。

要仅对特定标签执行操作,您必须从 $GITHUB_REF (env-var) 中提取标签版本,例如使用如下步骤在第一个作业中输出:

- name: Get the version 
  id: get_tag_version 
  run: echo ::set-output name=version::${GITHUB_REF/refs\/tags\//}

然后在其他 2 个作业上使用 if condition 检查标签版本 是否包含 prod-dev-(需要第一个job) 为每个场景执行你想要的操作。

这是一个可以使用的完整示例:

name: Example

on:
  release:
    types: [published]

jobs:
  job1:
    runs-on: ubuntu-latest
    outputs:
      tag_version: ${{ steps.get_tag_version.outputs.version }}
    steps:
     - name: Get the version 
       id: get_tag_version 
       run: echo ::set-output name=version::${GITHUB_REF/refs\/tags\//}

   job2: # will be executed on for dev- tag
    runs-on: ubuntu-latest
    needs: [job1]
    if: contains( needs.job1.outputs.tag_version , 'dev-')
    steps:
     [...]

   job3: # will be executed on for prod- tag
    runs-on: ubuntu-latest
    needs: [job1]
    if: contains( needs.job1.outputs.tag_version , 'prod-')
    steps:
     [...]
   

我编写了一个工作流来测试上面的实现,它按预期工作创建了一个 prod-2 发布标签:

编辑:请注意,您还可以对 if 表达式使用 startWith 而不是 contains 函数。

tags 元素对 release 事件无效。因此,无论标签如何,都会为类型为 published 的每个 release 事件触发工作流。对于具有 release event as there is for push and pull_request 事件的标签没有直接过滤器。

因此,您可以在包含发布标签的上下文中结合 github.ref 结合 if 条件职位 。

name: Deploy

on:
  release:
    types: [published]

jobs:
  deploy-dev:
    name: Deploy to development
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/dev-')
    steps:
      # [...]

  deploy-prod:
    name: Deploy to production
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/prod-')
    steps:
      # [...]