No ano de 2019, percebi uma crescente no uso de DevOps com o Dynamics & PowerApps. Muitos clientes com o desejo de implementar integração continua e deploys automatizados. Porém, quem trabalha com Dynamics há algum tempo sabe que trabalhar com as soluções não é algo tão simples :).
Para realizamos a subida da solução por linha de comando, vamos utilizar Package Deployer. A ferramenta permite fazer o deploy através de interface gráfica(WPF) ou por linha de comando. E conforme o titulo do post vamos utilizar a linha de comando.
Com a linha de comando temos alguns benficios:
- Controlar o que subir
- Soluções
- Arquivos de dados
- Podemos utilizar em outras ferramentas de entrega continua como Bamboo, Jenkins, TeamCity e entre outros. No Azure DevOps já existem diversos plugins para importar e exportar soluções do Dynamics
Vamos a mão na massa!
Para utilizar a ferramenta por linha de comando utilizaremos o PowerShell para executar os comandos.
Mas, primeiramente precisamos criar um novo projeto de CRM Package no Visual Studio. Para isso baixe o template clicando aqui. O Template pode ser instalado no VS2015 até o VS 2019 (no Visual Studio 2017 e 2019 você irá receber um alerta de incompatibilidade, mas ele funciona igual.)
No Visual Studio de sua preferência, crie um novo projeto e selecione o CRM Package.
Após criar o projeto atualize para o .Net Framework 4.6.2. Como estamos utilizando CRM online como exemplo precisamos atualizar para conseguir subir a solução que vamos utilizar de exemplo.
Com o projeto criado, crie uma solução no seu Dynamics e exporte ela (Vamos utilizar aqui não gerenciada, somente para faciliar o exemplo). E adicione ela dentro da pasta “PkgFolder” pois é nela onde as soluções devem ficar. Após adicionar o arquivo selecione para copiar na saída quando realizar a compilação do projeto.
Agora vamos abrir o arquivo ImportConfig.xml, pois é nele que configuramos o que vamos importar e a ordem que deve ser importado.
Configurei o XML para importar somente a solution que criamos. Segue exemplo.
<?xml version="1.0" encoding="utf-16"?> <configdatastorage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" installsampledata="false" waitforsampledatatoinstall="false" agentdesktopzipfile="" agentdesktopexename="" crmmigdataimportfile=""> <solutions> <!-- Adicionamos a solution que exportamos do Dynamics ou PowerApps--> <configsolutionfile solutionpackagefilename="CICDPOC_1_0_0_0.zip" overwriteunmanagedcustomizations="true" publishworkflowsandactivateplugins="true"/> </solutions> <filestoimport> </filestoimport> <filesmapstoimport> </filesmapstoimport> </configdatastorage>
Agora precisamos atualizar os pacotes do Nuget para utilizar a versão mais recente.
E agora vamos realizar o build para ter os arquivo que utilizaremos para o deploy. Como saída, teremos a dll criada do projeto bem como a pasta PkgFolder com a solução que adicionamos.
Agora vamos para o PowerShell que é aonde vamos executar o script para realizar a importação do pacote que criamos.
Primeiramente vamos instalar o seguintes módulos que são necessário para importação da solução
Install-Module Microsoft.Xrm.Tooling.PackageDeployment.Powershell Install-Module Microsoft.Xrm.Data.Powershell
Com o módulo instalado vamos executar o seguinte script.
#Importa os Modulos Import-Module Microsoft.Xrm.Tooling.PackageDeployment.Powershell Import-Module Microsoft.Xrm.Data.Powershell #Local aonde tem o package compilado $packageDirectory = "pasta aonde encontra-se os binários" #obtém os pacotes que estão disponíveis na pasta $CrmPackage = Get-CrmPackages -PackageDirectory $packageDirectory #define usuário $username = "<username>" #define a senha $password = ConvertTo-SecureString "<senha>" -AsPlainText -Force #cria as credential para se conectar ao dynamcis $cred = New-Object System.Management.Automation.PSCredential($username,$password) #reliza a conexão com o Dynamics. Aqui vai depender algumas configurações conforme o seu ambiente #nesse caso aqui é para CRM Online $CRMConn = Get-CrmConnection -DeploymentRegion SouthAmerica -OnlineType Office365 -OrganizationName <nome_da_org>-Credential $cred #Importa o pacote no CRM conectado #informe o nome da sua DLL #o parametro -Verbose colocar a saídas na tela para acompanhar o processo Import-CrmPackage -CrmConnection $CRMConn -PackageDirectory $packageDirectory -PackageName "MFP.DeployPackage.dll" -Verbose
Como colocamos o parametro para verbose (-Verbose) é possível ver a saída de como o processo é efetuado.
Pronto! Dessa forma você consegue subir uma ou várias soluções de uma só vez sem a necessidade de abrir o Dynamics ou PowerApps e fazer a publicação manual.