【问题标题】:Getting Django env vars into Azure Pipelines for running unit tests将 Django 环境变量导入 Azure Pipelines 以运行单元测试
【发布时间】:2021-09-17 12:47:10
【问题描述】:

我尝试了几种方法,每次步骤失败时都会说:

  ...
  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

此任务运行良好,您可以看到 ADO Pipelines 从 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 }}...

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

问题

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

【问题讨论】:

    标签: azure-devops azure-pipelines azure-pipelines-build-task azure-pipelines-yaml azure-pipelines-tasks


    【解决方案1】:

    我认为你实际上很接近。所以你有这个:

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

    但这只会为此任务设置 DJANGO_SECRET_KEY。因此,如果您在另一个任务中需要它,您还需要在那里设置相同的 env 映射。

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多