Continuous Deploy & Dynamics 365: Como subir uma solução por linha de comando

By | 21/01/2020

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.

Leave a Reply

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

Protected by WP Anti Spam