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

时间:2019-11-06 15:53:04

标签: virtualenv circleci

我正在尝试在构建步骤中安装需求并在circleci上运行测试。我在运行pip安装时遇到了权限被拒绝的问题,因为它尝试在全局安装需求。我可以在用户级别安装要求,但是使用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

这为什么会失败?如果我将其放在一个单独的步骤中,它是否应该创建虚拟环境?

1 个答案:

答案 0 :(得分:1)

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

 - 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而没有任何激活。