MST
星途 面试题库

面试题:Bash脚本与复杂持续集成流程的优化

考虑一个具有多模块、多语言(如Python、Java)的大型项目的持续集成场景。目前使用Bash脚本进行构建和测试,但随着项目规模增长,构建时间过长。请描述如何优化Bash脚本以加速整个持续集成流程。包括但不限于并行化构建任务、智能缓存依赖项、根据代码变更范围有选择性地执行测试等方面。同时给出关键部分的Bash脚本示例。
14.3万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

1. 并行化构建任务

在Bash脚本中,可以利用 & 操作符将任务放到后台运行,从而实现并行化。例如,假设项目有Python和Java模块,并且它们的构建相互独立:

# 构建Python模块
python -m build python_module &
python_pid=$!

# 构建Java模块
cd java_module
mvn clean install &
java_pid=$!

# 等待两个任务完成
wait $python_pid
wait $java_pid

2. 智能缓存依赖项

对于Python项目,可以使用 pip cache 来缓存下载的包。对于Java项目,可以利用Maven本地仓库的缓存机制。

Python示例

# 检查是否存在缓存目录,如果不存在则创建
if [ ! -d ~/.pip/cache ]; then
    mkdir -p ~/.pip/cache
fi

# 使用缓存安装依赖
pip install --cache-dir ~/.pip/cache -r python_module/requirements.txt

Java示例

Maven会自动使用本地仓库缓存依赖。但如果想清理缓存并重新下载,可以使用:

cd java_module
mvn dependency:purge-local-repository
mvn clean install

3. 根据代码变更范围有选择性地执行测试

可以利用 git diff 命令来获取代码变更范围,然后根据变更的文件决定执行哪些测试。

示例

假设Python模块的测试文件按照功能模块划分,例如 tests/module1_test.py 对应 python_module/module1.py

# 获取变更的Python文件
changed_py_files=$(git diff --name-only HEAD^ HEAD -- '*.py' | grep 'python_module')

# 根据变更文件决定执行哪些测试
for file in $changed_py_files; do
    test_file="tests/${file##*/python_module/}_.py"
    if [ -f $test_file ]; then
        python -m unittest $test_file
    fi
done

对于Java项目,类似地,可以根据变更的Java源文件决定执行哪些JUnit测试类。假设测试类与源文件结构相似,在 src/test/java 目录下。

# 获取变更的Java文件
changed_java_files=$(git diff --name-only HEAD^ HEAD -- '*.java' | grep 'java_module/src/main/java')

# 根据变更文件决定执行哪些测试
for file in $changed_java_files; do
    relative_path=${file##*/java_module/src/main/java/}
    test_class="src/test/java/${relative_path%.java}Test.java"
    if [ -f $test_class ]; then
        mvn test -Dtest=$(echo $test_class | sed 's/\//./g' | sed 's/\.java$//')
    fi
done