Gitlab CI/CD 中设置 Python 虚拟环境的最佳实践是啥
Posted
技术标签:
【中文标题】Gitlab CI/CD 中设置 Python 虚拟环境的最佳实践是啥【英文标题】:What is best practice in Gitlab CI/CD for setup of a Python virtual environmentGitlab CI/CD 中设置 Python 虚拟环境的最佳实践是什么 【发布时间】:2021-10-26 16:07:01 【问题描述】:问题
现在我正在为一个托管在 Gitlab 上的 Python 项目写一个 .gitlab-ci.yml
。
我真的不知道把虚拟环境的设置和安装要求从requirements.txt
放到哪里。
我的主要资源是Gitlab Python.gitlab-ci.yml
template。
在那里,virtualenv 会在每个作业之前安装,使用 before_script
关键字并创建一个名为 'venv' 的 virtualenv:
before_script:
- python -V # Print out python version for debugging
- pip install virtualenv
- virtualenv venv
- source venv/bin/activate
此外,设置了“venv”的缓存:
cache:
paths:
- .cache/pip
- venv/
我想在我的脚本中做同样的事情,另外从我的仓库中的requirements.txt
安装。之后,我想在不同阶段执行代码分析(pylint,flake8)和测试。如果我将pip install -r requirements.txt
附加到before_script
,它会在每个作业中执行,这会产生不必要的日志。
问题
这样做不是更有意义
-
定义缓存的子目录。 (如上所示)
只能在
before_script
中调用source venv/bin/activate
。
为设置添加一个阶段或作业,调用virtualenv venv
以生成环境一次。这项工作也调用pip install -r requirements.txt
一次。
你会在哪里创建你的 venv 并安装你的需求?
【问题讨论】:
如果 python 包在 docker 容器中运行,则可以绕过 virtualenv,将容器视为虚拟环境。 【参考方案1】:对于一些托管在 Gitlab 中的 python 项目,我遵循的过程是:
-
创建一个 Dockerfile。这里是
pip install -r requirements
在创建不同 Runner 将在每个不同阶段使用的 docker 映像时执行的位置
在管道的每个其他阶段拉取在步骤 1 中创建的 Docker 映像可确保您只运行一次 pip install -r requirements.txt
可能在您可能调用 build
的阶段
例子:
Dockerfile
FROM rasa/rasa-sdk:latest
MAINTAINER William Galindez Arias
COPY ./actions /app/actions/
COPY ./requirements.txt /app/requirements.txt
EXPOSE 8000
WORKDIR /app
USER root
RUN pip install -r requirements.txt
USER 1001
ENTRYPOINT [""]
CMD python -m rasa_sdk --actions actions -vv
下面的.gitlab-ci.yml文件第一步使用上面的docker文件构建Docker镜像,然后推送到其他阶段
stages:
- build
- test
build-image:
stage: build
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $ACTIONS_CONTAINER_IMAGE -f Dockerfile .
- docker push $ACTIONS_CONTAINER_IMAGE
tags:
- docker
test-action:
stage: test
image: $ACTIONS_CONTAINER_IMAGE
script:
- echo "testing sdk "
【讨论】:
以上是关于Gitlab CI/CD 中设置 Python 虚拟环境的最佳实践是啥的主要内容,如果未能解决你的问题,请参考以下文章
Gitlab CI/CD 管道给出 Dockerfile 错误
在dind中运行docker-compose时Docker容器拒绝通信 - Gitlab CI/CD