¡Hola developer 👋🏻! Estos días he estado experimentando con un escenario (todavía secreto 🤫) en el que necesitaba que, cada vez que se creara un nuevo Work Item en Azure Boards, se lanzara automáticamente un flujo en Azure Pipelines.
Como no existe un trigger nativo para esto en Azure DevOps en este artículo quiero contarte cómo lo conseguí.
💡 El truco está en los WebHooks
La clave para resolverlo ha sido utilizar un WebHook dentro de Azure DevOps.
Lo primero que necesitas hacer es crear una Service Connection del tipo Incoming WebHook y configurarla de la siguiente manera 👇🏻
Una vez creada, ya puedes usarla para asociarla dentro de la plataforma a lo que se conoce como Service Hooks.
⚙️ Cómo crear un Service Hook
Dentro del proyecto donde quieras implementar esta automatización, ve a Project Settings → Service Hooks > Create a new subscription > Elegir el tipo Web Hooks.
Ahí podrás suscribirte a distintos tipos de eventos.
En mi caso, necesitaba hacerlo para el evento Work item created
que he configurado de esta forma:
La URL a la que tienes que apuntar es la siguiente: https://dev.azure.com/TU_AZURE_DEVOPS_ORG/_apis/public/distributedtask/webhooks/WorkItemWebHook?api-version=7.1-preview.1
💡Nota: Esta se puede proteger pero para esta demo no lo he incluido como parte de la configuración. Más información aquí.
Puedes hacer clic en el botón de Test para confirmar que esto funciona aunque por ahora no lo esté capturando ninguna pipeline ni nada.
Una vez hecho esto, solo queda crear el YAML que capture este evento y nos permita hacer con él lo que queramos a partir de ahora 🚀.
🧩 Azure Pipeline asociada al WebHook
La pipeline que he usado para probar el flujo es muy sencilla:
trigger: none
pool:
vmImage: ubuntu-latest
resources:
webhooks:
- webhook: myWebhookResource
connection: WorkItemWebHook
steps:
- checkout: none
- script: echo "🚀 Webhook triggered pipeline started!"
displayName: Starting message
- bash: |
# Access webhook data as parameter
echo "🔔 Processing webhook payload..."
echo "═══════════════════════════════════════════════════════════"
echo "📋 WEBHOOK INFORMATION"
echo "═══════════════════════════════════════════════════════════"
echo ""
echo "🔖 Event Type: ${{ parameters.myWebhookResource.eventType }}"
echo "🆔 Subscription ID: ${{ parameters.myWebhookResource.subscriptionId }}"
echo "🔑 Notification ID: ${{ parameters.myWebhookResource.notificationId }}"
echo "🎯 Event ID: ${{ parameters.myWebhookResource.id }}"
echo "📡 Publisher ID: ${{ parameters.myWebhookResource.publisherId }}"
echo "📅 Created Date: ${{ parameters.myWebhookResource.createdDate }}"
echo "🔢 Resource Version: ${{ parameters.myWebhookResource.resourceVersion }}"
echo ""
echo "═══════════════════════════════════════════════════════════"
echo "💬 MESSAGE"
echo "═══════════════════════════════════════════════════════════"
echo ""
echo "${{ parameters.myWebhookResource.message.text }}"
echo ""
echo "═══════════════════════════════════════════════════════════"
echo "📝 WORK ITEM DETAILS (from webhook)"
echo "═══════════════════════════════════════════════════════════"
echo ""
echo "🆔 Work Item ID: ${{ parameters.myWebhookResource.resource.id }}"
echo "🔄 Revision: ${{ parameters.myWebhookResource.resource.rev }}"
echo "📌 Title: ${{ parameters.myWebhookResource.resource.fields['System.Title'] }}"
echo "🏷️ Type: ${{ parameters.myWebhookResource.resource.fields['System.WorkItemType'] }}"
echo "📊 State: ${{ parameters.myWebhookResource.resource.fields['System.State'] }}"
echo "❓ Reason: ${{ parameters.myWebhookResource.resource.fields['System.Reason'] }}"
echo "🎯 Priority: ${{ parameters.myWebhookResource.resource.fields['Microsoft.VSTS.Common.Priority'] }}"
echo ""
echo "📄 Description:"
echo "${{ parameters.myWebhookResource.resource.fields['System.Description'] }}"
echo ""
echo "👤 Created By: ${{ parameters.myWebhookResource.resource.fields['System.CreatedBy'] }}"
echo "📅 Created Date: ${{ parameters.myWebhookResource.resource.fields['System.CreatedDate'] }}"
echo ""
echo "👥 Assigned To: ${{ parameters.myWebhookResource.resource.fields['System.AssignedTo'] }}"
echo ""
echo "🔄 Changed By: ${{ parameters.myWebhookResource.resource.fields['System.ChangedBy'] }}"
echo "📅 Changed Date: ${{ parameters.myWebhookResource.resource.fields['System.ChangedDate'] }}"
echo ""
echo "📂 Area Path: ${{ parameters.myWebhookResource.resource.fields['System.AreaPath'] }}"
echo "🔁 Iteration Path: ${{ parameters.myWebhookResource.resource.fields['System.IterationPath'] }}"
echo "📁 Team Project: ${{ parameters.myWebhookResource.resource.fields['System.TeamProject'] }}"
echo ""
echo "⚠️ Severity: ${{ parameters.myWebhookResource.resource.fields['Microsoft.VSTS.Common.Severity'] }}"
echo "📋 Kanban Column: ${{ parameters.myWebhookResource.resource.fields['WEF_EB329F44FE5F4A94ACB1DA153FDF38BA_Kanban.Column'] }}"
echo ""
echo "🔗 Work Item URL: ${{ parameters.myWebhookResource.resource.url }}"
echo ""
echo "═══════════════════════════════════════════════════════════"
# Set pipeline variables for later use
echo "##vso[task.setvariable variable=WorkItemId]${{ parameters.myWebhookResource.resource.id }}"
echo "##vso[task.setvariable variable=WorkItemTitle]${{ parameters.myWebhookResource.resource.fields['System.Title'] }}"
echo "##vso[task.setvariable variable=WorkItemType]${{ parameters.myWebhookResource.resource.fields['System.WorkItemType'] }}"
echo "##vso[task.setvariable variable=WorkItemState]${{ parameters.myWebhookResource.resource.fields['System.State'] }}"
echo "##vso[task.setvariable variable=WorkItemCreatedBy]${{ parameters.myWebhookResource.resource.fields['System.CreatedBy'] }}"
echo "##vso[task.setvariable variable=WorkItemAssignedTo]${{ parameters.myWebhookResource.resource.fields['System.AssignedTo'] }}"
echo "##vso[task.setvariable variable=WorkItemDescription]${{ parameters.myWebhookResource.resource.fields['System.Description'] }}"
displayName: Display webhook information 📊
Como ves, no hace absolutamente nada más que mostrar la información recibida a través del WebHook —pero para comprobar que todo funciona, es más que suficiente por ahora 😄.

¡Y listo! Así es como he conseguido que la creación de un Work Item en Azure Boards dispare automáticamente una pipeline.
¡Nos vemos 👋🏻!




