面试题答案
一键面试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