如何基于Maven pom版本条件触发GitHub Action的执行步骤
实现方案
1. 提取POM版本号存入环境变量
你可以直接调用Maven自带的help:evaluate插件获取当前POM的版本号,然后写入GitHub Actions内置的GITHUB_ENV文件,后续所有步骤都可以直接读取这个环境变量:
- name: 提取POM版本号 run: echo "POM_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV
参数-q是静默输出,-DforceStdout会直接把版本号打印到标准输出,不会携带多余的Maven运行日志。
2. 按分支和版本号控制步骤执行
直接使用GitHub Actions的if条件语法,结合内置的字符串匹配函数endsWith做判断即可,同时可以排除PR触发的场景,完全对齐你之前在Jenkins里的逻辑:
- develop分支执行条件:
if: github.ref == 'refs/heads/develop' && endsWith(env.POM_VERSION, '-SNAPSHOT') && github.event_name != 'pull_request' - main/master分支执行条件:
if: contains(fromJson('["refs/heads/main", "refs/heads/master"]'), github.ref) && !endsWith(env.POM_VERSION, '-SNAPSHOT') && github.event_name != 'pull_request'
完整Workflow示例
name: Maven 发布流程 on: push: branches: - develop - main - master pull_request: # 预留PR触发的其他校验逻辑,发布逻辑会自动排除PR jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: 配置JDK uses: actions/setup-java@v4 with: java-version: '17' # 替换为你项目实际使用的JDK版本 distribution: 'temurin' cache: maven - name: 提取POM版本号 run: echo "POM_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV - name: 打印版本号(可选,用于调试) run: echo "当前POM版本为 ${{ env.POM_VERSION }}" # 推送到develop分支且版本为SNAPSHOT时执行 - name: 发布SNAPSHOT版本到Maven仓库 if: github.ref == 'refs/heads/develop' && endsWith(env.POM_VERSION, '-SNAPSHOT') && github.event_name != 'pull_request' run: mvn deploy # 替换为你实际的发布命令 # 推送到main/master分支且版本不为SNAPSHOT时执行 - name: 发布正式版本到Maven仓库 if: contains(fromJson('["refs/heads/main", "refs/heads/master"]'), github.ref) && !endsWith(env.POM_VERSION, '-SNAPSHOT') && github.event_name != 'pull_request' run: mvn deploy # 替换为你实际的发布命令
可选优化方案
如果你不想在每个步骤里写复杂的if条件,也可以把分支和版本的匹配逻辑提前放到job级别的if条件,拆分两个独立的job分别处理SNAPSHOT和正式版本的发布,逻辑会更清晰。
内容的提问来源于stack exchange,提问作者stwissel
相关产品推荐
相关产品推荐

