【问题标题】:GitHub Actions CI Conditional RegexGitHub Actions CI 条件正则表达式
【发布时间】:2020-03-10 18:30:14
【问题描述】:

我正在尝试将 CI 工作流程从 CircleCI 转移到 GitHub Actions。我面临的最后一个主要难题是部署。

目前我的工作流程是这样的,当我将标签推送到我的 GitHub 存储库时,它将运行测试,然后运行部署。只有当标签与正则表达式匹配时,CircleCI 过滤标签才运行作业:/v[0-9]+(\.[0-9]+)*/

如何在运行部署之前检查以确保我推送的标签与上面的正则表达式模式匹配?

我目前有以下 GitHub Actions yml 文件:

name: CI
on: [create]

jobs:
  # ...

  deploy:
    runs-on: ubuntu-latest
    if: github.event.ref_type == 'tag' && github.event.ref == SOMETHING HERE
    steps:
      - uses: actions/checkout@v1
      # ...

if 块下,我需要将github.event.ref == SOMETHING HERE 更改为其他内容。我查看了Contexts and expression syntax for GitHub Actions 文档页面。但由于 GitHub Actions 的灵活和强大,似乎应该有一种方法或方式来做到这一点,或者至少是某种解决方法。

如何确保标签 (github.event.ref) 与正则表达式模式 (/v[0-9]+(\.[0-9]+)*/) 匹配?

【问题讨论】:

    标签: github github-actions


    【解决方案1】:

    不幸的是,我认为目前还没有任何方法可以对if 条件表达式进行正则表达式匹配。

    一种选择是对push 事件使用过滤。

    on:
      push:
        tags:
          - 'v*.*.*'
    

    另一种选择是在creates a step output 的单独步骤中进行正则表达式检查。然后可以在 if 条件中使用它。

          - name: Check Tag
            id: check-tag
            run: |
              if [[ ${{ github.event.ref }} =~ ^refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
                  echo ::set-output name=match::true
              fi
          - name: Build
            if: steps.check-tag.outputs.match == 'true'
            run: |
              echo "Tag is a match"
    

    【讨论】:

    • 是的。由于我的工作流程,我希望部署之前的作业在创建的所有标签上运行,而不仅仅是“v*.*.*”。它的匹配也没有我的正则表达式强大。然后单独的步骤选项可能会起作用,但是当您有很多步骤时会感觉非常混乱。希望 GitHub 尽快添加对此的支持!
    • 您的检查标签操作步骤非常棒,效果非常棒!
    • @peterevans 看起来不错,但您能解释一下后一个示例的作用或工作原理,或者至少添加对一些文档的引用吗?
    • @user0800 我为set-output 添加了指向文档的链接。正则表达式部分只是 shell 脚本,并不特定于 GitHub Actions。
    • 如果您使用用户输入(例如 PR 标题或分支名称,如您所做的那样),匹配的外壳可能非常危险。这个例子非常令人担忧,我会考虑删除它。如果您将分支命名为 true]]||["a" 怎么办? (如果允许使用方括号?)
    【解决方案2】:

    根据docs,您可以这样做:

    on:
      create:
        tags:
          - "v[0-9]+.[0-9]+"
    

    我尝试了上述方法并且可以确认它有效。这不是完整的正则表达式功能,但应该足以满足您的需求。

    【讨论】:

    • 完整地说,“v[0-9]+\.[0-9]+”(带反斜杠)更好,否则您的正则表达式也将在 3.6 和 3a6 上匹配,因为这 。字符代表正则表达式中的“任何东西”。例如,您可以通过regex101.com 确认这一点。
    • @DennisAmeling 检查他提到的“文档”链接。你会看到那个“。”不会像完全传统的正则表达式那样受到影响。
    【解决方案3】:

    我已经设法通过两部分方法实现了这一点。第一部分包括过滤您想要运行的标签。第二部分是为您的 deploy 作业创建条件。

    我的工作流程的精简版如下所示:

    name: CI-CD
    
    on:
      push:
        branches:
        - stable
        tags:
        - '[0-9]+.[0-9]+.[0-9]+'
        - '[0-9]+.[0-9]+.[0-9]+rc[0-9]+'
      pull_request:
        branches:
        - stable
    
    
    jobs:
      test:
        steps:
          ...
    
      deploy:
        needs: test
        if: startsWith(github.ref, 'refs/tags')
        steps:
          ...
    

    我针对特定分支的推送、标签和拉取请求运行我的工作流程。您可以根据自己想要过滤标签的方式获得创意。 Check out the filter patterns.

    我有点挣扎的是如何设置正确的条件来运行deploy 作业。我决定了以下几点:

    needs: test
    

    确保它仅在test 作业成功时运行。

    然后我滥用github.ref 将是'refs/heads/stable' 推送到分支和'refs/tags/<your tag>' 推送标签的事实。所以我只是用以下条件来测试这种差异。

    if: startsWith(github.ref, 'refs/tags')
    

    对我来说就像一个魅力,但可能取决于你的设置。

    当然,您也可以创建单独的工作流程,但就我而言,我总是想先运行测试套件。

    【讨论】:

    猜你喜欢
    • 2020-09-06
    • 2016-09-19
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多