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

多模块配置下如何列出迭代周期内更新的待部署项目?

需求背景

我的项目是多模块Maven结构(基于Spring Boot、Java 20),目前需要手动核查每个子项目的提交历史,才能确定最近2周迭代周期内有更新的子项目,进而明确需要重新部署的服务。希望能自动化生成这份更新子项目的清单文档,技术栈包含GitHub Actions与Kubernetes。

项目模块结构示意图:
项目模块结构

子项目pom.xml示例:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.bootcamp.test</groupId>
<artifactId>BootCampProject</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
<groupId>com.bootcam</groupId>
<artifactId>bootCampApi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>bootCampApi</name>
<description>bootCampApi</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.4.5</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

父项目pom.xml示例:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.bootcamp.test</groupId>
<artifactId>BootCampProject</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.5</version>
<relativePath></relativePath>
</parent>
</project>
可行实现方案

方案1:基于GitHub Actions + Git命令自动生成更新清单

利用Git提交历史筛选最近2周内有变更的子目录,结合项目结构生成标准化文档。

操作步骤:

  1. 在仓库根目录创建GitHub Actions工作流文件:.github/workflows/generate-update-report.yml
  2. 配置触发规则:支持每周定时执行或手动触发
  3. 在工作流中执行以下逻辑:
    • 拉取完整代码仓库历史
    • 用Git命令提取最近2周有变更的子模块:
      git log --since="2 weeks ago" --name-only --pretty=format: | grep -E "^[^/]+/" | cut -d'/' -f1 | sort | uniq
      
    • 将结果整理为Markdown格式的清单,可附加每个模块的提交记录摘要
    • 将生成的文档上传为GitHub Artifact,或提交到仓库指定目录存档

示例工作流代码:

name: Generate Update Report
on:
  schedule:
    - cron: '0 0 * * 1' # 每周一凌晨自动执行
  workflow_dispatch: # 支持手动触发

jobs:
  generate-report:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # 拉取完整提交历史

      - name: Generate update report
        run: |
          echo "# 最近2周更新子项目清单" > update-report.md
          echo "生成时间: $(date '+%Y-%m-%d %H:%M:%S')" >> update-report.md
          echo "" >> update-report.md
          echo "## 变更模块列表" >> update-report.md
          
          # 提取有变更的子模块
          git log --since="2 weeks ago" --name-only --pretty=format: | grep -E "^[^/]+/" | cut -d'/' -f1 | sort | uniq | while read module; do
            echo "- **$module**" >> update-report.md
            echo "  最近提交记录:" >> update-report.md
            git log --since="2 weeks ago" --oneline -- $module | head -10 | sed 's/^/  - /' >> update-report.md
            echo "" >> update-report.md
          done

      - name: Upload report as artifact
        uses: actions/upload-artifact@v4
        with:
          name: weekly-update-report
          path: update-report.md

      # 可选:将报告提交到仓库存档
      - name: Commit report to repo
        run: |
          git config --global user.name "GitHub Actions"
          git config --global user.email "actions@github.com"
          git add update-report.md
          git commit -m "Update weekly service update report" || echo "No changes to commit"
          git push

方案2:结合Maven依赖分析,精准定位需部署项目

如果模块间存在依赖关系,基础模块更新可能导致依赖它的服务也需要重新部署,可通过Maven分析依赖链补充清单。

操作步骤:

  1. 先用方案1的Git命令获取直接变更的模块
  2. 针对每个变更模块,用Maven命令找出所有依赖它的子项目:
    mvn dependency:tree -Dincludes=com.bootcam:$changedModule -DoutputType=text | grep -E "^\[INFO\] com.bootcam:" | cut -d' ' -f4 | cut -d':' -f1 | sort | uniq
    
  3. 合并直接变更模块与间接影响模块,生成完整的需部署清单

依赖分析示例代码:

# 获取直接变更的模块
changed_modules=$(git log --since="2 weeks ago" --name-only --pretty=format: | grep -E "^[^/]+/" | cut -d'/' -f1 | sort | uniq)

# 分析间接影响的模块
affected_modules=""
for module in $changed_modules; do
  affected=$(mvn dependency:tree -Dincludes=com.bootcam:$module -DoutputType=text | grep -E "^\[INFO\] com.bootcam:" | cut -d' ' -f4 | cut -d':' -f1 | sort | uniq)
  affected_modules="$affected_modules $affected"
done

# 合并去重得到所有需部署模块
all_affected_modules=$(echo "$changed_modules $affected_modules" | tr ' ' '\n' | sort | uniq)

方案3:集成到CI/CD流程,自动标记并部署变更服务

如果已有GitHub Actions构建部署Kubernetes服务的流程,可直接在CI中嵌入变更识别逻辑:

  1. 构建前识别变更模块
  2. 仅对变更模块执行mvn package、镜像构建与推送
  3. 自动更新Kubernetes中对应服务的Deployment
  4. 同步生成部署清单文档,作为CI产物保存

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:34:51