BLOG

Continuous Deployment: So vermeiden Sie Datenverluste

03.12.2020 Christoph Epping

Aufbau der Entwicklungsumgebung

Automatisches Löschen verhindern

Wie können Sie nun verhindern, dass Daten beim Continuous Deployment ungewollt verloren gehen? Zunächst gilt es, die automatische Löschfunktion auszusetzen. Hierfür wählen Sie in den Publish Profiles des Projektes die Einstellung „Block incremental deployment if data loss might orrur“. Somit wird die Bereitstellung gestoppt, wenn Datenverluste drohen. Aktionen, die außerhalb des eigentlichen Deployments durchgeführt werden sollen, lassen sich mit Pre- oder Post-Deployment-Skripten realisieren. Die notwendigen Transformationen könnten demnach innerhalb eines Pre-Deployments-Skripts eingebunden werden.

Allerdings: Dacpac erstellt im ersten Schritt des Deployments alle notwendigen Skripte und führt erst danach das Pre-Deployment aus (siehe Abb.). Daher bricht der gesamte Prozess ab, wenn Sie entsprechende Transformationen oder Löschoperationen auf der Datenbank durchführen – selbst, wenn diese zuvor im Pre-Deployment bewusst umgesetzt wurden. Das heißt: Die Automatisierung ist komplett ausgesetzt. Deshalb haben wir einen unabhängigen, vorgelagerten Schritt eingefügt, durch den wir eine beliebige Anzahl an SQL-Skripten ausführen können.

Flussdiagramm zum Continuous Deployment mit einem vorgelagerten Schritt zum Einfühen von SQL-Skripten.
Abb.:Der Ablauf eines Deployments bei Dacpac-Projekten mit vorgelagerten, individuellen Migrationsskripten.

Release-Pipeline und Migrationsskript aufbauen

  1. param
  2. (
  3.     [parameter(Mandatory = $true)] [String] $resourceGroup,
  4.     [parameter(Mandatory = $true)] [String] $sqlServerName,
  5.     [parameter(Mandatory = $true)] [String] $SqlServerAdminLoginId,
  6.     [parameter(Mandatory = $true)] [String] $sqlServerAdPassword ,
  7.     [parameter(Mandatory = $true)] [String] $databaseName,
  8.     [parameter(Mandatory = $true)] [String] $queryFolder
  9. )
  10. Write-Host „Setting Server and Database“
  11. $sqlServer = Get-AzSqlServer -ResourceGroupName $resourceGroup | where {$_.ServerName -eq $sqlServerName}
  12. $sqlDatabase = Get-AzSqlDatabase -ResourceGroupName $resourceGroup -Servername $sqlServerName| where {$_.DatabaseName -eq $DatabaseName}
  13. Write-Host „Getting files“
  14. $queryNames = Get-ChildItem -Path $queryFolder | Sort-Object
  15. Write-Host „Executing SQL-Tasks“
  16. ForEach ($queryName in $queryNames){
  17.     # es sollen nur .sql Dateien ausgeführt werden
  18.     If ( $queryName.Name.Substring($queryName.Name.Length – 4) -eq ‚.sql‘){
  19.         Write-Host „Executing $($queryName.Name)“
  20.         $query = Get-Content „$($queryFolder)\$($queryName)“| Out-String
  21.         $query_exe = @{
  22.             ‚Database’= $sqlDatabase.DatabaseName
  23.             ‚ServerInstance‘ = $sqlServer.FullyQualifiedDomainName
  24.             ‚Username‘ = $SqlServerAdminLoginId
  25.             ‚Password‘ = $sqlServerAdPassword
  26.             ‚Query‘ = $query
  27.         }
  28.         Invoke-Sqlcmd @query_exe -verbose
  29.         Write-Host „Execution of $($queryName.Name) finished“
  30.     }
  31. }
  32. Write-Host „Finished executing SQL-Tasks“
  1.     – task: PublishPipelineArtifact@1
  2.       displayName: ‚Publish Artifact – Migrationsskripte‘
  3.       inputs:
  4.         targetPath: ‚$(System.DefaultWorkingDirectory)\<PFADZUMORDNER>\Migration‘
  5.         artifact: ‚Migrationsskripte‘
  6.         publishLocation: ‚pipeline‘
  7.     – task: PublishPipelineArtifact@1
  8.       displayName: ‚Publish Artifact – Migration.Main‘
  9.       inputs:
  10.         targetPath: ‚$(System.DefaultWorkingDirectory)\ <PFADZUMORDNER>\Migration.Main.ps1‘
  11.         artifact: ‚Migration.Main‘
  12.         publishLocation: ‚pipeline‘

Neu erstellte Artefakte werden iüber Azure DevOps dem Agent Job hinzugefügt.

Release-Pipeline erweitern

Hinzufügen eine Azure PowerShell-Tasks zur Erweiterung einer Release-Pipeline.

  1. -resourceGroup ‚<RESSOURCEGROUP>‘ -sqlServerName ‚<SQLSERVERNAME>‘ -SqlServerAdminLoginId ‚<LOGINID>‘ -sqlServerAdPassword ‚<PASSWORD>‘ -DatabaseName ‚<DATABASE>‘ -queryFolder ‚$(System.DefaultWorkingDirectory)/<PFADZUMORDNER>/Migrationsskripte‘
jetzt Teilen auf

Your email address will not be published. Required fields are marked *

Join #teamoraylispeople

Gestalte mit uns
die Welt der Daten