2

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

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

在此处输入图像描述

(我已经取消了这两个动作,但正如你所见,它们触发了) 在此处输入图像描述

4

2 回答 2

4

该元素对事件tags无效。因此,无论标签如何,都会为每个发布类型的事件release触发工作流。没有事件标签的直接过滤器,因为有 for和事件。releasereleasepushpull_request

因此,您可以在包含release 标记的上下文if中结合使用条件作业。github.ref

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:
      # [...]
于 2021-07-29T12:54:47.073 回答
3

触发器在这published两种情况下都使用(独立于标签),因为您的工作流程将针对已发布OR的标签(使用通知模式)事件启动。

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

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

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

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

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发布标签:

例子

编辑:请注意,您也可以使用 astartWith而不是containsif 表达式的函数。

于 2021-07-29T12:45:32.360 回答