GitHub Actions CI 条件正则表达式

Cha*_*ish 18 github github-actions

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

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

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

我目前有以下 GitHub 操作 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
      # ...
Run Code Online (Sandbox Code Playgroud)

if块下,我需要改变github.event.ref == SOMETHING HERE成为别的东西。我查看了 GitHub 操作文档页面的上下文和表达式语法。但是由于 GitHub Actions 的灵活和强大,似乎应该有一种方法或方式来做到这一点,或者至少是某种类型的解决方法。

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

pet*_*ans 28

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

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

on:
  push:
    tags:
      - 'v*.*.*'
Run Code Online (Sandbox Code Playgroud)

另一种选择是在一个单独的步骤中进行正则表达式检查,它会创建一个步骤输出。然后可以在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"
Run Code Online (Sandbox Code Playgroud)

  • 是的。由于我的工作流程,我希望部署之前的作业在创建的所有标签上运行,而不仅仅是“v*.*.*”。它的匹配也不像我的正则表达式那么强大。那么单独的步骤选项可能会起作用,但当你有很多步骤时感觉真的很混乱。希望 GitHub 尽快添加对此的支持! (2认同)

Mrc*_*ief 9

根据docs,您可以执行以下操作:

on:
  create:
    tags:
      - "v[0-9]+.[0-9]+"
Run Code Online (Sandbox Code Playgroud)

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

  • @DennisAmeling 检查他提到的“文档”链接。您会看到“.”。不会像完全传统的正则表达式那样受到影响。 (3认同)

Mid*_*ter 5

我设法通过两部分方法实现了这一点。第一部分包括过滤要运行的标签。第二部分是为你的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:
      ...
Run Code Online (Sandbox Code Playgroud)

我对特定分支的推送、标签和拉取请求运行我的工作流。您可以根据自己想要的标签过滤方式发挥创意。查看过滤器模式

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

needs: test
Run Code Online (Sandbox Code Playgroud)

这确保它只会在test作业成功时运行。

然后我虐待的事实,github.ref将是'refs/heads/stable'一个推动分支和'refs/tags/<your tag>'力推的标签。所以我只是用以下条件测试这种差异。

if: startsWith(github.ref, 'refs/tags')
Run Code Online (Sandbox Code Playgroud)

对我来说很有魅力,但可能取决于您的设置。

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

  • `startsWith(github.ref, 'refs/tags')` 检查可以替换为 `github.ref_type == 'tag'`。 (4认同)