03.12.2020

Continuous Deployment: So vermeiden Sie Datenverluste

Technical Value

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

Neuen Kommentar schreiben

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.

Klartext

  • Keine HTML-Tags erlaubt.
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.
  • Web page addresses and email addresses turn into links automatically.
Teilen auf

Newsletter Anmeldung

Abonnieren Sie unseren Newsletter!
Lassen Sie sich regelmäßig über alle Neuigkeiten rundum ORAYLIS und die BI- & Big-Data-Branche informieren.

Jetzt anmelden