Skip to content

Português

Elvis Souza edited this page Feb 23, 2022 · 17 revisions

Requisitos

  • SQL Server
  • Aplicação .Net Core 3.1+
  • Conta no Azure DevOps

Instalação e Configuração

Instalação do pacote

PM > Install-Package AzureDevOpsTracker

Passo 1 - Configuração do Startup.cs

Depois da instalação, atualize seu arquivo de Startup.cs OWIN com o seguinte código:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAzureDevopsStateTracker(new AzureDevopsStateTracker.Data.DataBaseConfig("[CONNECTION_STRING]"),
                                        new MessageConfig(EMessengers.MICROSOFT_TEAMS, "[URL_TEAMS]"));
}

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
    app.UseAzureDevopsStateTracker(serviceProvider);
}

No exemplo acima o Microsoft Teams será usado para lançar o ChangeLog.

Passo 2 - Criando a Controller

Para a integração com o Service Hook do Azure DevOps, é necessário que existam dois EndPoints que recebam uma requisição POST com as Json específicas. Essas requisições receberão dados de Workitems criados e Workitems atualizados.

public class ExampleController : Controller
{
    private readonly IAzureDevopsTrackerService _azureDevopsTrackerService;
    private readonly IChangeLogService _changeLogService;

    public ExampleController(
        IAzureDevopsTrackerService azureDevopsTrackerService, 
        IChangeLogService changeLogService)
    {
        _azureDevopsTrackerService = azureDevopsTrackerService;
        _changeLogService = changeLogService;
    }

    [HttpPost("workitem-updated")]
    public async Task<IActionResult> WorkItemUpdated([FromBody] UpdatedWorkItemDTO updatedWorkItemDTO)
    {
        await _azureDevopsTrackerService.Update(updatedWorkItemDTO);
        return Ok();
    }

    [HttpPost("workitem-created")]
    public async Task<IActionResult> WorkItemCreated([FromBody] CreateWorkItemDTO createWorkItemDTO)
    {
        await _azureDevopsTrackerService.Create(createWorkItemDTO);
        return Ok();
    }

    [AllowAnonymous]
    [HttpGet("release-changelog")]
    public IActionResult ReleaseChangelog()
    {
        var changeLog = _changeLogService.Release();
        if (changeLog is null) return new OkObjectResult("There's no WorkItems waiting for a ChangeLog");
           var message = _changeLogService.SendToMessengers(changeLog);
        return new OkObjectResult(message);
    }

    [AllowAnonymous]
    [HttpGet("count-items-for-release")]
    public IActionResult CountItemsForRelease()
    {
       try
       {
            var count = _changeLogService.CountItemsForRelease();
            var returnText = new StringBuilder();
            if (count == 0 || count == 1)
                returnText.Append($"{count} Item");
            else
                returnText.Append($"{count} Items");

            return new OkObjectResult(new { data = returnText.ToString() });
        }
        catch (Exception ex)
        {
            return new OkObjectResult(new { data = ex.Message });
        }
    }
}

Para mais informações sobre a utilização com Azure Function, consulte nossa página de Azure DevOps Function Tracker.

Configurando o DevOps

Criando Subscrição

Passo1

Configurando serviço

Passo2 Passo3 Passo4

Os mesmos passos devem ser realizados para o WorkItem Updated

Configurado o ChangeLog

Acessando as configurações do Processo no Azure DevOps é possível editar os campos de um WorkItem. Para o funcionamento do ChangeLog, é necessário que um campo chamado exatamente de "ChangeLog Description" seja criado. Passo5

Quando um WorkItem muda para o status Closed e possui algum texto no campo ChangeLog Description então ele ficará aguardando por um ChangeLog. É possível saber quantos itens estão aguardando por um ChangeLog através do método IChangeLogService.CountItemsForRelease().

No exemplo do Controller acima, a Action de url count-items-for-release tem esse papel.

Para lançar um ChangeLog, o método IChangeLogService.Release() deve ser chamado e, caso queira publicá-lo em alguns dos mensageiros que temos suporte, o método IChangeLogService.SendToMessengers(changeLog) deve ser chamado.

No exemplo do Controller acima, a Action de url release-changelog tem esses papéis.

Para facilitar o uso e a implantação do ChangeLog, recomendamos o site https://shields.io/ para a criação de um botão que informe o número de itens aguardando ChangeLog e ao clicar o ChangeLog seja lançado e publicado.

Exemplo de implementaçao do botão em questão:

[![Button](https://img.shields.io/badge/dynamic/json?color=%237bd1d7&style=for-the-badge&label=RELEASE%20CHANGELOG&query=%24.data&url=[URL DA SUA API]/count-items-for-release)]([URL DA SUA API]/release-changelog)

O resultado será:

image

Para o funcionamento do ChangeLog no Microsoft Teams e no Discord é necessário que um Webhook seja criado. Para mais informações de como criar um webhook, acesse:

Discord: https://support.discord.com/hc/pt-br/articles/228383668-Usando-Webhooks

Microsoft Teams: https://docs.microsoft.com/pt-br/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook

Exemplo de ChangeLog lançado no Microsoft Teams: image

Pronto, agora todas as mudanças feitas nos WorkItems já serão salvas automaticamente no banco de dados e sua equipe terá um ChangeLog automático!! 🎉😍

Exemplos

Tempo por State em uma Sprint:

select 
	t.State, 
	dbo.ToTime(AVG(t.TotalWorkedTime)) as AvgTime,
	dbo.ToTime(MAX(t.TotalWorkedTime)) as MaxTime,
	dbo.ToTime(MIN(t.TotalWorkedTime)) as MinorTime,
	dbo.ToTime(SUM(t.TotalWorkedTime)) as SumTime,
	AVG(t.TotalWorkedTime / 60 / 60) as AvgInHours
from WorkItems w
join TimeByStates t on t.WorkItemId = w.Id
where 1=1 
and w.IterationPath = 'Sprint 12'
and w.Type IN ('Bug', 'Task')
group by t.State

Tasks e Bugs que ficaram mais tempo em Active na Sprint

select 
	w.Id, 
	w.Title,
	dbo.ToTime(t.TotalWorkedTime) as TotalWorkedTime, 
	w.AssignedTo,
	t.TotalWorkedTime
from WorkItems w
join TimeByStates t on t.WorkItemId = w.Id
where w.IterationPath = 'Sprint 12'
and w.Type IN ('Bug', 'Task')
and t.TotalWorkedTime > 60
and t.State = 'Active'
order by t.TotalWorkedTime desc

Live Demo

Temos um banco de dados com um usuário público para você ver e testar o Azure DevOps Tracker em pleno funcionamento!

  • Servidor: tcp:sql-azure-devops-tracker.database.windows.net,1433
  • Banco: sqldb-azure-devops-tracker
  • Usuário: public_user
  • Senha: @Adt123456_

Link do projeto no Azure DevOps que está conectado nesse banco: Azure Devops - TypingHard

Melhorias em andamento

Board Status