Выполните модульные тесты в конвейере azure с контейнером python и mon go - PullRequest
0 голосов
/ 20 марта 2020

Я хочу запустить модульные тесты в python, и для некоторых из них требуется простой контейнер Mon go, в который я вставляю данные.

Вот мой фактический способ сделать это:

jobs: 
  - job: BuildMongoComponent
    displayName: Build Mongo Container
    steps:
    - script: |
        # --publish-all because I need a random port
        MONGO_ID=$(docker run --publish-all -d --mount type=bind,source=${PWD}/mongo_mock_data,target=/tmp/mongo_mock_data mongo)
        MONGO_PORT=$( docker inspect $MONGO_ID |  jq -r '.[0].NetworkSettings.Ports."27017/tcp"[0].HostPort' )
        docker exec $MONGO_ID mongoimport --db algo --collection train --type json --file /tmp/mongo_mock_data/train_data.json
        docker exec $MONGO_ID mongoimport --db algo --collection calculation --type json --file /tmp/mongo_mock_data/predict_data.json --jsonArray
        docker exec $MONGO_ID mongoimport --db pulse_algo --collection cluster --type json --file /tmp/mongo_mock_data/cluster_data.json
      env:
        # this value will be lost in the next job. However, I need this value in my Python tests.
        MONGODB_URL: 'mongodb://localhost:${MONGO_PORT}'

  - job: Unittests
    displayName: Unit tests
    container: 'python:3.6'
    steps:
    - script: |
        python -m pip install -r requirements.txt
      displayName: 'Install requirements'
      env:
        PIP_INDEX_URL: $(PIP_INDEX_URL)

    - script: |
        python -m pip install -r requirements.dev.txt
        python -m pytest 
      displayName: 'Unit tests'
      env:
        PIP_INDEX_URL: $(PIP_INDEX_URL)

Однако это не может работать, потому что я не могу получить доступ к переменной env MONGODB_URL вне этой работы. Я даже не уверен, что могу получить доступ к контейнеру Mon go, когда я на работе Python Unittest.

Мой вопрос: как мне сделать - построить контейнер Mon go с случайный порт и вставьте в него данные, а затем - Запустите мои python тесты и получите доступ к данным в контейнере Mon go, из моего Python контейнера?

1 Ответ

1 голос
/ 23 марта 2020

Как дизайн, каждая работа агента является независимым процессом. Итак, вы столкнулись с ожидаемым действием.

Без сценария контейнера mon go ваша проблема может быть просто понята как получить и получить доступ к переменной задания BuildMongoComponent в задании Unittests.

Поскольку вы используете конвейер YAML, здесь вы можете сначала установить MONGODB_URL в качестве выходной переменной. И затем сделать Unittests job зависит от BuildMongoComponent job.


Пример:

Просто изменил ваш скрипт:

jobs: 
  - job: BuildMongoComponent
    displayName: Build Mongo Container
    steps:
    - script: |
        # --publish-all because I need a random port
        MONGO_ID=$(docker run --publish-all -d --mount type=bind,source=${PWD}/mongo_mock_data,target=/tmp/mongo_mock_data mongo)
        MONGO_PORT=$( docker inspect $MONGO_ID |  jq -r '.[0].NetworkSettings.Ports."27017/tcp"[0].HostPort' )
        docker exec $MONGO_ID mongoimport --db algo --collection train --type json --file /tmp/mongo_mock_data/train_data.json
        docker exec $MONGO_ID mongoimport --db algo --collection calculation --type json --file /tmp/mongo_mock_data/predict_data.json --jsonArray
        docker exec $MONGO_ID mongoimport --db pulse_algo --collection cluster --type json --file /tmp/mongo_mock_data/cluster_data.json
        echo "##vso[task.setvariable variable=PORT;isOutput=true]mongodb://localhost:$MONGO_PORT"
      name: Mongo

  - job: Unittests
    displayName: Unit tests
    container: 'python:3.6'
    dependsOn: BuildMongoComponent
    variables:
      NewPort: $[dependencies.BuildMongoComponent.outputs['Mongo.PORT']]
    steps:
    - script: |
        python -m pip install -r requirements.txt
      displayName: 'Install requirements'
      env:
        PIP_INDEX_URL: $(PIP_INDEX_URL)

В настоящее время вы можете получить доступ к значению MONGODB_URL в задании Unittests , используя $(NewPort).


Другая проблема на ваш сценарий: не уверен, как вы сохраняете значение PWD, поскольку вы не упомянули об этом. Если вы храните его как секретную переменную, я боюсь, что формат, который вы используете, неверен. Вы должны использовать $ (PWD), чтобы получить его значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...