Um serviço .NET 8 construído para receber, processar e registrar eventos de webhooks do Azure DevOps, focado em capturar os dados completos no momento exato em que uma User Story é criada.
Este projeto resolve um problema comum no acompanhamento de projetos: a necessidade de ter um registro detalhado e centralizado de novos itens de trabalho. Em vez de registrar cada pequena alteração, esta API atua como um "coletor" inteligente que:
- Ouve os eventos de criação de itens de trabalho (
workitem.created) do Azure DevOps. - Filtra e reage apenas quando o item criado é do tipo User Story.
- Verifica se este é o primeiro registro daquele item, evitando duplicatas.
- Salva uma gama rica de informações (ID, Título, Descrição, Solicitante, Responsável, Projeto, etc.) em um banco de dados SQL Server para futuras análises ou integrações.
- Gatilho Específico: A API só age no evento
workitem.createde apenas para o tipo User Story. - Prevenção de Duplicidade: Garante que cada User Story seja registrada apenas uma vez.
- Extração de Dados Ricos: Captura informações detalhadas, incluindo Título, Descrição, Solicitante (Nome e Email), Responsável (Nome e Email), Projeto, Área e Iteração.
- Tratamento de Dados Flexível: Lida de forma robusta com as inconsistências do Azure DevOps no formato dos dados de usuário (aceita tanto texto simples quanto objetos complexos).
- Configuração Segura: Utiliza um arquivo
.envpara gerenciar a string de conexão do banco de dados, mantendo-a fora do controle de versão. - Estrutura Sólida: Construído com uma arquitetura Controller/Service em .NET 8 e usando Entity Framework Core para acesso a dados.
- ASP.NET Core 8
- Entity Framework Core 8
- SQL Server
- DotNetEnv (para carregar o arquivo .env)
- Ngrok (para desenvolvimento local)
- Azure DevOps (como fonte dos webhooks)
Siga os passos abaixo para ter o projeto rodando em seu ambiente local.
- .NET 8 SDK
- SQL Server (qualquer edição)
- Git
- Ngrok
git clone https://github.com/MatheusLauri/Devops-integration.git
cd IntegracaoDevOpsA aplicação precisa da tabela ts_upgdevops para funcionar. Execute o script SQL abaixo no seu banco de dados:
CREATE TABLE ts_upgdevops
(
PK_ID int identity PRIMARY KEY,
FK_ITEM_TRABALHO_AZURE int,
DS_TITULO nvarchar(255),
DS_TIPO varchar(100),
DS_DESCRICAO ntext,
DS_ESTADO varchar(100),
DS_MOTIVO varchar(255),
DS_TAGS varchar(500),
DS_SOLICITANTE_NOME nvarchar(255),
DS_SOLICITANTE_EMAIL varchar(255),
FK_SOLICITANTE_ID_AZURE varchar(100),
DS_PROJETO_NOME varchar(255),
DS_CAMINHO_AREA varchar(500),
DS_CAMINHO_ITERACAO varchar(500),
DS_RESPONSAVEL_NOME nvarchar(255),
DS_RESPONSAVEL_EMAIL varchar(255),
NR_PRIORIDADE int,
DS_URL_UI varchar(1024),
DS_URL_API varchar(1024),
TG_INATIVO tinyint,
FK_OWNER int,
DH_INCLUSAO datetime2,
DH_ALTERACAO datetime
);Na raiz do projeto, crie um arquivo chamado .env e adicione sua string de conexão. O nome ConnectionStrings__DefaultConnection é importante para que o .NET a reconheça.
ConnectionStrings__DefaultConnection="Server=SEU_SERVIDOR;Database=SEU_BANCO;User Id=SEU_USUARIO;Password=SUA_SENHA;TrustServerCertificate=True"dotnet restoredotnet runAnote a porta em que a aplicação está rodando (ex: http://localhost:5226).
Em um novo terminal, inicie o Ngrok:
ngrok http http://localhost:5226(Troque 5226 pela porta correta)
Copie o endereço https://... gerado pelo Ngrok.
No Azure DevOps, vá para Project Settings > Service Hooks e crie uma nova inscrição ("+").
- Serviço: Web Hooks
- Gatilho (Trigger): Work item created
- Filtros:
Work Item Type = User Story - URL: Cole o endereço do Ngrok seguido do endpoint correto:
https://SEU_ENDERECO.ngrok-free.app/api/webhook/userstory-created
Clique em Test para verificar e em Finish para salvar.
O fluxo lógico da aplicação é o seguinte:
Azure DevOps (Criação de uma nova User Story)
↓
Webhook
↓
Ngrok
↓
API .NET
↓
[Filtro 1: O evento é "workitem.created"?]
↓
[Filtro 2: O tipo é "User Story"?]
↓
[Filtro 3: O ID já existe no banco?]
↓
INSERT no SQL Server
- Método: POST
- URL:
/api/webhook/userstory-created - Corpo (Body): Espera o payload JSON padrão do Azure DevOps para o evento
workitem.created.
Respostas:
200 OK: A requisição foi recebida com sucesso e processada (ou ignorada conforme as regras).400 Bad Request: O JSON recebido é inválido ou incompleto.500 Internal Server Error: Ocorreu um erro inesperado no servidor (ex: falha de conexão com o banco).
- Adicionar autenticação ao endpoint para maior segurança (ex: usando uma API Key).
- Criar testes unitários e de integração.
- Expandir a lógica para lidar com a atualização (
workitem.updated) de User Stories. - Configurar uma pipeline de CI/CD para fazer o deploy automático para um ambiente na nuvem