Совместное использование файла между этапами выпуска в Azure DevOps (VSTS)

Общая картина: мы используем процесс выпуска Azure DevOps (пока мы создаем шаги в конструкторе, а не в конвейерах YAML). Мы выпускаем 3 среды с 3 различными базами данных. Часть выпуска - развертывание базы данных из файла DACPAC. Поскольку использование SqlPackage.exe для публикации непосредственно в базе данных не очень прозрачно (вы не видите и не просматриваете реальный скрипт SQL), мы хотели сделать выпуск в 2 этапа:

  1. Создайте сценарий SQL из DACPAC и просмотрите его
  2. После утверждения запустите app и db deploy из ранее созданного сценария.

Проблема: как разделить файл сценария sql между этапами и как просмотреть его для утверждения. Этапы могут быть запущены на другом агенте.

Что я пробовал:

  1. Публикация скрипта как артефакта сборки - это не сработает, потому что для генерации скрипта мне нужно подключиться к базе данных, и подключение к нему не должно быть частью процесса сборки, особенно подключения к производственной базе данных.
  2. Публикация артефакта в конвейерах Azure в качестве этапа выпуска - при выпуске он запрещен, только для сборок Опубликовать
  3. Опубликовать артефакт в общий доступ к файлу - я не уверен, как именно это работает, документация не очень хорошо сделана. Более того, в нашей инфраструктуре было бы сложно настроить регулярный обмен файлами в 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)'
Другие вопросы по тегам