Создание virtualenv для окружностей не может быть выполнено на отдельном этапе в задании / рабочем процессе. Почему это? - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь установить требования на этапе сборки и запустить тесты на 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 Ответ

1 голос
/ 06 ноября 2019

Я думаю, что проблема с этим подходом состоит в том, что каждый шаг выполняется со своей собственной оболочкой, поэтому результат 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 без какой-либо активации.

...