【发布时间】: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_KEY 是None 的错误。
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 question 将env: 映射到UsePythonVersion@0 任务。显然情况并非如此,因为即使对字符串进行硬编码也无济于事。
问题
我在这里做错了什么,正确的处理方法是什么?
【问题讨论】:
标签: azure-devops azure-pipelines azure-pipelines-build-task azure-pipelines-yaml azure-pipelines-tasks