Jenkins并行构建场景下如何检测指定venv是否正在执行pip安装
解决方案
核心使用Linux自带的flock工具实现独占锁,保证同一时间只有一个构建进程执行venv创建和依赖安装操作,其余并行进程会等待锁释放后直接复用已就绪的venv,完全避免并行冲突。
修改后的完整脚本
#!/bin/bash # 定义全局路径变量,方便后续调整 VENV_PATH="/home/jenkins/temp/venv_upgrade" LOCK_PATH="/home/jenkins/temp/venv_install.lock" # 给锁文件加独占锁,文件描述符用200避免和系统默认的0/1/2冲突 ( flock -x 200 # 拿到锁后二次判断venv是否已经就绪,避免等待锁的过程中其他进程已完成初始化 if [ -d "${VENV_PATH}" ] then echo "VENV: 虚拟环境已存在,直接复用" else echo "VENV: 开始创建虚拟环境并安装依赖" python3.8 -m venv "${VENV_PATH}" source "${VENV_PATH}/bin/activate" pip3 install -r "${WORKSPACE}/src/requirements.txt" # 可选:新增安装完成标记文件,进一步降低极端场景下的复用风险 touch "${VENV_PATH}/install_done" echo "VENV: 虚拟环境初始化完成" fi ) 200>"${LOCK_PATH}" # 所有进程统一在此处激活虚拟环境,锁释放后环境已完全就绪 echo "VENV: 激活虚拟环境" source "${VENV_PATH}/bin/activate"
逻辑说明
- 首先指定
/home/jenkins/temp/venv_install.lock作为全局锁文件,通过flock给该文件加独占锁,同一时间仅一个进程能拿到锁,其余进程会自动阻塞等待锁释放 - 拿到锁后二次判断venv目录是否存在:如果等待锁的过程中已有其他进程完成了venv创建和依赖安装,直接跳过安装步骤
- 锁会在对应代码块执行结束后自动释放,无需手动清理
额外优化建议
- 依赖安装完成后可新增标记文件,判断逻辑优先校验标记文件是否存在,避免venv目录创建完成但依赖没装完就被其他进程复用的极端情况
- 如果不希望进程无限等待,可以给flock加超时参数,比如
flock -x -w 300 200表示最多等待300秒,超时就报错退出,避免死锁
内容的提问来源于stack exchange,提问作者ALUFTW
相关产品推荐
相关产品推荐

