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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:21:01