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

如何用GitHub Action检查Maven依赖的Snapshot版本并区分环境构建

解决方案:实现Maven依赖Snapshot版本的环境差异化检查

你可以通过Maven插件+GitHub Action工作流的组合来实现需求,不需要额外第三方Action,以下是两种可行方案:

方案一:使用maven-enforcer-plugin(推荐)

这个插件能递归检查所有直接/间接依赖的Snapshot版本,通过参数控制是否让构建失败,适配不同环境:

  1. 在pom.xml中配置插件
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-enforcer-plugin</artifactId>
      <version>3.4.1</version>
      <executions>
        <execution>
          <id>check-no-snapshots</id>
          <goals>
            <goal>enforce</goal>
          </goals>
          <configuration>
            <rules>
              <requireReleaseDeps>
                <message>生产环境禁止依赖Snapshot版本</message>
                <banSnapshots>true</banSnapshots>
              </requireReleaseDeps>
            </rules>
            <fail>false</fail> <!-- 默认不终止构建,通过外部参数覆盖 -->
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
  1. 编写GitHub Action工作流
    根据分支或环境变量,传递不同参数控制插件行为:
name: Maven Dependency Check
on:
  push:
    branches: [ main, staging ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: maven
      - name: 生产环境构建(禁止Snapshot)
        if: github.ref == 'refs/heads/main'
        run: mvn clean install -Denforcer.fail=true
      - name: 预发布环境构建(允许Snapshot)
        if: github.ref == 'refs/heads/staging'
        run: mvn clean install -Denforcer.fail=false

方案二:自定义Shell脚本检查

如果不需要递归检查间接依赖,可以用简单脚本扫描pom.xml中的直接依赖:

  1. 编写检查脚本(check-snapshots.sh)
#!/bin/bash
SNAPSHOT_NUM=$(grep -c "<version>.*-SNAPSHOT</version>" pom.xml)
if [ $SNAPSHOT_NUM -gt 0 ]; then
    echo "发现${SNAPSHOT_NUM}个Snapshot依赖"
    if [ "$ENV" = "production" ]; then
        exit 1 # 生产环境终止构建
    else
        echo "预发布环境允许Snapshot依赖,继续执行"
    fi
else
    echo "未检测到Snapshot依赖"
fi
  1. 配置工作流调用脚本
name: Maven Dependency Check
on:
  push:
    branches: [ main, staging ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 识别运行环境
        run: |
          if [ "${{ github.ref }}" = "refs/heads/main" ]; then
            echo "ENV=production" >> $GITHUB_ENV
          else
            echo "ENV=staging" >> $GITHUB_ENV
          fi
      - name: 检查Snapshot依赖
        run: |
          chmod +x check-snapshots.sh
          ./check-snapshots.sh
      - name: Maven构建
        run: mvn clean install

注意事项

  • 方案一的maven-enforcer-plugin能覆盖所有依赖(包括间接依赖),准确性更高;方案二仅扫描pom中直接声明的依赖,适合简单场景。
  • 可以根据实际需求调整环境判断逻辑,比如用GitHub官方的「环境(Environments)」功能替代分支判断。

内容的提问来源于stack exchange,提问作者MAK Ripon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:20:40