You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于标签选择性发布多模块Maven制品至GitHub Packages的Workflow优化

多模块Maven项目基于标签触发GitHub Packages分模块发布方案

针对你的需求,我们可以通过标准化标签规则+步骤级条件判断实现单Job内按需发布指定模块,GitHub Actions虽然没有原生switch语法,但用if条件表达式完全能满足分支逻辑需求。

解决思路

  1. 约定标签命名规则:用module-<模块名>-v<版本号>格式的标签(比如module-user-v2.1.0),明确指定要发布的模块
  2. 在Workflow中从触发标签里提取模块名,作为后续条件判断的依据
  3. 为每个模块单独编写发布步骤,通过if条件控制只有匹配的模块才会执行发布

完整Workflow代码

name: 多模块Maven发布到GitHub Packages

on:
  push:
    tags:
      - 'module-*-v*'  # 只触发符合规则的标签推送

jobs:
  publish-target-module:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取仓库代码
        uses: actions/checkout@v4

      - name: 配置JDK环境
        uses: actions/setup-java@v4
        with:
          java-version: '17' # 根据你的项目JDK版本调整
          distribution: 'temurin'
          server-id: github
          settings-path: ${{ github.workspace }}

      - name: 从标签中提取模块名
        id: get-module
        run: |
          # 从module-user-v1.0.0这类标签中截取中间的模块名
          MODULE=$(echo "${{ github.ref_name }}" | awk -F'-' '{print $2}')
          echo "module_name=$MODULE" >> $GITHUB_OUTPUT

      # 以下为各模块的发布步骤,按需添加
      - name: 发布user模块
        if: steps.get-module.outputs.module_name == 'user'
        run: mvn deploy -DskipTests -f ./modules/user/pom.xml
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: 发布order模块
        if: steps.get-module.outputs.module_name == 'order'
        run: mvn deploy -DskipTests -f ./modules/order/pom.xml
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: 发布auth模块
        if: steps.get-module.outputs.module_name == 'auth'
        run: mvn deploy -DskipTests -f ./modules/auth/pom.xml
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      # 兜底:如果标签对应的模块不存在,触发失败提示
      - name: 模块不匹配提示
        if: steps.get-module.outputs.module_name not in ['user', 'order', 'auth']
        run: |
          echo "错误:标签对应的模块不存在,请检查标签格式(正确格式:module-<模块名>-v<版本号>)"
          exit 1

关键细节说明

  • 标签提取逻辑:除了用awk,也可以用GitHub Actions的内置表达式简化,比如${{ github.ref_name | split('-')[1] }},前提是标签严格遵循三段式结构
  • 条件判断:每个发布步骤的if条件会检查提取到的模块名是否匹配,只有符合条件的步骤才会执行,完全替代switch的分支逻辑
  • Maven配置要求:确保每个模块的pom.xml中配置了GitHub Packages的仓库信息:
    <distributionManagement>
      <repository>
        <id>github</id>
        <name>GitHub Packages</name>
        <url>https://maven.pkg.github.com/你的用户名/你的仓库名</url>
      </repository>
    </distributionManagement>
    
  • 权限问题:GITHUB_TOKEN是GitHub自动生成的秘钥,默认拥有当前仓库Packages的发布权限,无需额外配置

内容的提问来源于stack exchange,提问作者Ishan Kashyap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:42:53