基于标签选择性发布多模块Maven制品至GitHub Packages的Workflow优化
多模块Maven项目基于标签触发GitHub Packages分模块发布方案
针对你的需求,我们可以通过标准化标签规则+步骤级条件判断实现单Job内按需发布指定模块,GitHub Actions虽然没有原生switch语法,但用if条件表达式完全能满足分支逻辑需求。
解决思路
- 约定标签命名规则:用
module-<模块名>-v<版本号>格式的标签(比如module-user-v2.1.0),明确指定要发布的模块 - 在Workflow中从触发标签里提取模块名,作为后续条件判断的依据
- 为每个模块单独编写发布步骤,通过
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
相关产品推荐
相关产品推荐

