如何用GitHub Action检查Maven依赖的Snapshot版本并区分环境构建
解决方案:实现Maven依赖Snapshot版本的环境差异化检查
你可以通过Maven插件+GitHub Action工作流的组合来实现需求,不需要额外第三方Action,以下是两种可行方案:
方案一:使用maven-enforcer-plugin(推荐)
这个插件能递归检查所有直接/间接依赖的Snapshot版本,通过参数控制是否让构建失败,适配不同环境:
- 在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>
- 编写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中的直接依赖:
- 编写检查脚本(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
- 配置工作流调用脚本
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
相关产品推荐
相关产品推荐

