Jenkins任务中使用Pipenv
目录
前言
📍pipenv是Python官方推荐的包管理工具。
📍在使用Python环境,基本上都是使用虚拟环境进行处理的。
📍在Jenkins任务shell中使用常用的方式却无法使用pipenv虚拟环境😤
🩸那么如何解决这个问题呢❓
探索在本地pipenv使用流程
安装pipenv包
1
pip3 install pipenv
创建pipenv虚拟环境
1 2
# 指定Python版本 pipenv --python 3.10
进入虚拟环境
1 2
# 激活当前项目的虚拟环境 pipenv shell
虚拟环境存放路径
1
/Users/`USER`/.local/share/virtualenvs/
虚拟环境文件夹规则
前缀为创建虚拟环境时的文件夹名,后面部分为随机生成:
python_file-ZSRTT-ad
查找此文件夹可使用
1 2 3
# 通过当前任务名,查询虚拟环境文件夹名称 ➜ ~ echo $(ls $HOME/.local/share/virtualenvs | grep "python_file-") python_file-ZSRTT-ad
进入到虚拟环境后,查看当前系统环境变量:
env
PATH
环境变量:PATH=/Users/USER/.local/share/virtualenvs/python_file-ZSRTT-ad/bin:...
VIRTUAL_ENV
变量(启动虚拟环境变量后新增的):VIRTUAL_ENV=/Users/USER/.local/share/virtualenvs/python_file-ZSRTT-ad
通过查看系统环境变量,可以得到结论
使用虚拟环境后,会自动在环境变量中增加一个变量
VIRTUAL_ENV
,值为虚拟环境变量路径在
PATH
环境变量中,增加了虚拟环境的bin
目录1 2
VIRTUAL_ENV="虚拟环境路径" PATH=$VIRTUAL_ENV:$PATH
在Jenkins中实践
创建一个名为
py3.10
的任务在构建步骤中添加shell
1 2 3 4 5 6 7 8 9 10
# 初始化虚拟环境 pipenv --python 3.10 # 获取当前任务的虚拟环境路径 virName=$(ls $HOME/.local/share/virtualenvs | grep "$JOB_NAME-") # 设置虚拟环境临时环境变量 export VIRTUAL_ENV=$HOME/.local/share/virtualenvs/$virName # 把bin加入到path环境变量中 export PATH=${VIRTUAL_ENV}/bin:$PATH # 检查当前python版本 python3 --version
构建,查看打印的python版本是否为3.10
成功了✌️
优化构建步骤中的shell
从上面的shell可以看到,每次构建一个新的项目,都需要写五行shell脚本,总是做重复性的工作,对于这一块进行了优化,如下:
把重复性的shell单独存放在一个文件(
initPipenv.sh
)中,存放在/tmp
文件夹下,通过传递参数执行1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#! /bin/bash # Author: Joker-desire # Date: 2022-07-15 initPipfile() { echo "Init python virtual env" # 参数1:python版本 if [ -f "Pipfile" ]; then echo "Python virtual env is existed" else echo "Start build python virtual env" pipenv --python $1 fi } getVirtName() { # 参数1: 虚拟环境名称,实际就是Jenkins任务名 # 通过当前任务名,查询虚拟环境文件夹名称 echo $(ls $HOME/.local/share/virtualenvs | grep "$1-") } addEnv() { echo "Add temporary system env variables" # 设置虚拟环境临时环境变量 export VIRTUAL_ENV=$HOME/.local/share/virtualenvs/$1 # 把bin加入到path环境变量中 export PATH=${VIRTUAL_ENV}/bin:$PATH } main() { echo "come into workspace" cd $3 py=$1 jobName=$2 initPipfile $py virtName=`getVirtName $jobName` addEnv $virtName # 检查当前python版本 python3 --version } # 参数1 python版本 # 参数2 Jenkins任务名称 $JOB_NAME # 参数3 Jenkins Job文件夹路径 main $1 $2 $3
在构建shell中,直接执行此shell脚本即可
1 2 3 4
# 参数1:python版本 # 参数2:当前Jenkins任务名称 # 参数3:当前的路径 . /tmp/initPipenv.sh "3.10" $JOB_NAME `pwd`
构建,输出结果和上面一样
每次如果有新的Jenkins py任务,就可以直接在构建shell中加一行执行
initPipenv.sh
即可使用虚拟环境
‼️需要注意执行shell脚本的方式,需要使用.
执行shell