Совместное использование файла между этапами выпуска в Azure DevOps (VSTS)
Общая картина: мы используем процесс выпуска Azure DevOps (пока мы создаем шаги в конструкторе, а не в конвейерах YAML). Мы выпускаем 3 среды с 3 различными базами данных. Часть выпуска - развертывание базы данных из файла DACPAC. Поскольку использование SqlPackage.exe для публикации непосредственно в базе данных не очень прозрачно (вы не видите и не просматриваете реальный скрипт SQL), мы хотели сделать выпуск в 2 этапа:
- Создайте сценарий SQL из DACPAC и просмотрите его
- После утверждения запустите app и db deploy из ранее созданного сценария.
Проблема: как разделить файл сценария sql между этапами и как просмотреть его для утверждения. Этапы могут быть запущены на другом агенте.
Что я пробовал:
- Публикация скрипта как артефакта сборки - это не сработает, потому что для генерации скрипта мне нужно подключиться к базе данных, и подключение к нему не должно быть частью процесса сборки, особенно подключения к производственной базе данных.
- Публикация артефакта в конвейерах Azure в качестве этапа выпуска - при выпуске он запрещен, только для сборок Опубликовать
- Опубликовать артефакт в общий доступ к файлу - я не уверен, как именно это работает, документация не очень хорошо сделана. Более того, в нашей инфраструктуре было бы сложно настроить регулярный обмен файлами в Windows, я бы предпочел этого избежать.
Любые другие предложения?
0 ответов
Хотя вы не можете использовать конвейерные артефакты, вы можете использовать универсальные пакеты в управлении пакетами для публикации произвольных файлов для последующего извлечения. Простой сброс содержимого файла в журналы конвейера - это самый простой способ позволить людям проверить его.
Вы также можете создать файл с заполнителями в качестве артефакта сборки и объединить окончательные параметры из переменных конвейера на каждом этапе, чтобы сохранить их в качестве артефакта сборки. Это то, что я склонен делать для любых файлов такого рода. Похоже, это не относится к вашему сгенерированному файлу SQL.
В качестве альтернативы, если важен элемент "проверка на утверждение", вы можете сгенерировать его и записать в журнал, загрузить его в Universal Package Management. Затем попросите одобрения в конце этапа. На следующем этапе вы загружаете сценарий из Universal Package Management или регенерируете его, используя точно такую же конфигурацию задачи перед выполнением.
Azure DevOps теперь позволяет скачивать файлы, которые были опубликованы как артефакты на более ранних этапах конвейера.
В коде, которым я делюсь, я реализовал создание схемы SQL с изменениями базы данных с последующей публикацией этих изменений (после утверждения). Некоторые замечания:
- Это не сработает, если изменения приведут к потере данных.
- Путь к
sqlpackage
правильно только при установленной Visual Studio 2019, например, вwindows-2019
изображений. - Я передал следующие переменные через групповую переменную (подробнее о том, как создавать групповые переменные здесь):
targetDBConnectionString
servername
databasename
adminlogin
adminPassword
- Я добавил одобрение в
ApplyChanges
этап (в меню конвейеров выберите среды, затемApplyChanges
окружающая среда, а затемapprovals and checks
от кнопки с тремя точками в правом верхнем углу). Таким образом, изменения не применяются к базе данных до утверждения вручную.
stages:
- stage: 'Build'
displayName: 'Build the web application'
jobs:
(...)
- job: BuildDacpac
pool:
vmImage: 'windows-2019'
steps:
- task: DotNetCoreCLI@2
displayName: 'Build the database project'
inputs:
command: 'custom'
custom: 'build'
projects: 'FQDN\For\The\DB\Project\DBProjectName.sqlproj'
- task: CopyFiles@2
displayName: 'Copy dacpac file to a staging directory'
inputs:
contents: |
FQDN\For\The\DB\Project\bin\**\*.dacpac
targetFolder: '$(Build.StagingDirectory)'
- task: PublishBuildArtifacts@1
displayName: 'Publish build artifact'
inputs:
pathToPublish: '$(Build.ArtifactStagingDirectory)'
artifactName: dropDacpac
condition: succeededOrFailed()
- stage: VerifyScript
displayName: 'Script database schema changes'
dependsOn:
- Build
jobs:
- deployment: VerifyScript
pool:
vmImage: 'windows-2019'
variables:
- group: 'Timeline CV - Release'
environment: 'scriptverification'
strategy:
runOnce:
deploy:
steps:
- download: current
artifact: dropDacpac
patterns: '**/*'
- task: CmdLine@2
displayName: 'Generate schema changes script'
inputs:
script: |
"c:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage.exe" ^
/action:script ^
/diagnostics:true ^
/sourcefile:$(Pipeline.Workspace)\dropDacpac\path\to\the\dacpacFile\package.dacpac ^
/targetConnectionString:$(targetDBConnectionString) ^
/outputpath:$(Build.StagingDirectory)\changesScript.sql
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Build.StagingDirectory)'
artifactName: dropSqlSchemaChangesScript
condition: succeededOrFailed()
- task: PowerShell@2
displayName: Show Auto Generated SQL Script
inputs:
targetType: 'inline'
script: |
Write-Host "Auto Generated SQL Update Script:"
Get-Content $(Build.StagingDirectory)\changesScript.sql | foreach {Write-Output $_}
- stage: ApplyChanges
displayName: 'Apply database schema changes'
dependsOn: VerifyScript
jobs:
- deployment: ApplyChanges
pool:
vmImage: 'windows-2019'
variables:
- group: 'Timeline CV - Release'
environment: 'applyChanges'
strategy:
runOnce:
deploy:
steps:
- download: current
artifact: dropSqlSchemaChangesScript
- task: SqlDacpacDeploymentOnMachineGroup@0
displayName: 'Deploy SQL schema changes script'
inputs:
taskType: 'sqlQuery'
sqlFile: '$(Pipeline.Workspace)\dropSqlSchemaChangesScript\changesScript.sql'
targetMethod: 'server'
authScheme: 'sqlServerAuthentication'
serverName: '$(servername)'
databaseName: '$(databasename)'
sqlUsername: '$(adminlogin)'
sqlPassword: '$(adminPassword)'