在Gitlab CI/CD中,为设置Python虚拟环境的最佳实践是什么?

6

问题

目前我正在为托管在Gitlab上的Python项目编写一个.gitlab-ci.yml文件。

我不知道应该在哪里设置虚拟环境和从requirements.txt中安装依赖项。

我的主要资源是Gitlab Python.gitlab-ci.yml模板

在那里,使用before_script关键字在每个作业之前安装了virtualenv,并创建了名为' venv '的虚拟环境:

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/

我希望在我的脚本中做同样的事情,并从我的 repo 中安装 requirements.txt。然后,我想在不同的阶段执行代码分析(pylint、flake8)和测试。如果将 pip install -r requirements.txt 添加到 before_script,它会在每个作业中执行,这会产生不必要的日志。
问题:是否更合理地进行以下操作:
  1. 定义缓存的子目录。(如上所述)
  2. 只在 before_script 中调用 source venv/bin/activate
  3. 添加一项工作或阶段,调用 virtualenv venv 生成一个环境变量 一次。该工作还调用 pip install -r requirements.txt 一次
您会在哪里创建您的 venv 并安装您的 requirements?

1
如果Python包在Docker容器中运行,则可以将容器视为虚拟环境,从而绕过虚拟环境。 - tenacity
1个回答

5

我对一些托管在Gitlab中的Python项目遵循以下步骤:

  1. 创建一个Dockerfile。在创建不同Runners将在每个不同阶段使用的docker镜像时,这里执行了pip install -r requirements
  2. 在进一步的流程的每个阶段拉取第1步中创建的Docker映像可以确保您仅在一个可能称为“build”的阶段中运行一次pip install -r requirements.txt

举个例子:

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 文件的第一步是使用上面的 Dockerfile 构建 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 "

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接