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

gitlab - 作曲家包的 ci

触发 Gitlab CI/CD 管道以部署存储库的特定部分

如何解决“远程:您不允许上传代码”。 GitLab CI/CD 作业出错?

基于GitLab的CI/CD系统重点记要