Я пробовал несколько способов сделать это, и каждый раз, когда шаг терпит неудачу, я говорю:
...
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. Очевидно, это не так, потому что даже жесткое кодирование строки ничего не дает.
Вопрос
Что я здесь делаю не так и как правильно с этим справиться?