首页 > 解决方案 > 在 circleci 上创建 virtualenv 不能在作业/工作流的单独步骤中完成。为什么是这样?

问题描述

我正在尝试在构建步骤中安装要求并在 circleci 上运行测试。运行 pip install 时遇到权限被拒绝的问题,因为它尝试全局安装要求。我可以在用户级别安装要求,但使用 virtualenv 也可以:

version: 2
defaults: &defaults
  docker:
    - image: circleci/python:3.6
jobs:
  build_dataloader:
    <<: *defaults
    working_directory: ~/app/dataloader
    steps:
      - checkout:
          path: ~/app
      - run:
          name: Install requirements
          command: |
            virtualenv env
            source env/bin/activate
            pip install -r requirements.txt
  dataloader_tests:
    <<: *defaults
    parallelism: 2
    steps:
      - checkout:
          path: ~/app
      - run:
          name: Running dataloader tests
          command: |
            cd ~/app/dataloader
            python3 -m unittest discover tests/unit/
      - store_artifacts:
          path: test-reports/
          destination: app_tests


workflows:
  version: 2
  run_tests:
    jobs:
      - build_dataloader
      - dataloader_tests:
          requires:
            - build_dataloader

有没有办法将 virtualenv 放在一个单独的步骤中?当我将 virtualenv 部分放在单独的步骤中时,这不起作用:

version: 2
defaults: &defaults
  docker:
    - image: circleci/python:3.6
jobs:
  build_dataloader:
    <<: *defaults
    working_directory: ~/app/dataloader
    steps:
      - checkout:
          path: ~/app
      - run:
          name: Setup virtualenv
          command: |
            virtualenv env
            source env/bin/activate
      - run:
          name: Install requirements
          command: |
            pip install -r requirements.txt
  dataloader_tests:
    <<: *defaults
    parallelism: 2
    steps:
      - checkout:
          path: ~/app
      - run:
          name: Running dataloader tests
          command: |
            cd ~/app/dataloader
            python3 -m unittest discover tests/unit/
      - store_artifacts:
          path: test-reports/
          destination: app_tests


workflows:
  version: 2
  run_tests:
    jobs:
      - build_dataloader
      - dataloader_tests:
          requires:
            - build_dataloader

为什么会失败?如果我把它放在一个单独的步骤中,它不应该创建虚拟环境吗?

标签: virtualenvcircleci

解决方案


我认为这种方法的问题在于每个步骤都使用自己的 shell 运行,因此source env/bin/activate当步骤完成时结果会丢失;pip install在未激活 virtualenv 的不同 shell 中运行。试试这个:

 - run:
      name: Setup virtualenv
      command: |
        virtualenv env
  - run:
      name: Install requirements
      command: |
        source env/bin/activate
        pip install -r requirements.txt

或者干脆env/bin/pip install -r requirements.txt没有任何激活。


推荐阅读