Тестирование CircleCI с конкретными версиями Miniconda Python и NumPy - PullRequest
1 голос
/ 05 октября 2019

Я работаю над проектом, в котором используется платформа непрерывной интеграции CircleCI. Я использую Python в качестве основного языка и Miniconda в качестве платформы. Я хочу протестировать несколько версий Python и NumPy, используя Miniconda на CircleCI.

Я пытался использовать разные образы Python, но он использует только Python 3.7, так как я устанавливаю последнюю версию Miniconda. Не могли бы вы рассказать мне, как использовать несколько версий?

Ниже config.yml:

version: 2.0
workflows:
  version: 2
  test:
    jobs:
      - py3.6-np1.15
      - py3.5-np1.15
      - py3.6-np1.14
      - py3.5-np1.14
      - py3.7-np1.15
      - py3.5-np1.16
      - py3.6-np1.16
      - py3.7-np1.16

jobs:
  py3.6-np1.15: &test-template
    docker:
      - image: circleci/python:3.6.8
    environment:
      NUMPY_VERSION: 1.15.2
      CYTHON_VERSION: 0.29.2
    working_directory: ~/repo

    steps:
      - checkout
      - run:
          name: Install System Dependencies
          command: sudo apt-get update && sudo apt-get install -y libmpich12 libmpich-dev build-essential

      # Download and cache dependencies
      - restore_cache:
          keys:
            - v1-dependencies-{{ .Environment.CIRCLE_JOB }}-{{ checksum "setup.py" }}

      - run:
          name: install anaconda
          command: |
            wget https://repo.continuum.io/miniconda/Miniconda3-4.7.10-Linux-x86_64.sh -O ~/miniconda.sh
            chmod +x ~/miniconda.sh && ~/miniconda.sh -b
            export PATH=$HOME/miniconda3/bin:$PATH
            conda update --quiet --yes conda

      - run:
          name: Install numpy, cython, mdtraj
          command: |
            export PATH=$HOME/miniconda3/bin:$PATH
            conda install --quiet --yes numpy==$NUMPY_VERSION cython==$CYTHON_VERSION
            conda install --quiet --yes -c conda-forge mdtraj

      # - run:
      #     name: Upgrade pip
      #     command: |
      #       python3 -m venv venv
      #       . venv/bin/activate
      #       pip install pip==18.0

      # - run:
      #     name: Install numpy and cython
      #     command: |
      #       python3 -m venv venv
      #       . venv/bin/activate
      #       pip install --progress-bar off numpy==$NUMPY_VERSION cython==$CYTHON_VERSION

      - run:
          name: Install and build 
          command: |
            export PATH=$HOME/miniconda3/bin:$PATH
            pip install --progress-bar off .[dev]
            python setup.py build_ext --inplace
            python setup.py install



  py3.5-np1.15:
    <<: *test-template
    docker:
      - image: circleci/python:3.5.7
    environment:
      NUMPY_VERSION: 1.14.2
      CYTHON_VERSION: 0.29.2

  py3.6-np1.14:
    <<: *test-template
    environment:
      NUMPY_VERSION: 1.14.2
      CYTHON_VERSION: 0.29.2

  py3.5-np1.14:
    <<: *test-template
    docker:
      - image: circleci/python:3.5.7
    environment:
      NUMPY_VERSION: 1.14.2
      CYTHON_VERSION: 0.29.2

  py3.7-np1.15:
    <<: *test-template
    docker:
      - image: circleci/python:3.7.3

  py3.5-np1.16:
    <<: *test-template
    docker:
      - image: circleci/python:3.5.7
    environment:
      NUMPY_VERSION: 1.16.5
      CYTHON_VERSION: 0.29.2

  py3.6-np1.16:
    <<: *test-template
    environment:
      NUMPY_VERSION: 1.16.5
      CYTHON_VERSION: 0.29.2

  py3.7-np1.16:
    <<: *test-template
    docker:
      - image: circleci/python:3.7.3
    environment:
      NUMPY_VERSION: 1.16.5
      CYTHON_VERSION: 0.29.2

1 Ответ

1 голос
/ 05 октября 2019

Вот минимальный пример конфигурации того, как использовать CircleCI с Miniconda и конкретными версиями Python и NumPy, начиная с пустого ubuntu:bionic изображения.

version: 2
jobs:
  build:
    docker:
      - image: ubuntu:bionic
    environment:
      PYTHON_VERSION: 3.5.5
      NUMPY_VERSION: 1.14.2
    steps:
      - checkout
      - run:
          name: Setup Miniconda
          command: |
            apt update
            apt install -y wget
            cd $HOME
            wget "https://repo.anaconda.com/miniconda/Miniconda3-4.7.10-Linux-x86_64.sh" -O miniconda.sh
            printf '%s' "8a324adcc9eaf1c09e22a992bb6234d91a94146840ee6b11c114ecadafc68121  miniconda.sh" | sha256sum -c
            bash miniconda.sh -b -p $HOME/miniconda
      - run:
          name: Setup environment and run tests
          command: |
            export PATH="$HOME/miniconda/bin:$PATH"
            conda update -y conda
            conda create -n myenv python=$PYTHON_VERSION -c conda-forge
            source activate myenv
            conda install -y numpy=$NUMPY_VERSION
            python --version
            python -c "import numpy; print(numpy.__version__)"

Я думаю, что хорошей практикой является проверка контрольной суммыпосле загрузки установочного скрипта Miniconda Miniconda3-4.7.10-Linux-x86_64.sh из Интернета.

Вы можете изменить переменные окружения PYTHON_VERSION и NUMPY_VERSION, чтобы получить другие версии.

Вместо "реальных" тестов, в настоящее времямы просто убедимся, что наши нужные версии для Python и NumPy используются с python --version и python -c "import numpy; print(numpy.__version__)". Для приведенного выше примера в конце журнала вы должны найти:

Python 3.5.5
1.14.2

В зависимости от выбранной версии вы можете получить сообщение об ошибке:

  • Есливы получите PackagesNotFoundError, вам нужно убедиться, что выбранный канал имеет версию пакета, которую вы ищете. (Например, conda-forge выбрано в приведенном выше примере.)
  • Если вы получили UnsatisfiableError, вы выбрали версии пакетов, которые не совместимы.

Вот пример конфигурации для нескольких версий:

version: 2

workflows:
  version: 2
  test:
    jobs:
      - python_3.5
      - python_3.6
      - python_3.7

template: &template
  docker:
    - image: ubuntu:bionic
  steps:
    - checkout
    - run:
        name: Setup Miniconda
        command: |
          apt update
          apt install -y wget
          cd $HOME
          wget "https://repo.anaconda.com/miniconda/Miniconda3-4.7.10-Linux-x86_64.sh" -O miniconda.sh
          printf '%s' "8a324adcc9eaf1c09e22a992bb6234d91a94146840ee6b11c114ecadafc68121  miniconda.sh" | sha256sum -c
          bash miniconda.sh -b -p $HOME/miniconda
    - run:
        name: Setup environment and run tests
        command: |
          export PATH="$HOME/miniconda/bin:$PATH"
          conda update -y conda
          conda create -n myenv python=$PYTHON_VERSION
          source activate myenv
          conda install -y pip numpy=$NUMPY_VERSION
          python --version
          pip --version
          python -c "import numpy; print(numpy.__version__)"

jobs:
  python_3.5:
    <<: *template
    environment:
      PYTHON_VERSION: 3.5
      NUMPY_VERSION: 1.14.2
  python_3.6:
    <<: *template
    environment:
      PYTHON_VERSION: 3.6
      NUMPY_VERSION: 1.15.2
  python_3.7:
    <<: *template
    environment:
      PYTHON_VERSION: 3.7
      NUMPY_VERSION: 1.16.5

Если применить этот минимальный пример к вашему случаю, конфигурация будет выглядеть примерно так:

version: 2.0

workflows:
  version: 2
  test:
    jobs:
      - py3.6-np1.15
      - py3.5-np1.15
      - py3.6-np1.14
      - py3.5-np1.14
      - py3.7-np1.15
      - py3.6-np1.16
      - py3.7-np1.16

test-template: &test-template
  docker:
    - image: ubuntu:bionic
  steps:
    - checkout
    - run:
        name: Install System Dependencies
        command: apt-get update && apt-get install -y libmpich12 libmpich-dev build-essential

    # Download and cache dependencies
    - restore_cache:
        keys:
          - v1-dependencies-{{ .Environment.CIRCLE_JOB }}-{{ checksum "setup.py" }}

    - run:
        name: install anaconda
        command: |
          apt update
          apt install -y wget
          cd $HOME
          wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh
          chmod +x ~/miniconda.sh && bash ~/miniconda.sh -b -p $HOME/miniconda
          export PATH=$HOME/miniconda/bin:$PATH

    - run:
        name: Install numpy, cython, mdtraj
        command: |
          export PATH="$HOME/miniconda/bin:$PATH"
          conda update  --yes conda
          echo $PYTHON_VERSION
          conda create -n myenv python=$PYTHON_VERSION -c conda-forge
          source activate myenv
          conda install --yes pip
          conda install --yes -c conda-forge numpy=$NUMPY_VERSION cython=$CYTHON_VERSION
          conda install --yes -c conda-forge nose mdtraj  
          python --version
          python -c "import numpy; print(numpy.__version__)"

    - run:
        name: Install and build package
        command: |
          export PATH=$HOME/miniconda/bin:$PATH
          source activate myenv
          pip install --progress-bar off .[dev]
          python setup.py build_ext --inplace
          python setup.py install

    - save_cache:
        paths:
          - ~/miniconda
        key: v1-dependencies-{{ checksum "setup.py" }}

    - run:
        name: Run non-MPI tests
        command: |
          export PATH=$HOME/miniconda/bin:$PATH
          source activate myenv
          nosetests -a '!mpi' package

    - run:
        name: Run MPI tests
        command: |
          export PATH=$HOME/miniconda/bin:$PATH
          source activate myenv
          OMP_NUM_THREADS=1 mpiexec -n 2 nosetests -a mpi package

    - store_artifacts:
        path: test-reports
        destination: test-reports

jobs:
  py3.6-np1.15:
    <<: *test-template
    environment:
      NUMPY_VERSION: 1.14.2
      CYTHON_VERSION: 0.26.1
      PYTHON_VERSION: 3.6

  py3.5-np1.15:
    <<: *test-template
    environment:
      NUMPY_VERSION: 1.14.2
      CYTHON_VERSION: 0.26.1
      PYTHON_VERSION: 3.5

  py3.6-np1.14:
    <<: *test-template
    environment:
      NUMPY_VERSION: 1.14.2
      CYTHON_VERSION: 0.26.1
      PYTHON_VERSION: 3.6

  py3.5-np1.14:
    <<: *test-template
    environment:
      NUMPY_VERSION: 1.14.2
      CYTHON_VERSION: 0.26.1
      PYTHON_VERSION: 3.5

  py3.7-np1.15:
    <<: *test-template
    environment:
      NUMPY_VERSION: 1.15.2
      CYTHON_VERSION: 0.26.1
      PYTHON_VERSION: 3.7.1

  py3.6-np1.16:
    <<: *test-template
    environment:
      NUMPY_VERSION: 1.16.5
      CYTHON_VERSION: 0.26.1
      PYTHON_VERSION: 3.6

  py3.7-np1.16:
    <<: *test-template
    environment:
      NUMPY_VERSION: 1.16.5
      CYTHON_VERSION: 0.29.2
      PYTHON_VERSION: 3.7.1
...