in C#

Utilizando a API do MSDeploy com C#

Recentemente estava estudando algumas maneiras de automatizar o sinc de web sites entre diversos servidores. Para este fim, o Web Deploy (MSDeploy) é uma excelente ferramenta, com ele é possível realizar diversas operações de deploy, sincronização entre Web Servers (IIS), e outras configurações.

Além de ser possível utilizar esta plataforma via script e ferramentas de gerenciamento, também é possível consumir e executar os diversos comandos da API do MSDeploy utilizando .NET.

Para isto, precisaremos referenciar a seguinte dll: Microsoft.Web.Deployment.dll, que geralmente fica na pasta: C:\Program Files\IIS\Microsoft Web Deploy V3\

image

Após isso, podemos começar a desenvolver e utilizar a API do Web Deploy.

Neste exemplo, vou sincronizar as aplicações entre o servidor local e um servidor remoto.

Primeiramente vamos criar um objeto do tipo  DeploymentBaseOptions, no qual vamos configurar as opções do servidor de origem (ip, usuário, senha, etc) e definir um delegate para um método que mostrará o output do server de origem.

DeploymentBaseOptions opcoesServerOrigem = new DeploymentBaseOptions();
opcoesServerOrigem.Trace += new EventHandler<DeploymentTraceEventArgs>(Source_Trace);
opcoesServerOrigem.TraceLevel = System.Diagnostics.TraceLevel.Verbose;
opcoesServerOrigem.ComputerName = "servidorOrigem"; //pode ser ip ou nome/dns

 

Após isso, vamos criar um objeto do mesmo tipo (DeploymentBaseOptions), que será responsável pelas configurações do servidor de destino da operação de sinc:

DeploymentBaseOptions opcoesServerDestino = new DeploymentBaseOptions();
opcoesServerDestino.Trace += new EventHandler<DeploymentTraceEventArgs>(Dest_Trace);
opcoesServerDestino.TraceLevel = System.Diagnostics.TraceLevel.Verbose;
opcoesServerDestino.ComputerName = "servidorDestino"; //pode ser ip ou nome/dns

Depois de criar estes dois objetos, precisaremos criar um objeto do tipo DeploymentSyncOptions, que será responsável por conter as configurações e opções de Sinc, neste exemplo podemos configurar um flag que fará o sinc em “modo preview”.

DeploymentSyncOptions opcoesDeSinc = new DeploymentSyncOptions();
////utilizar em caso de preview das alterações
//opcoesDeSinc.WhatIf = true;

O próximo passo será criar o objeto que será responsável pelo Deploy ( DeploymentObject ) utilizando o DeploymentManager, com ele é possível realizar o Sinc:

using (DeploymentObject deploy =
        DeploymentManager.
        CreateObject(DeploymentWellKnownProvider.AppHostConfig, "Default Web Site", opcoesServerOrigem))
{
    deploy.SyncTo(DeploymentWellKnownProvider.AppHostConfig, "Default Web Site",
                    opcoesServerDestino, opcoesDeSinc);
}

Para finalizar, precisaremos escrever os métodos (que utilizamos anteriormente) para fazer o output do que está acontecendo:

static void Dest_Trace(object sender, DeploymentTraceEventArgs e)
{
    string name = System.Reflection.MethodInfo.GetCurrentMethod().Name;
    Console.WriteLine(name + ": " + e.Message);
}

static void Source_Trace(object sender, DeploymentTraceEventArgs e)
{
    string name = System.Reflection.MethodInfo.GetCurrentMethod().Name;
    Console.WriteLine(name + ": " + e.Message);
}

 

Após isso nosso programa deve se parecer com o seguinte:

using Microsoft.Web.Deployment;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DemoDeploy
{
    class Program
    {
        static void Main(string[] args)
        {
            DeploymentBaseOptions opcoesServerOrigem = new DeploymentBaseOptions();
            opcoesServerOrigem.Trace += new EventHandler<DeploymentTraceEventArgs>(Source_Trace);
            opcoesServerOrigem.TraceLevel = System.Diagnostics.TraceLevel.Verbose;
            opcoesServerOrigem.ComputerName = "servidorOrigem"; //pode ser ip ou nome/dns

            DeploymentBaseOptions opcoesServerDestino = new DeploymentBaseOptions();
            opcoesServerDestino.Trace += new EventHandler<DeploymentTraceEventArgs>(Dest_Trace);
            opcoesServerDestino.TraceLevel = System.Diagnostics.TraceLevel.Verbose;
            opcoesServerDestino.ComputerName = "servidorDestino"; //pode ser ip ou nome/dns

            DeploymentSyncOptions opcoesDeSinc = new DeploymentSyncOptions();
            ////utilizar em caso de preview das alterações
            //opcoesDeSinc.WhatIf = true;

            using (DeploymentObject deploy =
                    DeploymentManager.
                    CreateObject(DeploymentWellKnownProvider.AppHostConfig, "Default Web Site", opcoesServerOrigem))
            {
                deploy.SyncTo(DeploymentWellKnownProvider.AppHostConfig, "Default Web Site",
                                opcoesServerDestino, opcoesDeSinc);
            }
        }

        static void Dest_Trace(object sender, DeploymentTraceEventArgs e)
        {
            string name = System.Reflection.MethodInfo.GetCurrentMethod().Name;
            Console.WriteLine(name + ": " + e.Message);
        }

        static void Source_Trace(object sender, DeploymentTraceEventArgs e)
        {
            string name = System.Reflection.MethodInfo.GetCurrentMethod().Name;
            Console.WriteLine(name + ": " + e.Message);
        }

    }
}

Com estas poucas linhas de código criamos uma aplicação que sincroniza as aplicações entre dois servidores web (IIS).

Um exemplo de aplicação para o uso desta DLL seria criar um painel de controle com as opções de sinc, deploy e backup do ambiente, para que os desenvolvedores do time façam todo o gerenciamento dos deploy das novas versões dos projetos.

Espero que esta dica seja útil, estou a disposição para dúvidas, criticas e sugestões.

Abs

Rodolfo

  • Thiago

    isso tudo caso não utilize IIS 8, certo? Do contrário, é possível fazer direto pelo IIS, não?!

  • http://www.rodolfofadino.com.br/ Rodolfo Fadino

    Opa, tudo bom? Com o IIS 8 também é possível utilizar o msdeploy, o IIS nativamente não tem uma ferramenta para sincronizar as configurações em um farm.

  • Thiago

    eu quis dizer a parte de sincronizar o deploy…