Desvinculando "Deploy" e "Release"

Utilizando “Feature Toggles” em projetos ASP.NET core

Desvincular deploy e release é fundamental para a gestão ágil dos ambientes produtivosDe maneira ideal, processos de deploy devem acontecer de maneira contínua e automática. Entretanto, a disponibilização de features deve ocorrer conforme a estratégia de gestão de produtos das organizações.

Uma prática comum para alcançar este objetivo é sinalizar novas features, no código, com feature toggles ou feature flags, que podem ser “ligadas” ou “desligadas” por configuração, permitindo, assim,  que novos pacotes sejam instalados no ambiente produtivo (deploy) sem, necessariamente, disponibilizar as novas funcionalidades (release).

Em Asp.NET core, feature flags podem ser facilmente acrescentadas aos projetos pela utilização do pacote nuget Microsoft.FeatureManagement.AspNetCore.

dotnet add package Microsoft.FeatureManagement.AspNetCore --version 2.0.0

Trata-se de um pacote de fácil configuração.

public void ConfigureServices(IServiceCollection services)
{
    // ..
    services.AddControllersWithViews();
    // ..
}

Com ele devidamente configurado, basta sinalizar as features que serão controladas diretamente em appsettings.json, variáveis de ambiente ou, ainda, arquivos de configuração no Azure.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "FeatureManagement": {
    "Privacy":  true
  }
}

O acesso a configuração das features no código pode ser feito, além do acesso programático, realizado pela injeção de dependência para IFeatureManager, pela utilização de atributos.

using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Microsoft.FeatureManagement.Mvc;
using SampleWebWithFeatures.Models;

namespace SampleWebWithFeatures.Controllers
{
    public class HomeController : Controller
    {
        public HomeController() {}
        public IActionResult Index() => View();

        [FeatureGate("Privacy")]
        public IActionResult Privacy() => View();

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}

Para as Views, é possível adicionar taghelpers (via @addTagHelper *, Microsoft.FeatureManagement.AspNetCore) para ajudar a controlar o que é renderizado e o que não é.

<feature name="Privacy">
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
    </li>
</feature>

Em termos práticos, as maiores dificuldades estão relacionadas a gestão. Afinal, como podemos constatar, as restrições técnicas são mínimas.

Em Resumo
  • O fato

    Desvincular deploy e release é fundamental para a gestão ágil dos ambientes produtivos. De maneira ideal, processos de deploy devem acontecer de maneira contínua e automática. Entretanto, a disponibilização de features deve ocorrer conforme a estratégia de gestão de produtos das organizações.
  • O insight

    Uma prática comum para alcançar este objetivo é sinalizar novas features, no código, com feature toggles ou feature flags, que podem ser "ligadas" ou "desligadas" por configuração, permitindo, assim,  que novos pacotes sejam instalados no ambiente produtivo (deploy) sem, necessariamente, disponibilizar as novas funcionalidades (release). Em ASP.NET core, isso pode ser feito facilmente usando o pacote "Microsoft.FeatureManagement.AspNetCore"

Elemar Júnior

Microsoft Regional Director e Microsoft MVP. Atua, há mais de duas décadas, desenvolvendo software e negócios digitais de classe mundial. Teve o privilégio de ajudar a mudar a forma como o Brasil vende, projeta e produz móveis através de software. Hoje, seus interesses técnicos são arquiteturas escaláveis. bancos de dados e ferramentas de integração. Além disso, é fascinado por estratégia e organizações exponenciais.

Talvez você goste também

Carregando posts…

Mais posts da série Desvinculando "Deploy" e "Release"

1 comentário
  1. Henrique Rocha

    No podcast da lambda3 (Microserviços 5) vocês tiveram diversas discussões para o feature toogle. Uma dúvida que eu tenho, é em relação ao comportamento de uma feature que já existe no projeto, exemplo simples: Tenho um cadastro de usuário que ao final da rotina, é ser disparado um e-mail, porém, na nova feature meu cliente quer que eu adicione um disparo de SMS além do disparo de e-mail existente. Esse controle seria um método v2 na rota da API?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *