Jenkins构建间代码变更记录追踪方案

Jenkins构建间代码变更记录追踪方案

概述

本方案基于现有代码逻辑,实现每次Jenkins构建时自动追踪和展示代码变更记录的功能。通过记录每次构建的commit哈希,对比当前和上次构建之间的差异,生成变更历史报告。

核心逻辑

1. Commit记录追踪机制

系统使用[config_manager](file://D:\project\SuuntoTest\jenkins\config_manager.py#L0-L0)模块来持久化存储每次构建的commit哈希:

python 复制代码
# 保存当前commit到记录文件
def save_current_commit(repo_path):
    original_cwd = os.getcwd()
    os.chdir(repo_path)
    try:
        cmd = ['git', 'rev-parse', 'HEAD']
        result = subprocess.run(cmd, capture_output=True, text=True, check=True)
        current_commit = result.stdout.strip()
        config_manager.update_result_json("last_commit", current_commit)
    except subprocess.CalledProcessError as e:
        print(f"保存当前commit时出错: {e}")
    finally:
        os.chdir(original_cwd)

2. 构建间差异检测

通过比较当前commit和上次构建commit,获取变更内容:

python 复制代码
def get_jenkins_build_commits(repo_path):
    original_cwd = os.getcwd()
    os.chdir(repo_path)
    
    try:
        # 获取当前HEAD的commit
        cmd = ['git', 'rev-parse', 'HEAD']
        result = subprocess.run(cmd, capture_output=True, text=True, check=True)
        current_commit = result.stdout.strip()

        # 检查是否存在记录文件(上一次构建的commit)
        last_build_commit = config_manager.load_result_json().get('last_commit', '')
        if last_build_commit:
            # 如果commit相同,则没有新的变更
            if last_build_commit == current_commit:
                return []
            
            # 获取变更的文件
            changed_files = get_changed_files_between_commits(repo_path, last_build_commit, current_commit)
            
            # 根据变更的文件获取相关的commit
            commits = get_commits_for_files(repo_path, changed_files, last_build_commit, current_commit)
            
            return commits
        # ... 其他逻辑

3. 文件级别变更追踪

系统不仅追踪commit级别的变更,还能精确到文件级别的变更:

python 复制代码
def get_changed_files_between_commits(repo_path, old_commit, new_commit):
    original_cwd = os.getcwd()
    os.chdir(repo_path)

    try:
        # 获取从旧commit到新commit的文件变更
        cmd = ['git', 'diff', '--name-only', f'{old_commit}..{new_commit}']
        result = subprocess.run(cmd, capture_output=True, text=True, check=True)
        changed_files = result.stdout.strip().split('\n')
        changed_files = [f for f in changed_files if f]
        return changed_files
    except subprocess.CalledProcessError as e:
        print(f"获取变更文件时出错: {e}")
        return []
    finally:
        os.chdir(original_cwd)

工作流程

1. 初始化阶段

  • 系统首次运行时,由于没有历史记录,会获取所有commit记录
  • 将当前commit哈希保存到[result.json](file://D:\project\SuuntoTest\jenkins\result.json)文件中

2. 后续构建阶段

  • 读取上一次构建保存的commit哈希
  • 获取当前commit哈希
  • 比较两次commit之间的差异
  • 获取变更的文件列表
  • 根据变更的文件获取相关的commit记录
  • 生成HTML报告展示变更历史
  • 更新[result.json](file://D:\project\SuuntoTest\jenkins\result.json)中的commit哈希为当前值

3. 报告生成

  • 生成包含变更commit信息的HTML报告
  • 报告中包含作者、日期、commit消息等信息
  • 提供到GitHub commit页面的链接

Jenkins归档配置

为了确保生成的HTML报告能够在Jenkins中正确显示和访问,需要在Jenkinsfile或构建配置中添加归档步骤:

groovy 复制代码
post {
    always {
        // 归档commit历史报告
        archiveArtifacts artifacts: 'commit_history.html', fingerprint: true
        
        // 也可以归档其他相关文件
        archiveArtifacts artifacts: 'jenkins/result.json', fingerprint: true
    }
}

或者在Pipeline中使用archiveArtifacts步骤:

groovy 复制代码
stage('Archive commit history') {
    steps {
        script {
            // 确保报告文件存在
            if (fileExists('commit_history.html')) {
                archiveArtifacts artifacts: 'commit_history.html', fingerprint: true
            }
        }
    }
}

HTML报告显示优化

针对Jenkins中的内容安全策略(CSP)限制,HTML报告中已添加了适当的meta标签:

html 复制代码
<meta http-equiv="Content-Security-Policy" content="default-src * 'unsafe-inline' 'unsafe-eval'; script-src * 'unsafe-inline' 'unsafe-eval'; connect-src * 'unsafe-inline'; img-src * data: blob: 'unsafe-inline'; frame-src *; style-src * 'unsafe-inline';">

这确保了报告在Jenkins环境中能够正确显示样式和格式。

关键特性

1. 精确的变更追踪

  • 基于文件级别的变更检测,而非整个仓库的commit历史
  • 只显示与变更文件相关的commit记录

2. 自动化的记录管理

  • 自动保存和读取构建历史信息
  • 无需手动维护commit记录

3. 智能去重机制

  • 对获取到的commit记录进行去重处理
  • 按时间倒序排列,最新的变更显示在最前面

4. 完善的错误处理

  • 包含完整的异常处理机制
  • 即使某个步骤出错也不会影响整体流程

使用方法

在Jenkins构建流程中执行以下命令:

bash 复制代码
python jenkins/git_commit_report.py . commit_history.html

这将:

  1. 分析当前构建与上次构建之间的代码变更
  2. 生成包含变更记录的HTML报告
  3. 更新commit记录以供下次构建使用

然后确保在Jenkins配置中添加归档步骤以保存和展示报告:

groovy 复制代码
archiveArtifacts artifacts: 'commit_history.html', fingerprint: true

优势

  1. 精准追踪:只显示与实际变更相关的commit记录
  2. 自动化管理:无需手动维护历史记录
  3. 易于集成:可轻松集成到现有Jenkins构建流程中
  4. 可视化展示:生成易于阅读的HTML报告
  5. 可追溯性:提供到GitHub commit页面的直接链接
  6. Jenkins友好:生成的报告能正确在Jenkins中显示和归档
相关推荐
武子康1 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
Hello.Reader3 小时前
Go-Elasticsearch v9 安装与版本兼容性
elasticsearch·golang·jenkins
YuTaoShao3 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw4 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨4 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4045 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空5 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643146 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0016 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式
誰能久伴不乏6 小时前
Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
java·服务器·前端