如何通过GitHub Actions基于指定Tag格式验证限制Release作业
如何在GitHub Actions作业层级匹配特定格式的Tag以执行作业
我有一个通过Maven构建的应用,快照构建成功后会创建符合<appname>-<app_build_type>-<github-actions-run_number>-<env>-origin/<branch>格式的Tag(示例:java-maven-44-dev-origin/develop)。现需通过GitHub Actions的Release工作流,仅当Tag匹配该格式时才执行maven_build作业,不匹配则跳过或失败该作业。尝试了以下两种方法均无效,请求助实现方案(仅在作业层级处理,不通过run命令):
尝试过的无效方法
方法1:
name: maven-release on: workflow_dispatch: jobs: checkout_code: runs-on: [ubuntu-latest] steps: - name: Checkout uses: actions/checkout@v3 with: fetch-depth: 0 maven_build: runs-on: [ubuntu-latest] if: ${{ github.ref == 'refs/tags/*-origin/develop' }} needs: checkout_code steps: - name: Run maven build run: | mvn clean install
方法2:
name: maven-release on: workflow_dispatch: jobs: checkout_code: runs-on: [ubuntu-latest] steps: - name: Checkout uses: actions/checkout@v3 with: fetch-depth: 0 maven_build: runs-on: [ubuntu-latest] if: contains(github.ref, 'refs/tags/*-origin/develop') needs: checkout_code steps: - name: Run maven build run: | mvn clean install
解决方案
GitHub Actions的if条件支持通过matches函数使用正则表达式进行匹配,这是实现你需求的正确方式。之前的方法无效原因:
- 方法1使用
==做精确匹配,不支持通配符* - 方法2的
contains函数中*只是普通字符,不具备通配功能
以下是符合要求的配置,正则完全匹配你定义的Tag格式:
name: maven-release on: workflow_dispatch: jobs: checkout_code: runs-on: [ubuntu-latest] steps: - name: Checkout uses: actions/checkout@v3 with: fetch-depth: 0 maven_build: runs-on: [ubuntu-latest] # 正则匹配完整的Tag格式 if: ${{ matches(github.ref, '^refs/tags/[a-zA-Z0-9-]+-[a-zA-Z0-9-]+-[0-9]+-[a-zA-Z0-9-]+-origin/[a-zA-Z0-9/]+$') }} needs: checkout_code steps: - name: Run maven build run: | mvn clean install
正则说明
^refs/tags/:匹配github.ref的固定前缀[a-zA-Z0-9-]+:匹配<appname>,允许字母、数字、连字符-:格式中的分隔符[a-zA-Z0-9-]+:匹配<app_build_type>-:分隔符[0-9]+:匹配<github-actions-run_number>(纯数字)-:分隔符[a-zA-Z0-9-]+:匹配<env>-origin/:格式中的固定字符串部分[a-zA-Z0-9/]+$:匹配<branch>,支持分支名中的/(如feature/new-function)
如果需要更严格的匹配(比如限定env只能是dev/prod),可以修改对应部分的正则,例如将[a-zA-Z0-9-]+替换为(dev|prod)。
内容的提问来源于stack exchange,提问作者KNCK
相关产品推荐
相关产品推荐

