Получение переменных окружения Django в Azure Pipelines для запуска модульных тестов

Я пробовал несколько способов сделать это, и каждый раз, когда шаг терпит неудачу, я говорю:

  ...
  File "/home/vsts/work/1/s/api/config/settings.py", line 23, in <module>
    SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
  File "/opt/hostedtoolcache/Python/3.8.10/x64/lib/python3.8/os.py", line 675, in __getitem__
    raise KeyError(key) from None
KeyError: 'DJANGO_SECRET_KEY'

Это шаблон, который не прошел на последнем script шаге:

parameters:
- name: serviceName
  type: string
  default: ''
- name: pathName
  type: string
  default: ''

jobs:
- job: 
  displayName: Running unit tests for ${{ parameters.serviceName }}...
  variables:
    servicesChanged: $[ stageDependencies.Changed.Changes.outputs['detectChanges.servicesChanged'] ]
  condition: or(contains(variables['servicesChanged'], '${{ parameters.serviceName }}'), eq(variables['Build.Reason'], 'Manual'))
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.8'
  - script: |
      cd ${{ parameters.pathName }} && 
      python -m pip install --upgrade pip && 
      pip install -r requirements.txt
    displayName: Install requirements for ${{ parameters.pathName }}...
  - script: cd ${{ parameters.pathName }} &&  coverage run --omit='manage.py,config/*,.venv*,*/*__init__.py,*/tests.py,*/admin.py' manage.py test
    displayName: Run unit tests and coverage for ${{ parameters.pathName }}...
  - task: PublishTestResults@2
    inputs:
      testResultsFiles: reports/django-basic.xml
      testRunTitle: ${{ parameters.pathName }} Tests
    condition: succeededOrFailed()

В моем приложении Django я читал env vars с os.environ[ENV_VAR], которые до сих пор работали нормально.

Вот что я пробовал:

Установка переменных в конвейере

Я думал, что это самый простой, но наименее желательный способ сделать это. Я говорю это, потому что у меня есть все эти значения в Azure Key Vault, поэтому обновление их в двух местах будет дублироваться.

введите описание изображения здесь

Тем не менее, я получаю сообщение об ошибке DJANGO_SECRET_KEY это None.

Задача Azure Key Vault

В значительной степени следуйте этому руководство, которое включает установление Принципа обслуживания между AKV и ADO.

Затем я сделал secrets.yaml с этим:

steps:
- task: AzureKeyVault@2
  inputs:
    azureSubscription: $(azureSubscription)
    KeyVaultName: $(keyVaultName)
    SecretsFilter: '*'
    RunAsPreJob: false

Эта задача выполняется нормально, и вы можете видеть, что конвейеры ADO извлекают все значения из AKV.

И обновили шаблон модульного теста Python, чтобы:

parameters:
- name: serviceName
  type: string
  default: ''
- name: pathName
  type: string
  default: ''

jobs:
- job: 
  displayName: Running unit tests for ${{ parameters.serviceName }}...
  variables:
    servicesChanged: $[ stageDependencies.Changed.Changes.outputs['detectChanges.servicesChanged'] ]
  condition: or(contains(variables['servicesChanged'], '${{ parameters.serviceName }}'), eq(variables['Build.Reason'], 'Manual'))
  steps:
  - template: secrets.yaml
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.8'
    env:
      DJANGO_SECRET_KEY: $(PROD-DJANGOSECRETKEY)
  - script: |
      cd ${{ parameters.pathName }} && 
      python -m pip install --upgrade pip && 
      pip install -r requirements.txt
    displayName: Install requirements for ${{ parameters.pathName }}...
  - script: cd ${{ parameters.pathName }} &&  coverage run --omit='manage.py,config/*,.venv*,*/*__init__.py,*/tests.py,*/admin.py' manage.py test
    displayName: Run unit tests and coverage for ${{ parameters.pathName }}...

Меня заставили поверить, что я могу просто сопоставить env: с задачей UsePythonVersion@0 с помощью этого вопроса SO. Очевидно, это не так, потому что даже жесткое кодирование строки ничего не дает.

Вопрос

Что я здесь делаю не так и как правильно с этим справиться?




Ответы (1)


Я думаю, что вы на самом деле близки. Итак, у вас есть это:

  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.8'
    env:
      DJANGO_SECRET_KEY: $(PROD-DJANGOSECRETKEY)

Но это устанавливает только DJANGO_SECRET_KEY для этой задачи. Поэтому, если вам это нужно в другой задаче, вам также необходимо установить там такое же сопоставление env.

person Krzysztof Madej    schedule 06.07.2021
comment
Это сработало! - person cjones; 07.07.2021