【问题标题】:Github Actions Conditional TriggerGithub Actions 条件触发器
【发布时间】:2021-10-05 01:32:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: github github-actions building-github-actions


    【解决方案1】:

    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-(需要第一个作业)来执行每个场景所需的操作.

    下面是一个完整的例子:

    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 函数。

    【讨论】:

      【解决方案2】:

      tags 元素对release 事件无效。因此,无论标签如何,每个 published 类型的 release 事件都会触发工作流。与pushpull_request 事件一样,release 事件的标签没有直接过滤器。

      因此,您可以在包含发布标签的上下文中结合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:
            # [...]
      

      【讨论】:

      • 我们都以不同的方式做同样的事情。但是,您的解决方案看起来更简单(不使用outputs),因为它不那么冗长。很好的答案??
      • @GuiFalourd 谢谢。是的,想法基本相同,很高兴看到如何以不同的方式解决问题。
      猜你喜欢
      • 2022-11-02
      • 1970-01-01
      • 2020-06-27
      • 2021-09-19
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2022-07-26
      相关资源
      最近更新 更多