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

Jenkins同一项目能否运行不同流水线?Android多模块测试优化咨询

解决Android多模块项目Jenkins仅执行指定模块测试的方案

针对Android多模块项目在Jenkins中避免无关模块测试失败影响的问题,以下是几种实用配置方案:

1. 手动指定目标模块(参数化构建)

利用Gradle本身支持的模块级任务,结合Jenkins参数化构建,让执行者手动选择需要测试的模块:

  • 在Jenkins流水线中添加字符串参数(比如命名为TARGET_MODULES),默认值设为常用模块,描述说明格式(多个模块用空格分隔,比如:feature-user :feature-order)。
  • 流水线脚本中直接拼接模块对应的测试任务:
    pipeline {
        agent any
        parameters {
            string(name: 'TARGET_MODULES', defaultValue: ':feature-user', description: '指定要测试的模块,多模块用空格分隔,格式如":feature-user :feature-order"')
        }
        stages {
            stage('Execute Target Tests') {
                steps {
                    // 执行单元测试,若需Instrumented测试可追加:connectedDebugAndroidTest
                    sh "./gradlew ${params.TARGET_MODULES}:testDebugUnitTest"
                }
            }
        }
    }
    
  • 优势:灵活可控,适合需要针对性测试特定模块的场景。

2. 基于代码变更自动触发对应模块测试

通过Git变更文件分析,自动定位关联模块并仅执行其测试,无需手动干预:

  • 在流水线中先检测Git提交的变更文件,映射到对应的模块,再执行测试:
    pipeline {
        agent any
        stages {
            stage('Detect Changed Modules') {
                steps {
                    script {
                        // 获取本次提交变更的文件列表
                        def changedFiles = sh(script: 'git diff --name-only HEAD^ HEAD', returnStdout: true).trim().split('\n')
                        // 定义文件路径到模块的映射(根据你的项目结构调整)
                        def modulePathMap = [
                            'feature-user/': ':feature-user',
                            'feature-order/': ':feature-order',
                            'app/': ':app'
                        ]
                        def targetModules = []
                        // 匹配变更文件对应的模块
                        changedFiles.each { file ->
                            modulePathMap.each { prefix, module ->
                                if (file.startsWith(prefix) && !targetModules.contains(module)) {
                                    targetModules.add(module)
                                }
                            }
                        }
                        // 无变更时默认执行主模块测试(可自定义逻辑)
                        if (targetModules.isEmpty()) {
                            targetModules.add(':app')
                        }
                        env.TARGET_MODULES = targetModules.join(' ')
                    }
                }
            }
            stage('Run Relevant Tests') {
                steps {
                    sh "./gradlew ${env.TARGET_MODULES}:testDebugUnitTest"
                }
            }
        }
    }
    
  • 优势:自动化程度高,适合日常CI触发的构建场景,只跑变更关联模块的测试,节省时间。

3. 为各团队创建独立Jenkins任务

如果不同团队负责的模块边界清晰,直接为每个团队维护专属的Jenkins流水线:

  • 每个任务仅执行对应团队模块的测试命令,比如团队A的任务执行:
    ./gradlew :feature-user:testDebugUnitTest :feature-user:connectedDebugAndroidTest
    
  • 优势:职责完全隔离,各团队只关注自己的任务状态,不会被其他团队模块的测试失败干扰。

4. 排除无关模块测试

如果需要测试大部分模块,仅排除其他团队的模块,可以通过排除参数实现:

  • 添加字符串参数EXCLUDE_MODULES,指定需要跳过的模块。
  • 在流水线中过滤掉排除模块的测试任务:
    pipeline {
        agent any
        parameters {
            string(name: 'EXCLUDE_MODULES', defaultValue: ':feature-thirdparty', description: '指定要排除的模块,多模块用空格分隔')
        }
        stages {
            stage('Run Filtered Tests') {
                steps {
                    script {
                        // 获取所有单元测试任务
                        def allTestTasks = sh(script: './gradlew tasks --group="Verification" | grep "test.*UnitTest"', returnStdout: true).trim().split('\n')
                        // 过滤掉排除模块的任务
                        def filteredTasks = allTestTasks.findAll { task ->
                            !params.EXCLUDE_MODULES.split(' ').any { module -> task.startsWith(module) }
                        }
                        sh "./gradlew ${filteredTasks.join(' ')}"
                    }
                }
            }
        }
    }
    
  • 优势:适合需要测试大部分模块,仅少数模块需排除的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:50:46