将 Django 环境变量导入 Azure Pipelines 以进行 运行 单元测试

Getting Django env vars into Azure Pipelines for running unit tests

我已经尝试了几种方法来做到这一点,每次步骤失败时都会说:

  ...
  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 应用程序中,我使用 os.environ[ENV_VAR] 读取了环境变量,到目前为止运行良好。

这是我试过的:

在管道中设置变量

我认为这是最简单但最不理想的方法。我这么说是因为我在 Azure Key Vault 中拥有所有这些值,所以在两个地方重复更新这些值。

仍然,我得到的错误是 DJANGO_SECRET_KEYNone

Azure Key Vault 任务

几乎遵循 this guide,其中涉及在 AKV 和 ADO 之间建立服务原则。

然后我用这个做了一个secrets.yaml

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

此任务运行良好,您可以看到它从 AKV 中提取所有值的 ADO 管道。

并将 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 }}...

我被引导相信我可以通过 this SO questionenv: 映射到 UsePythonVersion@0 任务。显然情况并非如此,因为即使对字符串进行硬编码也无济于事。

问题

我在这里做错了什么,正确的处理方法是什么?

我觉得你其实很亲近。所以你有这个:

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

但这只为该任务设置了 DJANGO_SECRET_KEY。因此,如果您在其他任务中需要它,您还需要在那里设置相同的环境映射。