将 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_KEY
是 None
。
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 question 将 env:
映射到 UsePythonVersion@0
任务。显然情况并非如此,因为即使对字符串进行硬编码也无济于事。
问题
我在这里做错了什么,正确的处理方法是什么?
我觉得你其实很亲近。所以你有这个:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.8'
env:
DJANGO_SECRET_KEY: $(PROD-DJANGOSECRETKEY)
但这只为该任务设置了 DJANGO_SECRET_KEY。因此,如果您在其他任务中需要它,您还需要在那里设置相同的环境映射。
我已经尝试了几种方法来做到这一点,每次步骤失败时都会说:
...
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_KEY
是 None
。
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 question 将 env:
映射到 UsePythonVersion@0
任务。显然情况并非如此,因为即使对字符串进行硬编码也无济于事。
问题
我在这里做错了什么,正确的处理方法是什么?
我觉得你其实很亲近。所以你有这个:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.8'
env:
DJANGO_SECRET_KEY: $(PROD-DJANGOSECRETKEY)
但这只为该任务设置了 DJANGO_SECRET_KEY。因此,如果您在其他任务中需要它,您还需要在那里设置相同的环境映射。