Como publicar un proyecto de Base de datos de Visual Studio a Azure SQL con Azure Pipelines
20 Aug 2022
Reading time ~5 minutes
Hola nuevamente, el día de hoy les tengo un proyecto bastante interesante ya que a todos nos ha pasado que se vuelve un caos controlar los cambios que tenemos en nuestras bases de datos, por ejemplo con cada iteración de nuestro proyecto tenemos pequeños cambios a la base de datos, los cuales muy comúnmente los controlamos mediante scripts de SQL, la mayoría de las veces los colocamos dentro del mismo repositorio de nuestra aplicación y en cada deploy a productivo tenemos que ejecutar estos scripts dentro de la base de datos manualmente. Sin embargo, a todos los que hemos realizado esta mala practica nos ha pasado que se nos olvida ejecutar alguno de ellos o no se ejecutan en el orden correcto y cuando todo se integra algo se rompe. Bueno para solucionar este problema dentro de Visual Studio podemos crear un proyecto de Base de datos, el cual podemos colocar dentro de un Repo para controlar las versiones y cambios a nuestra Base de datos y todos estos cambios los podemos realizar controlada y automáticamente hacia nuestra base de datos a través de Azure Pipelines. A continuación, te mostraré como realizar esto paso a paso. Primero que nada, comenzamos creando nuestro proyecto de base de datos dentro de Visual Studio.
Seleccionamos el proyecto de SQL Server
Le ponemos un nombre y creamos el proyecto
Una vez creado el proyecto, la solución se encuentra en blanco; para ligar nuestra base de datos tenemos varias opciones, una de ellas nos permite importar toda nuestra base (tablas, store procedures, triggers, logins y demás objetos de la db) lo cual es de gran ayuda si es que ya tenemos una base de datos creada. Para esto damos click derecho en el proyecto -> Import -> Database.
Seleccionamos nuestra base de datos
Le damos Start para iniciar la importación
Una vez terminada la importación podemos ver dentro del explorador de soluciones todos los objetos de nuestra DB. En mi caso la base esta vacía, por lo cual creare 2 tablas (User y Product); esto con la finalidad de demostrar como se realizan los cambios a nuestra base de datos.
Antes de crear los pipelines debemos configurar nuestro proyecto para que se pueda realizar el despliegue hacia Azure SQL, para ello primero configuramos el servidor objetivo como Azure SQL; por alguna extraña razón, aunque importemos de Azure la base de datos Visual Studio mantiene la configuración como SQL Server 2016 lo cual al momento de hacer el despliegue a nuestra base en Azure nos marcará error ya que son incompatibles. Para corregir esto damos click derecho en nuestro proyecto y seleccionamos Propiedades.
Ahí cambiamos el Target Platform a Azure SQL
Una vez configurado nuestro Target Platform procedemos a crear el perfil de publicación, este perfil es necesario para realizar el deploy a nuestra base de datos. Para crearlo damos click derecho sobre el proyecto y seleccionamos Publish…
Presionamos el botón Create Profile, una vez que el botón se inhiba damos click en cerrar(cancelar).
Como podemos observar en nuestro proyecto se crea un archivo dentro de la raíz de este, en mi caso se generó el archivo DBproject.publish.xml
Procedemos a guardar nuestro proyecto dentro de un Repo de Azure, en esta parte podemos observar que el perfil de publicación no lo agrega al control de código, para corregir esto le damos click derecho y seleccionamos: Git -> Add Ignored File to Source Control…
Después de esto damos nuevamente click derecho sobre el perfil y seleccionamos Propiedades; este cambio lo debemos realizar ya que por default el archivo no queda con la opción de copiar al directorio destino.
Seleccionamos Copy Always en la propiedad de Copy to Output Directory.
Como siguiente paso creamos un nuevo pipeline dentro de Azure, para esto seleccionamos un nuevo pipeline de Azure.
A continuación, pongo el archivo YAML para que puedas modificar el código de acuerdo a la configuración de tu proyecto.
trigger:
- master
jobs:
- job: Job_1
displayName: Build DB project.
pool:
vmImage: windows-2019
steps:
- checkout: self
clean: true
- task: VSBuild@1
displayName: Build solution DBproject
inputs:
solution: DBproject/DBproject.sqlproj
msbuildArgs: /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=”$(Build.ArtifactStagingDirectory)\\”
platform: any cpu
configuration: release
- task: CopyFiles@2
displayName: Copy Dacpac to Build
inputs:
SourceFolder: DBproject/bin/Output
Contents: DBproject.dacpac
TargetFolder: $(Build.ArtifactStagingDirectory)
- task: CopyFiles@2
displayName: Copy Publish profile
inputs:
SourceFolder: DBproject
Contents: DBproject.publish.xml
TargetFolder: $(Build.ArtifactStagingDirectory)
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact'
inputs:
ArtifactName: DBproject
Guardamos y ejecutamos nuestro pipeline el cual debe ejecutarse correctamente; continuamos con la creación de nuestro Release para esto damos click al botón crear New release pipeline
Seleccionamos un pipeline vacío. Y en la sección de Artifacts seleccionamos como Source Type: Build. Seleccionamos nuestro proyecto y el Source de nuestro proyecto y Default Version: Latest
En la sección de Stages, damos click en Jobs y agregamos una nueva Tarea al Agent, esta será de tipo Azure SQL Database deployment
Esta tarea la configuramos con los datos de nuestra base de datos e información de nuestro proyecto, deberá de quedar de la siguiente forma:
Ejecutamos nuestro pipeline y esperamos a que termine el deploy, una vez terminado podemos revisar nuestros cambios en la base de datos; en mi caso deben aparecer las dos tablas que agregue.
Para poder revisar que efectivamente se respeten los cambios a la base de datos sin afectar a lo existente; agregare registros a una de las tablas que cree.
Creamos una nueva tabla para este ejemplo creare la tabla Store.
Ejecutamos nuestros Pipelines y esperamos a que termine el deploy a nuestra base de datos. Revisamos que nuestros cambios estén aplicados y también podemos revisar que no se haya afectado la información que ya teníamos almacenada en nuestra base de datos.
Como podemos observar nuestra información esta intacta y solo se aplicaron los cambios, como en este caso crear una tabla nueva.
Espero que este tutorial de como crear un proyecto de base de datos y hacer el deploy hacia una base de datos en Azure te sea de ayuda. Con esto tenemos controlado y automatizado los cambios que realice el equipo de desarrollo a la base de datos.