Díganos qué opina sobre la experiencia de descarga del PDF.
Documentación de Azure DevOps
Colabore en el desarrollo de software mediante el control de código fuente, el seguimiento del
trabajo y la integración y entrega continuas, tanto en el entorno local como en la nube.
INFORMACIÓN GENERAL INFORMACIÓN GENERAL
¿Qué es Azure DevOps? Diferencias entre Azure DevOps
Services y Azure DevOps Server
NOVEDADES NOVEDADES
Novedades de Azure DevOps Novedades de la documentación
de Azure DevOps
INTRODUCCIÓN INTRODUCCIÓN
Inicio gratuito Cree su primera canalización
GUÍA PASO A PASO GUÍA PASO A PASO
Conectar a un proyecto Autenticación del acceso con
tokens de acceso personal
Azure Boards Azure Repos Azure Pipelines
¿Qué es Azure Boards? ¿Qué es Azure Repos? ¿Qué es Azure Pipelines?
Elegir un proceso Clonación de un repositorio Cree su primera canalización
de Git existente
Crear el trabajo pendiente Esquema YAML
Introducción a Git y
Planeamiento y seguimiento Definición de variables
Visual Studio
del trabajo
Administrar conexiones de
Conexión al repositorio de
Adición o modificación de servicio
Git con SSH
elementos de trabajo en
Más información >
masa Revisión y combinación del
código con solicitudes de
Más información >
incorporación de cambios
Más información >
Azure Test Plans Azure Artifacts Azure DevOps Server
¿Qué es Azure Test Plans? ¿Qué es Azure Artifacts? Tareas administrativas
Creación de un plan de Fuentes de artefactos Requisitos de instalación y
pruebas actualización
Orígenes de nivel superior
Ejecutar pruebas Instalar
Configuración de permisos
automatizadas
Actualizar
Artefactos en Azure
Creación de pruebas
Pipelines Migrar
manuales
Más información > Más información >
Más información >
Compilación e implementación de las aplicaciones
ASP.NET .NET Core
C/C++ con GCC C/C++ con VC++
Docker Java
JavaScript y Node.js Python
Azure Web Apps Máquina virtual de Windows
Kubernetes Azure SQL Database
Configuración y personalización de recursos
Configuración & uso Seguridad, permisos, acceso &
Acerca de la configuración Acerca de los permisos, el acceso y los grupos de
seguridad
Administración del proyecto
Acerca de los niveles de acceso
Preferencias de usuario
Uso de tokens de acceso personal
Teams
Índice de referencia rápida de seguridad
Proyectos
Introducción a la facturación
Proyectos públicos
Agregar o quitar usuarios o grupos
Las organizaciones
Cambio de permisos de nivel de proyecto
Grupos de agentes de canalización & colas
Cambio de permisos de nivel de colección de
Auditoría
proyectos
Ver más >
Ver más >
Integración entre servicios, Azure & Personalización de Azure Boards
GitHub
Configurar y personalizar Azure Boards
Información general sobre la integración entre Comparación de procesos
servicios
Área y rutas de acceso de iteración
Rastreabilidad de un extremo a otro
Personalización de un proceso heredado
Integración entre Azure DevOps y GitHub
Modelo de proceso XML local
Implementar en Azure
Modelo de proceso XML hospedado
Trabajo entre proyectos
Plantillas de proceso
Azure Boards y GitHub
Ver más >
Ver más >
Servicios adicionales
Informes de análisis & Wikis, Búsqueda, navegación &
Paneles, gráficos, informes y widgets Crear una wiki para su proyecto
Catálogo de widgets Guía de sintaxis para el uso de Markdown en wiki
Gráficos basados en consultas de seguimiento del Búsqueda
trabajo
Navegación del portal web
Azure DevOps y Power BI
Ver más >
¿Qué son las vistas analíticas?
Más información >
Extensibilidad de & de Marketplace Recursos para desarrolladores
Descubrimiento de extensiones CLI de Azure DevOps
Desarrollar extensiones Referencia rápida de la CLI de Azure DevOps
Integrar aplicaciones Referencia de comandos de Git
Enlaces de servicio Comandos de control de versiones de Team
Foundation
Ver más >
Comandos de administración de casos de prueba
(TCM)
Generador de demostraciones de Azure DevOps
Services
API de REST
Centro de recursos de DevOps
Ver más >
Blogs - Twitter - Stack Overflow - Notificación de problemas - Developer Community - Estado del
servicio
Comenzar con Azure DevOps
documentación
Comience a usar Azure DevOps para colaborar en el código, compilar e implementar
aplicaciones, o planear y realizar el seguimiento del trabajo.
Acerca de Azure DevOps
e INFORMACIÓN GENERAL
¿Qué es Azure DevOps?
¿Qué es Azure Boards?
¿Qué es Azure Repos?
¿Qué es Azure Pipelines?
Introducción como parte interesada
Regístrese gratis.
f INICIO RÁPIDO
Azure DevOps (incluye todos los servicios)
Azure Boards
Azure Repos
Azure Pipelines
c GUÍA PASO A PASO
Conectar a un proyecto
Administración del proyecto
f INICIO RÁPIDO
Administración del proyecto
Adición de usuarios a un proyecto o equipo
Adición de usuarios a un proyecto o equipo
Adición de un administrador de proyectos
Adición de un administrador de recopilación de proyectos
p CONCEPTO
Permisos y acceso predeterminado
Guía de búsqueda de permisos
Planear y realizar el seguimiento del trabajo
f INICIO RÁPIDO
Planear y realizar el seguimiento del trabajo
Crear el trabajo pendiente
Colaboración en el código
f INICIO RÁPIDO
Clonación de un repositorio
Crear un repositorio
Autenticación con SSH
Búsqueda de código en todos los proyectos
Compilación e implementación de las aplicaciones
f INICIO RÁPIDO
Cree su primera canalización
i REFERENCIA
Esquema de YAML
Establecimiento de las preferencias
f INICIO RÁPIDO
Cambio de las preferencias de perfil
Administración de las notificaciones
Vista previa de las nuevas características
Establecer favoritos
Navegar
c GUÍA PASO A PASO
Navegación del portal web
Navegación de Team Explorer
Migrar e importar
p CONCEPTO
Migración desde TFS a Azure DevOps Services
Opciones de migración
Importar
Documentación de Azure Artifacts
Programe una vez y comparta paquetes en toda la organización. Hospede los paquetes
NuGet, npm, Maven, Python y Universal privados con Azure Artifacts para compilaciones
más confiables y escalables.
Introducción
p CONCEPTO
Información general sobre Artifacts
f INICIO RÁPIDO
Procedimientos recomendados
Consumo de almacenamiento de artefactos
Tamaños de paquete y límites de recuento
Configuración de fuentes
p CONCEPTO
¿Qué son las fuentes?
¿Qué son las vistas de fuente?
f INICIO RÁPIDO
Configuración de permisos
Información general sobre orígenes de nivel superior
Configuración de orígenes ascendentes
Artefactos en Azure Pipelines
p CONCEPTO
Información general
f INICIO RÁPIDO
Artefactos de canalización
Artefactos de versión y orígenes de artefactos
Publicación y descarga de Artifacts
Almacenamiento en caché de las canalizaciones
Símbolos
p CONCEPTO
¿Qué son los archivos de símbolos?
c GUÍA PASO A PASO
Depuración con Visual Studio
Depuración con WinDbg
Publicación de símbolos con Azure Pipelines
NuGet
f INICIO RÁPIDO
Introducción
c GUÍA PASO A PASO
Publicación de paquetes NuGet (CLI)
Publicación de paquetes NuGet con Azure Pipelines (YAML/clásico)
Instalación de paquetes NuGet con Visual Studio
Origen ascendente de NuGet.org
npm
f INICIO RÁPIDO
Introducción
c GUÍA PASO A PASO
Publicación de paquetes npm (CLI)
Publicación de paquetes npm con Azure Pipelines (YAML/clásico)
Configuración del proyecto y conexión a Azure Artifacts
Usar ámbitos de npm
Npmjs.com origen ascendente
Maven
f INICIO RÁPIDO
Introducción
c GUÍA PASO A PASO
Configuración del proyecto
Instalación de artefactos de Maven
Usar paquetes de Maven Central
Origen ascendente del repositorio de Google Maven
Origen ascendente de los complementos de Gradle
Origen ascendente de JitPack
Python
f INICIO RÁPIDO
Introducción
c GUÍA PASO A PASO
Publicación y descarga de paquetes de Python (CLI)
Publicación y descarga de paquetes de Python con Azure Pipelines (YAML/clásico)
Universal Packages
f INICIO RÁPIDO
Introducción
c GUÍA PASO A PASO
Publicación y descarga de paquetes universales con Azure Pipelines (YAML/clásico)
Orígenes ascendentes de paquetes universales
Documentación de Azure Boards
Aborde y planifique el trabajo entre equipos, y realice un seguimiento. Defina y actualice
problemas, errores, casos de usuario y otros temas con herramientas de Scrum, Kanban
y Agile personalizables.
Información sobre Azure Boards
e INFORMACIÓN GENERAL
¿Qué es Azure Boards?
Acerca de los elementos de trabajo
p CONCEPTO
Elegir un proceso
Flujo de los procesos de la metodología ágil
Introducción
f INICIO RÁPIDO
Regístrese gratis.
Planeamiento y seguimiento del trabajo
Introducción como parte interesada
Administración de Azure Boards
Planeamiento del proyecto
e INFORMACIÓN GENERAL
Información sobre el trabajo pendiente y la gestión de proyectos con la metodología ágil
f INICIO RÁPIDO
Crear el trabajo pendiente
Definición de características y epopeyas
Definición de características y epopeyas
Organización del trabajo pendiente
g TUTORIAL
Agregar o modificar en bloque elementos de trabajo (Excel)
Adición o modificación de elementos de trabajo en masa (Web)
Implementación de Kanban
f INICIO RÁPIDO
Inicio rápido del panel Kanban
g TUTORIAL
Conceptos básicos del panel Kanban
Add columns (Agregar columnas)
Personalizar el panel kanban
Implementación de Scrum
e INFORMACIÓN GENERAL
Información sobre Scrum y los sprints
g TUTORIAL
Asignación de trabajo a sprints
Establecimiento de la capacidad
Supervisión de la evolución de los sprints
Enumeración y administración de los elementos de trabajo
g TUTORIAL
Creación de consultas administradas
Realización de búsquedas ad hoc
Definición y administración de errores, y evaluación de prioridades
Eliminación, supresión o restauración de elementos de trabajo
Colaborar
f INICIO RÁPIDO
Conectar Azure Boards con GitHub
Vinculación de confirmaciones, solicitudes de incorporación de cambios y problemas de
GitHub a elementos de trabajo
p CONCEPTO
Vincular elementos de trabajo para admitir la rastreabilidad
g TUTORIAL
Uso de plantillas de elementos de trabajo
Agregar etiquetas a elementos de trabajo
Azure Boards con Microsoft Teams
Configurar y personalizar
p CONCEPTO
Acerca de los equipos y las herramientas de Agile
Configuración y personalización de Azure Boards
g TUTORIAL
Establecer rutas de acceso de área
Establecimiento de rutas de iteración (sprint)
Agregar un campo personalizado
Personalización del flujo de trabajo
Más info...
Metodología ágil a gran escala
g TUTORIAL
Administración de carteras
Revisión de planes y entregas de equipos
Implementación de Scaled Agile Framework®
Solución de problemas
c GUÍA PASO A PASO
Corrección de problemas de anidación y reordenación
Configuración de trabajos pendientes y paneles
Preguntas más frecuentes
Referencia rápida
i REFERENCIA
Referencia rápida sobre los elementos de trabajo
Referencia rápida de KQL
Índice de campo de elemento de trabajo
Permisos predeterminados para el seguimiento del trabajo
Recursos para desarrolladores
i REFERENCIA
CLI de Azure DevOps
API DE REST
Documentación de Azure Pipelines
Implemente la integración continua y la entrega continua (CI/CD) para la aplicación y la
plataforma que elija.
Introducción
p CONCEPTO
¿Qué es Azure Pipelines?
Use Azure Pipelines
Conceptos clave para los nuevos usuarios de Azure Pipelines
Canalizaciones de versión clásicas
f INICIO RÁPIDO
Regístrese gratis.
Cree su primera canalización
Clonar o importar una canalización
Personalización de la canalización
Compilación, implementación y prueba en cualquier lenguaje y
ecosistema
g TUTORIAL
Imagen de contenedor
Aplicaciones .NET Core
Anaconda
Android
Azure Kubernetes Service
Java
Aplicaciones de JavaScript y Node.js
Aplicaciones de Python
PHP
PHP
Más información >
Conceptos clave
p CONCEPTO
Agentes
Condiciones
Expresiones
Entornos
Trabajos
Parámetros en tiempo de ejecución
Fases
Tareas
Plantillas
Desencadenadores
Guía de referencia
i REFERENCIA
Esquema YAML
Variables predefinidas
Variables y artefactos de versión
Grupos de variables
Índice de tareas
Compilación de cualquier repositorio
c GUÍA PASO A PASO
GitHub
Git de Azure Repos
control de versiones de Team Foundation
BitBucket Cloud
Subversion
Git genérico
g TUTORIAL
Creación de varias ramas de Git
Implementar en Azure
e INFORMACIÓN GENERAL
Implementar en Azure
g TUTORIAL
Conexión con Azure
Implementación en Azure SQL Database
Implementación en Azure Kubernetes Service
Usar secretos de Azure Key Vault
Administración de agentes y agentes autohospedados
c GUÍA PASO A PASO
Implementación en Windows
Agentes hospedado por Microsoft
Agentes de Linux autohospedados
Agentes de macOS autohospedados
Configuración de pruebas continuas
g TUTORIAL
g TUTORIAL
Configuración para pruebas de IU
Pruebas de IU mediante Selenium
Revisión de los resultados de cobertura de código
Revisar los resultados de la prueba
Administración de pruebas no confiables
Analizar los resultados de pruebas
Configure resources
c GUÍA PASO A PASO
Creación y administración de grupos de agentes
Creación y administración de grupos de implementación
Creación y administración de conexiones de servicio
Establecimiento de directivas de retención de compilación y versión
Solución de problemas
c GUÍA PASO A PASO
Solución de problemas de compilaciones y versiones
Ejecución de una versión en modo de depuración
Solución de problemas conexiones de servicio de Azure Resource Manager
Publicar paquetes
g TUTORIAL
Publicar y descargar artefactos
Publicación de paquetes NuGet
Publicación de paquetes npm
Publicación de paquetes de Python
Publicación y descarga de Universal Packages
Publicación de paquetes Maven
Publicación de símbolos para la depuración
Integración con otras aplicaciones
c GUÍA PASO A PASO
Integración con Slack
Integración con Microsoft Teams
Integración con enlaces de servicio
Documentación de Azure Repos
Colabore en el desarrollo de código con los repositorios gratuitos de Git, tanto públicos
como privados, las solicitudes de incorporación de cambios y la revisión de código.
Información sobre Azure Repos
q VIDEO
Uso de solicitudes de incorporación de cambios con Azure DevOps
e INFORMACIÓN GENERAL
¿Qué es Azure Repos?
Comparación entre Git y TFVC
Conexión y autenticación
e INFORMACIÓN GENERAL
Información general sobre la autenticación
Conexión a un proyecto de Azure DevOps
c GUÍA PASO A PASO
Uso de la autenticación de clave SSH
Uso del administrador de credenciales de Git
Introducción a Git o GitHub
b INTRODUCCIÓN
Confirmación, uso compartido y sincronización del código
Clonación de un repositorio
Importación de un repositorio de Git en un proyecto
Actualización del código con buscar y extraer
Anulación de cambios en un repositorio de Git
g TUTORIAL
Guardado de cambios con confirmaciones de Git
Sincronización de cambios en un repositorio remoto de Git
Resolución de conflictos de combinación de Git
Administración de repositorios y ramas de Git
c GUÍA PASO A PASO
Creación y administración de repositorios de Git
Establecimiento de permisos de repositorios Git
Creación de una rama
Mejora de la calidad del código con directivas de ramas
Administración de ramas
Cambio de la rama predeterminada
Omitir archivos
Establecimiento de la seguridad y los permisos de las ramas de Git
i REFERENCIA
Permisos predeterminados
Referencia de comandos de Git
Introducción a TFVC
f INICIO RÁPIDO
Uso compartido del código con Visual Studio
c GUÍA PASO A PASO
Suspensión del trabajo y administración de conjuntos de cambios agregados pendientes de
confirmación
Uso del E plorador de control de código f ente para administrar archi os
Uso del Explorador de control de código fuente para administrar archivos
Obtención de revisiones de código
Creación de áreas de trabajo
Bifurcar carpetas y archivos
i REFERENCIA
Referencia de comandos de TFVC
Configuración de recursos de TFVC
c GUÍA PASO A PASO
Administración de permisos de repositorios de TFVC
Adición de directivas de inserción en repositorios de TFVC
Recursos para desarrolladores
i REFERENCIA
CLI de Azure DevOps
API REST de Git
API REST de TFVC
Documentación de Azure Test Plans
Mejore la calidad del código general mediante el uso de servicios de pruebas manuales
y exploratorias para las aplicaciones.
Acerca de Azure Test Plans
e INFORMACIÓN GENERAL
¿Qué es Azure Test Plans?
Navegación a Test Plans
Ejecutar pruebas manuales
f INICIO RÁPIDO
Creación de planes y conjuntos de pruebas
Crear casos de prueba manuales
Ejecutar pruebas manuales
g TUTORIAL
Probar diferentes configuraciones
Extensión de prueba y comentarios
f INICIO RÁPIDO
Instalación de la extensión Test & Feedback
Probar en modo conectado
Configuración de recursos de prueba
c GUÍA PASO A PASO
Establecer directivas de retención de pruebas
Establecer directivas de retención de pruebas
Ejecutar pruebas automatizadas
p CONCEPTO
Ejecución de pruebas automatizadas desde el centro de pruebas
Asociación de pruebas automatizadas a casos de prueba
Configuración de pruebas continuas
g TUTORIAL
Aplicaciones .NET Core
Go
Python
Pruebas de IU mediante Selenium
Revisión de los resultados de cobertura de código
Revisar los resultados de la prueba
Analizar los resultados de pruebas
Documentación de informes de
analytics &
Los informes en Azure DevOps permiten a los equipos de desarrollo de software tomar
decisiones controladas por datos y proporcionar valor a sus clientes con más rapidez.
Configuración de gráficos y paneles
e INFORMACIÓN GENERAL
Acerca de los paneles, gráficos, informes y widgets
Referencia rápida
Catálogo de widgets
g TUTORIAL
Adición, cambio de nombre y eliminación de paneles
Agregar un widget a un panel
Configuración de los widgets Burndown y Burnup
Visualización y configuración de la velocidad del equipo
c GUÍA PASO A PASO
Creación de gráficos basados en consultas de estado y tendencias
Estado y tendencias del seguimiento del trabajo
g TUTORIAL
Evolución ascendente y evolución
Evolución del sprint
Flujo acumulado
Ciclo y plazo
Velocidad
Gráficos de consultas basados en consultas de elementos de trabajo
Informes de canalización
p CONCEPTO
Revisar cobertura de código
Informes de Análisis de canalización
Gráfico histórico para grupos de agentes
Exploración del modelo de OData de Analytics
g TUTORIAL
Construcción de consultas de OData
Definición de consultas básicas
e INFORMACIÓN GENERAL
Procedimientos recomendados para usar al consultar Analytics
Referencia de OData de Analytics
i REFERENCIA
Metadatos de fecha del calendario, proyecto y usuario
metadatos de Azure Boards
Metadatos de Azure Pipelines
metadatos de Azure Test Plans
Estado y tendencias de las pruebas
p CONCEPTO
Tendencias de resultados de la prueba
Gráficos de estado, progreso y resultados de la prueba
Requisitos de pruebas de seguimiento
Análisis de pruebas y análisis de errores
Creación de informes de Power BI
e INFORMACIÓN GENERAL
Acerca de la integración de Power BI
¿Qué es Analytics?
¿Qué son las vistas de análisis?
Guía básica de informes
g TUTORIAL
Crear una vista de análisis
Conexión del conector de datos de Power BI
Conexión a datos mediante consultas de Power BI y OData
Creación de un informe de Power BI con una consulta de OData
Informes de Power BI de ejemplo
e INFORMACIÓN GENERAL
Informes de ejemplo que usan consultas de OData
Datos disponibles de análisis
c GUÍA PASO A PASO
Adición de una columna para la fecha de última actualización
Calcular el tiempo en estado
Extensión de Analytics con OData
e INFORMACIÓN GENERAL
Acerca de la integración de Power BI
Referencia rápida
f INICIO RÁPIDO
Consulta de datos de seguimiento del trabajo
Consultas con ámbito de proyecto y organización
Adición de datos de seguimiento del trabajo
i REFERENCIA
Instrucciones de consulta para Analytics con OData
Visualización de informes de SQL Server (heredado)
e INFORMACIÓN GENERAL
Informes de Reporting Services
c GUÍA PASO A PASO
Crear informes en Excel a partir de una consulta de elemento de trabajo
Crear un informe detallado mediante el Diseñador de informes
Agregar informes a un proyecto de equipo
Configuración & de uso
Configure los recursos y administre la configuración de una organización, un proyecto,
un equipo o un usuario.
Introducción
INFORMACIÓN GENERAL
Acerca de la configuración
Empezar a trabajar como administrador
INICIO RÁPIDO
Establecer preferencias de usuario
GUÍA PASO A PASO
Habilitación de características en versión preliminar
Administración de la organización (nube)
INFORMACIÓN GENERAL
Acerca de la administración de la organización
Planear la estructura de la organización
CONCEPTO
Administración del acceso con Azure Active Directory
INICIO RÁPIDO
Creación de una organización
GUÍA PASO A PASO
Adición de usuarios a la organización
Conexión de la organización a Azure Active Directory
Adición y administración de proyectos
CONCEPTO
Acerca de los proyectos y el escalado vertical
Personalización del proyecto
INFORMACIÓN GENERAL
Administración del proyecto
GUÍA PASO A PASO
Crear un proyecto
Conexión a GitHub
Agregar y administrar equipos
CONCEPTO
Acerca de los equipos y las herramientas de Agile
GUÍA PASO A PASO
Agregar un equipo
Configurar las herramientas de equipo
Definición de rutas de acceso de área de equipo
Configuración de iteraciones de equipo
Agregar un administrador del equipo
Establecimiento de alertas o notificaciones
CONCEPTO
Acerca de las notificaciones
GUÍA PASO A PASO
Establecimiento de notificaciones personales
Establecimiento de notificaciones de equipo
Auditoría y uso (nube)
CONCEPTO
Límites de frecuencia y utilización
INICIO RÁPIDO
Acceso, exportación y filtrado de registros de auditoría
Configuración de recursos de Pipelines
GUÍA PASO A PASO
Creación y administración de grupos de agentes
Creación y administración de grupos de implementación
Establecimiento de directivas de retención de compilación y versión
Creación y administración de conexiones de servicio
Configuración de recursos de Repos
INFORMACIÓN GENERAL
Acerca de las ramas y las directivas de rama
GUÍA PASO A PASO
Crear y administrar repositorios de Git
Establecimiento de directivas y configuración del repositorio de Git
Administrar directivas de rama de Git
Adición de directivas de inserción en repositorios de TFVC
Configuración de recursos de prueba
GUÍA PASO A PASO
Establecer directivas de retención de pruebas
Documentación de integración entre
servicios, Azure y GitHub
Trabaje en Azure DevOps Services y proyectos, integre con Azure, GitHub y otros
recursos, y cree y administre proyectos públicos.
Trabajo en varios servicios
e INFORMACIÓN GENERAL
Información general de la integración
Información general de la integración entre Azure DevOps y GitHub
Implementar en Azure
Trabajo entre proyectos
b INTRODUCCIÓN
Visualización del trabajo asignado
i REFERENCIA
Preguntas más frecuentes sobre el trabajo entre proyectos
Seguimiento del trabajo, del código, de las compilaciones y de las
versiones
e INFORMACIÓN GENERAL
Rastreabilidad de un extremo a otro
Configuración de repositorios de Git para la integración con el seguimiento del trabajo
g TUTORIAL
Impulsar desarrollo de Git
c GUÍA PASO A PASO
c GUÍA PASO A PASO
Vinculación de elementos de trabajo a compilaciones e implementaciones
Vincular objetos a elementos de trabajo
Configuración de canalizaciones para poder realizar un seguimiento del trabajo
Integración con GitHub
f INICIO RÁPIDO
Azure Boards y GitHub
Azure DevOps Projects y GitHub
Experiencia de Git en Visual Studio
Integración con enlaces de servicio
e INFORMACIÓN GENERAL
Integración con enlaces de servicio
g TUTORIAL
Creación de un enlace de servicio con WebHooks
Creación de un enlace de servicio con Microsoft Teams
Integración con Microsoft Teams
c GUÍA PASO A PASO
Azure Boards con Microsoft Teams
Azure Repos con Microsoft Teams
Azure Pipelines con Microsoft Teams
Integración con Slack
c GUÍA PASO A PASO
Azure Boards con Slack
Azure Repos con Slack
Azure Pipelines con Slack
Creación y administración de un proyecto público
e INFORMACIÓN GENERAL
¿Qué es un proyecto público?
f INICIO RÁPIDO
Conversión de un proyecto privado en público
Azure Boards de personalización de &
configuración
Configure y personalice Azure Boards, incluidas las rutas de acceso de área e iteración,
los proyectos y los procesos.
Configuración de equipos
p CONCEPTO
Acerca de los equipos y las herramientas de Agile
f INICIO RÁPIDO
Configurar las herramientas de equipo
Establecimiento de rutas de acceso de área de equipo
Establecimiento de iteraciones de equipo
Configurar proyectos
p CONCEPTO
Configuración y personalización de Azure Boards
Acerca de los proyectos y el escalado vertical
f INICIO RÁPIDO
Definición de rutas de acceso de área
Definición de rutas de acceso de iteración (sprints)
Personalización de un proceso de herencia
e INFORMACIÓN GENERAL
Modelo de proceso de herencia
f INICIO RÁPIDO
Agregar un campo personalizado
Agregar un tipo de elemento de trabajo personalizado
g TUTORIAL
Personalizar un flujo de trabajo
Aplicar reglas al flujo de trabajo
Personalizar un proyecto
Creación y administración de un proceso
Personalizar un proceso XML local
e INFORMACIÓN GENERAL
Modelo de proceso XML local
c GUÍA PASO A PASO
Agregar o modificar un campo
Agregar o modificar un tipo de elemento de trabajo
i REFERENCIA
Referencia de elementos XML
Personalización de una plantilla de proceso (local)
e INFORMACIÓN GENERAL
Acerca de los procesos y las plantillas de proceso
Archivos de plantilla de proceso
c GUÍA PASO A PASO
Personalizar una plantilla de proceso
Carga y descarga de plantillas de proceso
i REFERENCIA
Referencia de elementos XML
Referencia
i REFERENCIA
Restricciones de nomenclatura
Estados y categorías del flujo de trabajo
Límites de objetos de seguimiento del trabajo
Wikis, búsqueda, documentación de
navegación de &
Comparta información con wikis, busque dentro y entre proyectos y aprenda a navegar
por Azure DevOps.
Introducción
e INFORMACIÓN GENERAL
Navegación del portal web
Introducción a la búsqueda
c GUÍA PASO A PASO
Establecimiento de las preferencias
Habilitación o deshabilitación de características en versión preliminar
Establecimiento de favoritos personales o de equipo
Conectar a un proyecto
Adición y administración de wikis
e INFORMACIÓN GENERAL
Acerca de wikis, archivos LÉAME y Markdown
Diferencias entre wikis publicadas y aprovisionadas
f INICIO RÁPIDO
Crear una wiki para su proyecto
Adición y edición de páginas de wiki
Publicación de un repositorio de Git en una wiki
i REFERENCIA
Guía de sintaxis para el uso básico de Markdown
Guía de sintaxis para el uso de Markdown en wiki
Guía de sintaxis para el uso de Markdown en wiki
Search
e INFORMACIÓN GENERAL
Búsqueda en todo el código, wiki, paquetes y elementos de trabajo
c GUÍA PASO A PASO
Código de búsqueda
Buscar paquetes
Buscar elementos de trabajo
Navegación por el portal web
e INFORMACIÓN GENERAL
Información general sobre la navegación
c GUÍA PASO A PASO
Habilitación o deshabilitación de características en versión preliminar
Trabajo con Favoritos
Filtrar listas, paneles y directorios
Accesos directos del teclado
Solicitar, obtener, & realizar un seguimiento de los comentarios
e INFORMACIÓN GENERAL
Acerca de solicitar y proporcionar comentarios
c GUÍA PASO A PASO
Solicitud de comentarios, extensión Test & Feedback
Solicitar comentarios, Microsoft Feedback Client
Seguimiento de comentarios
Documentación de extensibilidad de
Marketplace &
Descubra, administre y desarrolle extensiones y widgets para la integración con Azure
DevOps.
Descubrimiento y administración de extensiones de Marketplace
p CONCEPTO
Acerca de Marketplace de Azure DevOps
c GUÍA PASO A PASO
Extensiones de solicitud
Instalar extensiones
Administrar permisos de extensión
Desarrollar extensiones
f INICIO RÁPIDO
Desarrollar una extensión web
Ejemplos de extensiones
Puntos de extensibilidad
g TUTORIAL
Crear una tarea de canalizaciones personalizada
Integrar aplicaciones
e INFORMACIÓN GENERAL
Información general de la integración
c GUÍA PASO A PASO
Autorización del acceso a las API REST con OAuth 2.0
Autenticación del acceso con tokens de acceso personal
i REFERENCIA
Bibliotecas cliente de .NET
Integración con Slack o Microsoft Teams
c GUÍA PASO A PASO
Azure Boards con Slack
Azure Pipelines con Slack
Azure Pipelines con Microsoft Teams
Integración con enlaces de servicio
e INFORMACIÓN GENERAL
Integración con enlaces de servicio
g TUTORIAL
Creación de un enlace de servicio con Microsoft Teams
Creación de un enlace de servicio con WebHooks
Información general de las extensiones
Artículo • 13/10/2022 • Tiempo de lectura: 6 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Las extensiones son complementos que puede usar para personalizar y ampliar su
experiencia con Azure DevOps.
Se escriben con tecnologías estándar ( HTML, JavaScript,
CSS) y se desarrollan con sus herramientas de desarrollo preferidas.
Las extensiones se publican en Visual Studio Marketplace , donde se pueden mantener
privadas para usted y su equipo o compartirse públicamente con los millones de
desarrolladores que actualmente usan Azure DevOps.
Las extensiones usan nuestra biblioteca de API RESTful para interactuar fácilmente con
Azure DevOps y con aplicaciones o servicios.
Descripción de las partes de una extensión
Los siguientes elementos componen una extensión:
Archivo de manifiesto JSON: contiene información básica sobre la extensión.
Recursos de detección: Markdown e imágenes que componen la introducción y la
estética de la extensión en Marketplace.
Archivos estáticos: contienen la lógica de la extensión, incluidos los archivos HTML,
JS y CSS. Los archivos estáticos solo se aplican a las extensiones basadas en
contribuciones.
Estos archivos y recursos se agrupan para crear un archivo VSIX publicado en
Marketplace.
Desde Marketplace, los usuarios pueden instalar extensiones directamente en su
organización. Si no tiene permisos para instalar una extensión, pero es miembro del
proyecto, puede solicitar una extensión en su lugar.
Uso de una extensión
Hay docenas de maneras de usar una extensión y lugares donde puede agregar a la
interfaz de usuario y vamos a agregar más cada sprint. Obtenga información sobre
todos los lugares donde puede agregar un centro en los puntos de extensibilidad.
Proporcione nuevas tareas de Azure Pipelines que los equipos puedan usar en sus
compilaciones.
Use widgets de panel para obtener vistas personalizadas en Azure DevOps.
Amplíe el formulario de elemento de trabajo con nuevas pestañas, secciones y
acciones.
Cree su propio centro para insertar nuevas funcionalidades en nuestras
experiencias ágiles, de código, de compilación y de prueba.
Desarrolle acciones que se puedan ejecutar en centros de conectividad, tanto si
son nuestras como las que ha creado.
Evaluación de una extensión de Marketplace
Para evaluar una extensión de Marketplace, revise la información y los recursos descritos
en la tabla siguiente. Puede encontrar esta información en la información de extensión.
Información
Uso
Distintivo de publicador
El publicador ha demostrado su compromiso con sus clientes y marketplace a través de
excelentes directivas, calidad, confiabilidad y soporte técnico. Para obtener más
información, vaya a Publicador superior.
Preguntas y respuestas
La sección Q & A de las extensiones publicadas puede responder a preguntas que
puede tener. Además, son un buen mecanismo para interactuar con los editores de la
extensión para tener un diálogo significativo para que se sienta cómodo. Use la
información de Q & A para comprender las prácticas de desarrollo, pruebas y seguridad
que sigue el publicador. También le da una idea de la capacidad de respuesta del editor.
Opiniones de clasificaciones &
Las clasificaciones y las revisiones indican cómo otros perciben la oferta.
Directivas de privacidad, licencia y soporte técnico
Compruebe si el publicador los ha proporcionado y si satisface sus necesidades o
preocupaciones. Para obtener más información, vaya a Información de seguridad.
Información de seguridad
Examen de malware: Marketplace ejecuta un examen de virus en cada paquete de
extensión nuevo y actualizado que se publica para garantizar su seguridad. Hasta
que todo el examen esté claro, no publicamos la extensión para su uso público. Si
aparece un problema, el equipo de Marketplace tiene los medios para deshabilitar
una extensión inmediatamente y notificar a sus clientes existentes.
Examen de contenido: Marketplace examina el contenido de cada extensión nueva
y actualizada para evitar exponer contenido inapropiado o ofensivo en las páginas
de Marketplace.
Acceso solo a ámbitos aprobados: una extensión solo puede funcionar dentro de
los ámbitos concedidos. Por ejemplo, una extensión que solo tiene permisos de
lectura en los elementos de trabajo no puede modificar las características y
errores. Las extensiones web de Azure DevOps se ejecutan en un IFrame del
explorador de espacio aislado. Solo pueden acceder a los datos y las API de Azure
DevOps aprobadas para la extensión. Durante la instalación, se pide a los
administradores que aprueben los permisos y ámbitos. Una manera de protegerse
es revisar cuidadosamente los ámbitos solicitados por la extensión.
7 Nota
Si los ámbitos cambian para una extensión, debe aprobar la actualización para
que pueda aplicarse en su organización o colección.
Tareas de compilación y versión de terceros: las tareas se implementan como
código que se ejecuta en una máquina del agente. Las tareas solo pueden acceder
a los secretos proporcionados explícitamente (consulte secretos de variables), pero
las tareas suelen tener acceso total a la propia máquina del agente. Para reducir el
riesgo, ejecute compilaciones en agentes hospedados por Microsoft, que son
máquinas virtuales aisladas de otros trabajos y recicladas después de cada trabajo.
O bien, limite el acceso a archivos y redes en máquinas del agente hospedado
privado. Obtenga más información sobre los agentes de compilación y versión.
Ejecución de código de terceros en el servidor: no hay forma de que una
extensión instale o ejecute código en Azure DevOps Server.
Publicador principal
El programa Top Publisher de Marketplace está diseñado para ayudarle a evaluar o
adquirir extensiones e integraciones de Azure DevOps con confianza. El distintivo Top
Publisher implica que el publicador ha mostrado compromiso con sus clientes y
marketplace a través de directivas ejemplares, calidad, confiabilidad y soporte técnico.
Es para editores con una o varias extensiones o integraciones globales de Azure DevOps
y no es aplicable para el IDE de Visual Studio y Visual Studio Code publicadores de
extensiones.
Marketplace asigna el distintivo a un publicador después de revisar cuidadosamente el
publicador en los parámetros siguientes:
Directiva de privacidad
Directiva de licencias
Directiva de soporte técnico
Documentación
Capacidad de respuesta de Q & A
Revisión de clasificaciones & para sus ofertas
Participación activa y recuento de instalaciones para sus ofertas
Puede esperar soporte técnico oportuno y una buena experiencia general al obtener
una extensión de un publicador superior. Consulte las ofertas de los principales
publicadores .
Para obtener más información sobre el programa Top Publisher,
consulte los requisitos de cumplimiento del publicador.
7 Nota
A través de este programa, es el editor que está siendo certificado. Esto no cubre el
software ni la seguridad de sus extensiones e integraciones. Se recomienda leer la
sección anterior al evaluar las ofertas de un publicador.
Si tiene una extensión de un publicador superior y no está satisfecho con su experiencia,
considere la posibilidad de interactuar primero con el publicador. Después, si aún no
está satisfecho, póngase en contacto con el equipo de Marketplace.
Compilación de una extensión
Antes de compilar una extensión, familiarícese con los tipos de extensión ya disponibles
en Marketplace, Extensiones para Azure DevOps .
Obtenga información sobre cómo
compilar su primera extensión y consulte nuestros ejemplos de conjuntos completos.
Desarrollo de la primera extensión
Muestras
Para obtener más información sobre la creación de extensiones, consulte los siguientes
artículos:
API de REST
Enlaces de servicio
Empaquetar, publicar e instalar la extensión
Empaquetar y publicar la integración con una aplicación o servicio externo
Compartir su trabajo públicamente con toda la comunidad
Puede desarrollar una extensión para la canalización de entrega continua como se
describe en el vídeo siguiente.
Pasos siguientes
Desarrollar una extensión
Artículos relacionados
Visual Studio Marketplace
Página Publicador de extensiones
Programa de partners de Visual Studio
Referencia del manifiesto de extensión
Instalar extensiones
Artículo • 18/11/2022 • Tiempo de lectura: 16 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Aprenda a instalar, asignar, deshabilitar y desinstalar extensiones, que agregan nuevas
características y funcionalidades para Azure DevOps.
Para obtener más información sobre las extensiones, consulte la introducción al
desarrollo y la publicación .
Requisitos previos
Para instalar extensiones, debe ser miembro del grupo Administradores de la
colección de proyectos. Los propietarios de la organización son automáticamente
miembros de este grupo. Si no tiene permisos, puede solicitar extensiones en su
lugar o buscar un administrador de colecciones de proyectos.
Las extensiones privadas se deben compartir con la organización para que se
instalen. Consulte la documentación de publicación para obtener información
sobre cómo compartir extensiones privadas.
Instalar una extensión
Instale una extensión en su organización siguiendo estos pasos.
Browser
1. Inicie sesión en su organización ( https://dev.azure.com/{yourorganization} ).
2. Seleccione el icono de la bolsa de compras y, a continuación, seleccione
Examinar Marketplace.
3. Busque la extensión que desea instalar y seleccione Obtener gratis.
4. Seleccione su organización en el menú desplegable y, a continuación,
seleccione Instalar para instalar la extensión.
¿Por qué no veo ninguna organización?
¿Por qué no puedo instalar esta extensión?
La extensión ya está instalada. Ahora puede ir a su organización para usar la
extensión. Además, informe a su equipo sobre esta extensión, para que puedan
empezar a usar sus funcionalidades.
Desinstalación o deshabilitación de una
extensión
7 Nota
Los cargos continúan por una extensión de pago hasta que se reducen todos los
usuarios a cero (0) para la extensión.
Browser
1. Inicie sesión en su organización ( https://dev.azure.com/{yourorganization} ).
2. Seleccione Configuración de la organización.
3. Seleccione Extensiones y, a continuación, seleccione la extensión que desea
desinstalar o deshabilitar.
4. Seleccione Desinstalar o seleccione los puntos suspensivos (...) y, a
continuación, seleccione Deshabilitar.
Habilitar o enumerar extensiones a través de la
línea de comandos
Habilite una extensión con el comando az devops extension enable . Para empezar,
consulte Introducción a la CLI de Azure DevOps.
Azure CLI
az devops extension enable --extension-name
--publisher-name
[--org]
Parámetros: habilitación de la extensión
extension-name: nombre de la extensión que se va a habilitar.
publisher-name: el nombre del publicador de extensiones.
org: dirección URL de la organización de Azure DevOps. Configure la organización
predeterminada con az devops configure -d organization=ORG_URL . Obligatorio si
no está configurado como predeterminado o seleccionado mediante git config .
Ejemplo: --org https://dev.azure.com/MyOrganizationName/ .
Ejemplo: habilitación de la extensión
El siguiente comando habilita la extensión Timetracker y muestra el resultado en
formato de tabla.
Azure CLI
az devops extension enable --extension-name Timetracker --publisher-name
7pace --output table
Publisher Id Extension Id Name Version Last Updated
States
-------------- -------------- ----------- ----------- --------------- -
-------
7pace Timetracker Timetracker 5.0.1.34507 2019-11-13
none
Enumerar extensiones
Puede enumerar las extensiones instaladas en su organización con el comando az
devops extension list . Para empezar, consulte Introducción a la CLI de Azure DevOps.
Azure CLI
az devops extension list [--include-built-in {false, true}]
[--include-disabled {false, true}]
[--org]
Parámetros opcionales: enumerar extensiones
include-built-in: incluye las extensiones integradas. Los valores aceptados son true
(valor predeterminado) y false.
include-disabled: incluya las extensiones deshabilitadas. Los valores aceptados son
true (valor predeterminado) y false.
org: dirección URL de la organización de Azure DevOps. Puede configurar la
organización predeterminada mediante az devops configure -d
organization=ORG_URL . Obligatorio si no está configurado como predeterminado o
seleccionado mediante git config . Ejemplo: --org
https://dev.azure.com/MyOrganizationName/ .
Ejemplo: enumerar extensiones
En el siguiente comando se enumeran las extensiones de la organización. Excluye las
extensiones deshabilitadas y integradas y muestra los resultados en formato de tabla.
Azure CLI
az devops extension list --include-built-in false --include-disabled false -
output table
Publisher Id Extension Id Name Version
Last Updated States Flags
-------------- ----------------------- ----------------------- ----------
--------- --------------- ----------------------- -------
ms vss-analytics Analytics
18.160.0.2130149925 2019-11-22 multiVersion, truste... trusted
ms vss-code-search Code Search
18.160.0.1640944814 2019-11-22 multiVersion, truste... trusted
ms vss-plans Delivery Plans
18.160.0.1266795967 2019-11-25 multiVersion, truste... trusted
ms-eswm dependencytracker Dependency Tracker
2.1910.12801 2019-10-28 none
ms-devlabs workitem-feature-tim... Feature timeline and... 0.0.357
2019-10-14 none
AgileParts gantt GANTT chart 1.0.79
2019-10-25 none
gordon-bee... github GitHub Widget 0.10.0
2016-03-16 none
ms-devlabs vsts-extensions-mult... Multivalue control 2.2.26
2019-11-15 none
agile-exte... product-vision Product Vision 2.0.6
2019-06-04 none
mohitbagra related-workitems Related Work items 2.0.4
2017-11-12 none
YodLabs TagsManager2 Tags Manager 0.9.31
2019-02-04 none
ms-devlabs team-calendar Team Calendar 2.0.15
2019-11-01 none
ms vss-testmanager-web Test Manager for TFS...
18.160.0.2130893445 2019-11-25 multiVersion, truste... trusted
mmanela vsts-workitem-recent... Who recently viewed ... 1.0.4
2019-03-22 none
ottostreif... wiql-editor Wiql Editor 2.0.90
2019-06-21 none
mohitbagra workitem-checklist Work item checklist 3.2.4
2019-06-24 none
mohitbagra witoneclickactions Work item form one c... 2.3.2
2018-04-03 none
ms-devlabs WorkItemVisualizatio... Work Item Visualizat... 1.4.64
2018-04-03 none
Enumerar información de extensión
Puede enumerar los detalles de una extensión con el comando az devops extension
show . Para empezar, consulte Introducción a la CLI de Azure DevOps.
Azure CLI
az devops extension show --extension-name
--publisher-name
[--org]
Parámetros: enumerar la información de la extensión
extension-name: el nombre de la extensión.
publisher-name: el nombre del publicador de extensiones.
org: dirección URL de la organización de Azure DevOps. Puede configurar la
organización predeterminada mediante az devops configure -d
organization=ORG_URL . Obligatorio si no está configurado como predeterminado o
seleccionado mediante git config . Ejemplo: --org
https://dev.azure.com/MyOrganizationName/ .
Ejemplo: enumerar información de extensión
El siguiente comando muestra información sobre la extensión Timetracker en formato
de tabla.
Azure CLI
az devops extension show --extension-name Timetracker --publisher-name 7pace
--output table
Publisher Id Extension Id Name Version Last Updated
States
-------------- -------------- ----------- ----------- --------------- -
-------
7pace Timetracker Timetracker 5.0.1.34507 2019-11-13
disabled
Preguntas más frecuentes (P+F)
P: ¿Cómo obtener soporte técnico para suscripciones,
facturación y Marketplace de Azure?
R: Según el soporte técnico que necesite, elija entre los siguientes artículos:
Preguntas más frecuentes sobre facturación y suscripción de Azure
Soporte técnico de Azure .
Soporte técnico de facturación de Azure
Soporte técnico para suscripciones de Visual Studio
Compatibilidad de Azure DevOps
Póngase en contacto con el equipo de Marketplace de Azure DevOps
Pasos siguientes
Administrar permisos de extensión
Artículos relacionados
Solicitar extensiones y aprobar solicitudes de extensión
Desarrollar una extensión web
Solicitar y aprobar extensiones
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Si no tiene permisos para instalar extensiones, puede solicitar extensiones en su lugar.
Los administradores de la colección de proyectos reciben un correo electrónico cuando
otro miembro del proyecto solicita una extensión. Azure DevOps instala
automáticamente la extensión una vez aprobada.
Prerrequisitos
Para solicitar extensiones, debe ser colaborador de su organización.
Para aprobar extensiones, debe ser miembro del grupo Administradores de la
colección de proyectos y tener permisos de información de nivel de colección
Editar.
Solicitud de una extensión
1. Inicie sesión en su organización ( https://dev.azure.com/{yourorganization} ).
2. Seleccione Configuración de la organización.
3. Seleccione Extensiones y, a continuación, Examinar Marketplace.
4. Seleccione una extensión para instalar.
5. Si no tiene permiso para instalar la extensión, puede solicitarla ahora.
Revise las solicitudes después de que Marketplace envíe la solicitud al administrador de
la colección de proyectos.
Las solicitudes aparecen en la página Extensiones , pestaña Solicitado .
Para aprobar extensiones, debe tener permisos de información de nivel de colección de
edición.
Aprobación de una solicitud de extensión
1. Vaya al proyecto de Azure DevOps,
https://dev.azure.com/{organization}/{project} .
2. Seleccione el icono del contenedor de compras y, a continuación, Administrar
extensiones.
3. Revise y apruebe las extensiones solicitadas.
Después de aprobar las solicitudes de extensión, las extensiones se instalan
automáticamente.
4. Asigne esas extensiones a los usuarios que necesitan acceso.
Informe a su equipo sobre las extensiones instaladas, para que puedan empezar a usar
sus funcionalidades.
Artículos relacionados
Preguntas más frecuentes
Configuración de facturación
Precios de Azure DevOps
Asignación de niveles de acceso por pertenencia a grupos
Administrar permisos de extensión
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Obtenga información sobre cómo administrar permisos para usuarios o grupos, para
que puedan administrar extensiones.
Requisitos previos
Debe ser miembro del grupo Administradores de recopilación de proyectos para
administrar permisos para usuarios o grupos. Los propietarios de la organización
son miembros automáticamente de este grupo.
Las extensiones privadas se deben compartir con la organización para que se
instalen. Consulte la documentación de publicación para obtener información
sobre cómo compartir extensiones privadas.
Administración de permisos
1. Inicie sesión en su organización ( https://dev.azure.com/{yourorganization} ).
2. Seleccione Configuración de la organización.
3. Seleccione Extensiones.
4. Seleccione Seguridad.
5. Agregar usuarios o actualizar la configuración de permisos.
Artículos relacionados
Instalar extensiones
Extensiones de solicitud
Desinstalar o deshabilitar extensiones
Acerca de los permisos
Elección del mecanismo de
autenticación correcto
Artículo • 18/11/2022 • Tiempo de lectura: 4 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
En el caso de las aplicaciones que interactúan con Azure DevOps Services, debe
autenticarse para obtener acceso a recursos como las API REST. Entendemos que Azure
DevOps Services ofrece muchas maneras diferentes de autenticar la aplicación. En este
artículo se proporcionan instrucciones para ayudarle a elegir la autenticación adecuada
para la aplicación. En la tabla siguiente se describe el mecanismo de autenticación
recomendado para distintos tipos de aplicación. Consulte las siguientes descripciones
básicas, ejemplos y ejemplos de código para empezar.
Tipo de Descripción ejemplo Mecanismo de Ejemplos
aplicación autenticación de
código
Lado cliente Aplicación cliente, que Aplicación de consola Biblioteca de Muestra
interactivo permite la interacción que enumera autenticación
(REST) del usuario, la llamada a proyectos en una de Microsoft
Azure DevOps Services organización (MSAL)
API REST
Cliente Aplicación cliente, que Aplicación de consola Bibliotecas de Muestra
interactivo permite la interacción que enumera los cliente
(biblioteca del usuario, la llamada a errores asignados al
cliente) Azure DevOps Services usuario actual
bibliotecas cliente
JavaScript Aplicación JavaScript Aplicación de página Biblioteca de Muestra
interactivo basada en GUI única de AngularJS autenticación
que muestra de Microsoft
información del para JavaScript
proyecto para un (MSAL JS)
usuario
Un token de Alternativa sencilla a los Use su PAT en lugar Palmaditas
acceso tokens de OAuth de la contraseña.
personal normales.
(PAT)
Tipo de Descripción ejemplo Mecanismo de Ejemplos
aplicación autenticación de
código
Lado cliente Aplicación del lado Aplicación de consola Perfil de Muestra
no interactivo cliente solo de texto sin que muestra todos dispositivo
encabezado los errores asignados
a un usuario
Aplicación Aplicación cliente, que Aplicación de consola Biblioteca Muestra
interactiva permite la interacción que permite a los cliente
del lado del usuario, autentica a usuarios de Azure (interactiva y
cliente los usuarios de Azure DevOps ver errores autenticación
dirigida a DevOps asignados de Windows)
Azure
DevOps
Web Aplicación web basada Panel web OAuth Muestra
interactiva en GUI personalizado que
muestra resúmenes
de compilación
aplicación de Azure DevOps Server Azure DevOps Server Bibliotecas Muestra
Azure aplicación mediante la extensión que cliente
DevOps biblioteca OM de cliente muestra paneles de
Server errores de equipo
extensión de extensión de Azure Tarjetas ágiles SDK de tutorial de
Azure DevOps Services extensión web ejemplo
DevOps de VSS
Services
7 Nota
La API de Azure DevOps aún no admite el acceso de servicio no interactivo a través
de entidades de servicio, aunque se encuentra en la hoja de ruta. Si necesita llamar
a la API de Azure DevOps desde una aplicación no interactiva (donde un usuario
final no se puede autenticar de forma interactiva, como un trabajo en segundo
plano), debe usar un token de acceso personal (PAT). Dado que se trata de una
credencial de seguridad, el PAT debe almacenarse en un almacenamiento seguro,
como Azure Key Vault. Si es posible, la aplicación no interactiva debe usar una
identidad administrada para acceder a Key Vault, de modo que la aplicación
nunca necesite almacenar ningún secreto o credencial.
Para más información sobre cómo se administran la seguridad y la identidad, consulte
Acerca de la seguridad y la identidad.
Para más información sobre cómo almacenamos sus credenciales, consulte
Almacenamiento de credenciales para Azure DevOps.
Habilitar la autenticación básica de IIS invalida
el uso de PAT para Azure DevOps Server
Obtenga más información sobre el uso de la autenticación básica de IIS con Azure
DevOps local.
Preguntas más frecuentes (P+F)
P: ¿Por qué no puede una de mis cuentas de servicio
acceder a la API REST de Azure DevOps?
R: Es posible que su cuenta de servicio no tenga "materializado". Puesto que el inicio de
sesión no es posible con una cuenta de servicio que no tenga permisos de inicio de
sesión interactivos, consulte este trabajo .
P: Estoy realizando una aplicación interactiva del lado
cliente. ¿Debo usar Azure DevOps Services bibliotecas
cliente o Azure DevOps Services API REST?
R: Se recomienda usar Azure DevOps Services bibliotecas cliente a través de las API REST
al acceder a los recursos de Azure DevOps Services. Son más sencillos y fáciles de
mantener cuando se producen cambios de versión en los puntos de conexión REST. Si
falta la funcionalidad de las bibliotecas cliente, MSAL es el mejor mecanismo de
autenticación que se usará con nuestras API REST.
P: ¿Es esta guía solo para Azure DevOps Services o
también es relevante para los usuarios locales Azure
DevOps Server?
R: Esta guía es principalmente para Azure DevOps Services usuarios. Las bibliotecas
cliente son una serie de paquetes creados específicamente para ampliar Azure DevOps
Server funcionalidad. Para los usuarios locales, se recomienda usar las bibliotecas
cliente, la autenticación de Windows o los tokens de acceso personal (PAT) para
autenticarse para un usuario.
P: ¿Qué ocurre si quiero que mi aplicación se autentique
con Azure DevOps Server y Azure DevOps Services?
R: El procedimiento recomendado es tener diferentes rutas de autenticación para Azure
DevOps Server y Azure DevOps Services. Puede usar requestContext para averiguar cuál
está presionando y, a continuación, usar el mejor mecanismo para cada uno. En su lugar,
si desea una solución unificada, los PAT funcionan para ambos.
Autenticación y seguridad
Artículo • 18/11/2022 • Tiempo de lectura: 3 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Este artículo solo pertenece a las extensiones web y no a las extensiones de tarea
pipelines ni a las extensiones de punto de conexión de servicio. Para esas tareas, puede
usar publicar en Azure Service Bus tarea.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Llamada a las API REST desde la extensión
La mayoría de las extensiones tienen que llamar a las API REST de Azure DevOps en
nombre del usuario actual.
Si usa el proporcionado JavaScript REST clients , la autenticación se controla
automáticamente. Estos clientes solicitan automáticamente un token de acceso
desde el SDK principal y lo establecen en el encabezado Authorization de la
solicitud.
Si no usa los clientes proporcionados, debe solicitar un token de Core SDK y
establecerlo en el encabezado Authorization de la solicitud:
JavaScript
VSS.require(["VSS/Authentication/Services"],
function (VSS_Auth_Service) {
VSS.getAccessToken().then(function(token){
// Format the auth header
var authHeader =
VSS_Auth_Service.authTokenManager.getAuthorizationHeader(token);
// Add token as an Authorization header to your request
});
});
Autenticación de solicitudes en el servicio
Un escenario común es realizar llamadas a un servicio back-end desde una extensión.
Para comprobar que estas llamadas proceden de la extensión que se ejecuta en Azure
DevOps y para comprobar la autenticidad del usuario actual (y otra información de
contexto), se pone a disposición de la extensión un tipo especial de token. Este token
contiene información sobre quién realiza la llamada y también una firma que puede
validar para saber que la solicitud procede de la extensión.
Obtención de la clave de la extensión
La clave única de la extensión (que se genera cuando se publica la extensión) se puede
usar para comprobar la autenticidad de las solicitudes realizadas desde la extensión.
Para obtener esta clave, haga clic con el botón derecho en una extensión publicada y
seleccione Certificado.
2 Advertencia
Los cambios de ámbito en una extensión hacen que el certificado cambie. Si realiza
cambios en el ámbito, necesita una nueva clave de extensión.
Generación de un token para proporcionar al servicio
1. El método core SDK getAppToken devuelve una promesa que, cuando se resuelve,
contiene un token firmado con el certificado de la extensión.
JavaScript
VSS.getAppToken().then(function(token){
// Add token to your request
});
2. Pase este token al servicio como un parámetro de consulta o encabezado de
solicitud.
Análisis y validación del token
Este es un ejemplo de análisis del token. En primer lugar, descargue y almacene el
secreto de la extensión. Puede obtenerlo desde la página del publicador. Este secreto
debe estar disponible para la aplicación.
.NET Framework
Debe agregar 1 referencia para obtener este ejemplo para compilarlo.
1. Abra el Administrador de paquetes NuGet y agregue una referencia a
System.IdentityModel.Tokens.Jwt. Este ejemplo se creó con la versión 5.2.2 de este
paquete.
C#
using System.Collections.Generic;
using System.ServiceModel.Security.Tokens;
using Microsoft.IdentityModel.Tokens;
namespace TokenSample
class Program
static void Main(string[] args)
string secret = ""; // Load your extension's secret
string issuedToken = ""; // Token you are validating
var validationParameters = new TokenValidationParameters()
IssuerSigningKey = new
SymmetricSecurityKey(System.Text.UTF8Encoding.UTF8.GetBytes(secret)),
ValidateIssuer = false,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateLifetime = true,
ValidateAudience = false,
ValidateActor = false
};
SecurityToken token = null;
var tokenHandler = new JwtSecurityTokenHandler();
var principal = tokenHandler.ValidateToken(issuedToken,
validationParameters, out token);
.NET Core: WebAPI
Debe agregar 1 referencia para obtener este ejemplo para compilarlo.
1. Abra el Administrador de paquetes NuGet y agregue una referencia a
System.IdentityModel.Tokens.Jwt. Este ejemplo se creó con la versión 5.1.4 de este
paquete.
Startup.cs
C#
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
namespace TokenSample.Core.API
public class Startup
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
services.AddMvc();
string _secret = "ey9asfasdmax..<the secret key downloaded from
the Azure DevOps Services publisher page>.9faf7eh";
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer((o) =>
o.TokenValidationParameters = new
TokenValidationParameters()
IssuerSigningKey = new
SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secret)),
ValidateIssuer = false,
ValidateAudience = false,
ValidateActor = false,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateLifetime = true
};
});
public void Configure(IApplicationBuilder app, IHostingEnvironment
env)
app.UseAuthentication();
app.UseAuthorization();
app.UseMvc();
app.UseStaticFiles();
}
Los controladores de API:
C#
[Route("api/[controller]"),
Authorize()]
public class SampleLogicController : Controller
// ...
Uso de tokens de acceso personal
Artículo • 17/01/2023 • Tiempo de lectura: 10 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Puede usar un token de acceso personal (PAT) como contraseña alternativa para
autenticarse en Azure DevOps. En este artículo, se muestra cómo crear, usar, modificar y
revocar PAT para Azure DevOps.
Acerca de los PAT
Un token de acceso personal contiene las credenciales de seguridad de Azure DevOps.
Un PAT le identifica, las organizaciones accesibles y ámbitos de acceso. Por lo tanto, son
tan críticos como las contraseñas, por lo que debe tratarlas de la misma manera.
Si trabaja en herramientas de Microsoft, la cuenta de Microsoft (MSA) o Azure Active
Directory (Azure AD) es un enfoque aceptable y bien compatible. Sin embargo, si trabaja
con herramientas de terceros que no admiten cuentas de Microsoft o Azure AD, o no
quiere proporcionar sus credenciales principales a la herramienta, use PAT para limitar el
riesgo.
Puede crear y administrar los PAT mediante una de las siguientes maneras:
la interfaz de usuario en la configuración de usuario, que se describe en detalle en
este artículo
a través de la API de administración del ciclo de vida de PAT
Para configurar PAT para herramientas que no son de Microsoft, use administradores de
credenciales de Git o créelos manualmente. Se recomienda revisar nuestra guía de
autenticación para ayudarle a elegir el mecanismo de autenticación correcto. En el caso
de proyectos más pequeños que requieren una solución menos sólida, los PAT son una
alternativa sencilla. A menos que los usuarios usen un administrador de credenciales,
tienen que escribir sus credenciales cada vez.
Creación de un PAT
7 Nota
Las imágenes que ve desde el portal web pueden diferir de las imágenes que se
ven en este artículo. Estas diferencias se derivan de las actualizaciones realizadas en
Azure DevOps o las características en versión preliminar habilitadas. Hemos
habilitado la característica de página Nuevo administrador de cuentas . La
funcionalidad básica disponible para usted sigue siendo la misma a menos que se
mencione explícitamente.
1. Inicie sesión en su organización ( https://dev.azure.com/{yourorganization} ).
2. En la página principal, abra la configuración de usuario y seleccione Tokens
de acceso personal.
3. Seleccione + New Token (+ Nuevo token).
4. Asigne un nombre al token, seleccione la organización en la que desea usar el
token y, a continuación, establezca el token para que expire automáticamente
después de un número establecido de días.
5. Seleccione los ámbitos de este token para autorizar las tareas específicas.
Por ejemplo, para crear un token para habilitar una compilación y un agente de
versión para autenticarse en Azure DevOps Services, limite el ámbito del token a
grupos de agentes (leer & administrar). Para leer eventos de registro de auditoría
y administrar y eliminar secuencias, seleccione Leer registro de auditoría y, a
continuación, seleccione Crear.
7 Nota
Es posible que esté restringido a la creación de PAT de ámbito completo. Si es
así, el administrador de Azure DevOps en Azure AD ha habilitado una
directiva que le limita a un conjunto de ámbitos definido por el personalizado
específico. Para obtener más información, vea Administrar PAT con
directivas/Restringir la creación de PAT de ámbito completo.
Para un PAT
definido personalizado, el ámbito necesario para acceder a la API de
gobernanza de componentes, vso.governance , no se puede seleccionar en la
interfaz de usuario.
6. Cuando haya terminado, copie el token y almacénelo en una ubicación segura.
Para su seguridad, no se volverá a mostrar.
2 Advertencia
Trate y use un PAT como su contraseña y guárdelo en secreto.
Use su PAT en cualquier lugar donde se requieran las credenciales de usuario para la
autenticación en Azure DevOps.
) Importante
En el caso de las organizaciones respaldadas por Azure Active Directory, tiene 90
días para iniciar sesión con el nuevo PAT; de lo contrario, se considera inactivo. Para
obtener más información, consulte Frecuencia de inicio de sesión de usuario para
el acceso condicional.
Notificaciones
Los usuarios reciben dos notificaciones durante la vigencia de un PAT: una tras la
creación y la otra siete días antes de la expiración.
Después de crear un PAT, recibirá una notificación similar al ejemplo siguiente. Esta
notificación confirma que el PAT se agregó a su organización.
En la imagen siguiente se muestra un ejemplo de la notificación de siete días antes de
que expire el PAT.
Notificación inesperada
Si recibe una notificación pat inesperada, es posible que un administrador o herramienta
haya creado un PAT en su nombre. Vea los ejemplos siguientes:
Al conectarse a un repositorio de Git de Azure DevOps a través de git.exe. crea un
token con un nombre para mostrar como "git:
https://MyOrganization.visualstudio.com/ en MyMachine".
Cuando usted o un administrador configuran una implementación de Azure App
Service aplicación web, crea un token con un nombre para mostrar como "Service
Hooks: : Azure App Service: : Deploy web app".
Cuando usted o un administrador configuran pruebas de carga web como parte de
una canalización, crea un token con un nombre para mostrar como
"WebAppLoadTestCDIntToken".
Cuando se configura una extensión de mensajería de integración de Teams
Microsoft, crea un token con un nombre para mostrar como "Microsoft integración
de Teams".
2 Advertencia
Si cree que existe un PAT en error, le sugerimos que revoque el PAT. A
continuación, cambie la contraseña. Como usuario de Azure AD, consulte con el
administrador para ver si la organización se usó desde un origen o ubicación
desconocidos. Consulte también las preguntas más frecuentes sobre cómo
proteger accidentalmente un PAT en un repositorio público de GitHub.
Usar un PAT
Su PAT es su identidad y le representa cuando lo usa, al igual que una contraseña.
Git
Las interacciones de Git requieren un nombre de usuario, que puede ser cualquier cosa
excepto la cadena vacía.
Para usar un PAT con autenticación básica HTTP, use Base64-
encode para y $MyPat , que se incluye en el siguiente bloque de código.
Windows
En PowerShell, escriba el código siguiente.
PowerShell
$MyPat = 'yourPAT'
$B64Pat =
[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("`:$MyPa
t"))
git -c http.extraHeader="Authorization: Basic $B64Pat" clone
https://dev.azure.com/yourOrgName/yourProjectName/_git/yourRepoName
Para mantener el token más seguro, use administradores de credenciales para que
no tenga que escribir las credenciales cada vez. Se recomienda el Administrador de
credenciales de Git . Se requiere Git para Windows .
Repositorios existentes
En el caso de los repositorios existentes, si ya ha agregado el origen mediante el
nombre de usuario, ejecute primero el siguiente comando.
git remote remove origin
De lo contrario, ejecute el siguiente comando.
git remote add origin https://<PAT>@<company_machineName>.visualstudio.com:/<path-
to-git-repo> path to git repo = <project name>/_git/<repo_name> git push -u origin
--all
Uso de un PAT en el código
Puede usar un PAT en el código.
Windows
Si desea proporcionar el PAT a través de un encabezado HTTP, conviértalo primero
en una cadena Base64. En el ejemplo siguiente se muestra cómo convertir en
Base64 mediante C#.
C#
Authorization: Basic BASE64_USERNAME_PAT_STRING
A continuación, la cadena resultante se puede proporcionar como un encabezado
HTTP en el formato siguiente.
En el ejemplo siguiente se usa la clase HttpClient en C#.
C#
public static async void GetBuilds()
{
try
var personalaccesstoken = "PATFROMWEB";
using (HttpClient client = new HttpClient())
client.DefaultRequestHeaders.Accept.Add(
new
System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/jso
n"));
client.DefaultRequestHeaders.Authorization = new
AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "",
personalaccesstoken))));
using (HttpResponseMessage response = client.GetAsync(
"https://dev.azure.com/{organization}/{project}/_apis/build/builds?api-
version=5.0").Result)
response.EnsureSuccessStatusCode();
string responseBody = await
response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
catch (Exception ex)
Console.WriteLine(ex.ToString());
Sugerencia
Cuando use variables, agregue un $ al principio de la cadena, como en el
ejemplo siguiente.
C#
public static async void GetBuilds()
{
try
var personalaccesstoken = "PATFROMWEB";
using (HttpClient client = new HttpClient())
client.DefaultRequestHeaders.Accept.Add(
new
System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application
/json"));
client.DefaultRequestHeaders.Authorization = new
AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "",
personalaccesstoken))));
using (HttpResponseMessage response = client.GetAsync(
$"https://dev.azure.com/{organization}/{project}/_apis/build/builds?
api-version=5.0").Result)
response.EnsureSuccessStatusCode();
string responseBody = await
response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
catch (Exception ex)
Console.WriteLine(ex.ToString());
Cuando el código funciona, es un buen momento para cambiar de autenticación básica
a OAuth.
Para obtener más información y ejemplos de cómo usar PAT, consulte los siguientes
artículos:
Administradores de credenciales de Git
API de REST
NuGet en un equipo Mac
Informes de clientes
Introducción a la CLI de Azure DevOps.
Modificar un PAT
Puede volver a generar o ampliar un PAT y modificar su ámbito. Después de la
regeneración, el PAT anterior ya no está autorizado.
1. En la página principal, abra la configuración de usuario y seleccione Perfil.
2. En Seguridad, seleccione Tokens de acceso personal. Seleccione el token que
desea modificar y, a continuación, Editar.
3. Edite el nombre del token, la organización a la que se aplica, la expiración del
token o el ámbito de acceso asociado al token y, a continuación, seleccione
Guardar.
Revocar un PAT
Puede revocar un PAT en cualquier momento, por diversos motivos.
1. En la página principal, abra la configuración de usuario y seleccione Perfil.
2. En Seguridad, seleccione Tokens de acceso personal. Seleccione el token para el
que desea revocar el acceso y, a continuación, seleccione Revocar.
3. Seleccione Revocar en el cuadro de diálogo de confirmación.
Artículos relacionados
Acerca de la seguridad, la autenticación y la autorización
Permisos y acceso predeterminados para Azure DevOps
Revocación de PAT de usuario (para administradores)
Preguntas más frecuentes
P: ¿Qué ocurre con un PAT si una cuenta de usuario está
deshabilitada?
R: Una vez que un usuario ha quitado de Azure DevOps, el PAT se invalida en un plazo
de 1 hora. Si su organización está conectada a Azure Active Directory (Azure AD), el PAT
también se invalida en Azure AD, ya que pertenece al usuario. Se recomienda que el
usuario gire su PAT a otra cuenta de usuario o servicio para mantener los servicios en
ejecución.
P: ¿Hay alguna manera de renovar un PAT a través de la
API REST?
R: Sí, hay una manera de renovar, administrar y crear PAT mediante nuestras API de
administración del ciclo de vida de PAT. Para obtener más información, consulte
Administración de PAT mediante la API REST y nuestras preguntas más frecuentes.
P: ¿Puedo usar la autenticación básica con todas las API
REST de Azure DevOps?
A. No. Puede usar la autenticación básica con la mayoría de las API REST de Azure
DevOps, pero las organizaciones y los perfiles solo admiten OAuth. Para obtener más
información, consulte Administración de PAT mediante la API REST.
P: ¿Qué ocurre si comprueba accidentalmente mi PAT en
un repositorio público en GitHub?
R: Azure DevOps examina los PAT protegidos en repositorios públicos en GitHub.
Cuando encontramos un token filtrado, se envía inmediatamente una notificación por
correo electrónico detallada al propietario del token y se registra un evento en el
registro de auditoría de la organización de Azure DevOps. Animamos a los usuarios
afectados a mitigar inmediatamente girando o revocando el PAT filtrado.
Hay una directiva para administrar las PAT filtradas. Para obtener más información, vea
Revocar pats filtrados automáticamente.
P: ¿Puedo usar un token de acceso personal como ApiKey
para publicar paquetes NuGet en una fuente de Azure
Artifacts mediante la línea de comandos
dotnet/nuget.exe?
A. No. Azure Artifacts no admite el paso de un token de acceso personal como ApiKey.
Al usar un entorno de desarrollo local, se recomienda instalar el proveedor de
credenciales de Azure Artifacts para autenticarse con Azure Artifacts. Consulte los
ejemplos siguientes para obtener más detalles: dotnet, NuGet.exe.
Si desea publicar los
paquetes mediante Azure Pipelines, use la tarea Autenticación de NuGet para
autenticarse con el ejemplo de fuente.
Autorización del acceso a las API REST
con OAuth 2.0
Artículo • 18/11/2022 • Tiempo de lectura: 17 minutos
Azure DevOps Services
En este artículo, aprenderá a autenticar a los usuarios de la aplicación web para el
acceso a la API REST, por lo que la aplicación no sigue buscando nombres de usuario y
contraseñas.
7 Nota
Las instrucciones siguientes están pensadas para Azure DevOps Services usuarios,
ya que OAuth 2.0 no se admite en Azure DevOps Server. Las bibliotecas cliente son
una serie de paquetes creados específicamente para ampliar Azure DevOps Server
funcionalidad. Para los usuarios locales, se recomienda usar bibliotecas de cliente,
autenticación de Windows o tokens de acceso personal (PAT) para autenticarse en
nombre de un usuario.
Azure DevOps Services usa el protocolo OAuth 2.0 para autorizar la aplicación a un
usuario y generar un token de acceso. Use este token cuando llame a las API de REST
desde su aplicación.
Cuando llame a las API de Azure DevOps Services para ese usuario, use el token de
acceso de ese usuario. Los tokens de acceso expiran, así que actualiza el token de
acceso si ha expirado.
Para obtener un ejemplo de C# del flujo general, consulte vsts-auth-samples .
7 Nota
Puede registrar una aplicación dentro de la instancia de Azure Active Directory
(Azure AD). Para más información, consulte Autenticación de OAuth 2.0 con el
protocolo Azure AD y OpenID Connect.
1. Registrar la aplicación
1. Vaya a para https://app.vsaex.visualstudio.com/app/register registrar la
aplicación.
2. Seleccione los ámbitos que necesita la aplicación y, a continuación, use los mismos
ámbitos al autorizar la aplicación. Si registró la aplicación con las API de versión
preliminar, vuelva a registrarse porque los ámbitos que usó ya están en desuso.
3. Seleccione Crear aplicación.
Se muestra la página de configuración de la aplicación.
Cuando Azure DevOps Services presenta la página de aprobación de
autorización al usuario, usa el nombre de la empresa, el nombre de la
aplicación y las descripciones. También usa las direcciones URL del sitio web
de la empresa, el sitio web de la aplicación y los términos de servicio y las
declaraciones de privacidad.
Cuando Azure DevOps Services solicita la autorización de un usuario y el
usuario lo concede, el explorador del usuario se redirige a la dirección URL de
devolución de llamada de autorización con el código de autorización.
La
dirección URL de devolución de llamada debe ser una conexión segura
(https) para volver a transferir el código a la aplicación y coincidir
exactamente con la dirección URL registrada en la aplicación. Si no es así, se
muestra una página de error 400 en lugar de una página que pide al usuario
que conceda autorización a la aplicación.
4. Llame a la dirección URL de autorización y pase el identificador de la aplicación y
los ámbitos autorizados cuando quiera que un usuario autorice a la aplicación a
acceder a su organización.
Llame a la dirección URL del token de acceso cuando
quiera obtener un token de acceso para llamar a una API rest de Azure DevOps
Services.
La configuración de cada aplicación que registre está disponible en el perfil
https://app.vssps.visualstudio.com/profile/view .
2. Autorización de la aplicación
1. Si el usuario aún no ha autorizado la aplicación para acceder a su organización,
llame a la dirección URL de autorización. Le llama de nuevo con un código de
autorización, si el usuario aprueba la autorización.
no-highlight
https://app.vssps.visualstudio.com/oauth2/authorize
?client_id={app ID}
&response_type={Assertion}
&state={state}
&scope={scope}
&redirect_uri={callback URL}
Parámetro Tipo Notas
client_id GUID Identificador asignado a la aplicación cuando se registró.
response_type string Assertion
state string Puede ser cualquier valor. Normalmente, un valor de cadena
generado que correlaciona la devolución de llamada con su
solicitud de autorización asociada.
scope string Ámbitos registrados con la aplicación. Espacio separado. Consulte
los ámbitos disponibles.
redirect_uri Resolución Dirección URL de devolución de llamada de la aplicación. Debe
coincidir exactamente con la dirección URL registrada con la
aplicación.
2. Agregue un vínculo o un botón al sitio que lleve al usuario al punto de conexión
de autorización Azure DevOps Services:
no-highlight
https://app.vssps.visualstudio.com/oauth2/authorize
?client_id=88e2dd5f-4e34-45c6-a75d-524eb2a0399e
&response_type=Assertion
&state=User1
&scope=vso.work%20vso.code_write
&redirect_uri=https://fabrikam.azurewebsites.net/myapp/oauth-
callback
Azure DevOps Services pide al usuario que autorice la aplicación.
Suponiendo que el usuario acepta, Azure DevOps Services redirige el explorador del
usuario a la dirección URL de devolución de llamada, incluido un código de autorización
de corta duración y el valor de estado proporcionado en la dirección URL de
autorización:
no-highlight
https://fabrikam.azurewebsites.net/myapp/oauth-callback
?code={authorization code}
&state=User1
3. Obtener un token de acceso y actualización
para el usuario
Use el código de autorización para solicitar un token de acceso (y un token de
actualización) para el usuario. El servicio debe realizar una solicitud HTTP de servicio a
servicio para Azure DevOps Services.
Dirección URL: autorización de la aplicación
no-highlight
POST https://app.vssps.visualstudio.com/oauth2/token
Encabezados de solicitud HTTP: autorización de la
aplicación
Encabezado Value
Content-Type application/x-www-form-urlencoded
Content- Longitud calculada de la cadena del cuerpo de la solicitud (consulte el ejemplo
Length siguiente)
no-highlight
Content-Type: application/x-www-form-urlencoded
Content-Length: 1322
Cuerpo de la solicitud HTTP: autorización de la aplicación
no-highlight
client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-
bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-
bearer&assertion={1}&redirect_uri={2}
Reemplace los valores de marcador de posición en el cuerpo de la solicitud de ejemplo
anterior:
{0}: secreto de cliente codificado con dirección URL adquirido cuando se registró la
aplicación.
{1}: dirección URL codificada como "código" proporcionada a través del parámetro
de consulta a la code dirección URL de devolución de llamada.
{2}: dirección URL de devolución de llamada registrada con la aplicación.
Ejemplo de C# para formar el cuerpo de la solicitud: autorizar
aplicación
no-highlight
public string GenerateRequestPostData(string appSecret, string authCode,
string callbackUrl)
return String.Format("client_assertion_type=urn:ietf:params:oauth:client-
assertion-type:jwt-bearer&client_assertion=
{0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=
{1}&redirect_uri={2}",
HttpUtility.UrlEncode(appSecret),
HttpUtility.UrlEncode(authCode),
callbackUrl
);
Respuesta: autorización de la aplicación
JSON
"access_token": { access token for the user },
"token_type": { type of token },
"expires_in": { time in seconds that the token remains valid },
"refresh_token": { refresh token to use to acquire a new access token }
) Importante
Conserve de forma segura el refresh_token para que la aplicación no tenga que
pedir al usuario que vuelva a autorizar. Los tokens de acceso expiran rápidamente y
no se deben conservar.
4. Uso del token de acceso
Para usar un token de acceso, inclúyalo como token de portador en el encabezado
authorization de la solicitud HTTP:
Authorization: Bearer {access_token}
Por ejemplo, la solicitud HTTP para obtener compilaciones recientes para un proyecto:
no-highlight
GET https://dev.azure.com/myaccount/myproject/_apis/build-release/builds?
api-version=3.0
Authorization: Bearer {access_token}
Actualización de un token de acceso expirado
Si expira el token de acceso de un usuario, puede usar el token de actualización que
adquirió en el flujo de autorización para obtener un nuevo token de acceso. Es como el
proceso original para intercambiar el código de autorización para un token de acceso y
actualización.
DIRECCIÓN URL: token de actualización
no-highlight
POST https://app.vssps.visualstudio.com/oauth2/token
Encabezados de solicitud HTTP: token de actualización
Encabezado Value
Encabezado Value
Content-Type application/x-www-form-urlencoded
Content- Longitud calculada de la cadena del cuerpo de la solicitud (consulte el ejemplo
Length siguiente)
no-highlight
Content-Type: application/x-www-form-urlencoded
Content-Length: 1654
Cuerpo de la solicitud HTTP: token de actualización
no-highlight
client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-
bearer&client_assertion={0}&grant_type=refresh_token&assertion=
{1}&redirect_uri={2}
Reemplace los valores de marcador de posición en el cuerpo de la solicitud de ejemplo
anterior:
{0}: secreto de cliente codificado con dirección URL adquirido cuando se registró la
aplicación.
{1}: token de actualización con codificación URL para el usuario.
{2}: dirección URL de devolución de llamada registrada con la aplicación.
Respuesta: token de actualización
JSON
"access_token": { access token for this user },
"token_type": { type of token },
"expires_in": { time in seconds that the token remains valid },
"refresh_token": { new refresh token to use when the token has timed out
}
) Importante
Se emite un nuevo token de actualización para el usuario. Conserve este nuevo
token y úselo la próxima vez que necesite adquirir un nuevo token de acceso para
el usuario.
Ámbitos
) Importante
Los ámbitos solo habilitan el acceso a las API REST y seleccionan puntos de
conexión de Git. No se admite el acceso a la API SOAP.
Category Ámbito Nombre Descripción
Grupos de vso.agentpools Grupos de agentes Concede la
agentes (lectura) capacidad de
ver tareas,
grupos, colas,
agentes y
trabajos que se
están
ejecutando o
completados
recientemente
para los
agentes.
vso.agentpools_manage Grupos de agentes Concede la
(leer, administrar) capacidad de
administrar
grupos, colas y
agentes.
vso.environment_manage Entorno (lectura, Concede la
administración) capacidad de
administrar
grupos, colas,
agentes y
entornos.
Analytics vso.analytics Análisis (lectura) Concede la
capacidad de
consultar datos
de análisis.
Category Ámbito Nombre Descripción
Registro de vso.auditlog Registro de Concede la
auditoría auditoría (lectura) capacidad de
leer el registro
de auditoría a
los usuarios.
Compilación vso.build Compilación Concede la
(lectura) capacidad de
acceder a los
artefactos de
compilación,
incluidos los
resultados de
compilación, las
definiciones y
las solicitudes, y
la capacidad de
recibir
notificaciones
sobre eventos
de compilación
a través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.build_execute Compilación Concede la
(lectura y ejecución) capacidad de
acceder a
artefactos de
compilación,
incluidos los
resultados de
compilación, las
definiciones y
las solicitudes, y
la capacidad de
poner en cola
una
compilación,
actualizar las
propiedades de
compilación y la
capacidad de
recibir
notificaciones
sobre eventos
de compilación
a través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
Código vso.code Código (leer) Concede la
capacidad de
leer código
fuente y
metadatos
sobre
confirmaciones,
conjuntos de
cambios, ramas
y otros
artefactos de
control de
versiones.
También
concede la
capacidad de
buscar código y
recibir
notificaciones
sobre eventos
de control de
versiones a
través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.code_write Código (lectura y Concede la
escritura) capacidad de
leer, actualizar y
eliminar código
fuente, acceder
a metadatos
sobre
confirmaciones,
conjuntos de
cambios, ramas
y otros
artefactos de
control de
versiones.
También
concede la
capacidad de
crear y
administrar
solicitudes de
incorporación
de cambios y
revisiones de
código y recibir
notificaciones
sobre eventos
de control de
versiones a
través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.code_manage Código (lectura, Concede la
escritura y capacidad de
administración) leer, actualizar y
eliminar código
fuente, acceder
a metadatos
sobre
confirmaciones,
conjuntos de
cambios, ramas
y otros
artefactos de
control de
versiones.
También
concede la
capacidad de
crear y
administrar
repositorios de
código, crear y
administrar
solicitudes de
incorporación
de cambios y
revisiones de
código, y recibir
notificaciones
sobre eventos
de control de
versiones a
través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.code_full Código (completo) Concede acceso
completo al
código fuente,
metadatos
sobre
confirmaciones,
conjuntos de
cambios, ramas
y otros
artefactos de
control de
versiones.
También
concede la
capacidad de
crear y
administrar
repositorios de
código, crear y
administrar
solicitudes de
incorporación
de cambios y
revisiones de
código, y recibir
notificaciones
sobre eventos
de control de
versiones a
través de
enlaces de
servicio.
También incluye
compatibilidad
limitada con las
API de OM de
cliente.
vso.code_status Código (estado) Concede la
capacidad de
leer y escribir el
estado de la
solicitud de
incorporación
de cambios y
confirmación.
Category Ámbito Nombre Descripción
Derechos vso.entitlements Derechos (lectura) Proporciona
acceso de solo
lectura al punto
de conexión de
derechos de
licencia para
obtener
derechos de
cuenta.
vso.memberentitlementmanagement Administración de Concede la
MemberEntitlement capacidad de
(lectura) leer usuarios,
sus licencias, así
como proyectos
y extensiones a
los que pueden
acceder.
vso.memberentitlementmanagement_write Administración de Concede la
MemberEntitlement capacidad de
(escritura) administrar
usuarios, sus
licencias, así
como proyectos
y extensiones a
los que pueden
acceder.
Extensiones vso.extension Extensiones Concede la
(lectura) capacidad de
leer las
extensiones
instaladas.
vso.extension_manage Extensiones (leer y Concede la
administrar) capacidad de
instalar,
desinstalar y
realizar otras
acciones
administrativas
en las
extensiones
instaladas.
Category Ámbito Nombre Descripción
vso.extension.data Datos de extensión Concede la
(lectura) capacidad de
leer datos
(configuración y
documentos)
almacenados
por extensiones
instaladas.
vso.extension.data_write Datos de extensión Concede la
(lectura y escritura) capacidad de
leer y escribir
datos
(configuración y
documentos)
almacenados
por extensiones
instaladas.
Identidad del vso.graph Gráfico (lectura) Concede la
grafo & capacidad de
leer información
de usuario,
grupo, ámbito y
pertenencia a
grupos.
vso.graph_manage Gráfico Concede la
(administrar) capacidad de
leer información
de usuario,
grupo, ámbito y
pertenencia a
grupos, y para
agregar
usuarios, grupos
y administrar
pertenencias a
grupos.
vso.identity Identidad (leer) Concede la
capacidad de
leer identidades
y grupos.
Category Ámbito Nombre Descripción
vso.identity_manage Identidad Concede la
(administrar) capacidad de
leer, escribir y
administrar
identidades y
grupos.
Prueba de vso.loadtest Prueba de carga Concede la
carga (lectura) capacidad de
leer las
ejecuciones de
pruebas de
carga, los
resultados de
las pruebas y los
artefactos de
APM.
vso.loadtest_write Prueba de carga Concede la
(lectura y escritura) capacidad de
crear y
actualizar
ejecuciones de
pruebas de
carga y leer
metadatos,
incluidos los
resultados de
las pruebas y los
artefactos de
APM.
Grupo de vso.machinegroup_manage Grupo de Proporciona la
equipos implementación capacidad de
(lectura, administrar
administración) grupos de
agentes y
grupos de
implementación.
Marketplace vso.gallery Marketplace Concede acceso
de lectura a
elementos y
publicadores
públicos y
privados.
Category Ámbito Nombre Descripción
vso.gallery_acquire Marketplace Concede acceso
(adquirir) de lectura y la
capacidad de
adquirir
elementos.
vso.gallery_publish Marketplace Concede acceso
(publicación) de lectura y la
capacidad de
cargar,
actualizar y
compartir
elementos.
vso.gallery_manage Marketplace Concede acceso
(administrar) de lectura y la
capacidad de
publicar y
administrar
elementos y
publicadores.
Notificaciones vso.notification Notificaciones Proporciona
(lectura) acceso de
lectura a
suscripciones y
metadatos de
eventos,
incluidos los
valores de
campo filtrables.
vso.notification_write Notificaciones Proporciona
(escritura) acceso de
lectura y
escritura a
suscripciones y
acceso de
lectura a
metadatos de
eventos,
incluidos los
valores de
campo filtrables.
Category Ámbito Nombre Descripción
vso.notification_manage Notificaciones Proporciona
(administrar) acceso de
lectura, escritura
y administración
a las
suscripciones y
acceso de
lectura a los
metadatos de
eventos,
incluidos los
valores de
campo filtrables.
vso.notification_diagnostics Notificaciones Proporciona
(diagnósticos) acceso a los
registros de
diagnóstico
relacionados
con
notificaciones y
proporciona la
capacidad de
habilitar
diagnósticos
para
suscripciones
individuales.
Empaquetado vso.packaging Empaquetado Concede la
(lectura) capacidad de
leer fuentes y
paquetes.
vso.packaging_write Empaquetado Concede la
(lectura y escritura) capacidad de
crear y leer
fuentes y
paquetes.
vso.packaging_manage Empaquetado Concede la
(lectura, escritura y capacidad de
administración) crear, leer,
actualizar y
eliminar fuentes
y paquetes.
Category Ámbito Nombre Descripción
Proyecto y vso.project Proyecto y equipo Concede la
equipo (leer) capacidad de
leer proyectos y
equipos.
vso.project_write Proyecto y equipo Concede la
(lectura y escritura) capacidad de
leer y actualizar
proyectos y
equipos.
vso.project_manage Proyecto y equipo Concede la
(leer, escribir y capacidad de
administrar) crear, leer,
actualizar y
eliminar
proyectos y
equipos.
Versión vso.release Versión (lectura) Concede la
capacidad de
leer artefactos
de versión,
incluidas las
versiones, las
definiciones de
versión y el
entorno de
versión.
vso.release_execute Versión (lectura, Concede la
escritura y capacidad de
ejecución) leer y actualizar
artefactos de
versión,
incluidas las
versiones, las
definiciones de
versión y el
entorno de
versión, y la
capacidad de
poner en cola
una nueva
versión.
Category Ámbito Nombre Descripción
vso.release_manage Versión (lectura, Concede la
escritura, ejecución capacidad de
y administración) leer, actualizar y
eliminar
artefactos de
versión,
incluidas las
versiones, las
definiciones de
versión y el
entorno de
versión, y la
capacidad de
poner en cola y
aprobar una
nueva versión.
Seguridad vso.security_manage Seguridad Concede la
(administrar) capacidad de
leer, escribir y
administrar
permisos de
seguridad.
Conexiones de vso.serviceendpoint Puntos de conexión Concede la
servicio de servicio (lectura) capacidad de
leer puntos de
conexión de
servicio.
vso.serviceendpoint_query Puntos de conexión Concede la
de servicio (lectura capacidad de
y consulta) leer y consultar
los puntos de
conexión del
servicio.
vso.serviceendpoint_manage Puntos de conexión Concede la
de servicio (leer, capacidad de
consultar y leer, consultar y
administrar) administrar
puntos de
conexión de
servicio.
Category Ámbito Nombre Descripción
Configuración vso.settings Configuración Concede la
(lectura) capacidad de
leer la
configuración.
vso.settings_write Configuración Concede la
(lectura y escritura) capacidad de
crear y leer la
configuración.
Symbols vso.symbols Símbolos (lectura) Concede la
capacidad de
leer símbolos.
vso.symbols_write Símbolos (lectura y Concede la
escritura) capacidad de
leer y escribir
símbolos.
vso.symbols_manage Símbolos (lectura, Concede la
escritura y capacidad de
administración) leer, escribir y
administrar
símbolos.
Grupos de vso.taskgroups_read Grupos de tareas Concede la
tareas (lectura) capacidad de
leer grupos de
tareas.
vso.taskgroups_write Grupos de tareas Concede la
(leer, crear) capacidad de
leer y crear
grupos de
tareas.
vso.taskgroups_manage Grupos de tareas Concede la
(leer, crear y capacidad de
administrar) leer, crear y
administrar
grupos de
tareas.
Category Ámbito Nombre Descripción
Panel de vso.dashboards Paneles de equipo Concede la
equipo (lectura) capacidad de
leer la
información del
panel del
equipo.
vso.dashboards_manage Paneles de equipo Concede la
(administrar) capacidad de
administrar la
información del
panel del
equipo.
Administración vso.test Administración de Concede la
de pruebas pruebas (lectura) capacidad de
leer planes de
prueba, casos,
resultados y
otros artefactos
relacionados
con la
administración
de pruebas.
vso.test_write Administración de Concede la
pruebas (lectura y capacidad de
escritura) leer, crear y
actualizar planes
de prueba,
casos,
resultados y
otros artefactos
relacionados
con la
administración
de pruebas.
Tokens vso.tokens Tokens de Concede la
autorización capacidad de
delegados administrar
tokens de
autorización
delegados a los
usuarios.
Category Ámbito Nombre Descripción
vso.tokenadministration Administración de Concede la
tokens capacidad de
administrar (ver
y revocar)
tokens
existentes a los
administradores
de la
organización.
Perfil de vso.profile Perfil de usuario Concede la
usuario (leer) capacidad de
leer el perfil, las
cuentas, las
colecciones, los
proyectos, los
equipos y otros
artefactos de la
organización de
nivel superior.
vso.profile_write Perfil de usuario Concede la
(escritura) capacidad de
escribir en su
perfil.
Grupos de vso.variablegroups_read Grupos de variables Concede la
variables (lectura) capacidad de
leer grupos de
variables.
vso.variablegroups_write Grupos de variables Concede la
(lectura, creación) capacidad de
leer y crear
grupos de
variables.
vso.variablegroups_manage Grupos de variables Concede la
(leer, crear y capacidad de
administrar) leer, crear y
administrar
grupos de
variables.
Category Ámbito Nombre Descripción
Wiki vso.wiki Wiki (lectura) Concede la
capacidad de
leer wikis,
páginas wiki y
datos adjuntos
wiki. También
concede la
capacidad de
buscar páginas
wiki.
vso.wiki_write Wiki (lectura y Concede la
escritura) capacidad de
leer, crear y
actualizar wikis,
páginas wiki y
datos adjuntos
wiki.
Elementos de vso.work Elementos de Concede la
trabajo trabajo (leer) capacidad de
leer elementos
de trabajo,
consultas,
paneles, rutas
de acceso de
área e
iteraciones y
otros metadatos
relacionados
con el
seguimiento de
elementos de
trabajo. También
concede la
capacidad de
ejecutar
consultas,
buscar
elementos de
trabajo y recibir
notificaciones
sobre eventos
de elementos de
trabajo a través
de enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.work_write Elementos de Concede la
trabajo (lectura y capacidad de
escritura) leer, crear y
actualizar
elementos de
trabajo y
consultas,
actualizar
metadatos del
panel, leer áreas
de lectura e
iteraciones rutas
de acceso a
otros metadatos
relacionados de
seguimiento de
elementos de
trabajo, ejecutar
consultas y
recibir
notificaciones
sobre eventos
de elementos de
trabajo a través
de enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.work_full Elementos de Concede acceso
trabajo (completos) completo a
elementos de
trabajo,
consultas,
trabajos
pendientes,
planes y
metadatos de
seguimiento de
elementos de
trabajo. También
proporciona la
capacidad de
recibir
notificaciones
sobre eventos
de elementos de
trabajo a través
de enlaces de
servicio.
Registre la aplicación y use ámbitos para indicar los permisos de Azure DevOps Services
que requiere la aplicación.
Cuando los usuarios autorizan a la aplicación a acceder a su
organización, la autorizan para esos ámbitos.
La solicitud de la autorización pasa los
mismos ámbitos que registró.
Para obtener más información, vea Crear datos adjuntos o seguimiento de elementos de
trabajo.
Ejemplos
Puede encontrar un ejemplo de C# que implementa OAuth para llamar a Azure DevOps
Services API REST en nuestro ejemplo de GitHub de OAuth de C# .
Preguntas más frecuentes (P+F)
P: ¿Puedo usar OAuth con mi aplicación de teléfono
móvil?
A. No. Azure DevOps Services solo admite el flujo del servidor web, por lo que no hay
ninguna manera de implementar OAuth, ya que no se puede almacenar de forma
segura el secreto de la aplicación.
P: ¿Qué errores o condiciones especiales necesito
controlar en mi código?
R: Asegúrese de controlar las siguientes condiciones:
Si el usuario deniega el acceso a la aplicación, no se devuelve ningún código de
autorización. No use el código de autorización sin comprobar la denegación.
Si el usuario revoca la autorización de la aplicación, el token de acceso ya no es
válido. Cuando la aplicación usa el token para acceder a los datos, se devuelve un
error 401. Vuelva a solicitar autorización.
P: Quiero depurar mi aplicación web localmente. ¿Puedo
usar localhost para la dirección URL de devolución de
llamada al registrar mi aplicación?
A. Sí. Azure DevOps Services ahora permite localhost en la dirección URL de devolución
de llamada. Asegúrese de usar https://localhost como principio de la dirección URL de
devolución de llamada al registrar la aplicación.
P: Obtengo un error HTTP 400 cuando intento obtener un
token de acceso. ¿Qué podría estar mal?
R: Compruebe que establece el tipo de contenido en application/x-www-form-
urlencoded en el encabezado de la solicitud.
P: Obtengo un error HTTP 401 cuando uso un token de
acceso basado en OAuth, pero un PAT con el mismo
ámbito funciona bien. ¿Por qué?
R: Compruebe que el administrador de la organización no ha deshabilitado el acceso a
aplicaciones de terceros a través de OAuth en https://dev.azure.com/{your-org-
name}/_settings/organizationPolicy .
En este escenario, el flujo para autorizar una aplicación y generar un token de acceso
funciona, pero todas las API REST devuelven solo un error, como TF400813: The user "
<GUID>" is not authorized to access this resource.
P: ¿Puedo usar OAuth con los puntos de conexión SOAP y
las API REST?
A. No. OAuth solo se admite en las API REST en este momento.
P: ¿Cómo puedo obtener detalles de los datos adjuntos
de mi elemento de trabajo mediante las API REST de
Azure DevOps?
R: En primer lugar, obtenga los detalles del elemento de trabajo con elementos de
trabajo- Obtener la API REST de elementos de trabajo:
REST
GET https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/{id}
Para obtener los detalles de los datos adjuntos, debe agregar el siguiente parámetro a la
dirección URL:
REST
$expand=all
Con los resultados, obtendrá la propiedad relations. Allí puede encontrar la dirección
URL de los datos adjuntos y, dentro de la dirección URL, puede encontrar el
identificador. Por ejemplo:
REST
$url =
https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/434?
$expand=all&api-version=5.0
$workItem = Invoke-RestMethod -Uri $url -Method Get -ContentType
application/json
$split = ($workitem.relations.url).Split('/')
$attachmentId = $split[$split.count - 1]
# Result: 1244nhsfs-ff3f-25gg-j64t-fahs23vfs
Artículos relacionados
Selección del método de autenticación adecuado
Permisos y acceso predeterminados para Azure DevOps
Uso de la CLI multiplataforma para
Azure DevOps mediante tokens de
acceso personal (PAT)
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Puede descargar la versión más reciente de Node.js código fuente, en la página
de descargas de código fuente deNode.js
Instalación de la CLI multiplataforma para Azure DevOps
Instale tfx-cli mediante npm , un componente de Node.js mediante la ejecución
de:
no-highlight
npm i -g tfx-cli
Para más información sobre tfx-cli, consulte la CLI de Node para Azure DevOps en
GitHub .
Token de acceso personal
Empiece por crear un token de acceso personal y péguelo en el comando de inicio de
sesión.
~$ tfx login
Copyright Microsoft Corporation
> Service URL: {url}
> Personal access token: xxxxxxxxxxxx
Logged in successfully
Algunos ejemplos de direcciones URL válidas son:
https://marketplace.visualstudio.com
https://youraccount.visualstudio.com/DefaultCollection
Configuración de la autenticación básica
) Importante
No se recomienda la autenticación básica. Al activar la autenticación básica de IIS
se producen varios problemas, y debe usar tokens de acceso personal (PAT) en su
lugar. Por ejemplo, si activa la autenticación básica de IIS, la línea de comandos de
GIT deja de funcionar.
Siga estos pasos para habilitar la autenticación básica para la instancia de Azure
DevOps:
2 Advertencia
La autenticación básica envía nombres de usuario y contraseñas en texto no
cifrado. Debe considerar la posibilidad de configurar Azure DevOps Server usar
SSL para habilitar la comunicación segura al usar la autenticación básica.
1. Instalación de la Basic Authentication característica para IIS en Administrador del
servidor
2. Abra el Administrador de IIS y expanda al Azure DevOps Server sitio web, haga
doble clic en el Authentication icono de la vista Características.
3. Elija Basic Authentication en la lista de métodos de autenticación. Elija Enable en
la columna de la derecha. Ahora debería ver Basic Authentication habilitado.
7 Nota
Deje vacía la configuración de dominio y dominio para autenticación básica.
Inicio de sesión de tfx con autenticación básica
Ahora puede empezar a usar tfx en el servidor. Le interesará iniciar sesión antes de
emitir comandos.
1. Escriba el comando siguiente:
no-highlight
tfx login --auth-type basic
2. Agregue la dirección URL del servicio.
3. Agregue el nombre de usuario. Use domain\user (por ejemplo, fabrikam\peter). Si
está trabajando en una máquina de grupo de trabajo, use machinename\user .
4. Agregue la contraseña. Escriba la contraseña del nombre de usuario que escribió
anteriormente.
Ahora puede usar cualquier otro comando tfx.
no-highlight
> tfx login --auth-type basic
Copyright Microsoft Corporation
Enter service url > http://localhost:8080/tfs/defaultcollection
Enter username > fabfiber\peter
Enter password > *******
logged in successfully
La habilitación de la autenticación
básica de IIS invalida mediante tokens
de acceso personal
Artículo • 13/12/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Se recomienda mantener desactivada la autenticación básica de IIS siempre al usar
Azure DevOps Server. Solo si es necesario, debe habilitar la autenticación básica de IIS.
Cuando la autenticación básica de IIS está habilitada en la máquina Windows, evita que
use tokens de acceso personal (PAT) como mecanismo de autenticación.
Por ejemplo, si usa un PAT para permitir que una aplicación de terceros recupere
información de errores y, a continuación, envíe por correo electrónico esa información al
receptor de errores con la autenticación básica de IIS habilitada, esa aplicación produce
un error en la autenticación. La aplicación no puede recuperar información de errores.
Git con autenticación básica de IIS habilitada
2 Advertencia
Si usa Git con autenticación básica de IIS, Git interrumpe porque requiere PAT para
la autenticación de usuario. Aunque no se recomienda usar la autenticación básica
de IIS, al agregar un encabezado adicional a las solicitudes de Git, puede usar Git
con autenticación básica de IIS.
El encabezado adicional debe usarse para todas las instalaciones de Azure DevOps
Server, ya que La autenticación de Windows también impide el uso de PAT.
El encabezado adicional debe incluir una codificación base 64 de "user:PAT". Consulte el
siguiente formato y ejemplo.
Formato
git -c http.extraheader='Authorization: Basic [base 64 encoding of
"user:password"]' ls-remote
http://tfsserver:8080/tfs/DefaultCollection/_git/projectName
Ejemplo
git -c http.extraheader='Authorization: Basic
a2FzYW50aGE6bzN3cDVndmw2YXRkajJkam83Znd4N2k3NDdhbGxjNXp4bnc3b3o0dGQycmd3d2M1
eTdjYQ==' ls-remote
http://tfsserver:8080/tfs/DefaultCollection/_git/projectName
Artículos relacionados
Guía de autenticación
Autorización del acceso a las API REST con OAuth 2.0
Desarrollar una extensión web
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Use extensiones para mejorar Azure DevOps con nuevas experiencias web, widgets de
panel, tareas de compilación, etc. Puede desarrollar extensiones mediante tecnologías
estándar como HTML, JavaScript y CSS. Este tutorial le guía a través de la creación de
una extensión web para Azure DevOps.
Sugerencia
Explore los ejemplos de extensión y la documentación más reciente sobre el
desarrollo de extensiones mediante el SDK de extensión de Azure DevOps.
Requisitos previos
Debe tener los siguientes permisos e instalaciones.
Debe ser propietario de la organización. Si no tiene una organización, puede crear
una organización de forma gratuita .
Instale Node.js .
Instale la herramienta de empaquetado de extensiones (TFX). Ejecute npm install
-g tfx-cli desde un símbolo del sistema, que usará para empaquetar la extensión
más adelante.
Creación de un directorio y un manifiesto
Una extensión se compone de un conjunto de archivos que incluye un archivo de
manifiesto necesario. Se empaqueta en un archivo .vsix y se publica en Visual Studio
Marketplace.
1. Cree un directorio para contener los archivos necesarios para la extensión:
mkdir my-first-extension
2. Desde este directorio, inicialice un nuevo manifiesto de paquete de npm:
npm init -y
En este archivo se describen las bibliotecas necesarias para la extensión.
3. Instale el paquete del SDK de extensión web de Microsoft VSS y guárdelo en el
manifiesto del paquete de npm:
npm install vss-web-extension-sdk --save
Este SDK incluye una biblioteca de JavaScript que proporciona las API necesarias
para comunicarse con la página en la que está insertada la extensión.
4. Cree un archivo de manifiesto de extensión denominado vss-extension.json en la
raíz del directorio de extensión con el siguiente contenido:
JSON
"manifestVersion": 1,
"id": "my-first-extension",
"publisher": "",
"version": "1.0.0",
"name": "My First Extension",
"description": "A sample Visual Studio Services extension",
"public": false,
"categories": ["Azure Repos"],
"targets": [
"id": "Microsoft.VisualStudio.Services"
],
"contributions": [
"id": "my-hub",
"type": "ms.vss-web.hub",
"targets": [
"ms.vss-code-web.code-hub-group"
],
"properties": {
"name": "My Hub",
"uri": "my-hub.html"
],
"files": [
"path": "my-hub.html",
"addressable": true
},
"path": "node_modules/vss-web-extension-sdk/lib",
"addressable": true,
"packagePath": "lib"
7 Nota
La public propiedad controla si la extensión es visible para todos los usuarios
de Visual Studio Marketplace. Mantenga las extensiones privadas durante el
desarrollo.
5. Cree un archivo denominado my-hub.html en la raíz del directorio de extensión
con el siguiente contenido, que es para la vista (también conocida como
concentrador) ha contribuido a la experiencia web.
HTML
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="lib/VSS.SDK.min.js"></script>
<style>
body {
background-color: rgb(0, 67, 117);
color: white;
margin: 10px;
font-family: "Segoe UI VSS (Regular)","-apple-
system",BlinkMacSystemFont,"Segoe UI",sans-serif;
</style>
<script type="text/javascript">
VSS.init();
VSS.ready(function() {
document.getElementById("name").innerText =
VSS.getWebContext().user.name;
});
</script>
</head>
<body>
<h1>Hello, <span id="name"></span></h1>
</body>
</html>
6. El directorio de extensión debe tener un aspecto similar al del ejemplo siguiente.
|-- my-hub.html
|-- node_modules
|-- @types
|-- vss-web-extension-sdk
|-- package.json
|-- vss-extension.json
¿Necesita ayuda? Publique preguntas en el Azure DevOps Services Developer
Community .
Pasos siguientes
Empaquetar y publicar la extensión
Artículos relacionados
Sistema de diseño de fórmulas para desarrolladores
Modelo de contribución
Puntos de extensibilidad
Artículo • 13/10/2022 • Tiempo de lectura: 7 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Las extensiones mejoran la experiencia del usuario de Azure DevOps al contribuir con
nuevas funcionalidades. En este artículo, se resaltan los puntos de extensibilidad más
comunes a los que la extensión puede tener como destino. Para más información sobre
el modelo de extensibilidad de Azure DevOps, consulte el modelo de contribución.
La extensión guía de contribuciones es una extensión de ejemplo. Instale esta
extensión en su organización. Una vez instalado, verá los puntos de extensibilidad que
están disponibles. Se recomienda instalar esta extensión en una organización personal o
de prueba. El origen de esta extensión también está disponible.
Además, busque un
ejemplo de un punto de extensión de creación de repositorios en esta solicitud de
incorporación de cambios de GitHub .
Para más información, consulte azure-devops-extension-api,installedextension api y
azure-devops-extension-sdk.
Centros de conectividad y grupos
concentradores
Los centros de conectividad y los grupos concentradores son los elementos de
navegación principales de Azure DevOps. Los archivos, las versiones, los trabajos
pendientes y las consultas son ejemplos de centros de conectividad. Un centro
pertenece a un grupo concentrador. El centro de archivos, por ejemplo, pertenece al
grupo de concentradores de nivel de proyecto Azure Repos. Los grupos concentradores
pueden existir en el nivel de organización o colección o en el nivel de proyecto. La
mayoría de las extensiones contribuyen al nivel de proyecto.
En la tabla siguiente se describen los grupos de concentradores más comunes de Azure
DevOps a los que puede contribuir.
Nombre ID Nivel Imagen de vista previa
Nombre ID Nivel Imagen de vista previa
Azure Boards ms.vss-work-web.work- Proyecto o
hub-group equipo
Azure Repos ms.vss-code-web.code- Proyecto o
hub-group equipo
Nombre ID Nivel Imagen de vista previa
Azure Pipelines ms.vss-build-web.build- Proyecto o
release-hub-group equipo
Nombre ID Nivel Imagen de vista previa
Nombre ID Nivel Imagen de vista previa
Azure Test Plans ms.vss-test-web.test- Proyecto o
hub-group equipo
Configuración del ms.vss-web.project- Project
proyecto admin-hub-group
Nombre ID Nivel Imagen de vista previa
Configuración de ms.vss-web.collection- Organización
la organización admin-hub-group o colección
Nombre ID Nivel Imagen de vista previa
Ejemplo
En el ejemplo siguiente se muestra cómo contribuir un centro al grupo centro de
código:
JSON
...
"contributions": [
"id": "my-custom-hub",
"type": "ms.vss-web.hub",
"targets": [
"ms.vss-code-web.code-hub-group"
],
"properties": {
"name": "Code Hub",
"order": 30,
"uri": "/views/code/custom.html"
ms.vss-web.hub es el tipo de esta contribución. Este tipo se define en la vss-web
extensión publicada en el ms publicador. Este tipo declara las propiedades
opcionales y necesarias que requieren las contribuciones de este tipo (por ejemplo,
nombre, orden, etc.).
ms.vss-code-web.code-hub-group es el identificador completo de la contribución
del grupo concentrador que tiene como destino este centro. Esta contribución se
declara en la vss-code-web extensión publicada en el ms publicador.
my-custom-hub es el identificador corto de esta contribución; {publisherId}.
{extensionId}.my-custom-hub es el identificador completo.
Agregar un icono a su menú o barra de
herramientas
Agregue una propiedad de icono, por lo que se puede usar directamente por nombre.
Se recomienda proporcionar su propio icono.
Uso de su propio ejemplo de icono:
"properties":
"name": "Sample hub",
"uri": "dist/Hub/Hub.html",
"icon": "asset://static/sample-icon.png",
"supportsMobile": true
}
Uso del ejemplo iconos de Office UI Fabric :
"properties":
"iconName": "Code",
"name": "Code Hub",
"order": 30,
"uri": "/views/code/custom.html"
Configuración de menús y barras de
herramientas
Nombre Id. de destino
Barra de herramientas de información general de ms.vss-admin-web.collection-
organización y recopilación overview-toolbar-menu
Cuadrícula de proyectos de información general de ms.vss-admin-web.projects-grid-menu
recopilación
Barra de herramientas de información general del ms.vss-admin-web.project-overview-
proyecto toolbar-menu
Cuadrícula de teams de información general del ms.vss-admin-web.teams-grid-menu
proyecto
Azure Boards menú y barra de herramientas
Nombre Id. de destino Imagen de vista previa
Menú de consulta de ms.vss-work-
elemento de trabajo web.work-item-
query-menu
Menú de la barra de ms.vss-work-
herramientas de resultados web.work-item-
de la consulta de elementos query-results-
de trabajo toolbar-menu
Nombre Id. de destino Imagen de vista previa
Elemento de menú ms.vss-work-
Resultados de la consulta del web.query-result-
elemento de trabajo work-item-menu
Pestaña Resultados de la ms.vss-work-
consulta de elementos de web.query-tabs
trabajo
Elemento de trabajo para el ms.vss-work-
menú contextual web.work-item-
toolbar-menu
Nombre Id. de destino Imagen de vista previa
Menú Elemento de trabajo ms.vss-work-
pendiente web.backlog-item-
menu
Menú de filtro dinámico de ms.vss-work-
tablero sprint web.sprint-board-
pivot-filter-
menu
Menú de filtro dinámico de ms.vss-work-
panel web.backlog-
board-pivot-
filter-menu
Menú Tarjeta ms.vss-work-
web.backlog-
board-card-item-
menu
Pestaña Trabajo pendiente ms.vss-work-
del producto web.product-
backlog-tabs
Pestaña trabajo pendiente de ms.vss-work-
iteración web.iteration-
backlog-tabs
Nombre Id. de destino Imagen de vista previa
Panel trabajo pendiente de ms.vss-work-
cartera web.portfolio-
backlog-toolpane
Panel trabajo pendiente del ms.vss-work-
producto web.requirement-
backlog-toolpane
Panel de trabajo pendiente ms.vss-work-
de iteración web.iteration-
backlog-toolpane
Menú y barra de herramientas de Azure
Pipelines
Nombre Id. de destino Vista previa
Menú de compilación ms.vss-build-
completado web.completed-build-
menu
Nombre Id. de destino Vista previa
Menú Definiciones de ms.vss-build-
compilación web.build-definition-
menu
Acción de la barra de ms.vss-test-web.test-
herramientas de results-actions-menu
resultados de pruebas
Pestaña Detalles del ms.vss-test-web.test-
resultado de la prueba result-details-tab-
items
Nombre Id. de destino Vista previa
Menú contextual del ms.vss-
Explorador de releaseManagement-
canalizaciones de web.release-
versión definition-explorer-
context-menu
Menú de la barra de ms.vss-
herramientas del releaseManagement-
Explorador de web.release-
canalizaciones de definition-explorer-
versión toolbar-menu
Menú de la barra de ms.vss-
herramientas resumen releaseManagement-
de versión web.release-editor-
tool-bar-menu
Pestaña Resumen de ms.vss-
versión releaseManagement-
web.release-details-
view
Sección de resumen de ms.vss-
la versión releaseManagement-
web.release-details-
summary-tab
Vista de detalles de la ms.vss-build-
canalización, botón de web.pipelines-header-
encabezado menu
Nombre Id. de destino Vista previa
Vista de detalles de la ms.vss-build-
canalización, menú web.pipelines-folder-
contextual de carpeta menu
Tareas de Azure Pipelines
Las tareas realizan el trabajo en una compilación o versión. Para obtener más
información, obtenga información sobre cómo contribuir a una tarea de compilación o
versión.
Azure Repos menú y barra de herramientas
Nombre Id. de destino Imagen de vista previa
Menú Elemento de origen ms.vss-code-
(cuadrícula) web.source-grid-
item-menu
Nombre Id. de destino Imagen de vista previa
Menú Elemento de origen ms.vss-code-
(árbol) web.source-tree-
item-menu
Menú Elemento de origen ms.vss-code-
(cuadrícula y árbol) web.source-item-
menu
Menú Cambiar elemento ms.vss-code-
de lista web.change-list-
item-menu
Menú Cambiar elemento ms.vss-code-
de resumen de lista web.change-list-
summary-item-
menu
Menú de árbol de ramas de ms.vss-code-
Git web.git-
branches-tree-
menu
Nombre Id. de destino Imagen de vista previa
Menú acciones de solicitud ms.vss-code-
de incorporación de web.pull-
cambios de Git request-action-
menu
Pestañas de solicitud de ms.vss-code-
incorporación de cambios web.pr-tabs
de Git (dinamizaciones)
Menú de lista de ms.vss-code-
confirmaciones de Git web.git-commit-
list-menu
Menú de detalles de ms.vss-code-
confirmación de Git web.git-commit-
details-menu
Azure Test Plans menú y barra de herramientas
Nombre Id. de destino Imagen de vista previa
Menú De cuadrícula de ejecución ms.vss-test-web.test-run-
de prueba grid-menu
Menú de árbol de conjuntos de ms.vss-test-web.test-
planes de prueba plans-suites-context
Pestaña dinámica del ms.vss-test-web.test-
concentrador del plan de prueba plan-pivot-tabs
Otros puntos de extensibilidad
Widget de panel: una extensión puede contribuir a un nuevo tipo de widget que
los usuarios pueden agregar a un panel. Obtenga información sobre cómo
contribuir a un widget de panel.
Formulario de elemento de trabajo: el formulario de elemento de trabajo se
mejora mediante extensiones con nuevas secciones, pestañas, acciones y
representadores de campos personalizados. Para obtener más información,
obtenga información sobre cómo extender el formulario de elemento de trabajo.
Enlaces de servicio: un "consumidor" es el servicio al que se envían los eventos en
los enlaces de servicio. Una extensión puede contribuir a los servicios de
consumidor. Estos servicios se configuran mediante un usuario (o mediante
programación) para enviar eventos a ese servicio. Para más información, consulte
Contribución de un consumidor de enlaces de servicio.
Funciones:
Nombre: Característica de versión preliminar (solo hospedada)
Identificador de destino: ms.vss-web.managed-features
Modelo de contribución
Artículo • 04/10/2022 • Tiempo de lectura: 3 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Las extensiones agregan nuevas funcionalidades al sistema proporcionando
contribuciones y definiendo formas para que otras extensiones se conecten a ellas.
Un
tipo de contribución define algo que se puede agregar al sistema. Una contribución es
una instancia específica de un tipo de contribución. Por ejemplo, hub es un tipo de
contribución definido por una extensión básica proporcionada por Microsoft. El
Explorer centro de conectividad del grupo concentrador de compilación es una
contribución específica del tipo hub .
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Tipos de contribución
Un tipo de contribución define un contrato al que deben adherirse todas las
contribuciones al sistema de ese tipo. hub , action y build-task son todos ejemplos de
tipos de contribución. Los tipos definen las propiedades establecidas por instancias de
ese tipo. Cada definición de propiedad indica el tipo de la propiedad (cadena, booleano,
etc.), si la propiedad es necesaria y, opcionalmente, especifica un valor predeterminado
si no se especifica mediante una contribución. Un tipo de contribución también puede
extenderse desde otro tipo de contribución.
Ejemplo
Este es un ejemplo de una declaración de tipo de contribución en un manifiesto de
extensión:
JavaScript
...
"contributionTypes": [
"id": "hub",
"name": "Web Access Hub",
"description": "A hub that appears in the hubs menu at the top
of web pages.",
"properties": {
"name": {
"description": "The text to display for the hub",
"type": "string",
"required": true
},
"uri": {
"description": "URI of the contents of the hub page",
"type": "string",
"required": true
},
"order": {
"description": "An optional ordering value which can
indicate in which position to place the hub within the hub group",
"type": "integer"
...
Contribuciones
Una contribución es una instancia de un tipo de contribución. Por ejemplo, el Queries
centro de trabajo del grupo concentrador de trabajo es una contribución de tipo hub y
la Publish Test Results tarea de compilación es una contribución de tipo build-task .
Todas las contribuciones deben especificar un tipo y especificar valores para las
propiedades requeridas por ese tipo de contribución.
Ejemplo
Este es un ejemplo de una declaración de contribución del centro en un manifiesto de
extensión:
JavaScript
"contributions": [
"id": "build-explorer-hub",
"type": "ms.vss-web.hub",
"targets": [
".build-hub-group"
],
"properties": {
"name": "Explorer",
"uri": "/_build",
"order": 22
Contribuciones dirigidas
Una contribución puede tener como destino una o varias contribuciones. Esto crea una
relación entre la contribución y cada uno de sus destinos que permite al sistema
detectar contribuciones para el destino en tiempo de ejecución. Por ejemplo, una
contribución ( Explorer ) podría tener como hub destino una contribución específica
hub-group ( Build ).
JSON
"id": "build-explorer-hub",
"type": "ms.vss-web.hub",
"targets": [
".build-hub-group"
Cuando se representa el grupo concentrador, el sistema puede consultar todas las
contribuciones de concentrador que tienen como destino el grupo concentrador para
saber qué concentradores se van a representar.
Identificación de contribuciones y tipos
Cada tipo de contribución y contribución debe tener un identificador único (dentro de la
extensión en la que se declara).
Un identificador de contribución completo incluye el identificador del publicador, el
identificador de extensión y el identificador de contribución/tipo, separados por un
punto (.). Por ejemplo: "ms.vss-web.hub" es el identificador completo de la contribución
con el identificador de hub en la vss-web extensión publicada por el ms publicador
(Microsoft).
Las referencias de contribución relativas se pueden usar dentro de un manifiesto de
extensión para la referencia de una contribución a otro tipo de contribución o
contribución dentro de esa misma extensión. En este caso, no se incluyen los
identificadores de publicador y de extensión y el identificador es un punto (.) seguido
del identificador de contribución. Por ejemplo, ".hub" se puede usar dentro de la
extensión "vss-web" mencionada anteriormente como acceso directo para "ms.vss-
web.hub".
Adición de una extensión de tarea de
canalizaciones personalizadas
Artículo • 28/12/2022 • Tiempo de lectura: 22 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Aprenda a instalar extensiones en su organización para tareas personalizadas de
compilación o versión en Azure DevOps.
Para más información sobre el nuevo sistema de compilación y versión multiplataforma,
consulte ¿Qué es Azure Pipelines?.
7 Nota
En este artículo se tratan las tareas del agente en extensiones basadas en agente.
Para obtener información sobre las tareas del servidor o las extensiones basadas en
servidor, consulte la documentación de GitHub de la tarea servidor .
Prerrequisitos
Para crear extensiones para Azure DevOps, necesita el software y las herramientas
siguientes.
Una organización en Azure DevOps. Para obtener más información, consulte
Creación de una organización.
Un editor de texto. Para muchos de los tutoriales, usamos Visual Studio Code, que
proporciona compatibilidad con intelliSense y depuración. Vaya a
code.visualstudio.com para descargar la versión más reciente.
La versión más reciente de Node.js.
TypeScript Compiler 2.2.0 o posterior, aunque se recomienda la versión 4.0.2 o
posterior. Vaya a npmjs.com para descargar el compilador.
CLI multiplataforma para Azure DevOps para empaquetar las extensiones.
Puede
instalar tfx-cli mediante npm , un componente de Node.js mediante la ejecución
npm i -g tfx-cli de .
Un home directorio para el proyecto.
El home directorio de una extensión de tarea
de compilación o versión debe ser similar al ejemplo siguiente después de
completar los pasos descritos en este tutorial:
|--- README.md
|--- images
|--- extension-icon.png
|--- buildandreleasetask // where your task scripts are
placed
|--- vss-extension.json // extension's manifest
Instalación del paquete vss-web-extension-sdk .
) Importante
La máquina de desarrollo debe ejecutar la versión más reciente de Node para
asegurarse de que el código escrito es compatible con el entorno de producción en
el agente y la versión más reciente que no sea de versión preliminar de azure-
pipelines-task-lib.
1. Crear una tarea personalizada
Haga cada parte de 1. Cree una tarea personalizada dentro de la buildandreleasetask
carpeta .
7 Nota
Este tutorial de ejemplo está en Windows con PowerShell. Lo hemos hecho
genérico para todas las plataformas, pero la sintaxis para obtener variables de
entorno es diferente. Si usa un equipo Mac o Linux, reemplace las instancias de
$env:<var>=<val> por export <var>=<val> .
Creación de scaffolding de tareas
1. Cree la estructura de carpetas para la tarea e instale las bibliotecas y dependencias
necesarias.
2. Desde dentro de la buildandreleasetask carpeta, ejecute el siguiente comando.
npm init --yes
npm init crea el package.json archivo . Hemos agregado el --yes parámetro para
aceptar todas las opciones predeterminadas npm init .
Sugerencia
El agente no instala automáticamente los módulos necesarios porque espera
que la carpeta de tareas incluya los módulos de nodo. Para mitigar esto, copie
en node_modules buildandreleasetask . A medida que la tarea es mayor, es fácil
superar el límite de tamaño (50 MB) de un archivo VSIX. Antes de copiar la
carpeta del nodo, puede ejecutar npm install --production o npm prune --
production , o puede escribir un script para compilar y empaquetar todo.
3. Agregue azure-pipelines-task-lib a la biblioteca.
npm install azure-pipelines-task-lib --save
4. Asegúrese de que los términos de TypeScript estén instalados para dependencias
externas.
npm install @types/node --save-dev
npm install @types/q --save-dev
5. Cree un .gitignore archivo y agréguele node_modules. El proceso de compilación
debe realizar un elemento npm install y un para typings install que
node_modules se compilen cada vez y no necesiten estar protegidos.
echo node_modules > .gitignore
6. Instale Mocha como una dependencia de desarrollo.
npm install mocha --save-dev -g
npm install sync-request --save-dev
npm install @types/mocha --save-dev
7. Elija TypeScript versión 2.3.4 o 4.0.2.
npm install typescript@4.0.2 -g --save-dev
7 Nota
Para que el tsc comando esté disponible, asegúrese de que TypeScript está
instalado globalmente con npm en el entorno de desarrollo. Si omite este
paso, TypeScript versión 2.3.4 se usa de forma predeterminada y todavía tiene
que instalar el paquete globalmente para que el tsc comando esté
disponible.
8. Crear tsconfig.json opciones del compilador. Este archivo garantiza que los
archivos TypeScript se compilan en archivos JavaScript.
tsc --init --target es6
Para asegurarse de que se usa el estándar ES6 (en lugar de ES5), agregamos el --
target es6 parámetro .
Creación de una tarea personalizada
Ahora que se ha completado el scaffolding, podemos crear nuestra tarea personalizada.
1. Cree un task.json archivo en la buildandreleasetask carpeta . El task.json
archivo describe la tarea de compilación o versión y es lo que usa el sistema de
compilación o versión para representar las opciones de configuración al usuario y
saber qué scripts se van a ejecutar en tiempo de compilación o lanzamiento.
2. Copie el código siguiente y reemplace por la {{placeholders}} información de la
tarea. El marcador de posición más importante es taskguid y debe ser único.
JSON
{
"$schema": "https://raw.githubusercontent.com/Microsoft/azure-
pipelines-task-lib/master/tasks.schema.json",
"id": "{{taskguid}}",
"name": "{{taskname}}",
"friendlyName": "{{taskfriendlyname}}",
"description": "{{taskdescription}}",
"helpMarkDown": "",
"category": "Utility",
"author": "{{taskauthor}}",
"version": {
"Major": 0,
"Minor": 1,
"Patch": 0
},
"instanceNameFormat": "Echo $(samplestring)",
"inputs": [
"name": "samplestring",
"type": "string",
"label": "Sample String",
"defaultValue": "",
"required": true,
"helpMarkDown": "A sample string"
],
"execution": {
"Node": {
"target": "index.js"
componentes task.json
Consulte las descripciones siguientes de algunos de los componentes del task.json
archivo.
Propiedad Descripción
id Un GUID único para la tarea.
name Nombre sin espacios.
friendlyName Nombre descriptivo (espacios permitidos).
description Descripción detallada de lo que hace la tarea.
author Cadena corta que describe la entidad que desarrolla la tarea de
compilación o versión, por ejemplo: "Microsoft Corporation".
Propiedad Descripción
instanceNameFormat Cómo se muestra la tarea en la lista de pasos de compilación o versión.
Puede usar valores de variable mediante $(variablename).
groups Describe los grupos que las propiedades de tarea pueden agrupar
lógicamente en la interfaz de usuario.
inputs Entradas que se usarán cuando se ejecute la tarea de compilación o
versión. Esta tarea espera una entrada con el nombre samplestring.
execution Opciones de ejecución para esta tarea, incluidos los scripts.
restrictions Las restricciones que se aplican a la tarea sobre los comandos de GitHub
Codespaces pueden llamar a y se puede establecer la tarea de variables. Se
recomienda especificar el modo de restricción para las nuevas tareas.
7 Nota
Para obtener una visión más detallada del archivo task.json, o para obtener
información sobre cómo agrupar varias versiones en la extensión, consulte la
referencia de la tarea Compilación y versión.
3. Cree un index.ts archivo con el código siguiente como referencia. Este código se
ejecuta cuando se llama a la tarea.
TypeScript
import tl = require('azure-pipelines-task-lib/task');
async function run() {
try {
const inputString: string | undefined = tl.getInput('samplestring',
true);
if (inputString == 'bad') {
tl.setResult(tl.TaskResult.Failed, 'Bad input was given');
return;
console.log('Hello', inputString);
catch (err) {
tl.setResult(tl.TaskResult.Failed, err.message);
run();
4. Escriba "tsc" en la buildandreleasetask carpeta para compilar un index.js archivo
desde index.ts .
Ejecución de la tarea
1. Ejecute la tarea con node index.js desde PowerShell.
En el ejemplo siguiente, se produce un error en la tarea porque no se
proporcionaron entradas ( samplestring es una entrada necesaria).
node index.js
##vso[task.debug]agent.workFolder=undefined
##vso[task.debug]loading inputs and endpoints
##vso[task.debug]loaded 0
##vso[task.debug]task result: Failed
##vso[task.issue type=error;]Input required: samplestring
##vso[task.complete result=Failed;]Input required: samplestring
Como corrección, podemos establecer la samplestring entrada y volver a ejecutar
la tarea.
$env:INPUT_SAMPLESTRING="Human"
node index.js
##vso[task.debug]agent.workFolder=undefined
##vso[task.debug]loading inputs and endpoints
##vso[task.debug]loading INPUT_SAMPLESTRING
##vso[task.debug]loaded 1
##vso[task.debug]Agent.ProxyUrl=undefined
##vso[task.debug]Agent.CAInfo=undefined
##vso[task.debug]Agent.ClientCert=undefined
##vso[task.debug]Agent.SkipCertValidation=undefined
##vso[task.debug]samplestring=Human
Hello Human
Esta vez, la tarea se realizó correctamente porque samplestring se proporcionó y ha
generado correctamente "Hello Human"!
2. Prueba unitaria de los scripts de tareas
Realizamos pruebas unitarias para probar rápidamente el script de tarea y no las
herramientas externas a las que llama. Queremos probar todos los aspectos de las rutas
de acceso de éxito y error.
1. Instale las herramientas de prueba. Usamos Mocha como controlador de prueba
en este tutorial.
npm install mocha --save-dev -g
npm install sync-request --save-dev
npm install @types/mocha --save-dev
2. Cree una tests carpeta que contenga un _suite.ts archivo con el siguiente
contenido:
TypeScript
import * as path from 'path';
import * as assert from 'assert';
import * as ttm from 'azure-pipelines-task-lib/mock-test';
describe('Sample task tests', function () {
before( function() {
});
after(() => {
});
it('should succeed with simple inputs', function(done: Mocha.Done)
{
// Add success test here
});
it('it should fail if tool returns 1', function(done: Mocha.Done) {
// Add failure test here
});
});
Sugerencia
La carpeta de prueba debe encontrarse en la carpeta buildandreleasetask. Si
recibe un error de solicitud de sincronización, puede solucionarlo agregando
sync-request a la carpeta buildandreleasetask con el comando npm i --save-
dev sync-request .
3. Cree un success.ts archivo en el directorio de prueba con el siguiente contenido.
Esta creación de archivos simula la ejecución de la tarea y simula todas las
llamadas a métodos externos.
TypeScript
import ma = require('azure-pipelines-task-lib/mock-answer');
import tmrm = require('azure-pipelines-task-lib/mock-run');
import path = require('path');
let taskPath = path.join(__dirname, '..', 'index.js');
let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);
tmr.setInput('samplestring', 'human');
tmr.run();
La prueba de éxito valida que, con las entradas adecuadas, se realiza
correctamente sin errores ni advertencias y devuelve el resultado correcto.
4. Agregue la siguiente prueba de éxito de ejemplo al _suite.ts archivo para
ejecutar el ejecutor ficticio de la tarea.
TypeScript
it('should succeed with simple inputs', function(done: Mocha.Done) {
this.timeout(1000);
let tp = path.join(__dirname, 'success.js');
let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
tr.run();
console.log(tr.succeeded);
assert.equal(tr.succeeded, true, 'should have succeeded');
assert.equal(tr.warningIssues.length, 0, "should have no
warnings");
assert.equal(tr.errorIssues.length, 0, "should have no errors");
console.log(tr.stdout);
assert.equal(tr.stdout.indexOf('Hello human') >= 0, true, "should
display Hello human");
done();
});
5. Cree un failure.ts archivo en el directorio de prueba como ejecutor ficticio de
tareas con el siguiente contenido:
TypeScript
import ma = require('azure-pipelines-task-lib/mock-answer');
import tmrm = require('azure-pipelines-task-lib/mock-run');
import path = require('path');
let taskPath = path.join(__dirname, '..', 'index.js');
let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);
tmr.setInput('samplestring', 'bad');
tmr.run();
La prueba de error valida que cuando la herramienta recibe entradas incorrectas o
incompletas, se produce un error de la manera esperada con la salida útil.
6. Agregue el código siguiente al _suite.ts archivo para ejecutar el ejecutor ficticio
de la tarea.
TypeScript
it('it should fail if tool returns 1', function(done: Mocha.Done) {
this.timeout(1000);
let tp = path.join(__dirname, 'failure.js');
let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
tr.run();
console.log(tr.succeeded);
assert.equal(tr.succeeded, false, 'should have failed');
assert.equal(tr.warningIssues.length, 0, "should have no
warnings");
assert.equal(tr.errorIssues.length, 1, "should have 1 error
issue");
assert.equal(tr.errorIssues[0], 'Bad input was given', 'error issue
output');
assert.equal(tr.stdout.indexOf('Hello bad'), -1, "Should not
display Hello bad");
done();
});
7. Ejecute las pruebas.
tsc
mocha tests/_suite.js
Ambas pruebas deben superarse. Si desea ejecutar las pruebas con una salida más
detallada (lo que vería en la consola de compilación), establezca la variable de
entorno: TASK_TEST_TRACE=1 .
$env:TASK_TEST_TRACE=1
3. Crear el archivo de manifiesto de extensión
El manifiesto de extensión contiene toda la información sobre la extensión. Incluye
vínculos a los archivos, incluidas las carpetas de tareas y las carpetas de imágenes.
Asegúrese de que ha creado una carpeta images con extension-icon.png. El ejemplo
siguiente es un manifiesto de extensión que contiene la tarea de compilación o versión.
1. Copie el siguiente código .json y guárdelo como archivo vss-extension.json en el
home directorio. No cree este archivo en la carpeta buildandreleasetask.
JavaScript
"manifestVersion": 1,
"id": "build-release-task",
"name": "Fabrikam Build and Release Tools",
"version": "0.0.1",
"publisher": "fabrikam",
"targets": [
"id": "Microsoft.VisualStudio.Services"
],
"description": "Tools for building/releasing with Fabrikam. Includes one
build/release task.",
"categories": [
"Azure Pipelines"
],
"icons": {
"default": "images/extension-icon.png"
},
"files": [
"path": "buildandreleasetask"
],
"contributions": [
"id": "custom-build-release-task",
"type": "ms.vss-distributed-task.task",
"targets": [
"ms.vss-distributed-task.tasks"
],
"properties": {
"name": "buildandreleasetask"
7 Nota
Cambie el publicador por el nombre del publicador. Para obtener más información,
consulte Creación de un publicador.
Contribuciones
Propiedad Descripción
id Identificador de la contribución. Debe ser único dentro de la extensión. No es
necesario que coincida con el nombre de la tarea de compilación o versión.
Normalmente, el nombre de la tarea de compilación o versión está en el
identificador de la contribución.
type Tipo de la contribución. Debe ser ms.vss-distributed-task.task.
targets Contribuciones "dirigidas" por esta contribución. Debe ser ms.vss-distributed-
task.tasks.
properties.name Nombre de la tarea. Este nombre debe coincidir con el nombre de carpeta de
la canalización de tareas de compilación o versión independiente
correspondiente.
Archivos
Propiedad Descripción
path Ruta de acceso del archivo o carpeta en relación con el home directorio.
7 Nota
Para obtener más información sobre el archivo de manifiesto de extensión, como
sus propiedades y lo que hacen, consulte la referencia del manifiesto de
extensión.
4. Empaquetar la extensión
Después de escribir la extensión, el siguiente paso para entrar en Visual Studio
Marketplace consiste en empaquetar todos los archivos juntos. Todas las extensiones se
empaquetan como archivos .vsix compatibles con VSIX 2.0. Microsoft proporciona una
interfaz de línea de comandos (CLI) multiplataforma para empaquetar la extensión.
1. Una vez que tenga tfx-cli, vaya al directorio principal de la extensión y ejecute el
siguiente comando:
no-highlight
tfx extension create --manifest-globs vss-extension.json
7 Nota
La versión de una extensión o integración debe incrementarse en cada
actualización.
Al actualizar una extensión existente, actualice la versión en el
manifiesto o pase el --rev-version modificador de línea de comandos. Esto
incrementa el número de versión de revisión de la extensión y guarda la nueva
versión en el manifiesto.
Debe revisar la versión de la tarea y la versión de
extensión para que se produzca una actualización. tfx extension create --
manifest-globs vss-extension.json --rev-version solo actualiza la versión de la
extensión y no la versión de la tarea. Para obtener más información, consulte Tarea
de compilación en GitHub .
Una vez que haya empaquetado la extensión en un archivo .vsix, estará listo para
publicar la extensión en Marketplace.
5. Publicar la extensión
Para publicar la extensión, primero cree el publicador, cargue la extensión y, por último,
compártala.
Creación del publicador
Todas las extensiones, incluidas las extensiones de Microsoft, se identifican como
proporcionadas por un publicador.
Si aún no es miembro de un publicador existente,
creará uno.
1. Inicie sesión en el Portal de publicación de Visual Studio Marketplace .
2. Si aún no es miembro de un publicador existente, se le pedirá que cree un
publicador. Si no se le pide que cree un publicador, desplácese hacia abajo hasta la
parte inferior de la página y seleccione Publicar extensiones en Sitios
relacionados.
Especifique un identificador para el publicador, por ejemplo: mycompany-
myteam .
Este identificador se usa como valor para el atributo en el publisher
archivo de manifiesto de las extensiones.
Especifique un nombre para mostrar para el publicador, por ejemplo: My
Team .
3. Revise el Contrato de publicador de Marketplace y seleccione Crear.
El publicador está definido. En una versión futura, puede conceder permisos para ver y
administrar las extensiones del publicador.
Es más fácil y seguro publicar extensiones en
un publicador común, sin necesidad de compartir un conjunto de credenciales entre los
usuarios.
Carga de la extensión
1. Busque el botón Cargar nueva extensión , vaya al archivo .vsix empaquetado y
seleccione Cargar.
También puede cargar la extensión a través de la línea de comandos mediante el
tfx extension publish comando en lugar de tfx extension create empaquetar y
publicar la extensión en un paso.
Opcionalmente, puede usar --share-with para
compartir la extensión con una o varias cuentas después de publicarla. También
necesitará un token de acceso personal. Para obtener más información, consulte
Creación de un token de acceso personal.
no-highlight
tfx extension publish --manifest-globs your-manifest.json --share-with
yourOrganization
Compartir la extensión
Ahora que ha cargado la extensión, está en Marketplace, pero nadie puede verlo.
Compártalo con su organización para poder instalarlo y probarlo.
1. Haga clic con el botón derecho en la extensión y seleccione Compartir y escriba la
información de la organización. También puede compartirlo con otras cuentas a las
que quiera tener acceso a la extensión.
) Importante
Los publicadores deben comprobarse para compartir extensiones públicamente.
Para más información, consulte Package/Publish/Install.
Ahora que la extensión se comparte en Marketplace, cualquier persona que quiera
usarla debe instalarla.
6. Creación de una canalización de compilación
y versión para publicar la extensión en
Marketplace
Cree una canalización de compilación y versión en Azure DevOps para ayudar a
mantener la tarea personalizada en Marketplace.
Prerrequisitos
Un proyecto de su organización. Para obtener más información, consulte Creación
de un proyecto.
Una extensión de Azure DevOps Extension Tasks instalada en su organización.
1. Vaya a Tareas de extensión de Azure DevOps.
2. Elija Obtenerlo gratis e instale la extensión en su organización.
Cree un grupo de variables de biblioteca de canalización para contener las variables
usadas por la canalización. Para obtener más información sobre cómo crear un grupo de
variables, vea Agregar y usar grupos de variables. Tenga en cuenta que puede crear
grupos de variables desde la pestaña Biblioteca de Azure DevOps o a través de la CLI.
Después de realizar un grupo de variables, use cualquier variable dentro de ese grupo
de la canalización. Obtenga más información sobre cómo usar un grupo de variables.
Declare las siguientes variables en el grupo de variables.
publisherId : identificador del publicador de Marketplace.
extensionId : identificador de la extensión, como se declara en el archivo vss-
extension.json.
extensionName : nombre de la extensión, como se declara en el archivo vss-
extension.json.
artifactName : nombre del artefacto que se crea para el archivo VSIX.
Cree una nueva conexión de servicio de Visual Studio Marketplace y conceda permisos
de acceso para todas las canalizaciones. Para más información sobre cómo crear una
conexión de servicio, consulte Conexiones de servicio.
Use el ejemplo siguiente para crear una canalización con YAML. Obtenga más
información sobre cómo crear la primera canalización y el esquema YAML.
YAML
trigger:
- master
pool:
vmImage: "ubuntu-latest"
variables:
- group: variable-group # Rename to whatever you named your variable group
in the prerequisite stage of step 6
stages:
- stage: Run_and_publish_unit_tests
jobs:
- job:
steps:
- task: TfxInstaller@4
inputs:
version: "v0.x"
- task: Npm@1
inputs:
command: 'install'
workingDir: '/TaskDirectory' # Update to the name of the
directory of your task
- task: Bash@3
displayName: Compile Javascript
inputs:
targetType: "inline"
script: |
cd TaskDirectory # Update to the name of the directory of
your task
tsc
- task: Npm@1
inputs:
command: 'custom'
workingDir: '/TestsDirectory' # Update to the name of the
directory of your task's tests
customCommand: 'testScript' # See the definition in the
explanation section below - it may be called test
- task: PublishTestResults@2
inputs:
testResultsFormat: 'JUnit'
testResultsFiles: '**/ResultsFile.xml'
- stage: Package_extension_and_publish_build_artifacts
jobs:
- job:
steps:
- task: TfxInstaller@4
inputs:
version: "0.x"
- task: Npm@1
inputs:
command: 'install'
workingDir: '/TaskDirectory' # Update to the name of the
directory of your task
- task: Bash@3
displayName: Compile Javascript
inputs:
targetType: "inline"
script: |
cd TaskDirectory # Update to the name of the directory of
your task
tsc
- task: QueryAzureDevOpsExtensionVersion@4
name: QueryVersion
inputs:
connectTo: 'VsTeam'
connectedServiceName: 'ServiceConnection' # Change to whatever
you named the service connection
publisherId: '$(PublisherID)'
extensionId: '$(ExtensionID)'
versionAction: 'Patch'
- task: PackageAzureDevOpsExtension@4
inputs:
rootFolder: '$(System.DefaultWorkingDirectory)'
publisherId: '$(PublisherID)'
extensionId: '$(ExtensionID)'
extensionName: '$(ExtensionName)'
extensionVersion: '$(QueryVersion.Extension.Version)'
updateTasksVersion: true
updateTasksVersionType: 'patch'
extensionVisibility: 'private' # Change to public if you're
publishing to the marketplace
extensionPricing: 'free'
- task: CopyFiles@2
displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)"
inputs:
Contents: "**/*.vsix"
TargetFolder: "$(Build.ArtifactStagingDirectory)"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: '$(ArtifactName)'
publishLocation: 'Container'
- stage: Download_build_artifacts_and_publish_the_extension
jobs:
- job:
steps:
- task: TfxInstaller@4
inputs:
version: "v0.x"
- task: DownloadBuildArtifacts@0
inputs:
buildType: "current"
downloadType: "single"
artifactName: "$(ArtifactName)"
downloadPath: "$(System.DefaultWorkingDirectory)"
- task: PublishAzureDevOpsExtension@4
inputs:
connectTo: 'VsTeam'
connectedServiceName: 'ServiceConnection' # Change to whatever
you named the service connection
fileType: 'vsix'
vsixFile:
'$(PublisherID).$(ExtensionName)/$(PublisherID)..vsix'
publisherId: '$(PublisherID)'
extensionId: '$(ExtensionID)'
extensionName: '$(ExtensionName)'
updateTasksVersion: false
extensionVisibility: 'private' # Change to public if you're
publishing to the marketplace
extensionPricing: 'free'
Para obtener más ayuda con los desencadenadores, como los desencadenadores de CI y
PR, consulte Especificación de eventos que desencadenan canalizaciones.
7 Nota
Cada trabajo usa un nuevo agente de usuario y requiere que se instalen
dependencias.
Etapas de canalización
Esta sección le ayuda a comprender cómo funcionan las fases de canalización.
Fase: Ejecución y publicación de pruebas unitarias
Esta fase ejecuta pruebas unitarias y publica los resultados de las pruebas en Azure
DevOps.
Para ejecutar pruebas unitarias, agregue un script personalizado al archivo package.json.
Por ejemplo:
JSON
"scripts": {
"testScript": "mocha ./TestFile --reporter xunit --reporter-option
output=ResultsFile.xml"
},
1. Agregue "Uso de la CLI de Node para Azure DevOps (tfx-cli)" para instalar tfx-cli en
el agente de compilación.
2. Agregue la tarea "npm" con el comando "install" y seleccione como destino la
carpeta con el archivo package.json.
3. Agregue la tarea "Bash" para compilar TypeScript en JavaScript.
4. Agregue la tarea "npm" con el comando "custom", seleccione la carpeta que
contiene las pruebas unitarias y escriba testScript como comando. Use las
siguientes entradas:
Comando: personalizado
Carpeta de trabajo que contiene package.json: /TestsDirectory
Comandos y argumentos: testScript
5. Agregue la tarea "Publicar resultados de pruebas". Si usa el periodista de Mocha
XUnit, asegúrese de que el formato de resultado es "JUnit" y no "XUnit". Establezca
la carpeta de búsqueda en el directorio raíz. Use las siguientes entradas:
Formato de resultado de la prueba: JUnit
Archivos de resultados de pruebas: **/ResultsFile.xml
Carpeta de búsqueda: $(System.DefaultWorkingDirectory)
Una vez publicados los resultados de la prueba, la salida de la pestaña pruebas debe
tener un aspecto similar al del ejemplo siguiente.
Fase: Empaquetar la extensión y publicar artefactos de compilación
1. Agregue "Uso de la CLI de Node para Azure DevOps (tfx-cli)" para instalar tfx-cli en
el agente de compilación.
2. Agregue la tarea "npm" con el comando "install" y seleccione como destino la
carpeta con el archivo package.json.
3. Agregue la tarea "Bash" para compilar TypeScript en JavaScript.
4. Agregue la tarea "Versión de extensión de consulta" para consultar la versión de
extensión existente. Use las siguientes entradas:
Conectarse a: Visual Studio Marketplace
Visual Studio Marketplace (conexión de servicio): conexión de servicio
Id. del publicador: identificador del publicador de Visual Studio Marketplace
Identificador de extensión: identificador de la extensión en el archivo vss-
extension.json
Aumentar versión: Revisión
Variable de salida: Task.Extension.Version
5. Agregue la tarea "Extensión de paquete" para empaquetar las extensiones basadas
en json del manifiesto. Use las siguientes entradas:
Carpeta manifiestos raíz: apunta al directorio raíz que contiene el archivo de
manifiesto. Por ejemplo, $(System.DefaultWorkingDirectory) es el directorio
raíz.
Archivos de manifiesto: vss-extension.json
Id. del publicador: identificador del publicador de Visual Studio Marketplace
Identificador de extensión: identificador de la extensión en el archivo vss-
extension.json
Nombre de la extensión: nombre de la extensión en el archivo vss-
extension.json
Versión de extensión: $(Task.Extension.Version)
Invalidar la versión de las tareas: activada (true)
Tipo de invalidación: Reemplazar solo revisión (1.0.r)
Visibilidad de la extensión: si la extensión todavía está en desarrollo,
establezca el valor en privado. Para liberar la extensión en público, establezca
el valor en público.
6. Agregue la tarea "Copiar archivos" para copiar archivos publicados. Use las
siguientes entradas:
Contenido: todos los archivos que se van a copiar para publicarlos como un
artefacto
Carpeta de destino: la carpeta en la que se copian los archivos.
Por ejemplo: $(Build.ArtifactStagingDirectory)
7. Agregue "Publicar artefactos de compilación" para publicar los artefactos para su
uso en otros trabajos o canalizaciones. Use las siguientes entradas:
Ruta de acceso para publicar: la ruta de acceso a la carpeta que contiene los
archivos que se publican.
Por ejemplo: $(Build.ArtifactStagingDirectory)
Nombre del artefacto: el nombre proporcionado al artefacto.
Ubicación de publicación de artefactos: elija "Azure Pipelines" para usar el
artefacto en trabajos futuros.
Fase: Descarga de artefactos de compilación y publicación de la
extensión
1. Agregue "Uso de la CLI de Node para Azure DevOps (tfx-cli)" para instalar tfx-cli en
el agente de compilación.
2. Agregue la tarea "Descargar artefactos de compilación" para descargar los
artefactos en un nuevo trabajo. Use las siguientes entradas:
Descargar artefactos generados por: si va a descargar el artefacto en un
nuevo trabajo de la misma canalización, seleccione "Compilación actual". Si
va a descargar en una nueva canalización, seleccione "Compilación
específica".
Tipo de descarga: elija "Artefacto específico" para descargar todos los
archivos publicados.
Nombre del artefacto: el nombre del artefacto publicado.
Directorio de destino: la carpeta donde se deben descargar los archivos.
3. La última tarea que necesita es la tarea "Publicar extensión". Use las siguientes
entradas:
Conectarse a: Visual Studio Marketplace
Conexión de Visual Studio Marketplace: ServiceConnection
Tipo de archivo de entrada: archivo VSIX
Archivo VSIX: /Publisher.*.vsix
Id. del publicador: identificador del publicador de Visual Studio Marketplace
Identificador de extensión: identificador de la extensión en el archivo vss-
extension.json
Nombre de la extensión: nombre de la extensión en el archivo vss-
extension.json
Visibilidad de la extensión: privada o pública
Opcional: Instalar y probar la extensión
Instale una extensión que se comparta con usted en unos pocos pasos:
1. En el panel de control de la organización
( https://dev.azure.com/{organization}/_admin ), vaya a la página de
administración de la colección de proyectos.
2. En la pestaña Extensiones , busque la extensión en el grupo "Extensiones
compartidas conmigo" y seleccione el vínculo de extensión.
3. Instale la extensión.
Si no puede ver la pestaña Extensiones , asegúrese de que se encuentra en el panel de
control (la página de administración en el nivel de colección de proyectos,
https://dev.azure.com/{organization}/_admin ) y no en la página de administración de
un proyecto.
Si no ve la pestaña Extensiones , las extensiones no están habilitadas para su
organización. Para obtener acceso anticipado a la característica de extensiones, se une al
Programa de partners de Visual Studio.
Para empaquetar y publicar extensiones de Azure DevOps en Visual Studio Marketplace,
puede descargar Tareas de extensión de Azure DevOps .
Preguntas más frecuentes
Consulte las siguientes preguntas más frecuentes (P+F) sobre cómo agregar tareas de
compilación o versión personalizadas en extensiones para Azure DevOps.
P: ¿Cómo puedo restringir el uso de comandos de GitHub
Codespaces para la tarea?
Puede restringir el uso y las variables de los comandos de GitHub Codespaces, que se
pueden establecer mediante tarea.
Esta acción podría ser útil para evitar el acceso sin
restricciones a variables o comandos vso para scripts personalizados que ejecuta la
tarea. Se recomienda configurarlo para nuevas tareas.
Para aplicarlo, es posible que
tenga que agregar la siguiente instrucción al archivo task.json:
JSON
"restrictions": {
"commands": {
"mode": "restricted"
},
"settableVariables": {
"allowed": ["variable1", "test*"]
Si restricted se especifica el valor para mode , solo puede ejecutar los siguientes
comandos mediante la tarea:
logdetail
logissue
complete
setprogress
setsecret
setvariable
debug
settaskvariable
prependpath
publish
settableVariables Las restricciones permiten pasar una lista de permitidos de variables,
que se pueden establecer mediante setvariable comandos o prependpath . También
permite expresiones regulares básicas. Por ejemplo, si la lista de permitidos era: ['abc',
'test*'] , estableciendo abc , test o test1 como variables con cualquier valor o
prepending ellos en la ruta de acceso se realizaría correctamente, pero si intenta
establecer un proxy de variable, advertiría. La lista vacía significa que la tarea no puede
cambiar ninguna variable.
Si se omite la settableVariables clave o commands , no se aplica la restricción pertinente.
La característica de restricción está disponible en la versión del agente 2.182.1 .
P: ¿Cómo se controla la señal de cancelación por una
tarea?
El agente de canalización envía SIGINT y SIGTERM señala al proceso secundario
correspondiente. No hay ningún medio explícito en la biblioteca de tareas que se va a
procesar. Para obtener más información, consulte Cancelación de trabajos del Agente .
P: ¿Cómo puedo quitar la tarea de la colección de
proyectos?
No se admite la eliminación automática de tareas. La eliminación automática no es
segura y interrumpe las canalizaciones existentes que ya usan estas tareas. Sin embargo,
puede marcar las tareas como en desuso. Para ello, aumente la versión de la tarea y
marque la tarea como en desuso .
P: ¿Cómo puedo actualizar una tarea al nodo más
reciente?
Se recomienda actualizar a la versión más reciente de Node . Para obtener información
de ejemplo, vea Actualización de tareas a Node 10 .
Artículos relacionados
Referencia del manifiesto de extensión
Esquema JSON de tarea de compilación y versión
Ejemplos de tareas de compilación y versión
Uso de un decorador para insertar pasos
en una canalización
Artículo • 16/12/2022 • Tiempo de lectura: 7 minutos
Azure DevOps Services | Azure DevOps Server 2022
Los decoradores de canalización permiten agregar pasos al principio y al final de cada
trabajo.
Este proceso es diferente de agregar pasos a una única definición porque se
aplica a todas las canalizaciones de una organización.
Supongamos que nuestra organización requiere ejecutar un detector de virus en todas
las salidas de compilación que se podrían liberar.
No es necesario que los autores de
canalizaciones recuerden agregar ese paso. Creamos un decorador que inserta
automáticamente el paso.
Nuestro decorador de canalización inserta una tarea
personalizada que realiza el examen de virus al final de cada trabajo de canalización.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Crear un decorador de canalización
En este ejemplo se supone que está familiarizado con los modelos de contribución.
Empiece por crear una extensión.
Después de seguir el tutorial, tendrá un vss-
extension.json archivo.
En este archivo, agregue contribución para el nuevo decorador
de canalización.
vss-extension.json
JSON
"manifestVersion": 1,
"contributions": [
"id": "my-required-task",
"type": "ms.azure-pipelines.pipeline-decorator",
"targets": [
"ms.azure-pipelines-agent-job.post-job-tasks"
],
"properties": {
"template": "my-decorator.yml"
],
"files": [
"path": "my-decorator.yml",
"addressable": true,
"contentType": "text/plain"
Opciones de contribución
Echemos un vistazo a las propiedades y a lo que se usan para:
Propiedad Descripción
id Identificador de contribución. Debe ser único entre las contribuciones
de esta extensión.
type Especifica que esta contribución es un decorador de canalización. Debe
ser la cadena ms.azure-pipelines.pipeline-decorator .
targets Los decoradores se pueden ejecutar antes del trabajo o la tarea
especificada, después o ambos. Consulte la tabla siguiente para ver las
opciones disponibles.
properties.template (Obligatorio) La plantilla es un archivo YAML incluido en la extensión,
que define los pasos para el decorador de canalización. Es una ruta de
acceso relativa de la raíz de la carpeta de extensión.
properties.targettask Identificador de tarea de destino usado para ms.azure-pipelines-agent-
job.pre-task-tasks destinos o ms.azure-pipelines-agent-job.post-
task-tasks . Debe ser una cadena GUID como 89b8ac58-8cb7-4479-a362-
1baaacc6c7ad
Destinos
Destino Descripción
Destino Descripción
ms.azure- Ejecute antes de otras tareas en una canalización de YAML o compilación clásica.
pipelines- Debido a las diferencias en el modo en que se produce la desprotección del
agent- código fuente, este destino se ejecuta antes de la desprotección en una
job.pre- canalización de YAML, pero después de la desprotección en una canalización de
job-tasks compilación clásica.
ms.azure- Ejecute después de la última checkout tarea en una canalización yaML o de
pipelines- compilación clásica.
agent-
job.post-
checkout-
tasks
ms.azure- Ejecute después de otras tareas en una compilación clásica o canalización YAML.
pipelines-
agent-
job.post-
job-tasks
ms.azure- Ejecute antes de la tarea especificada en una canalización de YAML o compilación
pipelines- clásica.
agent-
job.pre-
task-tasks
ms.azure- Ejecute después de la tarea especificada en una canalización de YAML o
pipelines- compilación clásica.
agent-
job.post-
task-tasks
ms.azure- Ejecute antes de la tarea especificada en en una canalización de RM clásica.
release-
pipelines-
agent-
job.pre-
task-tasks
ms.azure- Ejecute después de la tarea especificada en en una canalización de RM clásica.
release-
pipelines-
agent-
job.post-
task-tasks
Destino Descripción
ms.azure- Ejecute antes de otras tareas en una canalización de RM clásica.
release-
pipelines-
agent-
job.pre-
job-tasks
ms.azure- Ejecute después de otras tareas en una canalización de RM clásica.
release-
pipelines-
agent-
job.post-
job-tasks
7 Nota
Los trabajos de implementación en una canalización YAML solo admiten ms.azure-
pipelines-agent-job.pre-job-tasks y ms.azure-pipelines-agent-job.post-job-
tasks destinos.
Los trabajos admiten todos los destinos de canalización de YAML.
En este ejemplo, solo se usa ms.azure-pipelines-agent-job.post-job-tasks porque
queremos ejecutar al final de todos los trabajos de compilación.
Esta extensión contribuye a un decorador de canalización.
A continuación, crearemos un
archivo YAML de plantilla para definir el comportamiento del decorador.
YAML del decorador
En las propiedades de la extensión, elegimos el nombre "my-decorator.yml".
Cree ese
archivo en la raíz de la contribución.
Contiene el conjunto de pasos que se ejecutarán
después de cada trabajo.
Comenzaremos con un ejemplo básico y trabajaremos con la
tarea completa.
my-decorator.yml (versión inicial)
YAML
steps:
- task: CmdLine@2
displayName: 'Run my script (injected from decorator)'
inputs:
script: dir
Instalación del decorador
Para agregar un decorador de canalización a la organización, debe instalar una
extensión.
Solo las extensiones privadas pueden contribuir a decoradores de
canalización.
La extensión debe crearse y compartirse con su organización para poder
usarla.
Una vez que la extensión se haya compartido con su organización, busque la
extensión e instálela.
Guarde el archivo y, a continuación, compile e instale la extensión.
Cree y ejecute una
canalización básica.
El decorador inserta automáticamente el dir script al final de cada
trabajo.
Una ejecución de canalización es similar a la siguiente:
7 Nota
El decorador se ejecuta en cada trabajo de cada canalización de la organización.
En
pasos posteriores, agregaremos lógica para controlar cuándo y cómo se ejecuta el
decorador.
Inserción condicional
En nuestro ejemplo, solo es necesario ejecutar el detector de virus si es posible que las
salidas de compilación se publiquen al público.
Supongamos que solo se publican
compilaciones de la rama predeterminada (normalmente master ).
Debemos limitar el
decorador a los trabajos que se ejecutan en la rama predeterminada.
El archivo actualizado tiene el siguiente aspecto:
my-decorator.yml (versión revisada)
YAML
steps:
- ${{ if eq(resources.repositories['self'].ref,
resources.repositories['self'].defaultBranch) }}:
- script: dir
displayName: 'Run my script (injected from decorator)'
Puede empezar a ver la eficacia de este punto de extensibilidad.
Use el contexto del
trabajo actual para insertar pasos condicionalmente en tiempo de ejecución.
Use
expresiones YAML para tomar decisiones sobre los pasos que se van a insertar y cuándo.
Consulte el contexto de expresión del decorador de canalización para obtener una lista
completa de los datos disponibles.
Hay otra condición que debemos tener en cuenta: ¿qué ocurre si el usuario ya incluyó el
paso de detección de virus?
No deberíamos perder tiempo ejecutándolo de nuevo.
En
este sencillo ejemplo, pretenderemos que cualquier script tarea encontrada en el
trabajo ejecute el detector de virus.
(En una implementación real, tendría una tarea
personalizada para comprobarlo en su lugar).
El identificador de la tarea de script es d9bafed4-0b18-4f58-968d-86655b4d2ce9 .
Si vemos
otra tarea de script, no deberíamos insertar la nuestra.
my-decorator.yml (versión final)
YAML
steps:
- ${{ if and(eq(resources.repositories['self'].ref,
resources.repositories['self'].defaultBranch),
not(containsValue(job.steps.*.task.id, 'd9bafed4-0b18-4f58-968d-
86655b4d2ce9'))) }}:
- script: dir
displayName: 'Run my script (injected from decorator)'
Especificación de una tarea de destino
Puede especificar el identificador de tarea de destino e insertar tareas antes o después
de esta tarea de destino.
Para especificar la tarea de destino, puede modificar el archivo
de manifiesto vss-extension.json como se muestra a continuación:
vss-extension.json
JSON
"contributions": [
"id": "my-required-task",
"type": "ms.azure-pipelines.pipeline-decorator",
"targets": [
"ms.azure-pipelines-agent-job.pre-task-tasks",
"ms.azure-pipelines-agent-job.post-task-tasks"
],
"properties": {
"template": "my-decorator.yml",
"targettask": "target-task-id"
],
...
Al configurar la propiedad "targettask", puede especificar el identificador de una tarea
de destino.
Las tareas se insertarán antes o después de todas las instancias de la tarea
de destino especificada.
Especificación de la inserción de entradas de la tarea de
destino
Puede especificar una lista de entradas de la tarea de destino que desea insertar como
entradas en la tarea insertada.
Esta característica está diseñada para trabajar con tareas de canalización personalizadas.
No está pensado para proporcionar acceso a las entradas de la tarea de canalización de
destino a través de variables de canalización.
Para obtener acceso a las entradas de la tarea de canalización de destino (entradas con
el target_ prefijo ), la tarea de canalización insertada debe usar métodos de azure-
pipelines-tasks-task-lib y no de las variables de canalización, por ejemplo const
inputString = tl.getInput('target_targetInput') ).
Para ello, puede crear su propia tarea de canalización personalizada y usar las entradas
de destino allí. Si necesita la funcionalidad de una de las tareas predescriptoras, como
CmdLine@2 , puede crear una copia de la tarea CmdLine@2 y publicarla con la
extensión de decorador.
7 Nota
Esta funcionalidad solo está disponible para las tareas que se insertan antes o
después de la tarea de destino.
Para especificar esta lista de entradas, puede modificar el archivo de manifiesto vss-
extension.json como se indica a continuación:
vss-extension.json (versión de entradas de tareas insertadas)
JSON
"contributions": [
"id": "my-required-task",
"type": "ms.azure-pipelines.pipeline-decorator",
"targets": [
"ms.azure-pipelines-agent-job.pre-task-tasks",
"ms.azure-pipelines-agent-job.post-task-tasks"
],
"properties": {
"template": "my-decorator.yml",
"targettask": "target-task-id",
"targettaskinputs": ["target-task-input", "target-task-
second-input"]
],
...
Al configurar la propiedad "targettaskinputs", puede especificar la lista de entradas que
se espera que se inserten.
Estas entradas se insertarán en la tarea con el prefijo
" target_ " y estarán disponibles en la tarea insertada como target_target-task-input .
Nota: Las entradas de tarea de destino que obtienen valores secretos con variables
u obtenerlos de otras tareas no se insertarán.
Depuración
Al crear el decorador de canalización, es probable que tenga que depurar.
También
puede que desee ver qué datos tiene disponibles en el contexto.
Puede establecer la system.debugContext variable true en al poner en cola una
canalización.
A continuación, examine la página de resumen de la canalización.
Verá algo similar a la imagen siguiente:
Seleccione la tarea para ver los registros, que notifican que el contexto disponible está
disponible y los valores en tiempo de ejecución.
Vínculos útiles
Obtenga más información sobre la sintaxis de expresiones YAML.
Ejemplos de extensiones
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Empiece a desarrollar la extensión trabajando desde un ejemplo.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
En los siguientes ejemplos de Microsoft se muestran las funcionalidades del marco de
extensión y cómo contribuir a varias áreas. Cada ejemplo muestra una o varias
contribuciones. Hemos limitado el número de contribuciones de cada ejemplo para
aumentar la comprensión del marco de extensión.
Muestra Source Contribuciones Descripción
Control GitHub Control formulario Agregue codificación de colores a los
personalizado de de elemento de valores de una lista desplegable.
formulario de trabajo
elemento de trabajo
de escala de colores
Administración de GitHub Acción del menú Cree una carpeta en los repositorios de
carpetas contextual (árbol origen desde el árbol del explorador de
del explorador de código. No es necesario clonar el
código) repositorio ni instalar herramientas
adicionales.
Ejecución de pruebas GitHub Pestaña Plan de Permite al evaluador realizar los pasos
sin conexión prueba de prueba incluso si se desconecta de
Azure DevOps. Se puede hacer con la
hoja de cálculo de Excel exportada.
tareas de Release GitHub tareas de Release Tareas de utilidad para Release
Management Management Management.
Utility
Roll-up Board GitHub Widget de panel Este widget muestra el número de
tarjetas en cada columna del panel
Kanban.
Muestra Source Contribuciones Descripción
Widget de datos de GitHub Widget de panel Cree datos de ejemplo en el proyecto
ejemplo de Team Services.
Visualización del GitHub Acción de la barra Visualice el modelo de estado para un
modelo de estado de herramientas tipo de elemento de trabajo
(elemento de seleccionado.
trabajo),
Concentrador
Team Calendar GitHub Concentrador, Realice un seguimiento de los eventos
orígenes de importantes para el equipo, vea y
eventos administre días fuera, vea rápidamente
cuándo comienzan y terminan los
sprints, etc.
Estado del proyecto GitHub Widget de panel Permitir a los usuarios visualizar el
de equipo estado general de las compilaciones,
proporcionando una indicación visual
similar a Codify Build Light.
WSJF (trabajo más GitHub Notificación Calcula automáticamente WSJF
corto ponderado (elemento de (trabajo más corto ponderado primero)
primero) trabajo), acción de por elemento de trabajo y lo almacena
menú contextual en un campo de elemento de trabajo.
(elemento de
trabajo)
Listas en cascada GitHub Formulario de Defina el comportamiento en cascada
elemento de para las listas de selección en el
trabajo formulario de elemento de trabajo.
Primeros pasos
Para empezar lo antes posible, hay un proyecto de inicialización disponible que
contiene los archivos necesarios para compilar una extensión mediante TypeScript. Para
automatizar la compilación, el empaquetado y la publicación de la extensión, se agrega
un script grunt.
Artículos relacionados
Desarrollar una extensión web
Sistema de diseño de fórmulas para desarrolladores
Repositorio de extensiones de ejemplo de Azure DevOps
Modelo de contribución
Empaquetar y publicar extensiones
Guía de navegación vertical
Artículo • 18/11/2022 • Tiempo de lectura: 3 minutos
Azure DevOps Services
La navegación vertical incluye cambios que afectan a algunas extensiones. Estos
resultados incluyen compatibilidad con iconos de extensión junto con cambios en el
contexto del equipo.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK Azure DevOps Extension.
Contexto de equipo
En la navegación horizontal tradicional, los usuarios podrían ir a un proyecto o equipo
seleccionando en un selector que se encuentra en la parte superior izquierda del
encabezado de página. Este selector presentó una lista de equipos recientes y una
manera de buscar todos los equipos. En la nueva navegación vertical, un usuario solo
puede navegar a un proyecto (y no a un equipo). Este cambio se realizó para simplificar
la experiencia general. Sin embargo, introdujo un desafío para las extensiones web que
dependen de la capacidad de los usuarios para cambiar de equipo mediante el selector
de equipos tradicional en el encabezado de página.
VSS.getWebContext() es una API del lado cliente proporcionada por el SDK de VSS que
proporciona información sobre la organización, el proyecto y el equipo actuales en los
que está funcionando el usuario:
JSON
"account": {
"name": "Fabrikam",
"id": "50e49b94-4bb6-40e7-8c85-a6d756d8a4d8"
},
"project": {
"name": "Fabrikam Dev",
"id": "049b1af2-fc87-4e50-95e4-151357f04b7f"
},
"team": {
"name": "Ops Team",
"id": "9b3a6b80-fe95-4c8c-8aa1-1e5d535d7af1"
No se recomienda confiar en VSS.getWebContext().team . En su lugar, siga las
instrucciones siguientes, en función de la categoría en la que se encuentra la extensión.
Extensiones de concentrador que son conscientes del
equipo
Si la extensión necesita proporcionar a los usuarios una manera de seleccionar un
equipo, puede usar la API REST de Teams para obtener una lista de equipos para el
proyecto actual. En el ejemplo siguiente se muestra cómo llamar a esta API desde la
extensión.
JavaScript
VSS.require(["VSS/Service", "TFS/Core/RestClient"],
function(VSS_Service, Tfs_Core_WebApi) {
var client =
VSS_Service.getCollectionClient(Tfs_Core_WebApi.CoreHttpClient4);
client.getTeams(VSS.getWebContext().project.id).then(
function(teams) {
console.log(teams);
);
});
Para obtener un ejemplo de una extensión que proporciona un control selector de
equipo, vea Team Calendar .
Extensiones de paneles o pivotes que se encuentran en
centros que tienen en cuenta el equipo, como los
backlogs y el panel
La extensión puede comprobar el objeto de configuración pasado a la contribución. Este
objeto tiene propiedades diferentes según el tipo de contribución y dónde se hospeda
la contribución. En el ejemplo se muestra cómo leer el equipo de la configuración y
volver al equipo de lectura de webContext para admitir la nueva navegación vertical y la
navegación horizontal anterior en versiones locales.
JavaScript
function getCurrentTeam() {
let webContext = VSS.getWebContext();
let configuration = VSS.getConfiguration();
if ("team" in configuration) {
return configuration.team;
} else if ("team" in webContext) {
return webContext.team;
} else {
return null; // should only happen if not in a project context
Extensiones de acciones que se encuentran en centros
que tienen en cuenta el equipo, como los backlogs y el
panel
La extensión puede comprobar el objeto actionContext pasado a la devolución de
llamada invocada cuando un usuario selecciona el elemento de menú aportado. En el
ejemplo se muestra el equipo de lectura de actionContext.
JavaScript
var menuContributionHandler = (function () {
"use strict";
return {
// This is a callback that gets invoked when a user selects the
newly contributed menu item
// The actionContext parameter contains team information.
execute: function (actionContext) {
if("team" in actionContext) {
alert(`Team. Id is ${actionContext.team.id}, Name is
${actionContext.team.name}`);
};
}());
Icono de concentrador
Opcionalmente, puede establecer un recurso (como un .png o .jpg) como icono del
centro. Este icono aparece junto al centro en la barra de navegación vertical. Debe
empaquetarse con la extensión.
7 Nota
Estos iconos no aparecen en la navegación horizontal.
Complete los pasos siguientes para establecer un icono para el centro.
1. Establezca la iconAsset propiedad de la contribución del centro en el identificador
de recurso completo, que sigue el patrón : {publisher-id}.{extension-id}/{asset-
path} .
2. Agregue una entrada para este recurso en la propiedad includesata de
contribución.
3. Empaquete el recurso con la extensión en la lista de la files propiedad en la raíz
del manifiesto.
Ejemplo 1:
JSON
"id": "my-extension",
"publisherId": "my-publisher",
...
"contributions": [
"id": "example-hub",
"type": "ms.vss-web.hub",
"targets": [
"ms.vss-code-web.code-hub-group"
],
"properties": {
"name": "My Hub",
"iconAsset": "my-publisher.my-extension/images/fabrikam-
logo.png",
"includesData": {
"assets": [
"my-publisher.my-extension/images/fabrikam-logo.png"
],
"files": [
"path": "images/fabrikam-logo.png",
"addressable": true
Ejemplo 2:
Cuando se aplican temas como claro frente a oscuro, puede especificar los iconos en el
manifiesto de extensión como se muestra a continuación.
JSON
"id": "hub",
"type": "ms.vss-web.hub",
"targets": [
"ms.vss-work-web.work-hub-group"
],
"properties": {
"name": "Hub",
"description": "Something",
"uri": "pages/Hub.html",
"icon": {
"light": "img/hub-light.png",
"dark": "img/hub-dark.png"
Trabajar con direcciones URL en
extensiones e integraciones
Artículo • 18/11/2022 • Tiempo de lectura: 8 minutos
Azure DevOps Services
Con la introducción de Azure DevOps Services, ahora se puede acceder a los recursos y
las API de la organización a través de cualquiera de las siguientes direcciones URL:
https://dev.azure.com/{organization} (nuevo)
https://{organization}.visualstudio.com (heredado)
Independientemente de cuándo se creó la organización, los usuarios, las herramientas y
las integraciones pueden interactuar con las API REST de nivel de organización mediante
cualquiera de las direcciones URL. Como desarrollador de una extensión, integración o
herramienta que interactúa con Azure DevOps Services, es importante comprender
cómo trabajar correctamente con las direcciones URL disponibles para el código y cómo
formar direcciones URL correctamente al llamar a las API REST.
Para más información, consulte la Referencia de la API rest.
Dirección URL principal de la organización
Cada organización tiene una dirección URL principal designada que es el formulario
nuevo o el formulario heredado. La dirección URL principal se usa Azure DevOps
Services para construir direcciones URL en determinados escenarios (más detalles a
continuación). La dirección URL principal predeterminada de una organización viene
determinada por el momento en que se creó la organización, pero un administrador
puede cambiarla:
Cuando se creó la organización Dirección URL principal predeterminada
El 10/9/2018 o después Nuevo
Antes del 10/9/2018 Heredado
Cómo se usa la dirección URL principal
La dirección URL principal es la dirección URL base de todas las direcciones URL
construidas por Azure DevOps en trabajos en segundo plano y otros escenarios
automatizados. Vea los ejemplos siguientes:
Direcciones URL proporcionadas para Azure Pipelines tareas a través de variables
de entorno (como SYSTEM_TEAMFOUNDATIONCOLLECTIONURI )
Direcciones URL incluidas en las cargas de eventos de enlaces de servicio (como
direcciones URL en resourceContainers )
Direcciones URL en correo electrónico, Slack, Microsoft Teams y notificaciones
similares
Por ejemplo, el siguiente fragmento de código de tarea muestra la dirección URL de la
organización proporcionada a la tarea:
PowerShell
$orgUrl = $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
Write-Host $orgUrl
Si esta tarea se ejecuta en una organización en la que la dirección URL principal es el
nuevo formulario de dirección URL, el resultado es
https://dev.azure.com/{organization} . La misma tarea ejecutada en una organización
donde la dirección URL principal es el formulario de dirección URL heredada genera
https://{organization}.visualstudio.com .
Por lo tanto, es importante que las tareas y los servicios de Azure Pipeline que reciben
eventos de enlaces de servicio controle ambos formularios de dirección URL.
Direcciones URL devueltas en las API REST
Independientemente de la dirección URL principal de una organización, las direcciones
URL devueltas en la respuesta a una llamada a la API REST usan la misma dirección URL
base que la dirección URL de solicitud. Esto garantiza que los clientes que llaman a una
API REST mediante una dirección URL heredada siguen retrayendo direcciones URL en el
mismo formulario (heredado). Por ejemplo, cuando se llama a la API REST Projects
mediante una dirección URL heredada, las direcciones URL de la respuesta usan el
formato heredado:
Solicitud
HTTP
GET https://Fabrikam.visualstudio.com/_apis/projects/MyProject
Response
JavaScript
"id": "ef4de40d-3d96-4b80-a320-cfafe038ae57",
"name": "MyProject",
"url": "https://Fabrikam.visualstudio.com/_apis/projects/MyProject"
Llamar a la misma API mediante la nueva dirección URL
( https://dev.azure.com/Fabrikam/_apis/projects/MyProject ) da como resultado
direcciones URL devueltas en el nuevo formulario de dirección URL.
Procedimientos recomendados
Para asegurarse de que la extensión, la herramienta o la integración sean resistentes a
los cambios en los formularios url de la organización y a posibles cambios futuros en la
ubicación (dominio) de una API REST:
1. Supongamos que el formulario de la dirección URL de la organización puede
cambiar con el tiempo.
2. Evite analizar una dirección URL para construir otra dirección URL.
3. No suponga que una API REST determinada siempre reside en el mismo dominio.
4. Evitar el almacenamiento de direcciones URL en el servicio
5. Cuando sea posible, use las bibliotecas cliente de .NET, TypeScript (web),
Node.js y Python proporcionadas por Microsoft al interactuar con Azure
DevOps
Cómo obtener la dirección URL de una
organización
Con solo el nombre o el identificador de la organización, puede obtener su dirección
URL base mediante la API rest de áreas de recursos global
( https://dev.azure.com/_apis/resourceAreas ). Esta API no requiere autenticación y
proporciona información sobre la ubicación (URL) de la organización, así como la
dirección URL base de las API REST, que pueden encontrarse en dominios diferentes.
Un área de recursos es un grupo de recursos y puntos de conexión de api REST
relacionados. Cada área de recursos tiene un identificador conocido (consulte la tabla
siguiente). Cada área de recursos tiene una dirección URL base específica de la
organización que se puede usar para formar direcciones URL para las API de esa área de
recursos. Por ejemplo, la dirección URL base de las API REST de "compilación" para
Fabrikam https://dev.azure.com/Fabrikam podría ser , pero la dirección URL base de las
API REST de "administración de versiones" podría ser
https://vsrm.dev.azure.com/Fabrikam .
7 Nota
La API REST de Áreas de recursos devuelve direcciones URL para la organización en
función de la dirección URL principal designada de esa organización.
Con el nombre de la organización
Hay varias maneras de obtener la dirección URL base de una organización mediante su
nombre.
HTTP
Solicitud
Reemplace {organizationName} por el nombre de la organización, por ejemplo ,
"Fabrikam". 79134C72-4A58-4B42-976C-04E7115F32BF es el identificador del área de
recursos "principal", que es donde están los recursos importantes, como los
"proyectos".
GET https://dev.azure.com/_apis/resourceAreas/79134C72-4A58-4B42-976C-
04E7115F32BF
?accountName={organizationName}&api-version=5.0-preview.1
Response
JavaScript
"id": "79134C72-4A58-4B42-976C-04E7115F32BF",
"name": "Core",
"locationUrl": "https://dev.azure.com/Fabrikam"
refleja locationUrl la dirección URL base de la organización.
Con el identificador de la organización
Para obtener la dirección URL de una organización mediante su identificador GUID, use
hostId el parámetro de consulta de los ejemplos anteriores (en lugar de accountName ).
Por ejemplo:
GET https://dev.azure.com/_apis/resourceAreas/79134C72-4A58-4B42-976C-
04E7115F32BF?hostId={organizationId}&api-version=5.0-preview.1
Cómo obtener la dirección URL base de una
API REST
A partir de la dirección URL de una organización, puede usar la API REST de áreas de
recursos para buscar la dirección URL base correcta para cualquier API REST que
necesite llamar. Este proceso garantiza que el código es resistente a la ubicación
(dominio) de una API REST que cambia en el futuro y evita una lógica potencialmente
quebradiza.
7 Nota
Si usa la biblioteca cliente de .NET, TypeScript (web), Node.js o Python
proporcionada por Microsoft, la búsqueda de direcciones URL se controla por
usted. Por ejemplo, en .NET cuando se construye y se llama a , el cliente devuelto se
enlaza correctamente a VssConnection GetClient<T> la dirección URL base correcta
para las API REST a las que llama este cliente.
Si no usa una biblioteca cliente proporcionada por Microsoft:
1. Use la tabla siguiente para buscar el identificador del área de recursos para la API
REST a la que debe llamar. El nombre del área de recursos suele aparecer después
de en /_apis/ la ruta de la API rest. Por ejemplo, la /_apis/release/definitions
API REST pertenece al área release de recursos, que tiene un identificador de
efc2f575-36ef-48e9-b672-0c6fb4a48ac5 .
2. Llame a la API REST de áreas de recursos de nivel de organización
( {organizationUrl}/_apis/resourceAreas/{resourceAreaId}?api-version=5.0-
preview.1 ) y pase el identificador del área de recursos. Por ejemplo:
GET https://dev.azure.com/Fabrikam/_apis/resourceAreas/efc2f575-36ef-
48e9-b672-0c6fb4a48ac5?api-version=5.0-preview.1
3. Use el campo locationUrl de la respuesta JSON como dirección URL base para
llamar a otras API REST para esta área. En este ejemplo, la dirección URL base para
Release Management API REST es https://vsrm.dev.azure.com/Fabrikam .
Al igual que la API REST global de Áreas de recursos descrita anteriormente, no se
necesitan credenciales para llamar a la API REST de áreas de recursos de nivel de
organización.
Ejemplo: Pipelines tarea que llama a una API REST Azure
Pipelines versiones anteriores
En este ejemplo, una tarea de compilación debe llamar a la API REST Azure Pipelines
versiones anteriores. Forma la dirección URL base correcta para esta llamada a la API
rest mediante la dirección URL de la organización (proporcionada en una variable de
entorno) y la API REST de áreas de recursos.
7 Nota
Los identificadores de área de recursos son fijos y se pueden incrustar de forma
segura en tareas y otra lógica.
PowerShell
$orgUrl = $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
$releaseManagementAreaId = "efc2f575-36ef-48e9-b672-0c6fb4a48ac5"
# Build the URL for calling the org-level Resource Areas REST API for the RM
APIs
$orgResourceAreasUrl = [string]::Format("{0}/_apis/resourceAreas/{1}?api-
preview=5.0-preview.1", $orgUrl, $releaseManagementAreaId)
# Do a GET on this URL (this returns an object with a "locationUrl" field)
$results = Invoke-RestMethod -Uri $orgResourceAreasUrl
# The "locationUrl" field reflects the correct base URL for RM REST API
calls
$rmUrl = $results.locationUrl
# Construct the URL to the release definitions REST API
$releaseDefinitionsUrl = [string]::Format("{0}/_apis/release/definitions?
api-preview=5.0-preview.1", $rmUrl)
Identificadores de área de recursos (referencia)
En esta tabla se muestran los identificadores de las áreas de recursos comunes. Consulte
la sección anterior para obtener más información sobre cómo usar esta tabla.
7 Nota
Los identificadores de área de recursos son fijos y son coherentes en todas las
organizaciones de Azure DevOps Services.
Id. del área de recursos Nombre
0d55247a-1c47-4462-9b1f-5e2125590ee6 account
5d6898bb-45ec-463f-95f9-54d49c71752e build
79bea8f8-c898-4965-8c51-8bbc3966faa8 collection
79134c72-4a58-4b42-976c-04e7115f32bf core
31c84e0a-3ece-48fd-a29d-100849af99ba panel
a0848fa1-3593-4aec-949c-694c73f4c4ce delegatedAuth
6823169a-2419-4015-b2fd-6fd6f026ca00 Discusión
a85b8835-c1a1-4aac-ae97-1c3d0ba72dbd distributedtask
7bf94c77-0ce1-44e5-a0f3-263e4ebbf327 drop
6c2b0933-3600-42ae-bf8b-93d4f7e83594 extensionManagement
67349c8b-6425-42f2-97b6-0843cb037473 Favorito
4e080c62-fa21-4fbc-8fef-2a10a2b38049 git
4e40f190-2e3f-4d9f-8331-c7788e833080 graph
68ddce18-2501-45f1-a17b-7931a9922690 memberEntitlementManagement
b3be7473-68ea-4a81-bfc7-9530baaa19ad NuGet
4c83cfc1-f33a-477e-a789-29d38ffca52e npm
45fb9450-a28d-476d-9b0f-fb4aedddff73 paquete
7ab4e64e-c4d8-4f50-ae73-5ef2e21642a5 empaquetado
2e0bf237-8973-4ec9-a581-9c3d679d1776 pipelines
Id. del área de recursos Nombre
fb13a388-40dd-4a04-b530-013a739c72ef policy
8ccfef3d-2b87-4e99-8ccb-66e343d2daa8 perfil
efc2f575-36ef-48e9-b672-0c6fb4a48ac5 release
57731fdf-7d72-4678-83de-f8b31266e429 informes
ea48a0a1-269c-42d8-b8ad-ddc8fcdcf578 paquetes Bower
3b95fb80-fdda-4218-b60e-1052d070ae6b test
c83eaf52-edf3-4034-ae11-17d38f25404c testresults
8aa40520-446d-40e6-89f6-9c9f9ce44c48 tfvc
970aa69f-e316-4d78-b7b0-b7137e47a22c usuario
5264459e-e5e0-4bd8-b118-0985e68a4ec5 Ingenio
1d4f49f9-02b9-4e26-b826-2cdb6195f2a9 work
85f8c7b6-92fe-4ba6-8b6d-fbb67c809341 seguimiento de trabajo
Pasos siguientes
Hacer que la extensión o la integración sea pública
Almacenamiento de datos
Artículo • 21/01/2023 • Tiempo de lectura: 9 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Las extensiones de Azure DevOps tienen la capacidad de almacenar preferencias de
usuario y estructuras de datos complejas directamente en la infraestructura
proporcionada por Microsoft. Esto garantiza que los datos del usuario estén protegidos
y se realicen copias de seguridad igual que otros datos de la organización y del
proyecto. También significa que para las necesidades de almacenamiento de datos
simples, usted (como proveedor de extensiones) no es necesario configurar o
administrar (o pagar) servicios de almacenamiento de datos de terceros.
Hay dos maneras de interactuar con el servicio de almacenamiento de datos: API REST o
un servicio de cliente proporcionado por Microsoft disponible como parte del SDK de
VSS. Se recomienda encarecidamente que los desarrolladores de extensiones usen las
API de servicio de cliente proporcionadas, que proporcionan un contenedor práctico
sobre las API REST.
7 Nota
¿Buscás las API REST de Azure DevOps? Consulte la referencia más reciente de la
API REST de Azure DevOps.
Para más información sobre las bibliotecas cliente de .NET, consulte Bibliotecas
cliente de .NET para Azure DevOps.
Lo que puede almacenar
El servicio está diseñado para permitirle almacenar y administrar dos tipos diferentes de
datos:
1. Configuración: configuración simple de clave-valor (como preferencias de usuario)
2. Documentos: colecciones de objetos complejos similares (documentos)
Una colección es como un contenedor indizado para los documentos. Un documento es
un blob JSON que pertenece a una colección. Aparte de algunos nombres de propiedad
reservados, el esquema de estos documentos se controla y administra por usted.
Cómo puede definir el ámbito de los datos
La configuración y las colecciones de documentos se pueden limitar a:
1. Colección de proyectos: compartida por todos los usuarios de la colección de
proyectos en la que está instalada la extensión
2. Usuario: un único usuario de una colección de proyectos en la que se instala la
extensión
Configuración del almacenamiento
Las dos funciones principales para interactuar con la configuración son getValue() y
setValue():
getValue() toma una clave de cadena (y otras opciones como ámbito) y devuelve
un IPromise. La resolución de esta promesa contiene un valor para la clave
proporcionada.
setValue() toma una clave de cadena y un valor (y otras opciones como ámbito) y
devuelve un IPromise. La resolución de esta promesa contiene el nuevo valor de la
configuración.
Este es un ejemplo de cómo establecer un valor:
JavaScript
// Get data service
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService)
{
// Set value in user scope
dataService.setValue("userScopedKey", 12345, {scopeType:
"User"}).then(function(value) {
console.log("User scoped key value is " + value);
});
});
Este es un ejemplo de cómo recuperar un valor de configuración:
JavaScript
// Get data service
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService)
{
// Get value in user scope
dataService.getValue("userScopedKey", {scopeType:
"User"}).then(function(value) {
console.log("User scoped key value is " + value);
});
});
Si scopeType no se especifica , la configuración se almacena en el nivel de colección de
proyectos y son accesibles para todos los usuarios de esa colección de proyectos
mediante la extensión .
Este es un ejemplo de cómo establecer un valor de
configuración en el nivel de colección del proyecto:
JavaScript
// Get data service
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService)
{
// Set value (default is project collection scope)
dataService.setValue("someKey", "abcd-efgh").then(function(value) {
console.log("Key value is " + value);
});
});
Almacenamiento de datos (colecciones de
documentos)
Para interactuar con datos más completos más allá de los pares clave-valor, puede usar
los conceptos de documentos para realizar operaciones CRUD en los datos de su
extensión. Un documento es un blob JSON, aumentado con dos propiedades especiales:
id. y __etag . Los identificadores se pueden definir por el usuario si son importantes para
el modelo de datos de una extensión o, si se deja sin definir, se genera mediante el
sistema. Estos identificadores deben ser únicos dentro de una colección determinada.
Dado que una colección hace referencia a un ámbito y una instancia determinados de
una extensión, esto significa que se puede usar el mismo identificador de documento en
distintas colecciones.
Están disponibles las siguientes operaciones de documento:
Obtención de un documento
Creación de un documento
Establecer un documento (crear o actualizar)
Actualización de un documento
Eliminar un documento
También hay una sola operación que se puede realizar en una colección:
Obtener todos los documentos
Obtención de un documento por identificador
Recuperar un documento por su identificador de una colección es fácil:
JavaScript
// Get data service
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService)
{
// Get document by id
dataService.getDocument("MyCollection",
"MyDocumentId").then(function(doc) {
// Assuming document has a property named foo
console.log("Doc foo: " + doc.foo);
});
});
Esta llamada intenta recuperar un documento con el identificador "MyDocumentId", de
la colección "MyCollection". Puesto que no se proporciona ningún ámbito, la colección
que usa el servicio se limita al valor predeterminado de toda la instancia de esta
extensión. Si esta colección no existe o no existe un documento con ese identificador, se
devuelve un 404, que la extensión debe controlar. El documento que se devuelve es un
objeto JSON que contiene todas sus propias propiedades, además del identificador
especial y __etag las propiedades usadas por el servicio de almacenamiento de datos.
Creación de un documento
Para crear un nuevo documento, realice una llamada como la siguiente:
JavaScript
// Get data service
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService)
{
// Prepare document first
var newDoc = {
fullScreen: false,
screenWidth: 500
};
dataService.createDocument("MyCollection",
newDoc).then(function(doc) {
// Even if no ID was passed to createDocument, one gets
generated
console.log("Doc id: " + doc.id);
});
});
Si la colección con el nombre y el ámbito proporcionados, aún no existe, se crea
dinámicamente antes de crear el propio documento.
Si el documento proporcionado contiene una id propiedad , ese valor se usa como
identificador único para el documento. Si ese campo no existe, el servicio genera un
GUID y se incluye en el documento que se devuelve cuando se resuelve la promesa.
Si ya existe otro documento de la colección con el mismo identificador que el
proporcionado en el documento, se produce un error en la operación. Si el
comportamiento deseado se crea un nuevo documento si el identificador no existe,
pero modifica el documento existente si lo hace, se debe usar el setDocument() método
.
Establecer un documento (actualizar o crear)
setDocument() realiza el equivalente de una operación "upsert", modificando un
documento existente si hay un identificador en el documento proporcionado que existe
en la colección. Si el identificador no existe o no se proporcionó ningún identificador, se
agrega un nuevo documento a la colección.
JavaScript
// Get data service
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService)
{
// Prepare document first
var myDoc = {
id: 1,
fullScreen: false,
screenWidth: 500
};
dataService.setDocument("MyCollection", myDoc).then(function(doc) {
console.log("Doc id: " + doc.id);
});
});
Actualización de un documento
updateDocument requiere que el documento que se está modificando ya exista en la
colección. Si no se proporciona ningún identificador o el identificador proporcionado en
el documento no existe en la colección, se produce una excepción.
Este es un ejemplo de cómo se usa la actualización:
JavaScript
// Get data service
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService)
{
var collection = "MyCollection";
var docId = "1234-4567-8910";
// Get document first
dataService.getDocument(collection, docId, { scopeType: "User"
}).then(function(doc) {
// Update the document
doc.name = "John Doe";
dataService.updateDocument(collection, doc, { scopeType: "User"
}).then(function(d) {
// Check the new version
console.log("Doc version: " + d.__etag);
});
});
});
Eliminar un documento
Esta función elimina el documento con el identificador proporcionado de la colección
proporcionada. Si la colección no existe o el documento no existe, se devuelve un valor
404.
Este es un ejemplo de uso:
JavaScript
// Get data service
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService)
{
var docId = "1234-4567-8910";
// Delete document
dataService.deleteDocument("MyCollection", docId).then(function() {
console.log("Doc deleted");
});
});
Obtener todos los documentos de una colección
Además de las operaciones en los propios documentos, el servicio de almacenamiento
de datos proporciona una única operación en colecciones: recuperar todos los
documentos de una sola colección. Esta llamada es similar a la siguiente:
JavaScript
// Get data service
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService)
{
// Get all document under the collection
dataService.getDocuments("MyCollection").then(function(docs) {
console.log("There are " + docs.length + " in the collection.");
});
});
Esta llamada devuelve todos los documentos de una colección con ámbito, hasta 100
000 documentos. Si la colección no existe, se devuelve un valor 404.
Avanzado
Cómo se almacenan las opciones
Esta llamada encapsula el método cliente setDocument y lo pasa varias partes de
información. Como se mencionó anteriormente, la configuración se almacena
internamente como documentos, por lo que se crea un documento simple sobre la
marcha, donde el identificador del documento, es la clave que se proporcionó en el
método setValue(). Hay dos propiedades adicionales en el documento. Uno es "value",
que contiene el valor pasado al método . El otro es "revision", que se establece en -1. La
propiedad de revisión se describe con más detalle en la sección "Trabajar con
documentos", pero en el contexto de la configuración, pasando la revisión: -1 en el
documento, estamos indicando que no nos importa el control de versiones de este
documento de configuración.
Dado que la configuración se almacena como documentos, es necesario proporcionar
un nombre de colección, lo que indica dónde almacenar el documento. Para simplificar
las cosas, al trabajar con los métodos setValue()/getValue(), el nombre de la colección
siempre es el nombre especial "$settings". La llamada anterior emite una solicitud PUT
en el siguiente punto de conexión:
httprequest
GET
_apis/ExtensionManagement/InstalledExtensions/{publisherName}/{extensionName
}/Data/Scopes/User/Me/Collections/%24settings/Documents
La carga de la solicitud sería la siguiente:
JSON
{
"id": "myKey",
"__etag": -1,
"value": "myValue"
API de REST
Suponiendo que este fragmento de código se ejecuta después de que el valor ya se
haya establecido, debería ver un mensaje de alerta que contiene el texto "El valor es
myValue". El método getValue es de nuevo un contenedor en torno a las API REST,
emitiendo una solicitud GET al siguiente punto de conexión:
httprequest
GET
_apis/ExtensionManagement/InstalledExtensions/{publisherName}/{extensionName
}/Data/Scopes/User/Me/Collections/%24settings/Documents/myKey
etags
El __etag campo es la forma en que el servicio de almacenamiento de datos controla la
simultaneidad de documentos. Antes de que el servicio almacene una actualización de
un documento, se realiza una comprobación para comprobar que el __etag del
documento almacenado actualmente es igual al __etag del documento pasado como
parte de la actualización. Si esta comprobación se realiza correctamente, __etag se
incrementa y el nuevo documento se devuelve al autor de la llamada. Si se produce un
error en esta comprobación, significa que el documento que se intentó actualizar estaba
obsoleto y se produce una excepción. Es necesario que el escritor de extensiones
controle correctamente esta excepción, ya sea obteniendo la versión más reciente
__etag del documento que combina los cambios y volviendo a intentar la actualización
o propagando un mensaje al usuario.
Puede haber ciertos tipos de documentos en los que este nivel de simultaneidad no es
necesario y un modelo de último resultado es lo que realmente se desea. En estos casos,
al editar el documento, pase -1 como __etag valor para indicar este tipo de
funcionalidad. El servicio de configuración descrito anteriormente usa este modelo para
guardar la configuración y las preferencias.
Agregar un concentrador
Artículo • 18/11/2022 • Tiempo de lectura: 3 minutos
Azure DevOps Services
En este artículo, crearemos un nuevo centro que se muestra en Azure Boards después
de los centros sprints y consultas.
Estructura de una extensión
no-highlight
|--- README.md
|--- sdk
|--- node_modules
|--- scripts
|--- VSS.SDK.js
|--- images
|--- icon.png
|--- scripts // not used in this tutorial
|--- hello-world.html // html page to be used for your hub
|--- vss-extension.json // extension's manifest
Obtenga el SDK de cliente: VSS.SDK.js
El script principal del SDK, VSS.SDK.js, permite que las extensiones web se comuniquen
con el host, Azure DevOps Services, frame. Este script también inicializa, notifica a la
extensión cargada u obtiene contexto sobre la página actual. Obtenga el archivo del
SDK de cliente VSS.SDK.js y agréguelo a la aplicación web.
Colóquelo en la
home/sdk/scripts carpeta .
Use el comando "npm install" mediante la línea de comandos (requiere Node ) para
recuperar el SDK:
no-highlight
npm install vss-web-extension-sdk
7 Nota
Para más información, consulte SDK de extensión web de Azure DevOps .
La página central: hello-world.html
Cada centro muestra una página web
Consulte los grupos de concentradores de destino en la referencia de puntos de
extensión.
Cree un hello-world.html archivo en el directorio de la home extensión.
Haga referencia
al SDK y llame a init() y notifyLoadSucceeded().
HTML
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello World</title>
<script src="sdk/scripts/VSS.SDK.js"></script>
</head>
<body>
<script type="text/javascript">VSS.init();</script>
<h1>Hello World</h1>
<script type="text/javascript">VSS.notifyLoadSucceeded();</script>
</body>
</html>
El archivo de manifiesto de la extensión: vss-
extension.json
Cada extensión debe tener un archivo de manifiesto de extensión
Leer la referencia del manifiesto de extensión
Obtenga más información sobre los puntos de contribución en Puntos de
extensibilidad.
Cree un archivo JSON ( vss-extension.json por ejemplo) en el home directorio con el
siguiente contenido:
JSON
"manifestVersion": 1,
"id": "sample-extension",
"version": "0.1.0",
"name": "My first sample extension",
"description": "A sample Visual Studio Services extension.",
"publisher": "fabrikamdev",
"categories": ["Azure Boards"],
"targets": [
"id": "Microsoft.VisualStudio.Services"
],
"icons": {
"default": "images/logo.png"
},
"contributions": [
"id": "Fabrikam.HelloWorld",
"type": "ms.vss-web.hub",
"description": "Adds a 'Hello' hub to the Work hub group.",
"targets": [
"ms.vss-work-web.work-hub-group"
],
"properties": {
"name": "Hello",
"order": 99,
"uri": "hello-world.html"
],
"scopes": [
"vso.work"
],
"files": [
"path": "hello-world.html", "addressable": true
},
"path": "sdk/scripts", "addressable": true
},
"path": "images/logo.png", "addressable": true
7 Nota
Cambie el publicador por el nombre del publicador. Para crear un publicador,
consulte Empaquetar, publicar e instalar.
Iconos
La estrofa de iconos especifica la ruta de acceso al icono de la extensión en el
manifiesto.
Agregue una imagen cuadrada titulada logo.png , como se muestra en el manifiesto de
extensión.
Contribuciones
La estrofa de contribuciones agrega su contribución (el centro Hello) al manifiesto de
extensión.
Para cada contribución de la extensión, el manifiesto define lo siguiente:
tipo de contribución, centro
destino de contribución, el grupo del centro de trabajo (consulte todos los grupos
de concentradores de destino),
las propiedades específicas de cada tipo de contribución. Un concentrador tiene
las siguientes propiedades.
Propiedad Descripción
name Nombre del concentrador.
orden Colocación del centro en el grupo concentrador.
uri Ruta de acceso (relativa al URI base de extensión) de la página que se va a exponer
como centro.
Ámbitos
Incluya los ámbitos que requiere la extensión.
En este caso, es necesario vso.work acceder a los elementos de trabajo.
Archivos
La estrofa de archivos indica los archivos que desea incluir en el paquete: la página
HTML, los scripts, el script del SDK y el logotipo.
Establézcalo addressable en a true menos que incluya otros archivos que no necesiten
ser direccionables por url.
7 Nota
Para obtener más información sobre el archivo de manifiesto de extensión, como
las propiedades y la función, consulte la referencia del manifiesto de extensión.
Pasos siguientes
Empaquetar, publicar e instalar extensiones
Artículos relacionados
Pruebas y depuración de extensiones
Referencia del manifiesto de extensión
SDK de extensión web de Azure DevOps
Sistema de diseño de fórmulas de Azure DevOps
Agregar un grupo de concentradores
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Crearemos un grupo concentrador y agregaremos un centro a él.
Si aún no lo ha hecho,
cree primero el centro hello y siga estos pasos para crear el grupo concentrador.
1. Agregue un grupo concentrador al archivo de manifiesto de la aplicación en
contribuciones, como esta.
JSON
"contributions": [
"id": "sample-hub-group",
"type": "ms.vss-web.hub-group",
"description": "Adds a 'Samples' hub group at the project/team-
level",
"targets": [
"ms.vss-web.project-hub-groups-collection"
],
"properties": {
"name": "Samples",
"order": 100
},
Examine la referencia de destinos de contribución para ver los grupos de
concentradores disponibles a los que se puede contribuir.
2. Cambie la contribución del centro para que esté en el grupo concentrador de
ejemplos que acaba de crear. Solo tiene que actualizar los destinos al identificador
de contribución relativa del grupo concentrador que acaba de agregar.
JSON
"id": "Fabrikam.HelloWorld",
"type": "ms.vss-web.hub",
"description": "Adds a 'Hello' hub to the Work hub group.",
"targets": [
".sample-hub-group"
],
"properties": {
"name": "Hello",
"order": 99,
"uri": "hello-world.html"
3. Instale la extensión.
Ahora el centro aparece en el grupo Concentrador de ejemplos.
Este es el manifiesto de extensión completo con Hello en el grupo concentrador de
ejemplos.
JSON
"namespace": "Fabrikam.myextension",
"name": "My Extension",
"description": "This is my first extension",
"version": "1.0",
"provider": {
"name": "Fabrikam Fiber Inc"
},
"baseUri": "https://localhost:port",
"icon": "images/logo.png",
"links": {
"info": "info.html",
"support": "support.html",
"termsOfService": "terms-of-service.html"
},
"contributions": {
"vss.web#hubGroups.project": [
"id": "samples",
"name": "Samples",
"order": 30
],
"vss.web#hubs": [
"id": "myhub",
"name": "Hello",
"groupId": "samples",
"uri": "hello-world.html"
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Agregar una acción de menú
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
En este ejemplo, se agrega una acción al menú contextual de consulta en el centro de
consultas del elemento de trabajo.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Requisitos previos para este artículo
Debe crear una aplicación web para la acción, que se puede encontrar en el
ejemplo del centro.
Si no lo ha hecho, eche un vistazo al tutorial de escritura de la primera extensión
para obtener información sobre los conceptos básicos.
Actualizar archivo de manifiesto de extensión
A continuación se muestra el fragmento de código que agrega la acción a la sección de
contribuciones del manifiesto de extensión.
JSON
...
"contributions": [
"id": "myAction",
"type": "ms.vss-web.action",
"description": "Run in Hello hub action",
"targets": [
"ms.vss-work-web.work-item-query-menu"
],
"properties": {
"text": "Run in Hello hub",
"title": "Run in Hello hub",
"icon": "images/icon.png",
"groupId": "actions",
"uri": "action.html"
...
Propiedades
Propiedad Descripción
text Texto que aparece en el elemento de menú.
title Texto de información sobre herramientas que aparece en el elemento de
menú.
icon Dirección URL a un icono que aparece en el elemento de menú. Las
direcciones URL relativas se resuelven mediante baseUri.
groupId Determina dónde aparece este elemento de menú en relación con los
demás.
uri URI en una página que registra el controlador de acciones de menú
(consulte a continuación).
registeredObjectId (Opcional) Nombre del controlador de acciones de menú registrado. El valor
predeterminado es el identificador de colaborador.
Obtenga información sobre todos los lugares donde puede agregar acciones en puntos
de extensibilidad.
Página HTML
La acción de menú se representa mediante un script de JavaScript incrustado en un
archivo HTML. Guarde el siguiente contenido en un archivo y una ubicación que
coincida con la referencia a él en el archivo de manifiesto de la extensión.
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Action Sample</title>
</head>
<body>
<div>
The end user doesn't see the content on this page.
It is only in the background to handle the contributed menu item
being selected.
</div>
</body>
</html>
Your JavaScript
El script siguiente registra el objeto de controlador para controlar la acción, colóquelo
en la sección de la head página HTML anterior.
Hemos establecido lib un alias para que esté node_modules/vss-web-extension-
sdk/lib en nuestro vss-extension.json archivo de manifiesto.
TypeScript
<script src="lib/VSS.SDK.min.js"></script>
<script>
VSS.init();
// Use an IIFE to create an object that satisfies the
IContributedMenuSource contract
var menuContributionHandler = (function () {
"use strict";
return {
// This is a callback that gets invoked when a user selects the
newly contributed menu item
// The actionContext parameter contains context data surrounding
the circumstances of this
// action getting invoked.
execute: function (actionContext) {
alert("Hello, world");
};
}());
// Associate the menuContributionHandler object with the "myAction" menu
contribution from the manifest.
VSS.register("myAction", menuContributionHandler);
</script>
Sugerencia
Para obtener más información, vea Puntos de extensibilidad, menús y barras de
herramientas, el modelo de contribución el sistema de diseño de fórmulas, la
referencia de la API rest, los ejemplos de extensiones y los recursos de la
Developer Community .
Pasos siguientes
Ahora que ha escrito la extensión, los pasos siguientes son Empaquetar, Publicar e
Instalar la extensión. También puede consultar la documentación para probar y depurar
la extensión.
Empaquetar, publicar e instalar extensiones
Pruebas y depuración de extensiones
Creación de un punto de conexión de
servicio
Artículo • 04/10/2022 • Tiempo de lectura: 6 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Los puntos de conexión de servicio son una manera de que Azure DevOps se conecte a
sistemas o servicios externos. Son una agrupación de propiedades almacenadas de
forma segura por Azure DevOps, que incluye, pero no se limita a las siguientes
propiedades:
Nombre del servicio
Descripción
Dirección URL del servidor
Certificados o tokens
Nombres de usuarios y contraseñas
A continuación, las extensiones pueden usar el punto de conexión de servicio para
adquirir los detalles almacenados para realizar las operaciones necesarias en ese
servicio.
Siga esta guía para crear una nueva contribución de punto de servicio y usarla
en la extensión.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Información general sobre tareas
Puede desarrollar un punto de conexión de servicio mediante la creación de una
extensión de ejemplo para Azure DevOps que incluya los siguientes elementos:
Un punto de conexión de servicio personalizado con orígenes de datos, que
permite que una tarea de compilación o un widget de panel llamen a un punto de
conexión REST en el servicio o servidor definido por el punto de conexión.
Una tarea de compilación, que define dos propiedades: el punto de conexión & de
servicio una lista de selección, que tiene valores rellenados desde el origen de
datos del punto de conexión REST.
7 Nota
Los puntos de conexión de servicio creados por los usuarios se crean en el nivel de
proyecto, no en el nivel de organización.
Los pasos necesarios para completar esta tarea son:
1. Crear el archivo de manifiesto de extensión
2. Creación de la canalización de tareas de compilación, en el archivo task.json
7 Nota
En este tutorial se hace referencia al directorio principal del proyecto como "home".
Cree el archivo de manifiesto: vss-
extension.json
El archivo de manifiesto define el punto de conexión personalizado y los vínculos al
manifiesto task.json de la tarea de compilación.
En este artículo, la creación del archivo de manifiesto se divide en las tres partes
siguientes:
Creación del archivo de manifiesto básico
Adición de una contribución de punto de conexión personalizado
Agregar una tarea de compilación
Creación de un archivo de manifiesto básico
Cree un archivo JSON ( vss-extension.json por ejemplo) en el directorio de la home
extensión.
JSON
"manifestVersion": 1,
"id": "service-endpoint-tutorial",
"version": "0.1.1",
"name": "Sample extension that leverages a service endpoint",
"description": "A sample Azure DevOps extension which shows how to create
a custom endpoint and dynamic build task parameters taking value from a REST
API.",
"publisher": "francistotten",
"targets": [
"id": "Microsoft.VisualStudio.Services"
],
"files": [
"path": "BuildTaskFolder"
7 Nota
Debe actualizar la publisher propiedad . Y "BuildTaskFolder" es la ruta de acceso
donde finalmente colocaremos nuestra canalización de tareas de compilación.
Adición de la contribución de punto de conexión
personalizado
Agregue la siguiente contributions matriz debajo de la targets matriz del contenido
básico del manifiesto.
) Importante
Los parámetros de conexión de servicio deben capturarse mediante el
identificador de conexión de servicio.
JSON
"contributions": [
"id": "service-endpoint",
"description": "Service endpoint type for Fabrikam connections",
"type": "ms.vss-endpoint.service-endpoint-type",
"targets": [ "ms.vss-endpoint.endpoint-types" ],
"properties": {
"name": "fabrikam",
"displayName": "Fabrikam server connection",
"url": {
"displayName": "Server Url",
"helpText": "Url for the Fabrikam server to connect to."
},
"dataSources": [
"name": "Fabrikam Projects",
"endpointUrl": "{{endpoint.url}}api/projects/index",
"resultSelector": "jsonpath:$[*].nm"
],
"authenticationSchemes": [
"type": "ms.vss-endpoint.endpoint-auth-scheme-token"
},
"type": "ms.vss-endpoint.endpoint-auth-scheme-basic",
"inputDescriptors": [
"id": "username",
"name": "Username",
"description": "Username",
"inputMode": "textbox",
"validation": {
"isRequired": false,
"dataType": "string"
},
"id": "password",
"name": "Password",
"description": "Password",
"inputMode": "passwordbox",
"isConfidential": true,
"validation": {
"isRequired": false,
"dataType": "string"
],
"helpMarkDown": "<a href=\"url-to-documentation\" target=\"_blank\">
<b>Learn More</b></a>"
},
],
Si ha agregado correctamente la contribución del servicio, verá el punto de conexión de
Fabrikam al intentar agregar un nuevo punto de conexión de servicio a la organización.
Cree un punto de conexión de servicio mediante el punto de conexión de Fabrikam.
Sugerencia
Puede agregar inputDescriptors sin authenticationSchemes. Para obtener más
información, vea Interfaz InputDescriptor.
Adición de la contribución de la tarea de compilación
Dentro de la contributions matriz del paso anterior, agregue el siguiente objeto al final.
JSON
"id": "build-task",
"description": "Task with a dynamic property getting data from an
endpoint REST data source",
"type": "ms.vss-distributed-task.task",
"targets": [ "ms.vss-distributed-task.tasks" ],
"properties": {
"name": "BuildTaskFolder"
La dirección URL del punto de conexión dataSource se calcula a partir de la dirección
URL del punto de conexión (o una dirección URL fija) y otros valores.
En este tutorial,
esta llamada REST no devuelve nada y está pensado para reemplazarse por las llamadas
REST que desee realizar en el servicio.
Es posible usar otros parámetros que la dirección URL del punto de conexión para la
dirección URL de REST, por ejemplo, algunas propiedades del punto de conexión.
Por
ejemplo, suponiendo que teníamos una propiedad en el punto de conexión
denominado subscriptionId, la dirección URL de REST podría usarla con la siguiente
sintaxis: $(endpoint.subscription).
Creación de la tarea de compilación
El task.json archivo describe la tarea de compilación.
7 Nota
Eche un vistazo a la referencia de la tarea de compilación para buscar el esquema
del archivo JSON de la tarea de compilación.
Cree un task.json archivo en el BuildTaskFolder directorio, si aún no ha creado esta
carpeta, hágalo ahora.
JSON
"id": "6557a6d2-4caf-4247-99ea-5131286a8753",
"name": "build-task",
"friendlyName": "Build Task that uses the service endpoint",
"description": "Task with a dynamic property getting data from an endpoint
REST data source",
"author": "francistotten",
"helpMarkDown": "Replace with Markdown to show in help",
"category": "Build",
"visibility": [
"Build",
"Release"
],
"demands": [],
"version": {
"Major": "0",
"Minor": "1",
"Patch": "1"
},
"minimumAgentVersion": "1.95.0",
"instanceNameFormat": "Service Endpoint Build Task $(project)",
"inputs": [
"name": "FabrikamService",
"type": "connectedService:Fabrikam",
"label": "Fabrikam service/server end point",
"defaultValue": "",
"required": true,
"helpMarkDown": "Select the Fabrikam end point to use. If
needed,selecton 'manage', and add a new service endpoint of type 'Fabrikam
server connection'"
},
"name": "project",
"type": "pickList",
"label": "Fabrikam Project",
"required": true,
"helpMarkDown": "Select the name of the Fabrikam Project to analyze.",
"properties": {
"EditableOptions": "True"
],
"dataSourceBindings": [
"target": "project",
"endpointId": "$(FabrikamService)",
"dataSourceName": "Fabrikam Projects"
],
"execution": {
"Node": {
"target": "sample.js",
"argumentFormat": ""
},
"PowerShell3": {
"target": "sample.ps1"
componentes task.json
Objeto FabrikamService de entrada
Este campo es el primero de tipo connectedService:Fabrikam.connectedService expresa
que es un tipo de punto de conexión y que Fabrikam es el nombre del objeto.
Objeto project de entrada
Este campo es el segundo. Es una lista de selección.
Este campo se rellena mediante una llamada REST.
Los valores del campo "project" se toman del origen de datos REST "Projects" del
punto de conexión personalizado.
Expresado en la dataSourceBindings matriz.
El destino es el nombre del campo de tarea de compilación que se va a rellenar
("proyecto").
EndpointId es el nombre del campo de tarea de compilación que contiene el
tipo de punto de conexión personalizado.
DataSourceName elige la llamada DE REST.
Si ha agregado correctamente la tarea de compilación, ahora debería ver la tarea de
compilación al agregar tareas a una canalización de compilación.
Una vez que haya agregado la tarea de compilación a la canalización, confirme que
puede ver el punto de conexión de Fabrikam que ha creado.
La lista desplegable de
proyectos de este tutorial está en blanco, ya que no se usa un servicio real.
Una vez que
reemplace Fabrikam por el servicio, reemplace la llamada a Projects por su propia
llamada API REST para usar datos dinámicos dentro de la tarea de compilación.
Authentication
El esquema de autenticación de un punto de conexión de servicio determina las
credenciales que se usarían para conectarse al servicio externo. Para obtener más
información y ver los siguientes esquemas de autenticación, consulte la documentación
sobre esquemas de autenticación.
Autenticación básica
Autenticación basada en tokens
Autenticación basada en certificados
Sin autenticación
Pasos siguientes
Empaquetar, publicar e instalar extensiones
Artículos relacionados
Probar y depurar extensiones
Desarrollar una extensión web
Adición de un decorador de canalización
Creación de un consumidor
personalizado para enlaces de servicio
Artículo • 28/12/2022 • Tiempo de lectura: 3 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Con los enlaces de servicio, puede notificar a los sistemas de terceros los eventos que se
producen en el proyecto. Puede usar un consumidor personalizado para enviar un
mensaje HTTP al punto de conexión definido en el manifiesto de la extensión.
En este artículo se explica el desarrollo de una extensión que implementa un servicio de
consumidor de ejemplo, que incluye los siguientes eventos y acciones.
Eventos admitidos que desencadenan las siguientes acciones:
Código insertado
Solicitud de incorporación de cambios creada
Solicitud de incorporación de cambios actualizada
Acciones admitidas para realizar cuando se producen eventos:
Acción do (Enviar mensaje HTTP)
7 Nota
En este artículo, nos referimos al directorio principal del proyecto como "home".
Para más información, consulte el repositorio de GitHub de ejemplo de extensión .
Para obtener una lista de todos los eventos admitidos que puede usar como
desencadenadores para la extensión de consumidor personalizada, consulte Lista de
tipos de eventos.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Funcionamiento de los enlaces de servicio
Los publicadores de enlaces de servicio definen un conjunto de eventos. Las
suscripciones escuchan y esperan los eventos y definen las acciones para cuando se
desencadena el evento.
Se trata de una descripción general de cómo funcionan todas nuestras
implementaciones de enlace de servicio. En nuestro caso, especificamos nuestro
consumidor definido por una extensión, así como la acción especificada para cuando se
produce un evento.
Creación de la extensión
1. Vea cómo crear la extensión desde cero.
2. Agregue la contribución específica para la implementación de consumidor
personalizada al archivo de manifiesto básico. Vea el ejemplo siguiente de cómo
debe buscar el manifiesto después de agregar la contribución.
JSON
"manifestVersion": 1,
"id": "samples-service-hooks-consumer",
"version": "0.1.2",
"name": "Service Hooks Sample",
"description": "A simple extension that demonstrates how to contribute a
consumer service into service hooks.",
"publisher": "fabrikam",
"public": false,
"icons": {
"default": "images/logo.png"
},
"scopes": [],
"files": [
"path": "images",
"addressable": true
],
"content": {
"details": {
"path": "readme.md"
},
"categories": [
"Developer samples"
],
"targets": [
"id": "Microsoft.VisualStudio.Services"
],
"contributions": [
"id": "consumer",
"type": "ms.vss-servicehooks.consumer",
"targets": [
"ms.vss-servicehooks.consumers"
],
"properties": {
"id": "consumer",
"name": "Sample Consumer",
"description": "Sample consumer service",
"informationUrl": "https://aka.ms/vsoextensions",
"inputDescriptors": [
"id": "url",
"isRequired": true,
"name": "URL",
"description": "URL to post event payload to",
"inputMode": "textbox"
],
"actions": [
"id": "performAction",
"name": "Perform action",
"description": "Posts a standard event payload",
"supportedEventTypes": [
"git.push",
"git.pullrequest.created",
"git.pullrequest.updated"
],
"publishEvent": {
"url": "{{{url}}}",
"resourceDetailsToSend": "all",
"messagesToSend": "all",
"detailedMessagesToSend": "all"
7 Nota
No olvide actualizar la publisher propiedad .
Para cada contribución de la extensión, el manifiesto define los siguientes elementos.
Tipo de contribución: servicio de consumidor (ms.vss-servicehooks.consumer) en
este caso
Destino de contribución: servicios de consumidor (ms.vss-servicehooks.consumers)
en este caso
Propiedades específicas de cada tipo de contribución
Los consumidores tienen las siguientes propiedades.
Propiedad Descripción
id Identificador único para el servicio de consumidor.
name Nombre del consumidor personalizado, que es visible durante la creación de la
suscripción de enlace de servicio.
description Describe el servicio de consumidor.
informationUrl Encuentra más información sobre tu extensión.
inputDescriptors Entradas que usarán los usuarios que crean suscripciones con el servicio de
consumidor.
actions Describe las acciones que se van a realizar y qué eventos desencadenan esas
acciones.
Las acciones para el consumidor tienen las siguientes propiedades:
Propiedad Descripción
id Identificador del servicio de acción.
name Nombre de la acción.
description Descripción detallada de la acción.
supportedEventTypes Matriz de tipos de desencadenadores para los que se puede usar esta
acción. Para obtener más información, vea Lista de tipos de eventos.
publishEvent.url Dirección URL a la que se envía el mensaje HTTP. Los valores
proporcionados por inputDescriptors pueden crear plantillas. Los valores
reales se definen por el usuario cuando se crea la suscripción.
3. Implemente la extensión en la organización de Azure DevOps y pruebela.
Pasos siguientes
Empaquetar, publicar e instalar extensiones
Artículos relacionados
Consumidores de enlace de servicio
Servicios disponibles para enlaces de servicio
Creación de una suscripción de enlace de servicio mediante programación
Probar y depurar extensiones
Repositorio de GitHub de ejemplo de extensión
Lista de tipos de eventos
Creación de un servidor de estado de
solicitud de incorporación de cambios
con Node.js
Artículo • 27/09/2022 • Tiempo de lectura: 10 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
El flujo de trabajo de solicitud de incorporación de cambios (PR) proporciona a los
desarrolladores una oportunidad para obtener comentarios sobre su código de
elementos del mismo nivel, así como de herramientas automatizadas. Las herramientas
y servicios de terceros pueden participar en el flujo de trabajo de solicitud de
incorporación de cambios mediante la API de estado de la solicitud de incorporación de
cambios. Este artículo le guía por el proceso de creación de un servidor de estado para
validar las solicitudes de incorporación de cambios en un repositorio de Git de Azure
DevOps Services. Para más información sobre el estado de solicitud de incorporación de
cambios, consulte Personalización y ampliación de flujos de trabajo de solicitud de
incorporación de cambios con el estado de la solicitud de incorporación de cambios.
Requisitos previos
Una organización de Azure DevOps con un repositorio de Git. Si no tiene una
organización, regístrese para cargar y compartir código en repositorios de Git
privados ilimitados gratuitos.
Instale VS Code u otro editor de código de su elección. Las instrucciones de esta
guía usan VS Code, pero los pasos de otros editores de código son similares.
Instalación de Node.js
Para instalar Node.js, descargue la versión LTS adecuada para su plataforma. La
descarga contiene un instalador, que puede ejecutar para instalar el entorno de
ejecución de Node.js en el equipo local. Al instalar Node.js, asegúrese de mantener la
parte del administrador de paquetes npm de la instalación, que está seleccionada de
forma predeterminada.
Creación de un servidor web básico mediante
Express
Los pasos de esta sección usan Express , que es un marco web ligero para Node.js que
proporciona una serie de métodos de utilidad HTTP que simplifican la creación de un
servidor web. Este marco proporciona las funciones básicas necesarias para escuchar
eventos de solicitud de incorporación de cambios.
1. Desde la línea de comandos, cree una carpeta de proyecto para el servidor web.
mkdir pr-server
cd pr-server
2. Use el npm init comando para crear un nuevo package.json archivo para el
proyecto.
npm init
Presione Entrar para aceptar los valores predeterminados de todas las opciones
excepto el punto de entrada. Cámbiela a app.js .
entry point: (index.js) app.js
3. Instale Express en el directorio pr-server mediante el siguiente comando. Esto
instala Express y lo guarda en la lista de dependencias.
npm install express
4. Cree una aplicación express sencilla en la que se compilará para el servidor de
estado de pr. Los pasos siguientes se basan en el ejemplo Express Hello world .
Abra la carpeta del proyecto en VS Code ejecutando el siguiente comando desde
la pr-server carpeta .
code .
5. Cree un archivo (Ctrl + N) y pegue el código de ejemplo siguiente.
JavaScript
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('Hello World!')
})
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})
6. Guarde el archivo como app.js .
7. Ejecute el servidor web básico mediante el siguiente comando:
node app.js
Compruebe que el servidor se está ejecutando; para ello, vaya a
http://localhost:3000/ .
Escucha de solicitudes HTTP POST
El servidor web va a recibir POST solicitudes de Azure DevOps Services, por lo que debe
controlar esas solicitudes en el servidor.
1. Al final del app.js archivo, agregue el código siguiente y guarde el archivo.
JavaScript
app.post('/', function (req, res) {
res.send('Received the POST')
})
2. Vuelva a ejecutar el servidor web con el siguiente comando:
node app.js
Configuración de un enlace de servicio para
eventos de solicitud de incorporación de
cambios
Los enlaces de servicio son una característica Azure DevOps Services que puede alertar a
servicios externos cuando se producen determinados eventos. Para este ejemplo, querrá
configurar dos enlaces de servicio para eventos de solicitud de incorporación de
cambios, por lo que se puede notificar al servidor de estado. El primero será para el
evento de solicitud de incorporación de cambios creado y el segundo será para el
evento de solicitud de incorporación de cambios actualizado .
Para recibir las notificaciones de enlace de servicio, deberá exponer un puerto a la red
pública de Internet. La utilidad ngrok es muy útil para hacerlo en un entorno de
desarrollo.
1. Descargue y descomprima la versión de ngrok adecuada para su plataforma.
2. Use ngrok para empezar a escuchar en el mismo puerto que el servidor de
ejemplo: puerto 3000. Ejecute el siguiente comando en una nueva ventana de
comandos.
ngrok http 3000
Ngrok creará una dirección URL pública que reenvía a localhost:3000 . Tenga en
cuenta que la dirección URL, ya que la necesitará en el paso siguiente. Tendrá un
aspecto similar al siguiente:
http://c3c1bffa.ngrok.io
3. Vaya al proyecto en Azure DevOps, por ejemplo. https://dev.azure.com/<your
account>/<your project name>
4. En el menú de navegación, mantenga el puntero sobre el engranaje y seleccione
Enlaces de servicio.
5. Si se trata de su primer enlace de servicio, seleccione + Crear suscripción.
Si ya tiene configurados otros enlaces de servicio, seleccione el signo verde más
(+) para crear una nueva suscripción de enlace de servicio.
6. En el cuadro de diálogo Nueva suscripción de enlaces de servicio, seleccione Web
Hooks en la lista de servicios y, a continuación, seleccione Siguiente.
7. Seleccione Solicitud de incorporación de cambios creada en la lista de
desencadenadores de eventos y, a continuación, seleccione Siguiente.
8. En la página Acción, escriba la dirección URL de ngrok en el cuadro DIRECCIÓN
URL . Seleccione Probar para enviar un evento de prueba al servidor.
En la ventana de la consola de ngrok, verá un entrante POST que devolvió un 200
OK , que indica que el servidor recibió el evento de enlace de servicio.
HTTP Requests
-------------
POST / 200 OK
En la ventana Notificación de prueba, seleccione la pestaña Respuesta para ver los
detalles de la respuesta del servidor. Debería ver una longitud de contenido de 17
que coincida con la longitud de la cadena del controlador POST (es decir,
"Recibido el POST").
9. Cierre la ventana Notificación de prueba y seleccione Finalizar para crear el enlace
de servicio.
Siga los pasos del 3 al 9 de nuevo, pero esta vez configure el evento de actualización de
la solicitud de incorporación de cambios .
) Importante
Asegúrese de seguir los pasos anteriores dos veces y crear enlaces de servicio tanto
para la solicitud de incorporación de cambios creada como para los eventos
actualizados de la solicitud de incorporación de cambios.
Publicar el estado en solicitudes de
incorporación de cambios
Ahora que el servidor puede recibir eventos de enlace de servicio cuando se creen
nuevas solicitudes de incorporación de cambios, actualícela para volver a publicar el
estado en la solicitud de incorporación de cambios.
1. Las solicitudes de enlace de servicio incluyen una carga JSON que describe el
evento. Para ayudar a analizar el JSON devuelto por el enlace de servicio, instale el
paquete del analizador de cuerpo .
npm install body-parser
2. Actualice app.js para usar el analizador de cuerpo para analizar application/json .
JavaScript
var bodyParser = require('body-parser')
app.use(bodyParser.json())
3. Para simplificar la realización de llamadas api rest a Azure Repos, instale el paquete
azure-devops-node-api .
npm install azure-devops-node-api
4. Actualice app.js para usar el paquete azure-devops-node-api, configure los
detalles de una conexión a la cuenta y obtenga una instancia de la API de Git.
JavaScript
const vsts = require("azure-devops-node-api")
const collectionURL = process.env.COLLECTIONURL
const token = process.env.TOKEN
var authHandler = vsts.getPersonalAccessTokenHandler(token)
var connection = new vsts.WebApi(collectionURL, authHandler)
var vstsGit = connection.getGitApi().then(
vstsGit => {
vstsGit.createPullRequestStatus(prStatus, repoId,
pullRequestId).then( result => {
console.log(result);
},
error => {
console.log(error);
})
},
error => {
console.log(error);
);
5. Cree una variable de entorno para la dirección URL de la colección y reemplace por
<your account> el nombre de la organización de Azure DevOps.
setx COLLECTIONURL "https://dev.azure.com/<your account>"
6. Cree un token de autenticación personal (PAT) para que la aplicación lo use,
siguiendo estas instrucciones: Autenticación con tokens de acceso personal. Debe
crear un nuevo PAT para cada servicio que use para acceder a su cuenta, asígnele
el nombre adecuado.
7. Cree una variable de entorno para el PAT.
setx TOKEN "yourtokengoeshere"
8. Actualice la post() función para leer los detalles de la solicitud de incorporación
de cambios de la carga del enlace de servicio. Necesitará estos valores para
devolver el estado.
JavaScript
var repoId = req.body.resource.repository.id
var pullRequestId = req.body.resource.pullRequestId
var title = req.body.resource.title
9. Compile el objeto de estado que se va a publicar en la solicitud de incorporación
de cambios.
State es una enumeración de tipo GitStatusState. Use succeeded para indicar que
la solicitud de incorporación de cambios ha superado la comprobación de estado y
está lista para combinarse.
description es un valor de cadena que se mostrará al usuario en la sección Estado
y la fuente de actividades en la vista de detalles de la solicitud de incorporación de
cambios.
targetUrl es una dirección URL que se usará para crear un vínculo para el texto de
descripción de la sección Estado y la fuente de actividades. Este es el lugar donde
los usuarios pueden ir para obtener más información sobre el estado, por ejemplo,
un informe de compilación o una ejecución de prueba. Si no se especifica ninguna
dirección URL, la descripción aparecerá como texto sin vínculo.
El contexto name y genre se usan para clasificar el estado y distinguirlo de otros
servicios que publican el estado.
JavaScript
var prStatus = {
"state": "succeeded",
"description": "Ready for review",
"targetUrl": "https://visualstudio.microsoft.com",
"context": {
"name": "wip-checker",
"genre": "continuous-integration"
10. En lugar de simplemente publicar el succeeded estado de forma ciega, inspeccione
el título de la solicitud de incorporación de cambios para ver si el usuario ha
indicado si la solicitud de incorporación de cambios es un trabajo en curso
agregando WIP al título. Si es así, cambie el estado devuelto a la solicitud de
incorporación de cambios.
JavaScript
if (title.includes("WIP")) {
prStatus.state = "pending"
prStatus.description = "Work in progress"
11. Por último, publique el estado mediante el createPullRequestStatus() método .
Requiere el objeto de estado, el identificador del repositorio y el identificador de la
solicitud de incorporación de cambios. Genera la respuesta a la consola del nodo
para que pueda ver el resultado de la publicación.
JavaScript
vstsGit.createPullRequestStatus(prStatus, repoId, pullRequestId).then(
result => {
console.log(result)
})
12. El método resultante debe tener un aspecto similar al siguiente:
JavaScript
app.post("/", function (req, res) {
// Get the details about the PR from the service hook payload
var repoId = req.body.resource.repository.id
var pullRequestId = req.body.resource.pullRequestId
var title = req.body.resource.title
// Build the status object that we want to post.
// Assume that the PR is ready for review...
var prStatus = {
"state": "succeeded",
"description": "Ready for review",
"targetUrl": "https://visualstudio.microsoft.com",
"context": {
"name": "wip-checker",
"genre": "continuous-integration"
// Check the title to see if there is "WIP" in the title.
if (title.includes("WIP")) {
// If so, change the status to pending and change the
description.
prStatus.state = "pending"
prStatus.description = "Work in progress"
// Post the status to the PR
vstsGit.createPullRequestStatus(prStatus, repoId,
pullRequestId).then( result => {
console.log(result)
})
res.send("Received the POST")
})
13. Guarde app.js y reinicie la aplicación de nodo.
node app.js
Creación de una nueva solicitud de
incorporación de cambios para probar el
servidor de estado
Ahora que el servidor se está ejecutando y escuchando notificaciones de enlace de
servicio, cree una solicitud de incorporación de cambios para probarla.
1. Comience en la vista de archivos. Edite el archivo readme.md en el repositorio (o
cualquier otro archivo si no tiene un readme.md).
2. Realice una edición y confirme los cambios en el repositorio.
3. Asegúrese de confirmar los cambios en una nueva rama para que pueda crear una
solicitud de incorporación de cambios en el paso siguiente.
4. Seleccione el vínculo Crear una solicitud de incorporación de cambios .
5. Agregue WIP en el título para probar la funcionalidad de la aplicación. Seleccione
Crear para crear la solicitud de incorporación de cambios.
6. Una vez creada la solicitud de incorporación de cambios, verá la sección de estado,
con la entrada Trabajo en curso que vincula a la dirección URL especificada en la
carga.
7. Actualice el título de la solicitud de incorporación de cambios y quite el texto de
WIP y tenga en cuenta que el estado cambia de Trabajo en curso a Listo para
revisión.
Pasos siguientes
En este artículo, ha aprendido los conceptos básicos de cómo crear un servicio que
escucha eventos de solicitud de incorporación de cambios a través de enlaces de
servicio y puede publicar mensajes de estado mediante la API de estado. Para
obtener más información sobre la API de estado de la solicitud de incorporación
de cambios, consulte la documentación de la API REST.
Configure una directiva de rama para un servicio externo.
Usar Azure Functions para crear
directivas de rama personalizadas
Artículo • 27/09/2022 • Tiempo de lectura: 8 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
El flujo de trabajo de solicitud de incorporación de cambios (PR) proporciona a los
desarrolladores la oportunidad de recibir comentarios sobre su código de elementos del
mismo nivel, así como de herramientas automatizadas. Las herramientas y servicios de
terceros pueden participar en el flujo de trabajo de solicitud de incorporación de
cambios mediante la API de estado de la solicitud de incorporación de cambios. Este
artículo le guía por el proceso de creación de una directiva de rama personalizada
mediante Azure Functions para validar las solicitudes de incorporación de cambios en
un repositorio de Git de Azure DevOps Services. Con Azure Functions no tiene que
preocuparse por el aprovisionamiento y el mantenimiento de servidores, especialmente
cuando crece la carga de trabajo. Azure Functions proporcionar una plataforma de
proceso totalmente administrada con alta confiabilidad y seguridad.
Para obtener más información sobre el estado de solicitud de incorporación de cambios,
consulte Personalización y ampliación de flujos de trabajo de solicitud de incorporación
de cambios con el estado de la solicitud de incorporación de cambios.
Requisitos previos
Una organización de Azure DevOps con un repositorio de Git. Si no tiene una
organización, regístrese para cargar y compartir código en repositorios de Git privados
ilimitados gratuitos.
Creación de una función básica de Azure para
escuchar eventos de Azure Repos
Siga la documentación de creación de la primera función de Azure para crear una
función sencilla. Modifique el código del ejemplo para que tenga este aspecto:
C#
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,
TraceWriter log)
try
log.Info("Service Hook Received.");
// Get request body
dynamic data = await req.Content.ReadAsAsync<object>();
log.Info("Data Received: " + data.ToString());
// Get the pull request object from the service hooks payload
dynamic jObject = JsonConvert.DeserializeObject(data.ToString());
// Get the pull request id
int pullRequestId;
if (!Int32.TryParse(jObject.resource.pullRequestId.ToString(), out
pullRequestId))
log.Info("Failed to parse the pull request id from the service
hooks payload.");
};
// Get the pull request title
string pullRequestTitle = jObject.resource.title;
log.Info("Service Hook Received for PR: " + pullRequestId + " " +
pullRequestTitle);
return req.CreateResponse(HttpStatusCode.OK);
catch (Exception ex)
log.Info(ex.ToString());
return req.CreateResponse(HttpStatusCode.InternalServerError);
Configuración de un enlace de servicio para
eventos de solicitud de incorporación de
cambios
Los enlaces de servicio son una característica de Azure DevOps Services que puede
alertar a servicios externos cuando se producen determinados eventos. En este ejemplo,
le interesará configurar un enlace de servicio para eventos de solicitud de incorporación
de cambios, se notificará a la función de Azure cuando cambie una solicitud de
incorporación de cambios. Para recibir POST solicitudes cuando cambien las solicitudes
de incorporación de cambios, deberá proporcionar el enlace de servicio con la dirección
URL de la función de Azure.
Para este ejemplo, deberá configurar 2 enlaces de servicio. La primera será para el
evento de creación de la solicitud de incorporación de cambios y el segundo será para
el evento actualizado de la solicitud de incorporación de cambios .
1. Obtenga la dirección URL de la función del Azure Portal haciendo clic en la
dirección URL de obtención de la función en la vista de funciones de Azure y
copie la dirección URL.
2. Vaya al proyecto en Azure DevOps, por ejemplo. https://dev.azure.com/<your
organization>/<your project name>
3. En el menú de navegación, mantenga el puntero sobre el engranaje y seleccione
Enlaces de servicio.
4. Si este es el primer enlace de servicio, seleccione + Crear suscripción.
Si ya tiene otros enlaces de servicio configurados, seleccione el signo verde más
(+) para crear una nueva suscripción de enlace de servicio.
5. En el cuadro de diálogo Nueva suscripción de enlaces de servicio, seleccione Web
Hooks en la lista de servicios y, a continuación, seleccione Siguiente.
6. Seleccione Solicitud de incorporación de cambios creada en la lista de
desencadenadores de eventos y, a continuación, seleccione Siguiente.
7. En la página Acción, escriba la dirección URL que copió en el paso 1 en el cuadro
DIRECCIÓN URL . Seleccione Probar para enviar un evento de prueba al servidor.
En la ventana del registro de funciones de Azure, verá una entrada POST que
devolvió un 200 OK , que indica que la función recibió el evento de enlace de
servicio.
HTTP Requests
-------------
POST / 200 OK
En la ventana Notificación de prueba, seleccione la pestaña Respuesta para ver los
detalles de la respuesta del servidor. Debería ver la respuesta del servidor.
8. Cierre la ventana Notificación de prueba y seleccione Finalizar para crear el enlace
de servicio.
Vuelva a seguir los pasos del 2 al 8, pero esta vez configure el evento de actualización
de la solicitud de incorporación de cambios .
) Importante
Asegúrese de seguir los pasos anteriores dos veces y crear enlaces de servicio para
la solicitud de incorporación de cambios creada y los eventos actualizados de
solicitud de incorporación de cambios .
Cree una solicitud de incorporación de cambios para comprobar que la función de
Azure recibe notificaciones.
Publicar el estado en las solicitudes de
incorporación de cambios
Ahora que el servidor puede recibir eventos de enlace de servicio cuando se creen
nuevas solicitudes de incorporación de cambios, actualícelo para volver a publicar el
estado en la solicitud de incorporación de cambios. Puede usar la carga JSON publicada
por el enlace de servicio para determinar qué estado se va a establecer en la solicitud de
incorporación de cambios.
Actualice el código de la función de Azure para que tenga un aspecto similar al del
ejemplo siguiente.
Asegúrese de actualizar el código con el nombre de la organización, el nombre del
proyecto, el nombre del repositorio y el token pat. Para tener permiso para cambiar el
estado de la solicitud de incorporación de cambios, el PAT requiere vso.code_status
ámbito, que puede conceder seleccionando el ámbito Código (estado) en la página
Crear un token de acceso personal .
) Importante
Este código de ejemplo almacena el PAT en el código para simplificar el ejemplo. Se
recomienda almacenar secretos en KeyVault y recuperarlos desde allí.
En este ejemplo se inspecciona el título de la solicitud de incorporación de cambios para
ver si el usuario ha indicado si la solicitud de incorporación de cambios es un trabajo en
curso agregando WIP al título. Si es así, el código de ejemplo cambia el estado
publicado en la solicitud de incorporación de cambios. Reemplace el código de la
función de Azure por el código siguiente para implementar la actualización del estado
publicado en la solicitud de incorporación de cambios.
C#
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;
private static string organizationName = "[Organization Name]"; //
Organization name
private static string projectName = "[Project Name]"; // Project
name
private static string repositoryName = "[Repo Name]"; //
Repository name
/*
This is here just to simplify the sample, it is recommended to store
secrets in KeyVault and retrieve them from there.
*/
private static string pat = "[PAT TOKEN]";
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,
TraceWriter log)
try
log.Info("Service Hook Received.");
// Get request body
dynamic data = await req.Content.ReadAsAsync<object>();
log.Info("Data Received: " + data.ToString());
// Get the pull request object from the service hooks payload
dynamic jObject = JsonConvert.DeserializeObject(data.ToString());
// Get the pull request id
int pullRequestId;
if (!Int32.TryParse(jObject.resource.pullRequestId.ToString(), out
pullRequestId))
log.Info("Failed to parse the pull request id from the service
hooks payload.");
};
// Get the pull request title
string pullRequestTitle = jObject.resource.title;
log.Info("Service Hook Received for PR: " + pullRequestId + " " +
pullRequestTitle);
PostStatusOnPullRequest(pullRequestId,
ComputeStatus(pullRequestTitle));
return req.CreateResponse(HttpStatusCode.OK);
catch (Exception ex)
log.Info(ex.ToString());
return req.CreateResponse(HttpStatusCode.InternalServerError);
private static void PostStatusOnPullRequest(int pullRequestId, string
status)
string Url = string.Format(
@"https://dev.azure.com/{0}/{1}/_apis/git/repositories/{2}/pullrequests/{3}/
statuses?api-version=4.1",
organizationName,
projectName,
repositoryName,
pullRequestId);
using (HttpClient client = new HttpClient())
client.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new
AuthenticationHeaderValue("Basic", Convert.ToBase64String(
ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "", pat))));
var method = new HttpMethod("POST");
var request = new HttpRequestMessage(method, Url)
Content = new StringContent(status, Encoding.UTF8,
"application/json")
};
using (HttpResponseMessage response =
client.SendAsync(request).Result)
{
response.EnsureSuccessStatusCode();
private static string ComputeStatus(string pullRequestTitle)
string state = "succeeded";
string description = "Ready for review";
if (pullRequestTitle.ToLower().Contains("wip"))
state = "pending";
description = "Work in progress";
return JsonConvert.SerializeObject(
new
State = state,
Description = description,
TargetUrl = "https://visualstudio.microsoft.com",
Context = new
Name = "PullRequest-WIT-App",
Genre = "pr-azure-function-ci"
});
Creación de una nueva solicitud de
incorporación de cambios para probar el
servidor de estado
Ahora que el servidor se está ejecutando y escuchando notificaciones de enlace de
servicio, cree una solicitud de incorporación de cambios para probarlo.
1. Comience en la vista de archivos. Edite el archivo readme.md en el repositorio (o
cualquier otro archivo si no tiene un readme.md).
2. Realice una edición y confirme los cambios en el repositorio.
3. Asegúrese de confirmar los cambios en una nueva rama para poder crear una
solicitud de incorporación de cambios en el paso siguiente.
4. Seleccione el vínculo Crear una solicitud de incorporación de cambios .
5. Agregue WIP en el título para probar la funcionalidad de la aplicación. Seleccione
Crear para crear la solicitud de incorporación de cambios.
6. Una vez creada la solicitud de incorporación de cambios, verá la sección de estado,
con la entrada Trabajo en curso que vincula a la dirección URL especificada en la
carga.
7. Actualice el título de la solicitud de incorporación de cambios y quite el texto de
WIP y observe que el estado cambia de Trabajo en curso a Listo para su revisión.
Pasos siguientes
En este artículo, ha aprendido los conceptos básicos de cómo crear una función de
Azure sin servidor que escucha eventos de PR a través de enlaces de servicio y
puede publicar mensajes de estado mediante la API de estado. Para más
información sobre la API de estado de la solicitud de incorporación de cambios,
consulte la documentación de la API REST.
Configure una directiva de rama para un servicio externo.
Agregar pestañas en páginas de trabajo
pendiente
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Si tiene una página web que se puede hospedar en un iframe, también se puede
hospedar en Azure DevOps Services. Esta página web sería una pestaña en las páginas
de trabajo pendiente.
En este ejemplo, agregaremos una pestaña Hola mundo en el
trabajo pendiente del producto y el trabajo pendiente de iteración.
Creación de la página web
1. Obtenga el archivo sdk VSS.SDK.js de cliente y agréguelo a la aplicación web.
Colóquelo en la home/sdk/scripts carpeta .
a. Use el comando "npm install" para recuperar el SDK: npm install vss-web-
extension-sdk .
b. Para más información sobre el SDK, visite la página GitHub sdk de cliente .
2. Agregue la página web que desea mostrar como un centro. Estamos haciendo una
página sencilla hello-world.html aquí, agregada al home directorio.
3. En la página HTML, agregue una referencia al SDK y llame a init() y
notifyLoadSucceeded() .
HTML
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello World</title>
<script src="sdk/scripts/VSS.SDK.js"></script>
</head>
<body>
<script type="text/javascript">VSS.init();</script>
<h1>Hello World</h1>
<script type="text/javascript">VSS.notifyLoadSucceeded();</script>
</body>
</html>
Actualización del manifiesto de extensión
Actualice el archivo de manifiesto de extensión con el código siguiente:
JSON
...
"contributions": [
"id": "Fabrikam.HelloWorld.Backlog.Tabs",
"type": "ms.vss-web.tab",
"description": "Adds a 'Hello' tab to the Product and Iteration
backlog tabs.",
"targets": [
"ms.vss-work-web.product-backlog-tabs",
"ms.vss-work-web.iteration-backlog-tabs"
],
"properties": {
"name": "Hello",
"uri": "hello-world.html",
"registeredObjectId": "backlogTabObject"
],
"scopes": [
"vso.work"
],
"files": [
"path": "hello-world.html", "addressable": true
},
"path": "scripts", "addressable": true
},
"path": "sdk/scripts", "addressable": true
},
"path": "images/logo.png", "addressable": true
...
Contribuciones
La estrofa de contribuciones contiene información sobre las tareas.
Para cada contribución de la extensión, el manifiesto define
el tipo de contribución (pestaña en este caso),
el destino de contribución (las pestañas de trabajo pendiente de producto o
iteración en este caso),
y las propiedades específicas de cada tipo de contribución. Para una pestaña,
tenemos
Propiedad Descripción
name Nombre del centro
uri Ruta de acceso (relativa al URI base de la extensión) de la página que se va a
mostrar como la pestaña
registeredObjectId Identificador del objeto registrado para la pestaña. Incluya código como el
ejemplo siguiente en el archivo html indicado en la propiedad "uri" de la
contribución mostrada anteriormente.
Ámbitos
Incluye los ámbitos que requiere la extensión.
En este caso, es necesario vso.work
acceder a los elementos de trabajo.
Archivos
Incluya todos los archivos a los que accede la extensión.
En el caso de los archivos, establezca en addressable a true menos que incluya otros
archivos que no necesiten ser direccionables con dirección URL.
Ejemplo de registeredObjectId
JavaScript
VSS.register("backlogTabObject", {
pageTitle: function(state) {
return "Hello Tab";
},
updateContext: function(tabContext) {
},
isInvisible: function(state) {
return false;
},
isDisabled: function(state) {
return false;
});
Obtenga información sobre todos los lugares donde puede agregar un centro en
puntos de extensibilidad.
Pasos siguientes
Empaquetar, publicar e instalar o
Prueba y depuración
Agregar paneles en páginas de trabajo
pendiente
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services
Aquí agregamos una extensión Hello World simple como un panel en el trabajo
pendiente de cartera, el trabajo pendiente del producto y el trabajo pendiente de
iteración.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
El panel personalizado se abre en el mismo espacio que se abre el panel de asignación
si se seleccionó.
Hay tres tipos de trabajos pendientes que pueden ser destinos para extensiones de
panel: trabajos pendientes de cartera, trabajos pendientes de producto e iteración. Para
la plantilla agile, este desglose es el siguiente. Esto también es representativo de Scrum
y CMMI. Para obtener plantillas personalizadas, consulte el proceso para ver qué
trabajos pendientes son requisitos o categorías de cartera.
Consulte ejemplos de extensión de Azure DevOps Services en GitHub para obtener el
origen completo de una extensión de ejemplo.
Actualización del manifiesto de extensión
Actualice el archivo de manifiesto de extensión con el código siguiente:
JSON
...
"contributions": [
"id": "Fabrikam.HelloWorld.Backlogs.Panel",
"type": "ms.vss-work-web.backlog-panel",
"description": "Adds a 'Hello' panel to Product and Iteration
backlog pages.",
"targets": [
"ms.vss-work-web.requirement-backlog-toolpane",
"ms.vss-work-web.portfolio-backlog-toolpane",
"ms.vss-work-web.iteration-backlog-toolpane"
],
"properties": {
"title": "Hello Panel Pane",
"name": "Hello Panel",
"uri": "index.html",
"registeredObjectId": "backlogPanelObject"
],
"scopes": [
"vso.work"
...
Contribución
Para cada contribución de la extensión, el manifiesto define
el tipo de contribución (panel de trabajo pendiente en este caso),
el objetivo de contribución (los requisitos, la cartera y los trabajos pendientes de
iteración en este caso),
y las propiedades específicas de cada tipo de contribución. Para los paneles,
tenemos
Propiedad Descripción
title Texto de información sobre herramientas que aparece en el elemento de
menú
name Lo que aparece en la lista desplegable para la selección del panel
uri Ruta de acceso (relativa al URI base de la extensión) de la página que se va a
mostrar como el panel
Propiedad Descripción
registeredObjectId Identificador del objeto registrado para el panel
Obtenga información sobre todos los lugares donde puede agregar una extensión en
puntos de extensibilidad.
Ámbitos
Incluya los ámbitos que requiere la extensión.
En este caso, es necesario vso.work
acceder a los elementos de trabajo.
Obtener eventos de selección
Para obtener eventos de selección (información sobre los elementos de trabajo
seleccionados) implemente esta interfaz en el objeto registrado.
JavaScript
...
IContributedPanel {
workItemSelectionChanged: (selectedWorkItems) => void;
...
Pasos siguientes
Empaquetar, publicar e instalar o
Prueba y depuración
Extender el formulario del elemento de
trabajo
Artículo • 18/11/2022 • Tiempo de lectura: 9 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Obtenga información sobre cómo personalizar cómo se presenta el formulario de
elemento de trabajo a los usuarios a través de contribuciones realizadas a través de una
extensión.
Agregar un grupo a la página principal
Agregar una página (pestaña)
Agregar una acción al menú contextual
Agregar un control personalizado
Escuchar eventos en el formulario
Configurar contribuciones en el formulario de elemento de trabajo
Consulte el ejemplo de interfaz de usuario en ejemplos de extensión de Azure
DevOps en GitHub para obtener el origen completo.
Agregar un grupo
Para agregar un grupo a la página principal, agregue una contribución al manifiesto de
extensión. El tipo de esta contribución debe ser ms.vss-work-web.work-item-form-group
y debe tener como destino la ms.vss-work-web.work-item-form contribución.
JSON
"contributions": [
"id": "sample-work-item-form-group",
"type": "ms.vss-work-web.work-item-form-group",
"description": "Custom work item form group",
"targets": [
"ms.vss-work-web.work-item-form"
],
"properties": {
"name": "My Group",
"uri": "workItemGroup.html",
"height": 600
Propiedades
Propiedad Descripción
name Texto que aparece en el grupo
uri URI a una página que hospeda el html que se muestra en el formulario de elemento
de trabajo y sus scripts
height (Opcional) Define el alto del grupo. Cuando se omite, es del 100 %
Ejemplo de JavaScript
En este ejemplo se muestra cómo registrar un objeto al que se llama cuando se
producen eventos en el formulario de elemento de trabajo que puede afectar al grupo
contribuido.
JavaScript
VSS.require(["TFS/WorkItemTracking/Services"], function
(_WorkItemServices) {
// Get the WorkItemFormService. This service allows you to get/set
fields/links on the 'active' work item (the work item
// that currently is displayed in the UI).
function getWorkItemFormService()
return _WorkItemServices.WorkItemFormService.getService();
// Register a listener for the work item group contribution.
VSS.register(VSS.getContribution().id, function () {
return {
// Called when the active work item is modified
onFieldChanged: function(args) {
$(".events").append($("<div/>").text("onFieldChanged - "
+ JSON.stringify(args)));
},
// Called when a new work item is being loaded in the UI
onLoaded: function (args) {
getWorkItemFormService().then(function(service) {
// Get the current values for a few of the common
fields
service.getFieldValues(["System.Id", "System.Title",
"System.State", "System.CreatedDate"]).then(
function (value) {
$(".events").append($("
<div/>").text("onLoaded - " + JSON.stringify(value)));
});
});
},
// Called when the active work item is being unloaded in the
UI
onUnloaded: function (args) {
$(".events").empty();
$(".events").append($("<div/>").text("onUnloaded - " +
JSON.stringify(args)));
},
// Called after the work item has been saved
onSaved: function (args) {
$(".events").append($("<div/>").text("onSaved - " +
JSON.stringify(args)));
},
// Called when the work item is reset to its unmodified
state (undo)
onReset: function (args) {
$(".events").append($("<div/>").text("onReset - " +
JSON.stringify(args)));
},
// Called when the work item has been refreshed from the
server
onRefreshed: function (args) {
$(".events").append($("<div/>").text("onRefreshed - " +
JSON.stringify(args)));
});
});
Eventos
Evento Descripción del evento Argumento Descripción
de los
argumentos
onFieldChanged Se desencadena después de que un campo haya id Identificador
cambiado. Si el cambio de campo ejecutó reglas del
que actualizaron otros campos, todos estos elemento de
cambios forman parte de un único evento. trabajo.
changedFields Matriz con el nombre de referencia de todos los id Identificador
campos modificados. del
elemento de
trabajo.
onLoaded Se desencadena después de cuando los datos se id Identificador
cargan en el formulario de elemento de trabajo, del
cuando el usuario abre un elemento de trabajo elemento de
o cuando el usuario navega a otro elemento de trabajo.
trabajo en la vista de evaluación de prioridades.
onReset Se desencadena después de que el usuario id Identificador
deshace los cambios en el elemento de trabajo. del
elemento de
trabajo.
onRefreshed Se desencadena después de que el usuario id Identificador
actualice el elemento de trabajo manualmente. del
elemento de
trabajo.
onSaved Se desencadena después de guardar un id Identificador
elemento de trabajo. Para los elementos de del
trabajo de un cuadro de diálogo, debe tener elemento de
como destino el tipo "ms.vss-work-web.work- trabajo.
item-notifications" para asegurarse de que el
evento se activa desde que se cierra el cuadro
de diálogo, este tipo de contribución se
descarga. Para obtener más información,
consulte Escucha de eventos.
onUnloaded Se desencadena antes de que el usuario cierre el id Identificador
cuadro de diálogo o antes de que el usuario se del
mueva a otro elemento de trabajo en la vista de elemento de
evaluación de prioridades. trabajo.
Agregar una página
Una nueva página se representa como una pestaña en el formulario de elemento de
trabajo. Las páginas nuevas aparecen junto a la pestaña Detalles.
Para agregar una página al formulario de elemento de trabajo, agregue una
contribución al manifiesto de extensión. El tipo de esta contribución debe ser ms.vss-
work-web.work-item-form-page y debe tener como destino la ms.vss-work-web.work-
item-form contribución.
JSON
"contributions": [
"id": "sample-work-item-form-page",
"type": "ms.vss-work-web.work-item-form-page",
"description": "Custom work item form page",
"targets": [
"ms.vss-work-web.work-item-form"
],
"properties": {
"name": "My Page",
"uri": "workItemPage.html"
Propiedades
Propiedad Descripción
name Texto que aparece en la página de pestañas.
uri URI de una página que hospeda el html que se muestra en el formulario de
elemento de trabajo y sus scripts.
Ejemplo de JavaScript
Consulte el ejemplo de JavaScript en la sección grupo de formularios. El nombre del
objeto registrado debe coincidir con el id de la contribución.
Eventos
Evento Descripción del evento Argumento Descripción
de los
argumentos
onFieldChanged Se desencadena después de que un campo haya id Identificador
cambiado. Si el cambio de campo ejecutó reglas del
que actualizaron otros campos, todos estos elemento de
cambios forman parte de un único evento. trabajo.
changedFields Matriz con el nombre de referencia de todos los id Identificador
campos modificados. del
elemento de
trabajo.
onLoaded Se desencadena después de cuando los datos se id Identificador
cargan en el formulario de elemento de trabajo, del
cuando el usuario abre un elemento de trabajo elemento de
o cuando el usuario navega a otro elemento de trabajo.
trabajo en la vista de evaluación de prioridades.
onReset Se desencadena después de que el usuario id Identificador
deshace los cambios en el elemento de trabajo. del
elemento de
trabajo.
onRefreshed Se desencadena después de que el usuario id Identificador
actualice el elemento de trabajo manualmente. del
elemento de
trabajo.
onSaved Se desencadena después de guardar un id Identificador
elemento de trabajo. Para los elementos de del
trabajo de un cuadro de diálogo, debe tener elemento de
como destino el tipo "ms.vss-work-web.work- trabajo.
item-notifications" para asegurarse de que el
evento se activa desde que se cierra el cuadro
de diálogo, este tipo de contribución se
descarga. Para obtener más información,
consulte Escucha de eventos.
onUnloaded Se desencadena antes de que el usuario cierre el id Identificador
cuadro de diálogo o antes de que el usuario se del
mueva a otro elemento de trabajo en la vista de elemento de
evaluación de prioridades. trabajo.
Configurar contribuciones en el formulario de
elemento de trabajo
En Azure DevOps Services, de forma predeterminada, las extensiones de grupo
aparecen al final de la segunda columna del formulario y las contribuciones de página
después de todas las páginas del formulario del elemento de trabajo como pestaña. Las
contribuciones de control no se muestran en el formulario de forma predeterminada,
por lo que los usuarios tienen que agregarlos manualmente al formulario. En Azure
DevOps Server, para mostrar u ocultar o mover el control, las contribuciones de grupo y
página en el formulario de elemento de trabajo, vea Configurar extensiones de
formulario de elemento de trabajo.
Agregar acción de menú
Para agregar un elemento a la barra de herramientas del elemento de trabajo, agregue
esta contribución al manifiesto de extensión. El elemento aparece en ... desplegable en
la parte superior derecha del formulario de elemento de trabajo.
JSON
"contributions": [
"id": "sample-work-item-menu",
"type": "ms.vss-web.action",
"description": "Sample toolbar item which updates the title of a work
item",
"targets": [
"ms.vss-work-web.work-item-context-menu"
],
"properties": {
"text": "Try me!",
"title": "Updates the title of the work item from the extension",
"toolbarText": "Try me!",
"icon": "images/show-properties.png",
"uri": "menu-workItemToolbarButton.html"
Propiedades
Propiedad Descripción
text Texto que aparece en el elemento de la barra de herramientas.
title Texto de información sobre herramientas que aparece en el elemento de
menú.
toolbarText Texto que aparece cuando se mantiene el puntero sobre el elemento.
uri URI en una página que registra el controlador de acciones de la barra de
herramientas.
icon Dirección URL a un icono que aparece en el elemento de menú. Las
direcciones URL relativas se resuelven mediante baseUri.
group Determina dónde aparece el elemento de menú, relacionado con otros. Los
elementos de la barra de herramientas con el mismo nombre de grupo se
agrupan y dividen por un separador del resto de los elementos.
registeredObjectId (Opcional) Nombre del controlador de acciones de menú registrado. El valor
predeterminado es el identificador de contribución.
Escucha de eventos
Para agregar un observador al elemento de trabajo, que escucha los eventos del
elemento de trabajo, agregue esta contribución al manifiesto de extensión. No hay
ninguna visualización para observadores en el formulario de elemento de trabajo. Esta
es la mejor manera de escuchar el formulario de elemento de trabajo en el evento
Guardado, ya que el observador reside fuera del formulario y no se destruye cuando se
cierra el formulario, lo que puede ocurrir justo después de guardar.
JSON
"contributions": [
"id": "sample-work-item-form-observer",
"type": "ms.vss-work-web.work-item-notifications",
"description": "Gets events about the current work item form for the
'Try Me!' toolbar button",
"targets": [
"ms.vss-work-web.work-item-form"
],
"properties": {
"uri": "myformobserver.html"
Propiedades
Propiedad Descripción
uri URI a una página que hospeda los scripts que escuchan eventos
Eventos
Evento Descripción del evento Argumento Descripción
de los
argumentos
onFieldChanged Se desencadena después de que un campo haya id Identificador
cambiado. Si el cambio de campo ejecutó reglas del
que actualizaron otros campos, todos estos elemento de
cambios forman parte de un único evento. trabajo.
changedFields Matriz con el nombre de referencia de todos los id Identificador
campos modificados. del
elemento de
trabajo.
onLoaded Se desencadena después de cuando los datos se id Identificador
cargan en el formulario de elemento de trabajo, del
cuando el usuario abre un elemento de trabajo elemento de
o cuando el usuario navega a otro elemento de trabajo.
trabajo en la vista de evaluación de prioridades.
onReset Se desencadena después de que el usuario id Identificador
deshace los cambios en el elemento de trabajo. del
elemento de
trabajo.
onRefreshed Se desencadena después de que el usuario id Identificador
actualice el elemento de trabajo manualmente. del
elemento de
trabajo.
Evento Descripción del evento Argumento Descripción
de los
argumentos
onSaved Se desencadena después de guardar un id Identificador
elemento de trabajo. Para los elementos de del
trabajo de un cuadro de diálogo, debe tener elemento de
como destino el tipo "ms.vss-work-web.work- trabajo.
item-notifications" para asegurarse de que el
evento se activa desde que se cierra el cuadro
de diálogo, este tipo de contribución se
descarga. Para obtener más información,
consulte Escucha de eventos.
onUnloaded Se desencadena antes de que el usuario cierre el id Identificador
cuadro de diálogo o antes de que el usuario se del
mueva a otro elemento de trabajo en la vista de elemento de
evaluación de prioridades. trabajo.
Ejemplo de HTML/JavaScript
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Work item extension page sample</title>
</head>
<body>
<script src="sdk/scripts/VSS.SDK.js"></script>
<script>
VSS.init({
usePlatformScripts: true
});
VSS.ready(function () {
// Register a listener for the work item page contribution.
VSS.register(VSS.getContribution().id, function () {
return {
// Called when the active work item is modified
onFieldChanged: function(args) {
},
// Called when a new work item is being loaded in the UI
onLoaded: function (args) {
},
// Called when the active work item is being unloaded in
the UI
onUnloaded: function (args) {
},
// Called after the work item has been saved
onSaved: function (args) {
},
// Called when the work item is reset to its unmodified
state (undo)
onReset: function (args) {
},
// Called when the work item has been refreshed from the
server
onRefreshed: function (args) {
});
});
</script>
</body>
</html>
Agregar un control personalizado al
formulario de elemento de trabajo
Artículo • 04/10/2022 • Tiempo de lectura: 3 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Los controles personalizados permiten cambiar la forma en que los usuarios ven e
interactúan con un campo en el formulario de elemento de trabajo. En el siguiente
artículo se explica cómo se ha compilado este control personalizado de ejemplo.
Obtenga información sobre cómo crear su propio control personalizado.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Adición del control personalizado
Para agregar un control a la página principal, agregue una contribución al manifiesto de
extensión. El tipo de esta contribución debe ser ms.vss-work-web.work-item-form-
control y debe tener como destino la ms.vss-work-web.work-item-form contribución.
JSON
"contributions": [
"id": "sample-work-item-form-control",
"type": "ms.vss-work-web.work-item-form-control",
"description": "Custom work item form control",
"targets": [
"ms.vss-work-web.work-item-form"
],
"properties": {
"name": "My Control",
"uri": "workItemControl.html",
"height": 600
El formulario de elemento de trabajo agrega un iframe para hospedar el control
personalizado.
Propiedades
Propiedad Descripción
name Texto que aparece en el grupo.
uri URI en una página que hospeda el html cargado por el iframe.
height (Opcional) Define el alto del iframe. Cuando se omite, es de 50 píxeles.
inputs Los valores que proporciona un usuario dentro del formulario.
Si desea cambiar el tamaño dinámicamente del iframe, puede usar el resize method
disponible en el SDK de cliente.
Un control personalizado en el formulario de elemento de trabajo es otro tipo de
contribución, como la contribución de página de grupo&. La principal diferencia es que
una contribución de control puede tomar un conjunto de entradas de usuario mientras
que las contribuciones de grupo y página no pueden.
Controlar entradas de contribución
Para definir las entradas de la contribución de control, use la inputs propiedad del
objeto de contribución en el manifiesto. En el ejemplo siguiente verá dos entradas:
FieldName y Colors. FieldName especifica a qué campo se asocia el control. Colors
configura qué colores se asignan a qué valores del control. Los valores de las entradas
que proporcionan los usuarios cuando agregan al formulario de elemento de trabajo.
Estos valores se pasan a la contribución de control cuando se cargan en el formulario.
JSON
"inputs": [
"id": "FieldName",
"description": "The field associated with the control.",
"type": "WorkItemField",
"properties": {
"workItemFieldTypes": ["String"]
},
"validation": {
"dataType": "String",
"isRequired": true
},
"id": "Colors",
"description": "The colors that match the values in the control.",
"validation": {
"dataType": "String",
"isRequired": false
Estas propiedades definen una entrada de usuario que la contribución puede usar:
id : identificador único para la entrada.
description : algunas oraciones que describen la entrada.
type (opcional): el tipo de entrada. Solo se admite en Azure DevOps y TFS 15 RC2
y versiones posteriores.
Valores válidos:
WorkItemField : indica que la entrada es un campo Elemento de trabajo. El
valor proporcionado por el usuario para esta entrada debe ser un nombre de
referencia para el campo de elemento de trabajo válido.
properties (opcional): propiedades personalizadas para la entrada. Solo se admite
en Azure DevOps y TFS 15 RTM.
Claves válidas:
workItemFieldTypes : define una matriz de tipos de campo que admite esta
entrada. Los valores válidos son:
String
Integer
DateTime
PlainText
HTML
TreePath
History
Double
Guid
Boolean
Identity
PicklistString
PicklistInteger
PicklistDouble
validation : conjunto de propiedades que define qué valores se consideran válidos
para la entrada.
Claves válidas:
dataType : define el tipo de datos del valor de entrada. Los valores válidos
para esta propiedad son:
String
Number
Boolean
Field : solo se admite en TFS 15 RC1 y RC2 y no en Azure DevOps.
isRequired : un valor booleano, que indica si la entrada es necesaria para
tener un valor o no.
Ejemplo de JavaScript
Una extensión de control funciona como una extensión de grupo o página con una
diferencia que puede tomar determinadas entradas de usuario. Para leer los valores de
entrada del usuario, use VSS.getConfiguration().witInputs . En este ejemplo se muestra
cómo registrar un objeto al que se llama cuando se producen eventos en el formulario
de elemento de trabajo que puede afectar al control contribuido. También muestra
cómo leer los valores de entrada proporcionados por el usuario para este control.
TypeScript
import { Control } from "control";
import * as ExtensionContracts from
"TFS/WorkItemTracking/ExtensionContracts";
var control: Control;
var provider = () => {
return {
onLoaded: (workItemLoadedArgs:
ExtensionContracts.IWorkItemLoadedArgs) => {
// create the control
var fieldName = VSS.getConfiguration().witInputs["FieldName"];
var colors = VSS.getConfiguration().witInputs["Colors"];
control = new Control(fieldName, colors);
},
onFieldChanged: (fieldChangedArgs:
ExtensionContracts.IWorkItemFieldChangedArgs) => {
var changedValue =
fieldChangedArgs.changedFields[control.getFieldName()];
if (changedValue !== undefined) {
control.updateExternal(changedValue);
};
VSS.register(VSS.getContribution().id, provider);
En la captura de pantalla siguiente se muestra un control de elemento de trabajo
personalizado de ejemplo para el campo Prioridad .
Agregar extensiones en el formulario de
elemento de trabajo a través del xml de
definición de tipo de elemento de
trabajo
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Puede exportar un tipo de elemento de trabajo como xml mediante la witadmin
herramienta , que incluye el diseño del formulario de elemento de trabajo. Como parte
de este ejemplo, agregamos las contribuciones de página, grupo y control al diseño.
También agregamos el control al tipo de elemento de trabajo "User Story" de Agile. Para
obtener más información, vea Xml de WebLayout.
7 Nota
La personalización del formulario de elemento de trabajo a través de xml solo se
admite en Azure DevOps Server, no Azure DevOps Services.
Agregar extensión en el formulario de
elemento de trabajo
1. Instale extensiones de formulario de elemento de trabajo en Azure DevOps Server.
2. Abra Developer Command Prompt . Exporte el archivo xml al escritorio con el
siguiente comando.
witadmin exportwitd /collection:CollectionURL /p:Project /n:TypeName
/f:FileName
Se crea un archivo en el directorio que especificó.
3. Dentro de este archivo, vaya a la sección WebLayout . Dentro de la sección
WebLayout, un blob de comentario especifica qué extensiones instaladas tienen
como destino formularios de elemento de trabajo para la colección. Para cada
extensión, todas sus contribuciones de formulario se enumeran con sus
identificadores y entradas (si se trata de una contribución de control). En el
ejemplo siguiente, el comentario muestra la extensión color-control-dev instalada
en la colección. La extensión tiene una contribución de control que toma dos
entradas.
XML
<!--**********************************Work Item
Extensions***************************
Extension:
Name: color-control-dev
Id: example.color-control-dev
Control contribution:
Id: example.color-control-dev.color-control-contribution
Description:
Inputs:
Id: FieldName
Description: The field associated with the control.
Type: Field
IsRequired: true
Id: Colors
Descriptions: The colors that match the values in the
control.
Type: String
IsRequired: false
4. Busque el identificador de extensión en la sección Extensiones de elemento de
trabajo :
XML
<!--**********************************Work Item
Extensions***************************
Extension:
Name: color-control-dev
Id: example.color-control-dev
...
5. Agregue una etiqueta de extensión debajo de la sección Extensiones de elemento
de trabajo, como se muestra a continuación, para que la extensión esté disponible
para el formulario de elemento de trabajo. Para colocar una contribución dentro
del formulario, su extensión debe especificarse en la Extensions sección .
XML
<!--**********************************Work Item
Extensions***************************
...
Note: For more information on work item extensions use the
following topic:
https://go.microsoft.com/fwlink/?LinkId=816513
-->
<Extensions>
<Extension Id="example.color-control-dev" />
</Extensions>
6. La especificación de las extensiones en el xml coloca automáticamente las
contribuciones de página y grupo definidas en las extensiones dentro del
formulario. Puede mover las contribuciones en los ejemplos siguientes.
Agregar contribución de página
XML
<Page Id="Details">
<PageContribution Id="<page contribution id>" />
...
Agregar contribución de grupo
XML
<Page Id="Details">
...
<Section>
...
<GroupContribution Id="<group contribution id>" />
...
Una contribución de página y una contribución de grupo no pueden tomar ningún otro
elemento de diseño.
Agregar contribución de control
A diferencia de las contribuciones de página y grupo , especificar las extensiones en el
xml no coloca automáticamente las contribuciones de control .
Para agregar estas
contribuciones en el formulario, agréguelas con una etiqueta de contribución dentro del
formulario. En el ejemplo siguiente se agrega ControlContribution al grupo Planning .
Si una contribución de control tiene definida cualquier entrada necesaria, los usuarios
deben proporcionar un valor para esa entrada. Para cualquier entrada no necesaria, los
usuarios pueden decidir si establecer un valor en la entrada. En el ejemplo siguiente, se
establecen las FieldName entradas y Colors .
XML
<Page Id="Details">
...
<Section>
...
<Group Id="Planning">
...
<ControlContribution Label="Priority" Id="example.color-
control-dev.color-control-contribution">
<Inputs>
<Input Id="FieldName" Value="Microsoft.Azure DevOps
Services.Common.Priority" />
<Input Id="Colors" Value="red;green" />
</Inputs>
</ControlContribution>
<Control Label="Risk" Type="FieldControl"
FieldName="Microsoft.Azure DevOps Services.Common.Risk" />
7. Importe este archivo xml mediante witadmin .
witadmin importwitd /collection:CollectionURL /p:Project /f:FileName
La extensión se configura a través del formulario de elemento de trabajo.
Agregar pestañas en las páginas de
resultados de la consulta
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Si tiene una página web que se puede hospedar en un iframe, se puede hospedar en
Azure DevOps como pestaña en las páginas de resultados de la consulta.
En este
ejemplo, agregaremos una pestaña Hola mundo simple en los resultados de la consulta.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Creación de la página web
1. Obtenga el archivo del SDK de cliente VSS.SDK.js y agréguelo a la aplicación web.
Colóquelo en la home/sdk/scripts carpeta .
a. Use el comando "npm install" para recuperar el SDK: npm install vss-web-
extension-sdk .
b. Para más información sobre el SDK, visite la página de GitHub del SDK de
cliente .
2. Agregue la página web que desea mostrar como concentrador. Estamos haciendo
una página sencilla hello-world.html aquí, agregada al home directorio .
3. En la página HTML, agregue una referencia al SDK y llame a init() y
notifyLoadSucceeded() .
HTML
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello World</title>
<script src="sdk/scripts/VSS.SDK.js"></script>
</head>
<body>
<script type="text/javascript">VSS.init();</script>
<h1>Hello World</h1>
<script type="text/javascript">VSS.notifyLoadSucceeded();</script>
</body>
</html>
Actualización del manifiesto de extensión
Actualice el archivo de manifiesto de extensión con el código siguiente:
JSON
...
"contributions": [
"id": "Fabrikam.HelloTab.Query.Tabs",
"type": "ms.vss-web.tab",
"description": "Adds a 'Hello' tab to the query results",
"targets": [
"ms.vss-work-web.query-tabs"
],
"properties": {
"uri": "hello-query-tab.html",
"title": "Hello",
"name": "Hello"
],
"scopes": [
"vso.work"
],
"files": [
"path": "hello-query-tab.html", "addressable": true
},
"path": "scripts", "addressable": true
},
"path": "sdk/scripts", "addressable": true
},
"path": "images/logo.png", "addressable": true
...
Contribuciones
La estrofa de contribuciones contiene información sobre las tareas.
Para cada contribución de la extensión, el manifiesto define
el tipo de contribución (pestaña en este caso),
el destino de contribución (las pestañas de consulta en este caso),
y las propiedades que son específicas de cada tipo de contribución. Para una
pestaña, tenemos
Propiedad Descripción
name Nombre de la pestaña
uri Ruta de acceso (relativa al URI base de la extensión) de la página que se va a
mostrar como pestaña
title Título de la pestaña que se va a mostrar
Ámbitos
Incluye los ámbitos que requiere la extensión.
En este caso, es necesario vso.work
acceder a los elementos de trabajo.
Archivos
Incluya todos los archivos a los que accede la extensión.
En el caso de los archivos, establezca en addressable a true menos que incluya otros
archivos que no necesiten ser direccionables por url.
Ejemplo
JavaScript
VSS.register(VSS.getContribution(), {
pageTitle: function(state) {
return "Hello";
},
updateContext: function(tabContext) {
},
isInvisible: function(state) {
return false;
},
isDisabled: function(state) {
return false;
});
Obtenga información sobre todos los lugares en los que puede agregar un centro en
puntos de extensibilidad.
Pasos siguientes
Empaquetar, publicar e instalar o
Prueba y depuración
Agregar un widget de panel
Artículo • 18/11/2022 • Tiempo de lectura: 30 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019
Los widgets de un panel se implementan como contribuciones en el marco de
extensión.
Una sola extensión puede tener varias contribuciones. Aprenda a crear una
extensión con varios widgets como contribuciones.
Este artículo se divide en tres partes, cada uno de los cuales se basa en el anterior,
empezando por un widget simple y terminando con un widget completo.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Preparación y configuración necesaria para este
tutorial
Para crear extensiones para Azure DevOps o TFS, hay algunas herramientas y software
de requisitos previos que necesitará:
Conocimiento: Se requiere cierto conocimiento de JavaScript, HTML y CSS para el
desarrollo de widgets.
Una organización de Azure DevOps para instalar y probar el widget, puede
encontrar más información aquí .
Un editor de texto. Para muchos de los tutoriales, usamos Visual Studio Code ,
que se puede descargar aquí .
La versión más reciente del nodo, que se puede descargar aquí
CLI multiplataforma para Azure DevOps (tfx-cli) para empaquetar las extensiones.
tfx-cli se puede instalar mediante npm , un componente de Node.js mediante la
ejecución de npm i -g tfx-cli
Un directorio principal para el proyecto. Este directorio se conoce como home a lo
largo del tutorial.
Estructura de archivos de extensión:
no-highlight
|--- README.md
|--- sdk
|--- node_modules
|--- scripts
|--- VSS.SDK.min.js
|--- img
|--- logo.png
|--- scripts
|--- hello-world.html // html page to be used for your widget
|--- vss-extension.json // extension's manifest
Lo que encontrará en el tutorial
1. En la primera parte de esta guía se muestra cómo crear un widget, que imprime un
mensaje simple de "Hola mundo".
2. La segunda parte se basa en la primera agregando una llamada a una API REST de
Azure DevOps.
3. En la tercera parte se explica cómo agregar configuración al widget.
7 Nota
Si tiene prisa y desea poner las manos en el código de inmediato, puede descargar
los ejemplos completos aquí .
Una vez descargado, vaya a la widgets carpeta y, a
continuación, siga el paso 6 y el paso 7 directamente para publicar la extensión de
ejemplo que tiene los tres widgets de ejemplo de distintas complejidades.
Introducción a algunos estilos básicos para widgets que proporcionamos de forma
predeterminada y algunas instrucciones sobre la estructura de widgets.
Parte 1: Hola mundo
Esta parte presenta un widget que imprime "Hola mundo" mediante JavaScript.
Paso 1: Obtener el SDK de cliente: VSS.SDK.min.js
El script principal del SDK, VSS.SDK.min.js , permite que las extensiones web se
comuniquen con el marco de Azure DevOps del host. El script realiza operaciones como
inicializar, notificar la extensión se carga o obtener contexto sobre la página actual.
Obtenga el archivo del SDK de cliente VSS.SDK.min.js y agréguelo a la aplicación web.
Colóquelo en la home/sdk/scripts carpeta .
Use el comando "npm install" para recuperar el SDK:
no-highlight
npm install vss-web-extension-sdk
Para más información sobre el SDK, visite la página de GitHub del SDK de cliente .
Paso 2: Página HTML: hello-world.html
La página HTML es el pegamento que contiene el diseño juntos e incluye referencias a
CSS y JavaScript.
Puede asignar un nombre a este archivo cualquier cosa, solo tiene que
asegurarse de actualizar todas las referencias a con hello-world el nombre que use.
El widget se basa en HTML y se hospeda en un iframe .
Agregue el código HTML
siguiente en hello-world.html . Agregamos la referencia obligatoria al VSS.SDK.min.js
archivo e incluyemos un h2 elemento en , que se actualiza con la cadena Hola mundo
en el paso siguiente.
HTML
<!DOCTYPE html>
<html>
<head>
<script src="sdk/scripts/VSS.SDK.min.js"></script>
</head>
<body>
<div class="widget">
<h2 class="title"></h2>
</div>
</body>
</html>
Aunque se usa un archivo HTML, la mayoría de los elementos principales HTML
distintos del script y el vínculo se omiten en el marco de trabajo.
Paso 3: JavaScript
Usamos JavaScript para representar contenido en el widget. En este artículo,
encapsulamos todo nuestro código JavaScript dentro de un <script> elemento del
archivo HTML. Puede elegir tener este código en un archivo JavaScript independiente y
hacer referencia a él en el archivo HTML.
El código representa el contenido. Este código
javaScript también inicializa el SDK de VSS, asigna el código del widget al nombre del
widget y notifica al marco de extensión de éxitos o errores del widget.
En nuestro caso,
a continuación se muestra el código que imprimiría "Hola mundo" en el widget.
Agregue este script elemento en del head código HTML.
HTML
<script type="text/javascript">
VSS.init({
explicitNotifyLoaded: true,
usePlatformStyles: true
});
VSS.require("TFS/Dashboards/WidgetHelpers", function (WidgetHelpers)
{
WidgetHelpers.IncludeWidgetStyles();
VSS.register("HelloWorldWidget", function () {
return {
load: function (widgetSettings) {
var $title = $('h2.title');
$title.text('Hello World');
return WidgetHelpers.WidgetStatusHelper.Success();
});
VSS.notifyLoadSucceeded();
});
</script>
VSS.init inicializa el protocolo de enlace entre el iframe que hospeda el widget y el
marco de host.
explicitNotifyLoaded: true Pasamos para que el widget pueda notificar
explícitamente al host cuando hayamos terminado de cargar. Este control nos permite
notificar la finalización de la carga después de asegurarse de que se cargan los módulos
dependientes.
usePlatformStyles: true Pasamos para que el Widget pueda usar los
estilos principales de Azure DevOps para elementos html (como body, div, etc.). Si el
widget prefiere no usar estos estilos, pueden pasar . usePlatformStyles: false
VSS.require se usa para cargar las bibliotecas de scripts de VSS necesarias. Una llamada
a este método carga automáticamente bibliotecas generales como JQuery y
JQueryUI .
En nuestro caso, dependemos de la biblioteca WidgetHelpers, que se usa
para comunicar el estado del widget al marco de widgets.
Por lo tanto, pasamos el
nombre TFS/Dashboards/WidgetHelpers del módulo correspondiente y una devolución
de llamada a VSS.require .
Se llama a la devolución de llamada una vez cargado el
módulo.
La devolución de llamada tiene el resto del código JavaScript necesario para el
widget. Al final de la devolución de llamada, llamamos VSS.notifyLoadSucceeded a para
notificar la finalización de la carga.
WidgetHelpers.IncludeWidgetStyles incluye una hoja de estilos con algunos css básicos
para empezar. Asegúrese de encapsular el contenido dentro de un elemento HTML con
clase widget para usar estos estilos.
VSS.register se usa para asignar una función en JavaScript, que identifica de forma
única el widget entre las diferentes contribuciones de la extensión. El nombre debe
coincidir con el id que identifica su contribución como se describe en el paso 5. En el
caso de los widgets, la función que se pasa a VSS.register debe devolver un objeto que
cumpla el IWidget contrato, por ejemplo, el objeto devuelto debe tener una propiedad
de carga cuyo valor es otra función que tiene la lógica principal para representar el
widget.
En nuestro caso, es actualizar el texto del h2 elemento a "Hola mundo".
Se trata
de esta función a la que se llama cuando el marco de widget crea una instancia del
widget.
WidgetStatusHelper Usamos desde WidgetHelpers para devolver como
WidgetStatus correcto.
2 Advertencia
Si el nombre usado para registrar el widget no coincide con el identificador de la
contribución en el manifiesto, el widget funciona inesperadamente.
vss-extension.json siempre debe estar en la raíz de la carpeta (en esta guía,
HelloWorld ). Para todos los demás archivos, puede colocarlos en la estructura que desee
dentro de la carpeta, solo tiene que asegurarse de actualizar las referencias
correctamente en los archivos HTML y en el vss-extension.json manifiesto.
Paso 4: Logotipo de la extensión: logo.png
El logotipo se muestra en Marketplace y en el catálogo de widgets una vez que un
usuario instala la extensión.
Necesita un icono de catálogo de 98 px x 98 px. Elija una imagen, asígnela logo.png el
nombre y colóquela en la img carpeta .
Para admitir TFS 2015 Update 3, necesita una imagen adicional de 330 px x 160 px. Esta
imagen de vista previa se muestra en este catálogo. Elija una imagen, asígnela
preview.png el nombre y colóquela en la img carpeta como antes.
Sin embargo, puede asignar un nombre a estas imágenes siempre que el manifiesto de
extensión del paso siguiente se actualice con los nombres que use.
Paso 5: Manifiesto de la extensión: vss-extension.json
Cada extensión debe tener un archivo de manifiesto de extensión
Leer la referencia del manifiesto de extensión
Obtenga más información sobre los puntos de contribución en Puntos de
extensibilidad.
Cree un archivo JSON ( vss-extension.json por ejemplo) en el home directorio con el
siguiente contenido:
JSON
"manifestVersion": 1,
"id": "vsts-extensions-myExtensions",
"version": "1.0.0",
"name": "My First Set of Widgets",
"description": "Samples containing different widgets extending
dashboards",
"publisher": "fabrikam",
"categories": ["Azure Boards"],
"targets": [
"id": "Microsoft.VisualStudio.Services"
],
"icons": {
"default": "img/logo.png"
},
"contributions": [
"id": "HelloWorldWidget",
"type": "ms.vss-dashboards-web.widget",
"targets": [
"ms.vss-dashboards-web.widget-catalog"
],
"properties": {
"name": "Hello World Widget",
"description": "My first widget",
"catalogIconUrl": "img/CatalogIcon.png",
"previewImageUrl": "img/preview.png",
"uri": "hello-world.html",
"supportedSizes": [
"rowSpan": 1,
"columnSpan": 2
],
"supportedScopes": ["project_team"]
],
"files": [
"path": "hello-world.html", "addressable": true
},
"path": "sdk/scripts", "addressable": true
},
"path": "img", "addressable": true
Para obtener más información sobre los atributos necesarios, consulte la referencia del
manifiesto de extensión.
7 Nota
El publicador aquí debe cambiarse al nombre del publicador. Para crear un
publicador ahora, visite Package/Publish/Install.
Iconos
La estrofa de iconos especifica la ruta de acceso al icono de la extensión en el
manifiesto.
Contribuciones
Cada entrada de contribución define las propiedades.
Identificador para identificar su contribución. Este identificador debe ser único
dentro de una extensión. Este identificador debe coincidir con el nombre que usó
en el paso 3 para registrar el widget.
Tipo de contribución. Para todos los widgets, el tipo debe ser ms.vss-dashboards-
web.widget .
Matriz de destinos a los que contribuye la contribución. Para todos los widgets, el
destino debe ser [ms.vss-dashboards-web.widget-catalog] .
Las propiedades son objetos que incluyen propiedades para el tipo de
contribución. En el caso de los widgets, las siguientes propiedades son
obligatorias.
Propiedad Descripción
name Nombre del widget que se va a mostrar en el catálogo de widgets.
description Descripción del widget que se va a mostrar en el catálogo de widgets.
catalogIconUrl Ruta de acceso relativa del icono de catálogo que agregó en el paso 4 para
mostrarlo en el catálogo de widgets. La imagen debe ser de 98 px x 98 px. Si
ha usado una estructura de carpetas diferente o un nombre de archivo
diferente, especifique la ruta de acceso relativa adecuada aquí.
previewImageUrl Ruta de acceso relativa de la imagen de vista previa que agregó en el paso 4
para mostrarse en el catálogo de widgets solo para TFS 2015 Update 3. La
imagen debe ser de 330 px x 160 px. Si ha usado una estructura de carpetas
diferente o un nombre de archivo diferente, especifique la ruta de acceso
relativa adecuada aquí.
uri Ruta de acceso relativa del archivo HTML que agregó en el paso 1. Si ha
usado una estructura de carpetas diferente o un nombre de archivo diferente,
especifique la ruta de acceso relativa adecuada aquí.
supportedSizes Matriz de tamaños compatibles con el widget. Cuando un widget admite
varios tamaños, el primer tamaño de la matriz es el tamaño predeterminado
del widget. widget size se especifica para las filas y columnas ocupadas por
el widget en la cuadrícula del panel. Una fila o columna corresponde a 160 px.
Cualquier dimensión superior a 1x1 obtiene un adicional de 10 px que
representa el medianil entre widgets. Por ejemplo, un widget de 3x2 es
160*3+10*2 ancho y 160*2+10*1 alto. El tamaño máximo admitido es 4x4 .
supportedScopes En este momento, solo se admiten paneles de equipo. El valor debe ser
project_team . En el futuro, cuando se admitan otros ámbitos de panel, habrá
más opciones para elegir aquí.
Archivos
La estrofa de archivos indica los archivos que desea incluir en el paquete: la página
HTML, los scripts, el script del SDK y el logotipo.
Establézcalo addressable en a true
menos que incluya otros archivos que no necesiten ser direccionables por url.
7 Nota
Para obtener más información sobre el archivo de manifiesto de extensión, como
sus propiedades y lo que hacen, consulte la referencia del manifiesto de
extensión.
Paso 6: Empaquetar, publicar y compartir
Una vez que haya escrito la extensión, el siguiente paso para entrar en Marketplace es
empaquetar todos los archivos juntos. Todas las extensiones se empaquetan como
archivos .vsix compatibles con VSIX 2.0: Microsoft proporciona una interfaz de línea de
comandos multiplataforma (CLI) para empaquetar la extensión.
Obtención de la herramienta de empaquetado
Puede instalar o actualizar la CLI multiplataforma para Azure DevOps (tfx-cli) mediante
npm , un componente de Node.js , desde la línea de comandos.
no-highlight
npm i -g tfx-cli
Empaquetado de la extensión
Empaquetar la extensión en un archivo .vsix es sin esfuerzo una vez que tenga el tfx-cli.
Vaya al directorio principal de la extensión y ejecute el siguiente comando.
no-highlight
tfx extension create --manifest-globs vss-extension.json
7 Nota
La versión de una extensión o integración debe incrementarse en cada
actualización.
Al actualizar una extensión existente, actualice la versión en el manifiesto o pase el
modificador de --rev-version línea de comandos. Esto incrementa el número de
versión de revisión de la extensión y guarda la nueva versión en el manifiesto.
Una vez que haya empaquetado la extensión en un archivo .vsix, estará listo para
publicar la extensión en Marketplace.
Creación de un publicador para la extensión
Todas las extensiones, incluidas las extensiones de Microsoft, se identifican como
proporcionadas por un publicador.
Si aún no es miembro de un publicador existente,
creará uno.
1. Inicio de sesión en el Portal de publicación de Visual Studio Marketplace
2. Si aún no es miembro de un publicador existente, se le pedirá que cree un
publicador. Si no se le pide que cree un publicador, desplácese hacia abajo hasta la
parte inferior de la página y seleccione Publicar extensiones debajo de Sitios
relacionados.
Especifique un identificador para el publicador, por ejemplo: mycompany-
myteam
El identificador se usa como valor para el atributo en el publisher archivo
de manifiesto de las extensiones.
Especifique un nombre para mostrar para el publicador, por ejemplo: My Team
3. Revise el Contrato de publicador de Marketplace y seleccione Crear.
Ahora se define el publicador. En una versión futura, puede conceder permisos para ver
y administrar las extensiones del publicador.
Es fácil y más seguro que los equipos y las
organizaciones publiquen extensiones en un publicador común, pero sin necesidad de
compartir un conjunto de credenciales en un conjunto de usuarios.
Actualice el archivo de vss-extension.json manifiesto de los ejemplos para
reemplazar el identificador fabrikam de publicador ficticio por el identificador del
publicador.
Publicación y uso compartido de la extensión
Después de crear un publicador, ahora puede cargar la extensión en Marketplace.
1. Busque el botón Cargar nueva extensión , vaya al archivo .vsix empaquetado y
seleccione Cargar.
También puede cargar la extensión a través de la línea de comandos mediante el tfx
extension publish comando en lugar de tfx extension create empaquetar y publicar
la extensión en un paso.
Opcionalmente, puede usar --share-with para compartir la
extensión con una o varias cuentas después de la publicación.
También necesitará un
token de acceso personal.
no-highlight
tfx extension publish --manifest-globs your-manifest.json --share-with
yourOrganization
Paso 7: Agregar widget desde el catálogo
1. Vaya al proyecto en Azure DevOps.
http://dev.azure.com/{yourOrganization}/{yourProject}
2. Seleccione Información general y, después, Paneles.
3. Elija Agregar un widget.
4. Resalte el widget y, a continuación, seleccione Agregar.
El widget aparece en el panel.
Parte 2: Hola mundo con la API REST de Azure
DevOps
Los widgets pueden llamar a cualquiera de las API REST de Azure DevOps para
interactuar con los recursos de Azure DevOps.
En este ejemplo, usamos la API REST para
WorkItemTracking para capturar información sobre una consulta existente y mostrar
información de consulta en el widget justo debajo del texto "Hola mundo".
Paso 1: HTML
Copie el archivo hello-world.html del ejemplo anterior y cambie el nombre de la copia
a hello-world2.html . La carpeta ahora es similar a la siguiente:
no-highlight
|--- README.md
|--- sdk
|--- node_modules
|--- scripts
|--- VSS.SDK.min.js
|--- img
|--- logo.png
|--- scripts
|--- hello-world.html // html page to be used for your widget
|--- hello-world2.html // renamed copy of hello-world.html
|--- vss-extension.json // extension's manifest
Agregue un nuevo div elemento justo debajo de h2 para contener la información de
consulta.
Actualice el nombre del widget de HelloWorldWidget a HelloWorldWidget2 en
la línea donde se llama a VSS.register .
Esto permite que el marco identifique de forma
única el widget dentro de la extensión.
HTML
<!DOCTYPE html>
<html>
<head>
<script src="sdk/scripts/VSS.SDK.min.js"></script>
<script type="text/javascript">
VSS.init({
explicitNotifyLoaded: true,
usePlatformStyles: true
});
VSS.require("TFS/Dashboards/WidgetHelpers", function
(WidgetHelpers) {
WidgetHelpers.IncludeWidgetStyles();
VSS.register("HelloWorldWidget2", function () {
return {
load: function (widgetSettings) {
var $title = $('h2.title');
$title.text('Hello World');
return
WidgetHelpers.WidgetStatusHelper.Success();
});
VSS.notifyLoadSucceeded();
});
</script>
</head>
<body>
<div class="widget">
<h2 class="title"></h2>
<div id="query-info-container"></div>
</div>
</body>
</html>
Paso 2: Acceso a los recursos de Azure DevOps
Para habilitar el acceso a los recursos de Azure DevOps, los ámbitos deben especificarse
en el manifiesto de extensión. Agregamos el vso.work ámbito al manifiesto.
Este ámbito indica que el widget necesita acceso de solo lectura a las consultas y
elementos de trabajo. Consulte todos los ámbitos disponibles aquí.
Agregue lo
siguiente al final del manifiesto de extensión.
JSON
...,
"scopes":[
"vso.work"
2 Advertencia
Actualmente no se admite la adición o modificación de ámbitos después de
publicar una extensión. Si ya ha cargado la extensión, quítela de Marketplace. Vaya
al Portal de publicación de Visual Studio Marketplace, haga clic con el botón
derecho en la extensión y seleccione "Quitar".
Paso 3: Realizar la llamada a la API rest
Hay muchas bibliotecas del lado cliente a las que se puede acceder a través del SDK
para realizar llamadas a la API REST en Azure DevOps.
Estas bibliotecas se denominan
clientes REST y son contenedores de JavaScript en torno a las llamadas de Ajax para
todos los puntos de conexión del lado servidor disponibles.
Puede usar métodos
proporcionados por estos clientes en lugar de escribir llamadas a Ajax usted mismo.
Estos métodos asignan las respuestas de la API a objetos que el código puede consumir.
En este paso, se actualiza la VSS.require llamada a para cargar
TFS/WorkItemTracking/RestClient , que proporciona el cliente REST WorkItemTracking.
Podemos usar este cliente REST para obtener información sobre una consulta
denominada Feedback en la carpeta Shared Queries .
Dentro de la función que pasamos a VSS.register , creamos una variable para contener
el identificador del proyecto actual. Necesitamos esta variable para capturar la consulta.
También se crea un nuevo método getQueryInfo para usar el cliente REST. A
continuación, se llama a este método desde el método de carga.
El método getClient proporciona una instancia del cliente REST que necesitamos.
El
método getQuery devuelve la consulta ajustada en una promesa.
La actualización
VSS.require tiene el siguiente aspecto:
JavaScript
VSS.require(["TFS/Dashboards/WidgetHelpers",
"TFS/WorkItemTracking/RestClient"],
function (WidgetHelpers, TFS_Wit_WebApi) {
WidgetHelpers.IncludeWidgetStyles();
VSS.register("HelloWorldWidget2", function () {
var projectId = VSS.getWebContext().project.id;
var getQueryInfo = function (widgetSettings) {
// Get a WIT client to make REST calls to Azure DevOps
Services
return TFS_Wit_WebApi.getClient().getQuery(projectId,
"Shared Queries/Feedback")
.then(function (query) {
// Do something with the query
return WidgetHelpers.WidgetStatusHelper.Success();
}, function (error) {
return
WidgetHelpers.WidgetStatusHelper.Failure(error.message);
});
return {
load: function (widgetSettings) {
// Set your title
var $title = $('h2.title');
$title.text('Hello World');
return getQueryInfo(widgetSettings);
});
VSS.notifyLoadSucceeded();
});
Observe el uso del método Failure de WidgetStatusHelper .
Permite indicar al marco de
widget que se ha producido un error y aprovechar la experiencia de error estándar
proporcionada a todos los widgets.
Si no tiene la Feedback consulta en la Shared Queries carpeta , reemplace Shared
Queries\Feedback en el código por la ruta de acceso de una consulta que exista en
el proyecto.
Paso 4: Mostrar la respuesta
El último paso es representar la información de consulta dentro del widget.
La getQuery
función devuelve un objeto de tipo Contracts.QueryHierarchyItem dentro de una
promesa.
En este ejemplo, se muestra el identificador de consulta, el nombre de la
consulta y el nombre del creador de la consulta en el texto "Hola mundo".
Reemplace el
// Do something with the query comentario por lo siguiente:
JavaScript
// Create a list with query details
var $list = $('<ul>');
$list.append($('<li>').text("Query Id: " + query.id));
$list.append($('<li>').text("Query Name: " + query.name));
$list.append($('<li>').text("Created By: " + ( query.createdBy?
query.createdBy.displayName: "<unknown>" ) ) );
// Append the list to the query-info-container
var $container = $('#query-info-container');
$container.empty();
$container.append($list);
La final hello-world2.html es la siguiente:
HTML
<!DOCTYPE html>
<html>
<head>
<script src="sdk/scripts/VSS.SDK.min.js"></script>
<script type="text/javascript">
VSS.init({
explicitNotifyLoaded: true,
usePlatformStyles: true
});
VSS.require(["TFS/Dashboards/WidgetHelpers",
"TFS/WorkItemTracking/RestClient"],
function (WidgetHelpers, TFS_Wit_WebApi) {
WidgetHelpers.IncludeWidgetStyles();
VSS.register("HelloWorldWidget2", function () {
var projectId = VSS.getWebContext().project.id;
var getQueryInfo = function (widgetSettings) {
// Get a WIT client to make REST calls to Azure
DevOps Services
return
TFS_Wit_WebApi.getClient().getQuery(projectId, "Shared Queries/Feedback")
.then(function (query) {
// Create a list with query details
var $list = $('<ul>');
$list.append($('<li>').text("Query ID: " +
query.id));
$list.append($('<li>').text("Query Name: " +
query.name));
$list.append($('<li>').text("Created By: " +
(query.createdBy ? query.createdBy.displayName: "<unknown>") ));
// Append the list to the query-info-
container
var $container = $('#query-info-container');
$container.empty();
$container.append($list);
// Use the widget helper and return success
as Widget Status
return
WidgetHelpers.WidgetStatusHelper.Success();
}, function (error) {
// Use the widget helper and return failure
as Widget Status
return
WidgetHelpers.WidgetStatusHelper.Failure(error.message);
});
return {
load: function (widgetSettings) {
// Set your title
var $title = $('h2.title');
$title.text('Hello World');
return getQueryInfo(widgetSettings);
});
VSS.notifyLoadSucceeded();
});
</script>
</head>
<body>
<div class="widget">
<h2 class="title"></h2>
<div id="query-info-container"></div>
</div>
</body>
</html>
Paso 5: Novedades manifiesto de extensión
En este paso, actualizamos el manifiesto de extensión para incluir una entrada para
nuestro segundo widget.
Agregue una nueva contribución a la matriz en la
contributions propiedad y agregue el nuevo archivo hello-world2.html a la matriz en
la propiedad files.
Necesita otra imagen de vista previa para el segundo widget.
preview2.png Asígnelo el nombre y colóquelo en la img carpeta .
JSON
...,
"contributions":[
...,
"id": "HelloWorldWidget2",
"type": "ms.vss-dashboards-web.widget",
"targets": [
"ms.vss-dashboards-web.widget-catalog"
],
"properties": {
"name": "Hello World Widget 2 (with API)",
"description": "My second widget",
"previewImageUrl": "img/preview2.png",
"uri": "hello-world2.html",
"supportedSizes": [
"rowSpan": 1,
"columnSpan": 2
],
"supportedScopes": ["project_team"]
],
"files": [
"path": "hello-world.html", "addressable": true
},
"path": "hello-world2.html", "addressable": true
},
"path": "sdk/scripts", "addressable": true
},
"path": "img", "addressable": true
],
"scopes":[
"vso.work"
Paso 6: Empaquetar, Publicar y Compartir
Empaquetar, publicar y compartir la extensión.
Si ya ha publicado la extensión, puede
volver a empaquetar la extensión, como se describe aquí, y actualizarla directamente a
Marketplace.
Paso 7: Agregar widget desde el catálogo
Ahora, vaya al panel del equipo en
https:\//dev.azure.com/{yourOrganization}/{yourProject} . Si esta página ya está
abierta, actualízela.
Mantenga el puntero sobre el botón Editar de la parte inferior
derecha y seleccione el botón Agregar. El catálogo de widgets se abre donde se
encuentra el widget que instaló.
Elija el widget y seleccione el botón "Agregar" para
agregarlo al panel.
Parte 3: Hola mundo con configuración
En la parte 2 de esta guía, ha visto cómo crear un widget que muestre información de
consulta para una consulta codificada de forma rígida.
En esta parte, se agrega la
capacidad de configurar la consulta que se va a usar en lugar de la codificada de forma
rígida.
Cuando está en modo de configuración, el usuario obtiene una vista previa activa
del widget en función de sus cambios. Estos cambios se guardan en el widget en el
panel cuando el usuario selecciona Guardar.
Paso 1: HTML
Las implementaciones de widgets y configuraciones de widgets son mucho iguales.
Ambos se implementan en el marco de extensión como contribuciones. Ambos usan el
mismo archivo sdk, VSS.SDK.min.js . Ambos se basan en HTML, JavaScript y CSS.
Copie el archivo html-world2.html del ejemplo anterior y cambie el nombre de la copia
a hello-world3.html . Agregue otro archivo HTML denominado configuration.html .
La
carpeta tiene ahora un aspecto similar al del ejemplo siguiente:
no-highlight
|--- README.md
|--- sdk
|--- node_modules
|--- scripts
|--- VSS.SDK.min.js
|--- img
|--- logo.png
|--- scripts
|--- configuration.html
|--- hello-world.html // html page to be used for your widget
|--- hello-world2.html // renamed copy of hello-world.html
|--- hello-world3.html // renamed copy of hello-world2.html
|--- vss-extension.json // extension's manifest
Agregue el código HTML siguiente en configuration.html . Básicamente, agregamos la
referencia obligatoria al VSS.SDK.min.js archivo y un select elemento de la lista
desplegable para seleccionar una consulta de una lista preestablecida.
HTML
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="sdk/scripts/VSS.SDK.min.js"></script>
</head>
<body>
<div class="container">
<fieldset>
<label class="label">Query: </label>
<select id="query-path-dropdown" style="margin-
top:10px">
<option value="" selected disabled hidden>Please
select a query</option>
<option value="Shared Queries/Feedback">Shared
Queries/Feedback</option>
<option value="Shared Queries/My Bugs">Shared
Queries/My Bugs</option>
<option value="Shared Queries/My Tasks">Shared
Queries/My Tasks</option>
</select>
</fieldset>
</div>
</body>
</html>
Paso 2: JavaScript: Configuración
Use JavaScript para representar contenido en la configuración del widget como hicimos
para el widget en el paso 3 de la parte 1 de esta guía.
Este código javaScript representa
el contenido, inicializa el SDK de VSS, asigna el código para la configuración del widget
al nombre de configuración y pasa las opciones de configuración al marco. En nuestro
caso, a continuación se muestra el código que carga la configuración del widget.
Abra el
archivo configuration.html y el elemento siguiente <script> en . <head>
HTML
<script type="text/javascript">
VSS.init({
explicitNotifyLoaded: true,
usePlatformStyles: true
});
VSS.require("TFS/Dashboards/WidgetHelpers", function (WidgetHelpers)
{
VSS.register("HelloWorldWidget.Configuration", function () {
var $queryDropdown = $("#query-path-dropdown");
return {
load: function (widgetSettings,
widgetConfigurationContext) {
var settings =
JSON.parse(widgetSettings.customSettings.data);
if (settings && settings.queryPath) {
$queryDropdown.val(settings.queryPath);
return WidgetHelpers.WidgetStatusHelper.Success();
},
onSave: function() {
var customSettings = {
data: JSON.stringify({
queryPath: $queryDropdown.val()
})
};
return
WidgetHelpers.WidgetConfigurationSave.Valid(customSettings);
});
VSS.notifyLoadSucceeded();
});
</script>
VSS.init , VSS.require y VSS.register desempeñan el mismo papel que desempeñaron
para el widget, tal y como se describe en la parte 1.
La única diferencia es que para las
configuraciones de widget, la función que se pasa a VSS.register debe devolver un
objeto que satisfaga el IWidgetConfiguration contrato.
La load propiedad del IWidgetConfiguration contrato debe tener una función como su
valor.
Esta función tiene el conjunto de pasos para representar la configuración del
widget.
En nuestro caso, es actualizar el valor seleccionado del elemento desplegable
con la configuración existente si existe.
Se llama a esta función cuando el marco crea
una instancia de . widget configuration
La onSave propiedad del IWidgetConfiguration contrato debe tener una función como
su valor.
El marco llama a esta función cuando el usuario selecciona Guardar en el panel
de configuración.
Si la entrada del usuario está lista para guardarse, serialícela en una
cadena, forme el custom settings objeto y use WidgetConfigurationSave.Valid() para
guardar la entrada del usuario.
En esta guía, usamos JSON para serializar la entrada del usuario en una cadena. Puede
elegir cualquier otra manera de serializar la entrada del usuario en la cadena.
Es
accesible para el widget a través de la propiedad customSettings del WidgetSettings
objeto .
El widget tiene que deserializar esto, que se trata en el paso 4.
Paso 3: JavaScript: Habilitación de live preview
Para habilitar la actualización en vista previa activa cuando el usuario selecciona una
consulta en la lista desplegable, adjuntamos un controlador de eventos de cambio al
botón. Este controlador notifica al marco de trabajo que ha cambiado la configuración.
También pasa el customSettings que se va a usar para actualizar la versión preliminar.
Para notificar al marco, se notify debe llamar al método en
. widgetConfigurationContext Toma dos parámetros, el nombre del evento, que en este
caso es WidgetHelpers.WidgetEvent.ConfigurationChange y un EventArgs objeto para el
evento, creado a partir de customSettings la ayuda del WidgetEvent.Args método
auxiliar.
Agregue lo siguiente en la función asignada a la load propiedad .
JavaScript
$queryDropdown.on("change", function () {
var customSettings = {
data: JSON.stringify({
queryPath: $queryDropdown.val()
})
};
var eventName = WidgetHelpers.WidgetEvent.ConfigurationChange;
var eventArgs = WidgetHelpers.WidgetEvent.Args(customSettings);
widgetConfigurationContext.notify(eventName, eventArgs);
});
Debe notificar al marco de configuración el cambio al menos una vez para que se
pueda habilitar el botón "Guardar".
Al final, tiene configuration.html el siguiente aspecto:
HTML
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="sdk/scripts/VSS.SDK.min.js"></script>
<script type="text/javascript">
VSS.init({
explicitNotifyLoaded: true,
usePlatformStyles: true
});
VSS.require("TFS/Dashboards/WidgetHelpers", function
(WidgetHelpers) {
VSS.register("HelloWorldWidget.Configuration", function
() {
var $queryDropdown = $("#query-path-dropdown");
return {
load: function (widgetSettings,
widgetConfigurationContext) {
var settings =
JSON.parse(widgetSettings.customSettings.data);
if (settings && settings.queryPath) {
$queryDropdown.val(settings.queryPath);
$queryDropdown.on("change", function () {
var customSettings = {data:
JSON.stringify({queryPath: $queryDropdown.val()})};
var eventName =
WidgetHelpers.WidgetEvent.ConfigurationChange;
var eventArgs =
WidgetHelpers.WidgetEvent.Args(customSettings);
widgetConfigurationContext.notify(eventName, eventArgs);
});
return
WidgetHelpers.WidgetStatusHelper.Success();
},
onSave: function() {
var customSettings = {data:
JSON.stringify({queryPath: $queryDropdown.val()})};
return
WidgetHelpers.WidgetConfigurationSave.Valid(customSettings);
});
VSS.notifyLoadSucceeded();
});
</script>
</head>
<body>
<div class="container">
<fieldset>
<label class="label">Query: </label>
<select id="query-path-dropdown" style="margin-
top:10px">
<option value="" selected disabled hidden>Please
select a query</option>
<option value="Shared Queries/Feedback">Shared
Queries/Feedback</option>
<option value="Shared Queries/My Bugs">Shared
Queries/My Bugs</option>
<option value="Shared Queries/My Tasks">Shared
Queries/My Tasks</option>
</select>
</fieldset>
</div>
</body>
</html>
Paso 4: JavaScript: implementación de la recarga en el
widget
Hemos configurado la configuración del widget para almacenar la ruta de acceso de
consulta seleccionada por el usuario.
Ahora tenemos que actualizar el código del widget
para usar esta configuración almacenada en lugar del código Shared Queries/Feedback
duro del ejemplo anterior.
Abra el archivo hello-world3.html y actualice el nombre del widget de
HelloWorldWidget2 a HelloWorldWidget3 en la línea donde se llama a VSS.register .
Esto
permite que el marco identifique de forma única el widget dentro de la extensión.
La función asignada a HelloWorldWidget3 a través VSS.register de actualmente
devuelve un objeto que satisface el IWidget contrato.
Dado que el widget ahora
necesita configuración, esta función debe actualizarse para devolver un objeto que
satisfaga el IConfigurableWidget contrato.
Para ello, actualice la instrucción return para
incluir una propiedad denominada recarga como se indica a continuación. El valor de
esta propiedad es una función que llama al getQueryInfo método una vez más.
El marco
llama a este método de recarga cada vez que cambia la entrada del usuario para
mostrar la vista previa activa. También se llama cuando se guarda la configuración.
JavaScript
return {
load: function (widgetSettings) {
// Set your title
var $title = $('h2.title');
$title.text('Hello World');
return getQueryInfo(widgetSettings);
},
reload: function (widgetSettings) {
return getQueryInfo(widgetSettings);
La ruta de acceso de consulta codificada de forma rígida de getQueryInfo debe
reemplazarse por la ruta de acceso de consulta configurada, que se puede extraer del
parámetro widgetSettings que se pasa al método .
Agregue lo siguiente al principio del
getQueryInfo método y reemplace la ruta de consulta codificada de forma rígida por
settings.queryPath .
JavaScript
var settings = JSON.parse(widgetSettings.customSettings.data);
if (!settings || !settings.queryPath) {
var $container = $('#query-info-container');
$container.empty();
$container.text("Sorry nothing to show, please configure a query
path.");
return WidgetHelpers.WidgetStatusHelper.Success();
En este momento, el widget está listo para representarse con las opciones configuradas.
load Las propiedades y reload tienen una función similar. Este es el caso de la
mayoría de los widgets simples.
En el caso de los widgets complejos, habría ciertas
operaciones que le gustaría ejecutar solo una vez, independientemente de cuántas
veces cambie la configuración.
O puede haber algunas operaciones de peso pesado
que no necesiten ejecutarse más de una vez. Estas operaciones formarían parte de
la función correspondiente a la load propiedad y no a la reload propiedad .
Paso 5: Novedades de manifiesto de extensión
Abra el vss-extension.json archivo para incluir dos entradas nuevas en la matriz en la
contributions propiedad . Uno para el HelloWorldWidget3 widget y el otro para su
configuración.
Necesita otra imagen de vista previa para el tercer widget. Asígnelo
preview3.png y colóquelo en la img carpeta .
Actualice la matriz de la files propiedad
para incluir los dos nuevos archivos HTML que hemos agregado en este ejemplo.
JSON
...
"contributions": [
... ,
"id": "HelloWorldWidget3",
"type": "ms.vss-dashboards-web.widget",
"targets": [
"ms.vss-dashboards-web.widget-catalog",
"fabrikam.vsts-extensions-
myExtensions.HelloWorldWidget.Configuration"
],
"properties": {
"name": "Hello World Widget 3 (with config)",
"description": "My third widget",
"previewImageUrl": "img/preview3.png",
"uri": "hello-world3.html",
"supportedSizes": [
"rowSpan": 1,
"columnSpan": 2
],
"supportedScopes": ["project_team"]
},
"id": "HelloWorldWidget.Configuration",
"type": "ms.vss-dashboards-web.widget-configuration",
"targets": [ "ms.vss-dashboards-web.widget-configuration" ],
"properties": {
"name": "HelloWorldWidget Configuration",
"description": "Configures HelloWorldWidget",
"uri": "configuration.html"
],
"files": [
"path": "hello-world.html", "addressable": true
},
"path": "hello-world2.html", "addressable": true
},
"path": "hello-world3.html", "addressable": true
},
"path": "configuration.html", "addressable": true
},
"path": "sdk/scripts", "addressable": true
},
"path": "img", "addressable": true
],
...
Tenga en cuenta que la contribución para la configuración del widget sigue un modelo
ligeramente diferente al propio widget.
Una entrada de contribución para la
configuración del widget tiene:
Identificador para identificar su contribución. Debe ser único dentro de una
extensión.
Tipo de contribución. Para todas las configuraciones de widget, debe ser ms.vss-
dashboards-web.widget-configuration
Matriz de destinos a los que contribuye la contribución. Para todas las
configuraciones de widget, tiene una única entrada: ms.vss-dashboards-
web.widget-configuration .
Las propiedades que contienen un conjunto de propiedades que incluyen el
nombre, la descripción y el URI del archivo HTML usado para la configuración.
Para admitir la configuración, también es necesario cambiar la contribución del widget.
La matriz de destinos del widget debe actualizarse para incluir el identificador de la
configuración en el formato < publisher >.><< id for the configuration
contribution id for the extension > En este caso, es . fabrikam.vsts-extensions-
myExtensions.HelloWorldWidget.Configuration
2 Advertencia
Si la entrada de contribución del widget configurable no tiene como destino la
configuración mediante el nombre de extensión y el publicador correctos, como se
ha descrito anteriormente, el botón configurar no se muestra para el widget.
Al final de esta parte, el archivo de manifiesto debe contener tres widgets y una
configuración. Puede obtener el manifiesto completo del ejemplo aquí .
Paso 6: Empaquetar, publicar y compartir
Si aún no ha publicado la extensión, lea esta sección para empaquetar, publicar y
compartir la extensión.
Si ya ha publicado la extensión antes de este punto, puede
volver a empaquetar la extensión como se describe aquí y actualizarla directamente a
Marketplace.
Paso 7: Agregar widget desde el catálogo
Ahora, vaya al panel del equipo en
https://dev.azure.com/{yourOrganization}/{yourProject}. Si esta página ya está abierta,
actualízela.
Mantenga el puntero sobre el botón Editar de la parte inferior derecha y
seleccione el botón Agregar. Esto debería abrir el catálogo de widgets donde encuentre
el widget que instaló.
Elija el widget y seleccione el botón "Agregar" para agregarlo al
panel.
Verá un mensaje que le pide que configure el widget.
Hay dos maneras de configurar widgets. Uno es mantener el puntero sobre el widget,
seleccionar los puntos suspensivos que aparecen en la esquina superior derecha y, a
continuación, seleccionar Configurar.
La otra consiste en seleccionar el botón Editar en
la parte inferior derecha del panel y, a continuación, seleccionar el botón configurar que
aparece en la esquina superior derecha del widget.
Abre la experiencia de configuración
en el lado derecho y una vista previa del widget en el centro.
Continúe y elija una
consulta en la lista desplegable.
La vista previa en directo muestra los resultados
actualizados.
Seleccione "Guardar" y el widget mostrará los resultados actualizados.
Paso 8: Configurar más (opcional)
Puede agregar tantos elementos de formulario HTML como necesite en
configuration.html para la configuración adicional.
Hay dos características
configurables que están disponibles de forma predeterminada: el nombre del widget y
el tamaño del widget.
De forma predeterminada, el nombre que proporcione para el widget en el manifiesto
de extensión se almacena como el nombre del widget para cada instancia del widget
que se agregue a un panel.
Puede permitir que los usuarios lo configuren para que
puedan agregar cualquier nombre que desee a su instancia del widget.
Para permitir
esta configuración, agregue isNameConfigurable:true en la sección de propiedades del
widget en el manifiesto de extensión.
Si proporciona más de una entrada para el widget en la supportedSizes matriz en el
manifiesto de extensión, los usuarios también pueden configurar el tamaño del widget.
El manifiesto de extensión del tercer ejemplo de esta guía sería similar al siguiente si
habilitamos el nombre del widget y la configuración de tamaño:
JSON
...
"contributions": [
... ,
"id": "HelloWorldWidget3",
"type": "ms.vss-dashboards-web.widget",
"targets": [
"ms.vss-dashboards-web.widget-catalog", "fabrikam.vsts-
extensions-myExtensions.HelloWorldWidget.Configuration"
],
"properties": {
"name": "Hello World Widget 3 (with config)",
"description": "My third widget",
"previewImageUrl": "img/preview3.png",
"uri": "hello-world3.html",
"isNameConfigurable": true,
"supportedSizes": [
"rowSpan": 1,
"columnSpan": 2
},
"rowSpan": 2,
"columnSpan": 2
],
"supportedScopes": ["project_team"]
},
...
Con el cambio anterior, vuelva a empaquetar y actualice la extensión. Actualice el panel
que tiene este widget (Hola mundo Widget 3 (con config)).
Abra el modo de
configuración del widget; ahora debería poder ver la opción para cambiar el nombre y
el tamaño del widget.
Adelante y elija un tamaño diferente en la lista desplegable. Verá que se cambia el
tamaño de la versión preliminar en directo. Guarde el cambio y el widget en el panel
también se cambie.
2 Advertencia
Si quita un tamaño ya admitido, el widget no se carga correctamente. Estamos
trabajando en una corrección para una versión futura.
Cambiar el nombre del widget no da lugar a ningún cambio visible en el widget.
Esto se
debe a que nuestros widgets de ejemplo no muestran el nombre del widget en ningún
lugar. Vamos a modificar el código de ejemplo para mostrar el nombre del widget en
lugar del texto codificado de forma rígida "Hola mundo".
Para ello, reemplace el texto codificado de forma rígida "Hola mundo" por
widgetSettings.name en la línea donde establecemos el texto del h2 elemento.
Esto
garantiza que el nombre del widget se muestre cada vez que el widget se cargue en la
actualización de la página.
Puesto que queremos que la versión preliminar en directo se
actualice cada vez que cambie la configuración, también debemos agregar el mismo
código en la reload parte del código.
La instrucción return final de hello-world3.html
es la siguiente:
JavaScript
return {
load: function (widgetSettings) {
// Set your title
var $title = $('h2.title');
$title.text(widgetSettings.name);
return getQueryInfo(widgetSettings);
},
reload: function (widgetSettings) {
// Set your title
var $title = $('h2.title');
$title.text(widgetSettings.name);
return getQueryInfo(widgetSettings);
Vuelva a empaquetar y actualice la extensión de nuevo. Actualice el panel que tiene este
widget. Cualquier cambio en el nombre del widget, en el modo de configuración,
actualice el título del widget ahora.
Agregar un gráfico
Artículo • 18/11/2022 • Tiempo de lectura: 4 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019
Obtenga información sobre cómo puede agregar gráficos a las extensiones. Los gráficos
se pueden agregar a cualquier extensión Azure DevOps Services.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Los gráficos son fáciles de crear, cambiar de tamaño, interactivos y coherentes con el
aspecto y la apariencia Azure DevOps Services.
Se admiten los siguientes tipos de
gráfico:
Línea
Barra
Columna
Área
Barra apilada
Columna apilada
Área apilada
Gráfico circular
Tabla dinámica
Histograma
Si tiene prisa y quiere poner las manos en el código inmediatamente, puede
descargar los ejemplos completos .
Una vez descargado, vaya a la charts carpeta
y siga las instrucciones de empaquetado y publicación para publicar la extensión de
ejemplo.
La extensión contiene widgets de gráfico de ejemplo.
Cómo organizar el código
Para este tutorial, se crea un widget y se agrega un gráfico.
Para ello, en la home carpeta
del proyecto, cree un chart.html archivo con el siguiente contenido:
Archivo HTML
HTML
<!DOCTYPE html>
<html>
<head>
<script src="sdk/scripts/VSS.SDK.js"></script>
<script src="scripts/pie-chart.js"></script>
</head>
<body>
<div class="widget">
<h2 class="title">Chart Widget</h2>
<div id="Chart-Container"></div>
</div>
</body>
</html>
Use el comando npm install para recuperar el SDK: npm install vss-web-extension-
sdk . Para más información sobre el SDK, visite la página de GitHub del SDK de
cliente .
Asegúrese de que el VSS.SDK.js archivo está dentro de la sdk/scripts carpeta para que
la ruta de acceso sea home/sdk/scripts/VSS.SDK.js .
Imágenes
Agregue las siguientes imágenes a una img carpeta del directorio del proyecto para que
la ruta de acceso sea home/img/logo.png y home/img/CatalogIcon.png :
1. Logotipo de extensión
2. Icono de catálogo
Archivo de manifiesto de extensión
En la carpeta del proyecto, cree el home archivo de manifiesto de extensión. Cree un
archivo vss-extension.json con el siguiente contenido:
JSON
"manifestVersion": 1,
"id": "samples-charts",
"version": "1.0.0",
"name": "Interactive Charts in Azure DevOps Services",
"description": "Samples of interactive charts from the Chart SDK.",
"publisher": "Fabrikam",
"targets": [
"id": "Microsoft.VisualStudio.Services"
],
"icons": {
"default": "img/logo.png"
},
"demands": ["contribution/ms.vss-dashboards-web.widget-sdk-version-2",
"contribution/ms.vss-web.charts-service"],
"contributions": [
"id": "chart",
"type": "ms.vss-dashboards-web.widget",
"targets": [
"ms.vss-dashboards-web.widget-catalog"
],
"properties": {
"name": "Sample Chart",
"description": "A simple chart widget with no configuration
and hard-coded data.",
"catalogIconUrl": "img/CatalogIcon.png",
"uri": "chart.html",
"supportedSizes": [
"rowSpan": 2,
"columnSpan": 2
],
"supportedScopes": [
"project_team"
],
"files": [
"path": "chart.html",
"addressable": true
},
"path": "sdk/scripts/VSS.SDK.js",
"addressable": true
},
"path": "img",
"addressable": true
},
"path": "scripts",
"addressable": true
],
"scopes": [
Antes de cargar esta extensión, debe actualizar a publisher la suya.
Coloque los siguientes fragmentos de código en un chart.js archivo de una scripts
carpeta para que la ruta de acceso sea home/scripts/chart.js .
A continuación, siga las
instrucciones de empaquetado y publicación para publicar la extensión.
Gráficos
Gráfico
En este ejemplo se representa un gráfico. y data labelValues se han codificado de
forma dura aquí, y tendría que cambiarse a los datos que desea visualizar.
JavaScript
VSS.init({
explicitNotifyLoaded: true,
usePlatformStyles: true
});
VSS.require([
"TFS/Dashboards/WidgetHelpers",
"Charts/Services"
],
function (WidgetHelpers, Services) {
WidgetHelpers.IncludeWidgetStyles();
VSS.register("chart", function () {
return {
load:function() {
return
Services.ChartsService.getService().then(function(chartService){
var $container = $('#Chart-Container');
var chartOptions = {
"hostOptions": {
"height": "290",
"width": "300"
},
"chartType": "pie",
"series": [{
"data": [11, 4, 3, 1]
}],
"xAxis": {
"labelValues": ["Design", "On Deck",
"Completed", "Development"]
},
"specializedOptions": {
"showLabels": "true",
"size": 200
};
chartService.createChart($container, chartOptions);
return WidgetHelpers.WidgetStatusHelper.Success();
});
});
VSS.notifyLoadSucceeded();
});
Aquí, el tamaño del gráfico se define en hostOptions . La propiedad series es una matriz
y contiene un único objeto con datos en ella. El xAxis objeto contiene labelValues , que
corresponde a data .
En el caso de los gráficos circulares, también tenemos algunas
opciones especiales definidas por la specializedOptions propiedad . Aquí se habilitan
explícitamente las etiquetas de datos para el gráfico circular.
También es necesario
establecer el tamaño del gráfico circular especificando su diámetro exterior.
El gráfico requiere un contenedor, las opciones del gráfico y una llamada al Servicio de
gráficos para inicializar y representar. Para obtener más información sobre las opciones
de gráfico, consulte vss-web-extension-sdk/typings/charts .
Gráfico de áreas apiladas
En el ejemplo siguiente se representa un gráfico de áreas apiladas. Este tipo de gráfico
es ideal para comparar una relación de partes con un conjunto y resaltar tendencias
generales entre categorías. Normalmente se usa para comparar tendencias a lo largo del
tiempo.
En este ejemplo también se especifica un color personalizado para una de las
series que se representan.
JavaScript
VSS.init({
explicitNotifyLoaded: true,
usePlatformStyles: true
});
VSS.require([
"TFS/Dashboards/WidgetHelpers",
"Charts/Services"
],
function (WidgetHelpers, Services) {
WidgetHelpers.IncludeWidgetStyles();
VSS.register("StackedAreaChart", function () {
return {
load:function() {
return
Services.ChartsService.getService().then(function(chartService){
var $container = $('#Chart-Container');
var chartOptions = {
"hostOptions": {
"height": "290",
"width": "300"
},
"chartType": "stackedArea",
"series": [
"name": "Completed",
"data": [1,3,4,3,6,1,9,0,8,11]
},
"name": "Development",
"data": [1,1,0,3,0,2,8,9,2,8]
},
"name": "Design",
"data": [0,0,0,6,1,1,9,9,1,9],
"color": "#207752"
},
"name": "On Deck",
"data": [1,2,4,5,4,2,1,7,0,6]
],
"xAxis": {
"labelFormatMode": "dateTime_DayInMonth",
"labelValues": [
"1/1/2016",
"1/2/2016",
"1/3/2016",
"1/4/2016",
"1/5/2016",
"1/6/2016",
"1/7/2016",
"1/8/2016",
"1/9/2016",
"1/10/2016"
chartService.createChart($container, chartOptions);
return WidgetHelpers.WidgetStatusHelper.Success();
});
});
VSS.notifyLoadSucceeded();
});
Tabla dinámica
En este ejemplo se representa una tabla dinámica. Este tipo de gráfico ayuda a organizar
y resumir datos complejos en un formulario tabular.
JavaScript
VSS.init({
explicitNotifyLoaded: true,
usePlatformStyles: true
});
VSS.require([
"TFS/Dashboards/WidgetHelpers",
"Charts/Services"
],
function (WidgetHelpers, Services) {
WidgetHelpers.IncludeWidgetStyles();
VSS.register("PivotTable", function () {
return {
load:function() {
return
Services.ChartsService.getService().then(function(chartService){
var $container = $('#Chart-Container');
var chartOptions = {
"hostOptions": {
"height": "290",
"width": "300"
},
"chartType": "table",
"xAxis": {
"labelValues": ["Design","In
Progress","Resolved","Total"]
},
"yAxis": {
"labelValues": ["P1","P2","P3","Total"]
},
"series": [
"name": "Design",
"data": [
[0,0,1],
[0,1,2],
[0,2,3]
]
},
"name": "In Progress",
"data": [
[1,0,4],
[1,1,5],
[1,2,6]
]
},
"name": "Resolved",
"data": [
[2,0,7],
[2,1,8],
[2,2,9]
]
},
"name": "Total",
"data": [
[3,0,12],
[3,1,15],
[3,2,18],
[0,3,6],
[1,3,15],
[2,3,24],
[3,3,10]
],
"color": "rgba(255,255,255,0)"
chartService.createChart($container, chartOptions);
return WidgetHelpers.WidgetStatusHelper.Success();
});
});
VSS.notifyLoadSucceeded();
});
Llamar a una API REST
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Para llamar a una API REST desde la extensión, obtenga primero el servicio de cliente y
después úselo para llamar a la API.
7 Nota
¿Buscás las API REST de Azure DevOps? Consulte la referencia más reciente de la
API REST de Azure DevOps.
Para más información sobre las bibliotecas cliente de .NET, consulte Bibliotecas
cliente de .NET para Azure DevOps.
Servicios de cliente
Puede encontrar la lista completa de clientes REST disponibles y sus referencias aquí.
Llamar a una API
Tendrá que agregar el ámbito "scopes": ["vso.work"], a vss-extension.json para
usar el cliente de seguimiento de elementos de trabajo.
1. Obtenga el cliente REST. En este caso, se obtiene el cliente de seguimiento de
elementos de trabajo.
JavaScript
VSS.require(["VSS/Service", "TFS/WorkItemTracking/RestClient"],
function (VSS_Service, TFS_Wit_WebApi) {
// Get the REST client
var witClient =
VSS_Service.getCollectionClient(TFS_Wit_WebApi.WorkItemTrackingHttpClie
nt);
// ...
});
2. Llame a la API, getWorkItems , mediante el servicio cliente, witClient , con una
devolución de llamada que controle los resultados.
JavaScript
witClient.getWorkItems(/* some work item IDs */ [1,2,3,4],
["System.Title"]).then(
function(workItems) {
console.log(JSON.stringify(workItems));
});
Pasos siguientes
Muestra los resultados de la llamada a la API rest en una cuadrícula.
Compatibilidad con proyectos públicos
Azure DevOps Services extensiones
Artículo • 18/11/2022 • Tiempo de lectura: 8 minutos
Azure DevOps Services
Antes de la compatibilidad con proyectos públicos, todos Azure DevOps Services
proyectos eran privados. Los proyectos privados solo autenticaban a los usuarios con
acceso al proyecto, por lo que el público no podía verlo ni interactuar con él. Un
proyecto público permite a los usuarios que no son miembros ver el contenido de ese
proyecto en un estado de solo lectura.
Un usuario que no es miembro es anónimo (no autenticado en Azure DevOps
Services) o público (se autentica en Azure DevOps Services, pero no pertenece a la
organización).
Los usuarios que no son miembros suelen ver las mismas vistas que los usuarios
autenticados, pero la funcionalidad no pública está oculta o deshabilitada. Un ejemplo
de funcionalidad no pública, como la configuración y las acciones, incluye una
compilación de cola.
7 Nota
Azure DevOps Services compatibilidad con proyectos públicos se encuentra
actualmente en versión preliminar limitada. Póngase en vsts-
public@microsoft.com contacto con si está interesado en desarrollar extensiones
que admitan proyectos públicos. Para más información sobre los proyectos
públicos, consulte Azure DevOps Services Versión preliminar limitada de
proyectos públicos .
Decidir si hacer que una extensión sea visible
para los usuarios que no son miembros
Como desarrollador de extensiones, puede hacer que todo o parte de la extensión esté
disponible para los usuarios que no son miembros. Estos usuarios solo pueden usar la
extensión desde dentro de un proyecto público. Si decide no hacer que la extensión
esté disponible para los usuarios que no son miembros, no se requiere ningún cambio y
no hay ningún impacto en los miembros, ya sea que usen la extensión desde un
proyecto público.
Use esta lista de comprobación para decidir si debe hacer que la extensión esté
disponible para usuarios que no son miembros:
" Los datos presentados por la extensión son pertinentes para los usuarios que no
son miembros
" La extensión aporta funcionalidades en el nivel de proyecto
" La extensión contribuye a las áreas del producto a las que pueden acceder usuarios
que no son miembros
" La extensión no extiende ni se basa en características que no están disponibles para
los usuarios que no son miembros, por ejemplo, el servicio de datos o
determinadas AZURE DEVOPS SERVICES REST. Para más información, consulte la
sección Limitaciones de este artículo.
Visibilidad de la contribución
De forma predeterminada, las contribuciones solo son visibles para los miembros de la
organización. Para proporcionar visibilidad a los usuarios que no son miembros de una
contribución, establezca el restrictedTo atributo en esa contribución. El valor es una
matriz de cadenas que enumera los tipos de usuarios que deben tener visibilidad de la
contribución. Los valores posibles son:
member un usuario autenticado que sea miembro de la organización
public un usuario autenticado que no es miembro de la organización
anonymous un usuario no autenticado
Ejemplo: hacer que un centro sea visible para usuarios
anónimos, públicos y miembros
JSON
"contributions": [
"id": "my-hub",
"type": "ms.vss-web.hub",
"targets": [
"ms.vss-code-web.code-hub-group"
],
"restrictedTo": [
"member",
"public",
"anonymous"
],
"properties": {
...
También puede establecer la visibilidad predeterminada de todas las contribuciones de
la extensión estableciendo restrictedTo el atributo en la raíz del manifiesto de
extensión. A continuación, puede invalidar este valor predeterminado en contribuciones
individuales.
Ejemplo: hacer que todas las contribuciones, excepto una,
sean visibles para todos los usuarios
JSON
"id:": "my-extension",
"name": "My Extension",
"version": "1.0.0",
...
"restrictedTo": [
"anonymous",
"public",
"member"
],
"contributions": [
"id": "my-member-only-widget",
"type": "ms.vss-dashboards-web.widget",
"restrictedTo": [
"member"
],
"properties": {
...
},
"id": "my-hub",
"type": "ms.vss-web.hub",
"targets": [
"ms.vss-code-web.code-hub-group"
],
"properties": {
...
}
},
"id": "my-second-hub",
"type": "ms.vss-web.hub",
"targets": [
"ms.vss-work-web.work-hub-group"
],
"properties": {
...
}
Limitaciones
Si desea que algunos o todos los aspectos de su contribución estén disponibles para los
usuarios públicos, tenga en cuenta las siguientes limitaciones.
Métodos del SDK de VSS
El script del SDK principal, VSS.SDK.js, permite que las extensiones web se comuniquen
con el marco primario para realizar operaciones como inicializar la comunicación y
obtener información de contexto sobre el usuario actual. Los siguientes métodos del
SDK de VSS no se admiten para usuarios que no son miembros:
VSS.getAccessToken()
VSS.getAppToken()
Servicio de datos de extensión
Dado que los datos administrados por el servicio de datos de extensión no están
limitados ni protegidos para un proyecto, los usuarios que no son miembros no pueden
leer ni escribir ningún tipo de datos de extensión.
Ejemplo: control de errores de acceso a datos
Si el servicio de datos no puede acceder al servicio de datos debido a las limitaciones de
permisos del usuario que realiza la llamada, getValue se rechaza la promesa devuelta
por la llamada a . El error pasado a la función reject tiene un nombre, que puede
ayudarle a comprender por qué la llamada no pudo leer o escribir datos.
JavaScript
VSS.getService(VSS.ServiceIds.ExtensionData).then(function(dataService) {
dataService.getValue("someKey").then(function(value) {
// do something with the value
}, function(error) {
if (error.name === "AccessCheckException") {
alert(error.message);
});
});
API de REST
Hay un conjunto limitado de Azure DevOps Services API REST disponibles para usuarios
que no son miembros. Estas API incluyen la mayoría de las API de nivel de organización
y de nivel de proyecto para las características que no están disponibles para los usuarios
que no son miembros en general. Tenga en cuenta esta información cuando decida si
quiere que la extensión esté disponible para los usuarios que no son miembros.
Se recomienda usar las API de la versión 5.0 y posteriores, ya que determinadas API solo
están disponibles para usuarios que no son miembros a partir de la versión 5.0.
Referencias de identidad
La mayoría de Azure DevOps Services API REST usan un "contrato" común para
representar a un usuario o grupo. Para proteger la información de los miembros, como
las direcciones de correo electrónico, cuando un usuario anónimo o público invoca una
API REST, se omiten determinados campos, uniqueName como .
Comprobación de permisos de usuario
Use permisos para decidir si se va a abrir o habilitar una funcionalidad en la extensión.
La API REST de seguridad se usa desde el código de extensión web para comprobar si el
usuario actual tiene permiso en Azure DevOps Services para completar la tarea. De este
modo, el usuario no pensará que tiene permiso para hacer algo, solo para averiguar que
no lo hace.
Ejemplo: comprobar si el usuario tiene permiso para poner en cola
las compilaciones
En este ejemplo se muestra cómo usar el cliente REST de seguridad para comprobar si el
usuario tiene permisos para poner en cola las compilaciones en el proyecto actual. De
forma predeterminada, los usuarios que no son miembros no tienen este permiso.
JavaScript
VSS.require(["VSS/Service", "VSS/security/RestClient"],
function(VSS_Service, Security_RestClient) {
var client =
VSS_Service.getCollectionClient(Security_RestClient.SecurityHttpClient3);
var securityToken = VSS.getWebContext().project.id;
client.hasPermissionsBatch({
evaluations: [
"securityNamespaceId": "33344D9C-FC72-4d6f-ABA5-FA317101A7E9",
"token": securityToken,
"permissions": 128 /* queue builds */
],
alwaysAllowAdministrators: true
).then(function(response) {
console.log("Can user queue builds in this project? " +
response.evaluations[0].value);
});
});
Consideraciones sobre el widget de panel
Al igual que otros tipos de contribuciones, la visibilidad de las contribuciones del widget
de panel se controla con la propiedad restrictedTo de contribución. Por ejemplo, para
que un widget sea visible para usuarios que no son miembros y miembros:
JSON
"contributions": [
"id": "HelloWorldWidget",
"type": "ms.vss-dashboards-web.widget",
"targets": [
"ms.vss-dashboards-web.widget-catalog"
],
"restrictedTo": [
"member",
"public",
"anonymous"
],
"properties": {
...
Configuración del widget
Al controlar la visibilidad del widget para los usuarios que no son miembros, el marco
de trabajo del panel también proporciona un mecanismo de almacenamiento opcional
de forma abierta para la configuración del widget. Hay dos mecanismos disponibles
para indicar si la configuración del widget está disponible para su uso por parte de
usuarios que no son miembros en proyectos públicos.
Un widget con una configuración configurable que sea visible para los usuarios que no
son miembros debe seguir uno de los siguientes patrones. Si no lo hace, el widget no se
muestra a estos usuarios.
Patrón 1: el widget declara sus instancias solo para
almacenar la configuración específica del proyecto
Establezca la propiedad de la contribución del canStoreCrossProjectSettings widget en
false , lo que indica que la configuración del widget es específica del proyecto.
JSON
"id:": "HelloWorldWidget",
"type": "ms.vss-dashboards-web.widget",
...
"properties": {
"canStoreCrossProjectSettings": false
Patrón 2: una instancia de widget declara que su
configuración es específica del proyecto.
Las instancias de widget individuales también pueden indicar que su configuración es
específica del proyecto y está disponible para los usuarios que no son miembros. Al
guardar la configuración, el widget debe establecer en hasCrossProjectSettings en
false la cadena JSON con cadena:
JSON
"hasCrossProjectSettings": false,
"hypotheticalWidgetOption": true,
"backlogLevel": "Stories"
Consideraciones de compilación y versión
Si la extensión contribuye a una tarea de compilación o versión, no se requiere ningún
cambio para usar esa tarea desde una canalización en un proyecto público.
Consideraciones sobre el seguimiento de
elementos de trabajo
Las extensiones no funcionan para usuarios que no son miembros en el contexto de un
proyecto público sin cambios. Esto incluye el formulario de elemento de trabajo, otras
experiencias de elementos de trabajo o la interacción con las API REST de seguimiento
de elementos de trabajo.
Formulario de elemento de trabajo
Se producirá un error en todas las actualizaciones o eliminaciones de elementos de
trabajo para usuarios que no son miembros.
Identities
En Azure DevOps Services api REST versión 5.0 y posteriores, las identidades
IdentityRef se devuelven como objetos en lugar de cadenas. Como se ha descrito
anteriormente, determinados campos, uniqueName como , no se devuelven en estos
objetos si un usuario que no es miembro realizó la llamada API.
API existentes
Solo las API REST con ámbito de proyecto se pueden invocar mediante una extensión
cuando el usuario actual no es miembro de la organización. Se rechazan todas las
llamadas API REST que no estén en el ámbito de un proyecto.
Consultas
Existen las siguientes limitaciones para los usuarios que no son miembros relacionados
con las consultas de elementos de trabajo:
Los usuarios que no son miembros pueden ejecutar consultas conocidas por
identificador o ruta de acceso
Las consultas deben tener como ámbito el proyecto actual. Se excluyen todos los
elementos de trabajo que no pertenezcan al proyecto actual.
El usuario que no es miembro no puede crear nuevas consultas ni ejecutar
consultas WIQL
Empaquetar y publicar extensiones
Artículo • 18/11/2022 • Tiempo de lectura: 9 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Una vez que haya desarrollado la extensión, puede empaquetar y publicarla en Visual
Studio Marketplace . Marketplace es un repositorio global para extensiones,
integraciones y otras ofertas privadas y públicas de Microsoft.
7 Nota
Para obtener información sobre las propiedades de detección disponibles en el
archivo de manifiesto de la extensión que ayuda a los usuarios a detectar y obtener
información sobre la extensión, consulte la Referencia del manifiesto de extensión.
Requisitos previos
Debe cumplirse la siguiente lista de requisitos antes de publicar en Marketplace.
Instale la herramienta de empaquetado de extensiones (TFX). Ejecute npm install
-g tfx-cli desde un símbolo del sistema.
Asegúrese de que se conceden los permisos adecuados para usar cualquier
imagen, por ejemplo, iconos, logotipos, capturas de pantalla, etc.
Incluya un archivo exhaustivo overview.md para describir su descripción en
Marketplace.
Incluya un icono para la extensión, que tiene al menos 128 x 128 píxeles de
tamaño.
Al hacer referencia a productos de Microsoft, use nombres completos en lugar de
abreviaturas, por ejemplo, Azure DevOps frente a AzDO o - cualquier otra
abreviatura.
Evite usar nombres de marca en el nombre de la extensión.
Creación de un publicador
Todas las extensiones e integraciones, incluidas las extensiones de Microsoft, tienen un
publicador. Cualquier persona puede crear un publicador y publicar extensiones en él.
También puede conceder a otras personas acceso a su publicador si un equipo está
desarrollando la extensión.
Un usuario posee el publicador, normalmente el usuario que lo creó. El publicador
también se puede compartir con otros usuarios.
1. Inicie sesión en el Portal de publicación de Visual Studio Marketplace .
2. Si aún no es miembro de un publicador existente, + Crear un publicador.
a. Escriba un nombre en el campo nombre del publicador. El campo id. debe
establecerse automáticamente en función del nombre especificado.
7 Nota
Anote el identificador. Debe establecerlo en el archivo de manifiesto de la
extensión.
Si no se le pide que cree un publicador, desplácese hacia abajo hasta la parte
inferior de la página y seleccione Publicar extensiones debajo de Sitios
relacionados.
Especifique un identificador para el publicador, por ejemplo: mycompany-
myteam
Este identificador se usa como valor para el atributo en el publisher
archivo de manifiesto de extensión.
Especifique un nombre para mostrar para el publicador, por ejemplo: My Team
3. Revise el Contrato de publicador de Marketplace y, a continuación, seleccione
Crear.
Una vez creado el publicador, se le dirigirá a administrar elementos, pero no hay ningún
elemento.
Empaquetado de la extensión
Para cargar la extensión, debe empaquetarla como un archivo .vsix compatible con VSIX
2.0.
Microsoft proporciona una interfaz de línea de comandos (CLI) multiplataforma para
empaquetar y publicar la extensión.
1. Abra el archivo de manifiesto de extensión ( vss-extension.json ) y establezca el
valor del publisher campo en el identificador del publicador. Por ejemplo:
JSON
{
...
"id": "my-first-extension",
"publisher": "AnnetteNielsen",
...
2. Desde un símbolo del sistema, ejecute el comando de empaquetado de la
herramienta TFX desde el directorio de extensión.
npx tfx-cli extension create
Cuando haya finalizado, verá un mensaje que indica que la extensión se ha
empaquetado correctamente:
=== Completed operation: create extension ===
- VSIX: C:\my-first-extension\AnnetteNielsen.my-first-extension-
1.0.0.vsix
- Extension ID: my-first-extension
- Extension Version: 1.0.0
- Publisher: AnnetteNielsen
7 Nota
La versión de una extensión o integración debe incrementarse en cada
actualización.
Si no ha incrementado la extensión o integración en el manifiesto, debe pasar el --
rev-version modificador de línea de comandos. Esto incrementa el número de
versión de revisión de la extensión y guarda la nueva versión en el manifiesto.
Comprobación del tamaño del paquete
Compruebe el tamaño del vsix después de empaquetarlo. Si es mayor que 50 MB, debe
optimizarlo. Para ello, consulte las consideraciones siguientes:
Desduplicar las dependencias comunes, si las hay, indicándolas una vez en el
paquete de extensión.
Capturar elementos en tiempo de ejecución o durante el tiempo de instalación en
lugar de proporcionarlo en el paquete. Considere la posibilidad de usar la
biblioteca del instalador de herramientas para extraer las dependencias de la
herramienta en tiempo de ejecución. El uso de la biblioteca ofrece ventajas en las
que la herramienta se almacena en caché por versión, por lo que para los agentes
privados, no se descargarán todas las compilaciones. La hemos convertido en una
biblioteca para que se pueda usar fuera de las tareas del instalador de
herramientas. Sin embargo, la tarea no funcionará en escenarios desconectados
(sin Internet), que deben estar en la descripción o documentos de la tarea.
Algunos usuarios han tenido éxito con WebPack para agitar sus dependencias en
sus tareas.
Publicación de la extensión
Una vez empaquetada la extensión, puede cargarla en Marketplace en un publicador. El
publisher identificador especificado en el archivo de manifiesto de la extensión debe
coincidir con el identificador del publicador en el que se carga la extensión.
1. En el portal de administración , seleccione el publicador en el menú desplegable
de la parte superior de la página.
2. Seleccione Nueva extensión>de Azure DevOps.
3. Arrastre y coloque el archivo o selecciónelo para buscar el archivo VSIX, que creó
en el paso de empaquetado anterior y, a continuación, elija Cargar.
Después de la validación rápida, la extensión aparece en la lista de extensiones
publicadas. No se preocupe, la extensión solo es visible para usted.
En este momento, la extensión no es visible para ninguna cuenta y no se puede instalar
hasta que la comparta.
7 Nota
Microsoft ejecuta un examen de virus en cada paquete de extensión nuevo y
actualizado publicado. Hasta que todo el examen esté claro, no publicamos la
extensión en Marketplace para su uso público. De este modo, también evitamos
exponer contenido inapropiado o ofensivo en las páginas de Marketplace.
Compartir la extensión
Debe compartir la extensión con una organización para poder instalarla en Azure
DevOps. Para compartir una extensión, realice las siguientes tareas:
1. En el portal de administración de Marketplace , seleccione la extensión en la lista,
haga clic con el botón derecho y, después, elija Compartir,No compartir o
Publicar/Cancelar publicación, en función de la extensión.
2. Seleccione Organización y escriba el nombre de la organización. Seleccione Entrar.
3. Cierre el panel.
La extensión ahora se puede instalar en esta organización.
Instalación de la extensión
Para instalar la extensión que se ha compartido, siga estos pasos.
1. En Marketplace, seleccione la extensión para abrir su página de información
general.
7 Nota
Dado que la extensión es privada, solo usted y cualquier miembro de la
organización con el que se comparte puede ver esta página.
1. Seleccione Obtener gratis para iniciar el proceso de instalación. Seleccione la
organización con la que ha compartido la extensión en el menú desplegable.
2. Seleccione Instalar.
::: moniker-end
¡Enhorabuena! Ha instalado la extensión en una organización y está listo para probarla.
Pruebe la extensión
1. Seleccione Continuar con la organización al final del Asistente para la instalación
para ir a la página principal de la organización en la que se instaló la extensión
( https://dev.azure.com/{organization} ).
1. Actualice el explorador.
2. Abra Configuración de la organización y, a continuación, seleccione Extensiones.
Debería ver la nueva extensión en la pestaña Instalado .
Depuración de la extensión
Para depurar la extensión mediante Visual Studio o Browser Developer Tools, cambie el
manifiesto agregando la baseUri propiedad . Esta acción acelera el desarrollo sin
necesidad de volver a implementar la extensión cada vez que cambie el código fuente.
JSON
...
"baseUri": "https://localhost:44300",
...
Al cambiar el manifiesto, carga la extensión desde la instancia del servidor web local. Por
ejemplo, IISExpress en Visual Studio.
Después de cambiar el manifiesto, implemente e
instale esta extensión de depuración solo una vez.
7 Nota
Ejecute el servidor web local en modo SSL porque Azure DevOps exige que la
página web se sirva desde un origen seguro. De lo contrario, se produce un error
en la consola del explorador durante la carga de IFRAME de extensión.
Actualización de la extensión
Para cambiar una extensión que ya está publicada, actualícela.
Sugerencia
Se recomienda actualizar la extensión para quitar y volver a cargar. También se
recomienda tener dos extensiones, por ejemplo, publisher.extension y
publisher.extension-dev .
Publisher.extension es público en Marketplace, donde
los clientes pueden instalarlo en sus organizaciones de Azure DevOps.
Publisher.extension-dev se mantiene privado en Marketplace y se puede
compartir con una organización que posee y controla.
No es necesario mantener
dos copias del código fuente de la extensión. Puede mantener dos archivos de
manifiesto: uno para cada extensión y durante el empaquetado de la extensión,
puede proporcionar el archivo de manifiesto respectivo a la herramienta tfx-cli.
Para obtener más información sobre los argumentos necesarios para la
herramienta, consulte Comandos de extensión de TFX .
1. Seleccione una extensión en la lista de elementos mostrados.
2. Haga clic con el publisher.extension-dev botón derecho y seleccione Actualizar
para , por ejemplo.
3. Valide la extensión.
4. Realice las mismas actualizaciones en la versión de producción,
publisher.extension , por ejemplo.
5. Vaya a .vsix para la extensión y cárguelo.
La versión actualizada de la extensión se instala automáticamente en las cuentas que ya
la tienen instalada. Las nuevas cuentas en las que se instala la extensión en el futuro
también reciben la versión más reciente.
Hacer que la extensión sea pública
Para obtener información sobre cómo hacer que la extensión sea visible para todos los
usuarios, consulte Hacer que la descripción sea pública.
Anular la publicación de una extensión
Puede cancelar la publicación de extensiones gratuitas si ya no quiere ofrecerlas en
Marketplace.
En los escenarios siguientes se explica cuándo es posible que quiera quitar la extensión
de Marketplace:
Ha desarrollado otra extensión y ya no quiere ofrecer la actual.
La extensión tiene un problema, por lo que quiere quitar la extensión de
Marketplace hasta que haya resuelto el problema.
Ha publicado su extensión como pública por error.
Se deben cumplir ciertos criterios para que una extensión no se haya publicado o
quitado:
Acción Requisitos
Cancelar publicación Solo se pueden cancelar las extensiones gratuitas .
Quitar La extensión debe tener cero (0) instalaciones que se van a quitar.
Importante: Si debe quitar la extensión debido a problemas legales o de seguridad,
póngase en contacto con el equipo de Marketplace. Revisaremos la solicitud y
eliminaremos manualmente la extensión.
1. Seleccione la extensión en la página del publicador y elija Cancelar publicación
en el menú.
La extensión no se publica inmediatamente desde Marketplace y los nuevos
usuarios no pueden instalarla. Las clasificaciones y opiniones de su extensión
permanecen intactas.
Para ofrecer la extensión de nuevo en Marketplace, elija Publicar en el menú.
También puede optar por quitar la extensión por completo de Marketplace si la
extensión tiene cero (0) instalaciones. Para ello, elija Quitar en el menú. Esta acción no
se puede deshacer.
Empaquetar y publicar una integración
en Marketplace
Artículo • 04/10/2022 • Tiempo de lectura: 12 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
¿Tiene una herramienta, un servicio o un producto que se integre con Azure DevOps o
Team Foundation Server (TFS)?
Si es así, ayude a los usuarios a encontrarlo publicándolo
en Visual Studio Marketplace.
Marketplace es una tienda única para individuos y
equipos para encontrar herramientas que amplían y mejoran la experiencia.
Examine Marketplace para ver ejemplos de otras integraciones y extensiones.
7 Nota
Si busca información de empaquetado y publicación de extensiones, consulte
Extensiones de publicación de &paquetes.
Requisitos de publicación
Se debe cumplir la siguiente lista de requisitos antes de publicar en Marketplace.
Asegúrese de que se conceden los permisos adecuados para usar cualquier
imagen (iconos, logotipos, capturas de pantalla, etc.)
Incluir un archivo exhaustivo overview.md para describir la descripción en
Marketplace
Incluir un icono para la extensión, que tiene al menos 128 x 128 píxeles de tamaño
Al hacer referencia a productos de Microsoft, use nombres completos en lugar de
abreviaturas, por ejemplo, Azure DevOps Services frente a AzDO o , cualquier otra
abreviatura.
Absténgase de usar nombres de marca en el nombre de la extensión
Lo que necesita
1. Logotipo de 128 x 128 píxeles (formato PNG o JPEG) que representa su
integración, usted mismo o su empresa o organización
2. Mínimo de una captura de pantalla que muestra la integración
3. Llamada a la acción/dirección URL de introducción (donde los usuarios deben ir
para empezar a trabajar con la integración)
Pasos
La publicación en Marketplace es un proceso iterativo que comienza con la creación de
un archivo de manifiesto que define las características de integración y detección de
claves (como capturas de pantalla, logotipos y contenido de información general). Esta
información se usa para presentar la integración a los usuarios en Marketplace, por
ejemplo:
Jenkins para Azure DevOps
Nota: El término , extension se usa en las documentación a las que se hace referencia a
continuación. Las extensiones son otro tipo de elemento de Marketplace y comparten
muchas similitudes desde el punto de vista de la detección como integraciones.
¿Necesita ayuda para obtener la integración en Marketplace? Contáctenos . Y, sí,
esta dirección de correo electrónico es supervisada por personas reales.
Creación de un publicador
Todos los elementos de Visual Studio Marketplace, incluidas las extensiones y las
integraciones, pertenecen a un publicador.
Un publicador es propiedad de un usuario, normalmente el usuario que lo creó y
también se puede compartir con otros usuarios.
1. Inicie sesión en el Portal de publicación de Visual Studio Marketplace .
2. Si aún no es miembro de un publicador existente, se le pedirá que cree un
publicador. Si no se le pide que cree un publicador, desplácese hacia abajo hasta la
parte inferior de la página y seleccione Publicar extensiones debajo de Sitios
relacionados.
Especifique un identificador para el publicador, por ejemplo: mycompany-
myteam
Este identificador se usa como valor para el atributo en el publisher
archivo de manifiesto de extensión.
Especifique un nombre para mostrar para el publicador, por ejemplo: My Team
3. Revise el Contrato de publicador de Marketplace y, a continuación, seleccione
Crear.
Una vez creado el publicador, se le dirigirá a administrar los elementos, que no tienen
elementos.
Crear una carpeta para contener el manifiesto del
elemento y otros recursos
Antes de empaquetar la integración como una extensión, deberá crear una home carpeta
para que contenga algunos recursos necesarios, dentro de esta carpeta:
1. Cree una carpeta denominada images para contener:
Logotipo de la integración (128 x 128 píxeles)
Capturas de pantalla (1366 x 768 píxeles)
2. Creación de un archivo denominado overview.md
Describir la integración aquí
Para más información sobre Markdown, consulte GitHub Flavored
Markdown .
3. Creación de un archivo denominado vss-integration.json
Este archivo es el archivo de manifiesto de la descripción de Marketplace,
contiene muchas propiedades para describir la extensión en la descripción de
Marketplace. Puede examinar la referencia del manifiesto de extensión aquí.
Manifiesto de extensión
1. Rellene el vss-integration.json archivo con el siguiente código JSON:
JavaScript
"manifestVersion": 1,
"id": "myservice",
"version": "1.0.0",
"name": "My Service",
"publisher": "mycompany",
"description": "Awesome tools to help you and your team do great
things everyday.",
"targets": [
"id": "Microsoft.VisualStudio.Services.Integration"
],
"icons": {
"default": "images/service-logo.png"
},
"categories": [
"Plan and track"
],
"tags": [
"working",
"people person",
"search"
],
"screenshots": [
"path": "images/screen1.png"
},
"path": "images/screen2.png"
],
"content": {
"details": {
"path": "overview.md"
},
"license": {
"path": "fabrikam-license-terms.md"
},
"links": {
"getstarted": {
"uri": "https://www.mycompany.com/help/getstarted"
},
"learn": {
"uri": "https://www.mycompany.com/features"
},
"support": {
"uri": "https://www.mycompany.com/support"
},
"branding": {
"color": "rgb(34, 34, 34)",
"theme": "dark"
2. Actualice el código JSON mediante la siguiente referencia:
Estas propiedades son necesarias:
Propiedad Descripción Notas
manifestVersion Número Debe ser 1 .
correspondiente a la
versión del formato de
manifiesto.
Id Identificador de la Th ID es una cadena que debe ser única entre las
extensión. extensiones del mismo publicador. Debe comenzar
con un carácter alfabético o numérico y contener "A"
a "Z", "a" a "z", "0" a "9" y "-" (guion). Ejemplo:
sample-extension .
version Cadena que especifica Debe tener el formato major.minor.patch , por
la versión de una ejemplo 0.1.2 o 1.0.0 . También puede agregar un
extensión. cuarto número para el siguiente formato: 0.1.2.3
name Nombre corto y Ejemplo: "Fabrikam Agile Board Extension" .
legible de la extensión.
Limitado a 200
caracteres.
publisher Identificador del Este identificador debe coincidir con el identificador
publicador. en el que se publica la extensión. Consulte Creación y
administración de un publicador.
Propiedad Descripción Notas
categories Matriz de cadenas que Valores válidos: Azure Repos , Azure Boards , Azure
representan las Pipelines , Azure Test Plans y Azure Artifacts .
categorías a las que
pertenece la extensión. Notas:
Debe proporcionarse
al menos una Use la versión >=0.6.3 de tfx-cli si publica la
categoría y no hay extensión mediante programación.
ningún límite en Si usa la extensión Azure DevOps Extension
cuanto a cuántas Tasks para publicar, asegúrese de que su
categorías puede versión es >= 1.2.8. Es posible que tenga que
incluir. aprobar la actualización de la extensión debido
a cambios recientes en el ámbito.
Las categorías mencionadas anteriormente
están presentes de forma nativa en Visual
Studio Marketplace y Azure DevOps Server
2019 & anteriores. Para las extensiones
destinadas a versiones anteriores de TFS:
Si los clientes de TFS adquieren la extensión
a través de Visual Studio Marketplace (no la
galería local) en contexto conectado, use las
categorías que se han indicado
anteriormente.
Si va a compartir la extensión directamente
(es decir, no a través de Visual Studio
Marketplace) con un cliente mediante TFS
<=2018, use las siguientes categorías en su
lugar: Código, Planeamiento y seguimiento,
Compilación y versión, Prueba, Colaboración
e Integración. Si necesita compartir ambos a
través de Visual Studio Marketplace y
directamente con un cliente de TFS <=
2018, tendría que tener 2 paquetes de
extensión.
Objetivos Los productos y Matriz de objetos, donde cada objeto tiene un id
servicios admitidos por campo que indica uno de los siguientes:
la integración o la
extensión. Para Microsoft.VisualStudio.Services (extensiones
obtener más que funcionan con Azure DevOps o TFS),
información, consulte Microsoft.TeamFoundation.Server (extensión
Destinos de que funciona con TFS),
instalación. Microsoft.VisualStudio.Services.Integration
(integraciones que funcionan con Azure
DevOps o TFS),
Microsoft.TeamFoundation.Server.Integration
(integraciones que funcionan con TFS)
Estas propiedades opcionales ayudan a los usuarios a detectar y obtener información
sobre la extensión:
Propiedad Descripción Notas
description Algunas La descripción debe ser el "pitch de ascensor" de la extensión: un
oraciones que par de líneas para describir la extensión en Marketplace y hacer
describen las que los usuarios quieran instalarla. Consulte el ejemplo siguiente.
extensiones.
Limitado a 200
caracteres.
Iconos Diccionario de Claves válidas: default (128 x 128 píxeles) de tipo BMP, GIF, EXIF,
iconos que JPG, PNG y TIFF). Otras claves, como large (512 x 512 píxeles)
representan la pueden admitirse en el futuro. El valor de cada clave es la ruta de
extensión. acceso al archivo de icono de la extensión.
etiquetas Matriz de Ejemplos: agile , project management , task timer , etc.
etiquetas de
cadena para
ayudar a los
usuarios a
encontrar la
extensión.
Imágenes Matriz de Las capturas de pantalla son más valiosas cuando se incluyen en
imágenes que el contenido y deben usarse allí para ayudar a crear una página
no se pudieron de detalles del mercado de calidad para la extensión. Use
incluir en el capturas de pantalla para imágenes menos importantes que no
contenido. aparezcan en el contenido. Cada imagen debe tener 1366 x 768
píxeles. El path de cada elemento es la ruta de acceso al archivo
de la extensión.
content Diccionario de Cada extensión debe incluir contenido sólido. Así es como
archivos de mostrará a los usuarios lo que puede hacer la extensión. Haga
contenido que que sea rico, consumible e incluya capturas de pantalla cuando
describen la sea necesario. Incluya un overview.md archivo como elemento de
extensión a los contenido base. Se supone que cada archivo está en formato
usuarios. Markdown con sabor a GitHub . El path de cada elemento es la
ruta de acceso al archivo Markdown de la extensión. Claves
válidas: details . Es posible que otras claves se admita en el
futuro.
Propiedad Descripción Notas
vínculos Diccionario de Claves válidas: getstarted : primeros pasos, cómo configurar o
vínculos que usar. learn : contenido más profundo para ayudar a los usuarios
ayudan a los a comprender mejor la extensión o el servicio. license - Contrato
usuarios a de licencia de usuario final. privacypolicy - directiva de
obtener más privacidad para una extensión. support - obtener ayuda y soporte
información técnico para una extensión. El valor de cada clave es un objeto
sobre la con un uri campo, que es la dirección URL absoluta del vínculo.
extensión,
obtener
soporte técnico
y mover.
Repositorio Diccionario de Claves válidas: type - Tipo de repositorio. Ejemplo: git. uri -
propiedades Dirección URL absoluta del repositorio.
que describen
el repositorio
de código
fuente de la
extensión
Insignias Matriz de Claves válidas: href - Vincular al usuario navega al seleccionar el
vínculos a distintivo. uri - La dirección URL absoluta de la imagen de
distintivos de distintivo que se va a mostrar. description - Descripción del
metadatos distintivo, que se mostrará al mantener el puntero.
externos, como
TravisCI,
Appveyor, etc.,
desde los sitios
de distintivos
aprobados
Marca Diccionario de Claves válidas: : color color principal de la extensión o del
propiedades publicador; puede ser un hexadecimal (#ff00ff), RGB
relacionadas (rgb(100,200,50)) o nombres de color HTML admitidos (azul).
con la marca. theme - complementa el color; usa oscuro para colores de
personalización de marca oscuros o claro para colores de
personalización de marca más claros.
Details page
1 - descripción
2 - icono
3 - categorías
4- Capturas de pantalla
5 - contenido (detalles)
6 - vínculos
7 - personalización de marca
Asegúrese de que el atributo "público" se establece en "false" (o no está
establecido en absoluto) para evitar que la extensión o la integración se vuelvan
prematuramente visibles para todos los usuarios de Marketplace.
Empaquetar el manifiesto y los recursos
Obtención de la herramienta de paquete (tfx-cli)
Puede instalar o actualizar la CLI multiplataforma para Azure DevOps (tfx-cli) mediante
npm , un componente de Node.js , desde la línea de comandos.
no-highlight
npm i -g tfx-cli
Empaquetar la integración en un archivo .vsix
no-highlight
tfx extension create --manifest-globs vss-extension.json
7 Nota
La versión de una extensión o integración debe incrementarse en cada
actualización.
Si no ha incrementado la extensión o la integración en el manifiesto, debe pasar el
--rev-version modificador de línea de comandos. Esto incrementa el número de
versión de revisión de la extensión y guarda la nueva versión en el manifiesto.
Publicación de la integración en Marketplace
Una vez empaquetada la extensión, puede cargarla en Marketplace en un publicador. El
publisher identificador especificado en el archivo de manifiesto de la extensión debe
coincidir con el identificador del publicador en el que se carga la extensión.
Para cargar una extensión en Marketplace:
1. Vaya al portal de publicación de Visual Studio Marketplace.
2. Busque el botón Cargar nueva extensión , vaya al archivo .vsix empaquetado y
seleccione Cargar.
3. Después de una validación rápida, la extensión aparece en la lista de extensiones:
En este momento, la extensión no es visible para ninguna cuenta y no se puede instalar
hasta que la comparta.
Exámenes de protección
Como usuario de Marketplace, uno espera no obtener software malintencionado
(malware) cuando adquiere una extensión de Visual Studio Marketplace. Para garantizar
esto, ejecutamos un examen de virus en cada paquete de extensión publicado. Esto se
realiza para cada nueva extensión y para cada actualización de extensión. Hasta que el
examen esté claro, no publicamos la extensión en Marketplace para su uso público.
El examen de virus indicado se ejecuta solo en la publicación de la extensión y no
durante la ejecución de la extensión.
También realizamos un examen de contenido para cada extensión en Marketplace. Esto
se realiza para cada nueva extensión y para cada actualización de extensión. A través de
esto, evitamos exponer contenido inapropiado o ofensivo en las páginas de
Marketplace.
Uso compartido de la integración
Para poder instalar una integración en una organización en Azure DevOps o TFS, debe
compartirla con esa organización. El uso compartido es un requisito durante el
desarrollo y las pruebas de una integración, ya que es la única manera de ejecutar una
integración.
Para compartir una integración, realice las siguientes tareas:
1. Selección de una integración en la lista de elementos mostrados
2. Seleccione el botón Compartir.
3. Especifique el nombre de la organización para que esta integración sea visible.
Por ejemplo, para que una integración sea visible para la organización
dev.azure.com/fabrikam-fiber-inc , especifique fabrikam-fiber-inc .
Actualización de un elemento
Para cambiar una extensión que ya está publicada, actualícela.
Sugerencia
Se recomienda actualizar la extensión a través de quitar y volver a cargar. También
se recomienda tener dos extensiones, por ejemplo, publisher.extension y
publisher.extension-dev .
Publisher.extension es público en Marketplace, donde
los clientes pueden instalarlo en sus organizaciones de Azure DevOps.
Publisher.extension-dev se mantiene privado en Marketplace y se puede
compartir con una organización que posee y controla.
No es necesario mantener
dos copias del código fuente de la extensión. Puede mantener dos archivos de
manifiesto: uno para cada extensión y durante el empaquetado de la extensión,
puede proporcionar el archivo de manifiesto correspondiente a la herramienta tfx-
cli. Para obtener más información sobre los argumentos necesarios para la
herramienta, consulte Comandos de extensión de TFX .
1. Seleccione una extensión en la lista de elementos mostrados.
2. Haga clic con el publisher.extension-dev botón derecho y seleccione Actualizar
para , por ejemplo.
3. Valide la extensión.
4. Realice las mismas actualizaciones en la versión de producción,
publisher.extension , por ejemplo.
5. Vaya a .vsix para la extensión y cárguelo.
La versión actualizada de la extensión se instala automáticamente en las cuentas que ya
lo tienen instalado. Las nuevas cuentas en las que se instala la extensión en el futuro
también reciben la versión más reciente.
Hacer que la integración sea pública (visible
para todos los usuarios)
Para obtener información sobre cómo hacer pública la integración, visite Hacer que su
anuncio sea público.
Hacer que la extensión o la integración
sean públicas
Artículo • 18/11/2022 • Tiempo de lectura: 4 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019
¿Desarrollar para Visual Studio o Visual Studio Code? Si es así, no es necesario
solicitar la comprobación. La comprobación solo es necesaria para las integraciones
o extensiones de Azure DevOps.
Visual Studio Marketplace es donde los usuarios pueden obtener extensiones,
herramientas, productos y servicios que extienden Visual Studio, Visual Studio Code o
Azure DevOps.
En esta página se describen los pasos necesarios para que la integración o la extensión
estén disponibles públicamente en Marketplace.
Más información sobre el desarrollo de una extensión para Azure DevOps
Más información sobre el empaquetado y publicación de una extensión en
Marketplace
Más información sobre el empaquetado y la publicación de una integración en
Marketplace
A medida que desarrolle la extensión o el contenido de la página de Marketplace
(para una extensión o integración), la extensión puede y debe permanecer privada.
Para que la extensión esté disponible públicamente, debe establecer la marca
pública en true en el manifiesto.
Cualificaciones
Para tener una lista pública en Marketplace, la integración o la extensión deben cumplir
las siguientes calificaciones:
Funciona con o amplía Azure DevOps.
Usted (o su empresa) posee, desarrolla y tiene licencia para distribuir y anunciar la
integración o la extensión.
La extensión o integración se mantiene activamente.
Microsoft también puede solicitar una demostración y revisar el contenido planeado
para la entrada de Marketplace.
Publicador principal
El programa Top Publisher solo está disponible para publicadores con una o varias
extensiones o integraciones públicas de Azure DevOps. No es aplicable al IDE de
Visual Studio y a los publicadores de extensiones de Visual Studio Code.
El distintivo Top Publisher program reconoce a los publicadores que han
demostrado compromiso con sus clientes y marketplace a través de directivas
ejemplares, calidad, confiabilidad y soporte técnico. Una vez marcado, todas sus ofertas
públicas de Azure DevOps (extensiones e integraciones) muestran el distintivo Top
Publisher. Esto ayuda a los clientes a sentirse más seguros de evaluar y adquirir sus
ofertas.
Requisitos
1. Para cada oferta global de Azure DevOps en el publicador, asegúrese de que tiene
los siguientes elementos:
Directiva de privacidad completa y actualizada
Licencia completa y actualizada, es decir, contrato de licencia de usuario final
Directiva de soporte técnico completa y actualizada. Los clientes deben tener
acceso a su dirección URL de soporte técnico y ver una manera clara de
obtener soporte técnico de usted: presentar una incidencia, enviar un correo
electrónico al equipo de soporte técnico u otras formas de ponerse en
contacto con usted. Debe ofrecer soporte técnico durante aproximadamente
8 horas al día para todos los días laborables de la zona horaria local para
todas las ofertas. Y un tiempo de respuesta bajo documentado para las
ofertas de pago para problemas críticos.
Documentación completa y de alta calidad, que podría hospedarse en su
dominio, estar dentro de la oferta o hospedarse en un repositorio público de
GitHub. Idealmente, los clientes deben obtener información general, inicio
rápido y guías paso a paso.
Respuestas oportunas y satisfactorias a preguntas válidas en la sección Q&A:
responder a todas las preguntas válidas en la sección Q&A oportuna
(aproximadamente en un plazo de una semana) y satisfactoriamente. Las
respuestas a las opiniones también son bienvenidas.
Consulte el manifiesto de extensión sobre cómo agregar directivas a la oferta.
2. Actualización del perfil de publicador
A través del perfil de publicador, tiene una manera de mostrar todas sus ofertas en
un solo lugar junto con la información relacionada con el publicador de claves.
Para proporcionar la información, que aparece en el perfil:
Inicie sesión para https://marketplace.visualstudio.com/manage/publishers
usar la cuenta con la que publica y administra sus ofertas en Marketplace.
Seleccione el publicador y rellene la sección Acerca de usted en la pestaña
Detalles . A continuación se muestra un ejemplo de la sección Acerca de
usted para Microsoft (el publicador):
Guarde los cambios y use la acción "Ver perfil" hacia la parte superior de la
página para ver cómo parece a los consumidores. Puede usar esta página de
perfil para evangelizar las ofertas.
Aplicar para ser un publicador superior
1. Inicie sesión para https://marketplace.visualstudio.com/manage/publishers usar
la cuenta con la que publica y administra sus ofertas en Marketplace.
2. Seleccione el publicador y vaya a su pestaña Publicador superior . Nota: Debe
tener una o varias extensiones globales de Azure DevOps (servidor o servicio) o
integración para que aparezca la pestaña.
3. Si cumple parte de los requisitos enumerados anteriormente y es el propietario del
publicador, verá una opción para solicitar el programa. En la aplicación, se envía un
correo electrónico al equipo de Marketplace para revisar el caso. Responden en
menos de 10 días hábiles con los pasos siguientes, aclarando preguntas o con la
concesión del distintivo.
Es probable que el equipo examine parámetros adicionales, como la aceptación
activa de sus ofertas, los recuentos de instalación/introducción y las revisiones de
clasificaciones & en las ofertas antes de conceder el distintivo.
Microsoft se reserva el derecho de conceder, rechazar o revocar el distintivo de Top
Publisher en cualquier momento.
Una vez que un publicador es un publicador principal, todas sus futuras actualizaciones
y ofertas deben cumplir los requisitos enumerados anteriormente.
Publicación desde la línea de comandos
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Puede usar la CLI multiplataforma para Azure DevOps (tfx-cli) para publicar la extensión
en Visual Studio Marketplace.
Para obtener más información, consulte la información general de publicación,
instalación y uso compartido.
Requisitos previos
Obtenga la CLI de TFX desde el Administrador de paquetes de Node y genere un token
de acceso personal (PAT). Además, si aún no lo ha hecho, configure un publicador en la
Galería.
Adquisición de la CLI multiplataforma para Azure DevOps
1. Si no lo tiene, descargue e instale NodeJS . Durante la configuración, asegúrese
de dejar La opción Agregar a PATH elegida.
2. Abra un símbolo del sistema y escriba npm i -g tfx-cli .
Si ya tiene instalada la CLI de TFX, puede actualizar a la versión más reciente ejecutando
npm up -g tfx-cli .
Crear un token de acceso personal
1. Inicie sesión en su organización ( https:dev.azure.com/{organization} ).
2. En la página principal, abra el icono de configuración de usuario y seleccione
Perfil.
3. En Seguridad, seleccione Tokens de acceso personal y, a continuación, seleccione
Nuevo token.
4. Complete el formulario:
Asigne un nombre al token
Seleccione Todas las organizaciones accesibles, que es el único valor que
funciona al publicar a través de la CLI. Si selecciona solo una organización, se
producirá un error, incluso si el PAT es válido.
Seleccione un período de tiempo de expiración para el token. Esto es
necesario porque las API de publicación de Visual Studio Marketplace
funcionan fuera del contexto de una organización.
Establezca el ámbito de acceso asociado a este token. Asegúrese de
seleccionar el ámbito de Marketplace (publicar). Este ámbito limita el token a
solo poder publicar extensiones en Marketplace.
Seleccione Crear
5. Copie el token de acceso personal generado. Asegúrese de mantenerlo en secreto.
Publicación desde la línea de comandos
Una vez instalada la CLI de TFX y que tenga su PAT, puede usar la herramienta para
empaquetar y publicar la extensión.
1. Abra un símbolo del sistema en el directorio raíz de la extensión.
2. Ejecute el siguiente comando para publicar la extensión. Cuando se le solicite,
escriba el token de acceso personal para autenticarse.
Command
tfx extension publish --publisher <YOUR_PUBLISHER_ID> --manifest-js
<YOUR_EXTENSION_MANIFEST> --share-with <ACCOUNT_NAME>
Es posible que reciba el siguiente error si la extensión ya se ha publicado:
Failed Request: Internal Server Error(500) - Version number must increase
each time an extension is published. Extension: fabrikam.my-extension
Current version: 0.1.9 Updated version: 0.1.9
Puede agregar la --rev-version marca para incrementar automáticamente la versión de
revisión de la extensión. Esto también guarda la nueva versión en el manifiesto.
7 Nota
Todas las opciones disponibles para create están disponibles para el publish
comando .
Ejemplo
C:\vso-team-calendar>tfx extension publish --publisher publishFabrikam --
manifest-js fabrikam.config.js --share-with fabrikam --rev-version
Copyright Microsoft Corporation
> Personal access token:
Checking if this extension is already published
It is, update the extension
Waiting for server to validate extension package...
Sharing extension with fabrikam.
=== Completed operation: publish extension ===
- Packaging: C:\vso-team-calendar\fabrikam.team-calendar-0.2.6.vsix
- Publishing: success
- Sharing: shared with fabrikam
Respuesta a las revisiones de extensión
de Marketplace
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Puede responder a las revisiones que los clientes dejan para las extensiones en Visual
Studio Marketplace. Busque y seleccione Responder junto a una revisión si tiene uno de
los permisos siguientes.
owner
Creador
Colaborador
La respuesta se muestra en la revisión.
Solo puede dejar una respuesta. Evite usar revisiones como foro de soporte técnico. Si
necesita más detalles, proporcione un alias de soporte técnico para que el revisor se
comunique. Después, puede resolver sus problemas externamente y, a continuación,
actualizar la respuesta con una resolución.
Directrices para la respuesta del publicador a
las revisiones
Mantenga Visual Studio Marketplace en un lugar abierto, acogedor, respetuoso y útil
para que los clientes encuentren, prueben, instalen y revisen extensiones. La
comunicación desempeña un papel importante en mantener una comunidad sana. Para
ayudar a crear este entorno, estas son las directrices para los publicadores que
responden a las revisiones de los clientes. Piense profundamente en las interacciones
del cliente y refleje el espíritu de la experiencia del cliente que Marketplace está
intentando crear.
Las revisiones están reservadas para los comentarios de los clientes. Use Responder
solo para responder a una revisión.
Las revisiones son para compartir opiniones de los clientes, por lo que todas las
opiniones son válidas. Los clientes tienen derecho a sus opiniones, por lo que
tratan los comentarios respetuosamente como comentarios sin debate, críticas o
argumentos.
Asegúrese de que las respuestas agreguen valor y sean relevantes para los
comentarios de los clientes.
Céntrese en abordar con precisión preguntas o problemas. Si necesita más
detalles, pida al cliente que se comunique con usted por correo electrónico, en
lugar de discutir en las revisiones. Al resolver el problema, actualice la respuesta
con la resolución. Puede editar la respuesta, al igual que los clientes pueden editar
sus revisiones.
Si encuentra comentarios inadecuados, como spam, contenido abusivo o ofensivo,
para cualquier extensión, marcarlo para nuestra revisión.
Solicitud del publicador para anular una
revisión
Como publicador, puede recurrir para anular una revisión si el problema notificado se
debe a Marketplace o a la plataforma subyacente. Si el problema es válido, los
administradores de Marketplace anulan la clasificación. Puede llamar desde
clasificaciones y revisar la sección en la página del centro de extensión.
Referencia del manifiesto de extensión
Artículo • 07/01/2023 • Tiempo de lectura: 30 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Cada extensión tiene un archivo de manifiesto JSON que define información básica
sobre la extensión. El archivo también define cómo puede ampliar y mejorar la
experiencia. En este artículo se muestra cómo crear un manifiesto para la extensión en
Azure DevOps.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Cree un archivo denominado vss-extension.json en la raíz de la carpeta de extensión.
Este archivo contiene atributos necesarios, como el identificador de la extensión y sus
destinos de instalación, donde se puede ejecutar. También define las contribuciones que
realiza la extensión.
Vea el ejemplo siguiente de un manifiesto típico:
JSON
"manifestVersion": 1,
"id": "tools",
"version": "0.1.0",
"name": "Fabrikam Tools",
"publisher": "fabrikam",
"description": "Awesome tools to help you and your team do great things
everyday.",
"targets": [
"id": "Microsoft.VisualStudio.Services"
],
"icons": {
"default": "images/fabrikam-logo.png"
},
"scopes": [
"vso.work",
"vso.code_write",
"vso.build_execute"
],
"categories": [
"Azure Boards"
],
"branding": {
"color": "rgb(34, 34, 34)",
"theme": "dark"
},
"content": {
"details": {
"path": "readme.md"
},
"license": {
"path": "eula.md"
},
"links": {
"getstarted": {
"uri": "https://www.fabrikam-fiber-inc.com/help/getstarted"
},
"support": {
"uri": "https://www.fabrikam-fiber-inc.com/support"
},
"repository": {
"type": "git",
"uri": "https://github.com/fabrikam-fiber-inc/myextension"
},
"contributions": [
"id": "showCommits",
"type": "ms.vss-web.action",
"description": "Adds a menu action from builds grid to show
associated items.",
"targets": [
"ms.vss-build-web.completed-build-menu"
],
"properties": {
"title": "View associated items",
"uri": "launch.html"
],
"files": [
"path": "launch.html",
"addressable": true
},
"path": "node_modules/vss-web-extension-sdk/lib",
"addressable": true,
"packagePath": "lib"
Atributos necesarios
Estas propiedades son necesarias:
Propiedad Descripción Notas
manifestVersion Número Debe ser 1 .
correspondiente a la
versión del formato
de manifiesto.
ID Identificador de la Th ID es una cadena que debe ser única entre las
extensión. extensiones del mismo publicador. Debe comenzar
con un carácter alfabético o numérico y contener "A" a
través de "Z", "a" a "z", "0" a "9" y "-" (guion). Ejemplo:
sample-extension .
version Cadena que Debe tener el formato major.minor.patch , por
especifica la versión ejemplo 0.1.2 o 1.0.0 . También puede agregar un
de una extensión. cuarto número para el siguiente formato: 0.1.2.3
name Nombre corto y Ejemplo: "Fabrikam Agile Board Extension" .
legible de la
extensión. Limitado a
200 caracteres.
publisher Identificador del Este identificador debe coincidir con el identificador
publicador. en el que se publica la extensión. Consulte Creación y
administración de un publicador.
Propiedad Descripción Notas
Categorías Matriz de cadenas Valores válidos: Azure Repos , Azure Boards , Azure
que representan las Pipelines , Azure Test Plans y Azure Artifacts .
categorías a las que
pertenece la Notas:
extensión. Debe
proporcionarse al Use la versión >=0.6.3 de tfx-cli si va a publicar
menos una categoría la extensión mediante programación.
y no hay ningún Si usa la extensión Azure DevOps Extension
límite para cuántas Tasks para publicar, asegúrese de que su
categorías puede versión es >= 1.2.8. Es posible que tenga que
incluir. aprobar la actualización de la extensión debido
a cambios recientes en el ámbito.
Las categorías mencionadas anteriormente
están presentes de forma nativa en Visual Studio
Marketplace y Azure DevOps Server 2019 &
anteriores. Para las extensiones destinadas a
versiones anteriores de TFS:
Si los clientes de TFS adquieren la extensión
a través de Visual Studio Marketplace (no la
galería local) en contexto conectado, use las
categorías indicadas anteriormente.
Si va a compartir la extensión directamente
(es decir, no a través de Visual Studio
Marketplace) con un cliente mediante TFS
<=2018, use las siguientes categorías en su
lugar: Código, Planeamiento y seguimiento,
Compilación y versión, Prueba, Colaboración
e Integración. Si necesita compartir ambos a
través de Visual Studio Marketplace y
directamente con un cliente de TFS <= 2018,
tendría que tener 2 paquetes de extensión.
destinos Los productos y Matriz de objetos, donde cada objeto tiene un id
servicios admitidos campo que indica uno de los siguientes elementos:
por su integración o
extensión. Para más Microsoft.VisualStudio.Services (extensiones
información, consulte que funcionan con Azure DevOps o TFS),
Destinos de Microsoft.TeamFoundation.Server (extensión
instalación. que funciona con TFS),
Microsoft.VisualStudio.Services.Integration
(integraciones que funcionan con Azure DevOps
o TFS),
Microsoft.TeamFoundation.Server.Integration
(integraciones que funcionan con TFS)
Ejemplos de atributos necesarios
JSON
"manifestVersion": 1,
"id": "tools",
"version": "0.1.0",
"name": "Fabrikam Tools",
"publisher": "fabrikam",
"targets": [
"id": "Microsoft.VisualStudio.Services"
Atributos opcionales
Atributos en tiempo de ejecución
Propiedad Descripción Notas
Ámbitos Matriz de ámbitos Por ejemplo, vso.work e vs.code_write indica que la
de autorización extensión necesita acceso de solo lectura a los
(cadenas) que elementos de trabajo y acceso de lectura y escritura al
enumera los código fuente (y recurso relacionado). Los ámbitos se
permisos presentan al usuario al instalar la extensión. Para
necesarios para la obtener más información, consulte la lista completa de
extensión. ámbitos.
Demandas Matriz de Por ejemplo, api-version/3.0 indica que la extensión
demandas usa las API de la versión 3.0, por lo que no se puede
(cadenas) que ejecutar en productos anteriores que no admiten esta
enumera las versión. Para obtener más información, consulte la lista
funcionalidades completa de demandas.
necesarias para la
extensión.
Baseuri (Opcional) Por ejemplo: https://myapp.com/{{account.name}}/ .
dirección URL base Esta propiedad debe dejarse vacía si el contenido de la
para todas las extensión se empaqueta con la extensión.
direcciones URL
relativas
especificadas por
las contribuciones
de la extensión.
Propiedad Descripción Notas
Contribuciones Matriz de
contribuciones al
sistema.
contributionTypes Matriz de tipos de
contribución
definidos por la
extensión
JSON
"scopes": [
"vso.work",
"vso.code_write",
"vso.build_execute"
],
"demands": [
"api-version/3.0"
],
"contributions": [
"id": "showCommits",
"type": "ms.vss-web.action",
"description": "Adds a menu action from builds grid to show
associated items.",
"targets": [
"ms.vss-build-web.completed-build-menu"
],
"properties": {
"title": "View associated items",
"uri": "launch.html"
Atributos de detección
Estas propiedades opcionales ayudan a los usuarios a detectar y obtener información
sobre la extensión:
Propiedad Descripción Notas
Propiedad Descripción Notas
description Algunas La descripción debe ser la "inclinación del ascensor" de la
oraciones que extensión: un par de líneas para describir la extensión en
describen las Marketplace y hacer que los usuarios quieran instalarla. Consulte
extensiones. el ejemplo siguiente.
Limitado a 200
caracteres.
Iconos Diccionario de Claves válidas: default (128 x 128 píxeles) de tipo BMP, GIF, EXIF,
iconos que JPG, PNG y TIFF). Otras claves, como large (512 x 512 píxeles) se
representan la pueden admitir en el futuro. El valor de cada clave es la ruta de
extensión. acceso al archivo de icono de la extensión.
etiquetas Matriz de Ejemplos: agile , project management , task timer , etc.
etiquetas de
cadena para
ayudar a los
usuarios a
encontrar la
extensión.
Imágenes Matriz de Las capturas de pantalla son más valiosas cuando se incluyen en
imágenes que el contenido y se deben usar allí para ayudar a crear una página
no se pudieron de detalles de mercado de calidad para la extensión. Use capturas
incluir en el de pantalla para imágenes menos importantes que no se incluyen
contenido. en el contenido. Cada imagen debe tener 1366 x 768 píxeles. De
path cada elemento es la ruta de acceso al archivo de la
extensión.
content Diccionario de Cada extensión debe incluir contenido sólido. Así es como
archivos de mostrará a los usuarios lo que puede hacer la extensión. Haga que
contenido que sea rico, consumible e incluya capturas de pantalla cuando sea
describen la necesario. Incluya un overview.md archivo como elemento de
extensión a los contenido base. Se supone que cada archivo está en formato De
usuarios. Markdown con sabor a GitHub . El path de cada elemento es la
ruta de acceso al archivo Markdown de la extensión. Claves
válidas: details . Es posible que se admita otras claves en el
futuro.
Propiedad Descripción Notas
vínculos Diccionario de Claves válidas: getstarted : primeros pasos, cómo configurar o
vínculos que usar. learn : contenido más profundo para ayudar a los usuarios a
ayudan a los comprender mejor la extensión o el servicio. license - Contrato
usuarios a de licencia de usuario final. privacypolicy - directiva de
obtener más privacidad para una extensión. support - obtener ayuda y soporte
información técnico para una extensión. El valor de cada clave es un objeto
sobre la con un uri campo, que es la dirección URL absoluta del vínculo.
extensión,
obtener
soporte técnico
y mover.
Repositorio Diccionario de Claves válidas: type tipo de repositorio. Ejemplo: git. uri -
propiedades Dirección URL absoluta del repositorio.
que describen
el repositorio
de código
fuente de la
extensión
Insignias Matriz de Claves válidas: - href Vincular al usuario navega a al seleccionar el
vínculos a distintivo. uri - Dirección URL absoluta de la imagen de distintivo
distintivos de que se va a mostrar. description - Descripción del distintivo, que
metadatos se mostrará al mantener el puntero.
externos, como
TravisCI,
Appveyor, etc.,
desde los sitios
de distintivos
aprobados
Marca Diccionario de Claves válidas: - color color principal de la extensión o
propiedades publicador; puede ser un hexadecimal (#ff00ff), RGB
relacionadas (rgb(100,200,50)) o nombres de color HTML admitidos (azul).
con la marca. theme - complementa el color; use oscuro para colores de
personalización de marca oscuros o claro para colores de
personalización de marca más claros.
Marcar una extensión pública
De forma predeterminada, todas las extensiones de Marketplace de Azure DevOps
son privadas. Solo son visibles para el publicador y las cuentas compartidas por el
publicador. Si se ha comprobado el publicador, puede hacer que la extensión sea
pública estableciendo la marca en el Public manifiesto de extensión:
JSON
"galleryFlags": [
"Public"
O:
JSON
"public": true
Para obtener más información, vea Package/Publish/Install.
Marcar una extensión para que esté en versión preliminar
Si la extensión está lista para que los usuarios de Marketplace prueben, pero todavía
está trabajando con algunos errores o agregando función, puede marcarla como
preview :
JSON
"galleryFlags": [
"Preview"
Marcar una extensión como versión preliminar de pago
Si tiene previsto vender la extensión en Marketplace, ólela como versión preliminar de
pago. Una extensión marcada como gratuita no se puede cambiar a pago.
JSON
"galleryFlags": [
"Paid",
"Preview"
Marcar una extensión como de pago
Si desea vender la extensión en Marketplace, puede marcarla con la marca y
__BYOLENFORCED la Paid etiqueta (comienza con dos caracteres de subrayado):
JSON
"galleryFlags": [
"Paid"
],
"tags": [
"__BYOLENFORCED"
Tanto la marca como __BYOLENFORCED la Paid etiqueta deben estar presentes para
marcar una extensión como pagada en Marketplace. Bring-Your-Own-License (BYOL)
significa que el publicador de la extensión proporciona el mecanismo de facturación y
licencia para la extensión, ya que microsoft no proporciona para las extensiones de
Azure DevOps. Todas las extensiones de pago son necesarias para definir la directiva de
privacidad, la directiva de soporte técnico y un contrato de licencia de usuario final.
Además, los publicadores deben proporcionar contenido para la pestaña de precios en
Marketplace de la siguiente manera:
JSON
"content": {
"details": {
"path": "overview.md"
},
"pricing": {
"path": "pricing.md"
También debe agregar una nueva sección en el manifiesto de extensión para invalidar
las licencias de pago. En el futuro, quitaremos la comprobación de licencias de pago y
ya no necesitaremos la invalidación. Por ahora, asegúrese de que la extensión se
muestra según lo previsto. Cada invalidación consta de un "identificador" y un
"comportamiento". El "ID" debe coincidir con el identificador de las contribuciones
definidas en el manifiesto.
JSON
"licensing": {
"overrides": [
{ "id": "my-hub", "behavior": " AlwaysInclude" }
Si la extensión BYOL de pago ofrece un período de prueba (se recomienda para ello),
puede especificar la duración de la versión de prueba en días:
JSON
"galleryproperties": {
"trialDays": "30"
7 Nota
Si desea dirigirse a TFS, pero no desea exponer una opción Descargar para la
extensión, agregue la __DoNotDownload etiqueta (comienza con dos caracteres de
subrayado) al manifiesto de extensión.
Si va a trasladar una extensión de las
licencias de facturación & ofrecidas anteriormente de Microsoft al modelo BYOL,
póngase en contacto con nosotros y le proporcionaremos los pasos adecuados.
Ejemplo de más propiedades
JSON
"description": "Awesome tools to help you and your team do great things
everyday.",
"icons": {
"default": "images/fabrikam-logo.png"
},
"categories": [
"Plan and track"
],
"tags": [
"working",
"people person",
"search"
],
"content": {
"details": {
"path": "overview.md"
},
"license": {
"path": "license-terms.md"
},
"links": {
"home": {
"uri": "https://www.fabrikam-fiber-inc.com"
},
"getstarted": {
"uri": "https://www.fabrikam-fiber-inc.com/help/getstarted"
},
"learn": {
"uri": "https://www.fabrikam-fiber-inc.com/features"
},
"support": {
"uri": "https://www.fabrikam-fiber-inc.com/support"
},
"repository": {
"uri": "https://github.com/fabrikam-fiber-inc/tools"
},
"issues": {
"uri": "https://github.com/fabrikam-fiber-inc/tools/issues"
},
"repository": {
"type": "git",
"uri": "https://github.com/fabrikam-fiber-inc/tools"
},
"badges": [
"href": "https://travis.ci/fabrikam-fiber-inc/myextension",
"uri": "https://travis.ci/fabrikam-fiber-inc/myextension.svg?
branch=master",
"description": "TravisCI build for the project"
},
"href": "https://ci.appveyor.com/projects/fabrikam-fiber-
inc/myextension",
"uri":
"https://ci.appveyor.com/api/projects/status/vlg2sgs2y7tsdxpj4c?svg=true",
"description": "AppVeyor build for the project"
],
"branding": {
"color": "rgb(34, 34, 34)",
"theme": "dark"
},
"screenshots": [
"path": "screenshots/screen1.png"
},
"path": "screenshots/screen2.png"
Ejemplo de página de detalles
1 : descripción
2 - Icono
3 - categorías
4: capturas de pantalla
5 - contenido (detalles)
6 - vínculos
7 - personalización de marca
Q A de & Marketplace: propiedad CustomerQnASupport
Todas las extensiones de Visual Studio Marketplace tienen una sección de Q&A para
permitir conversaciones públicas de uno a uno entre usuarios de extensión y
publicadores. Los publicadores pueden elegir entre Q&A de Marketplace, problemas de
GitHub o una dirección URL de Q&A personalizada. Puede deshabilitar Q&A en
Marketplace mediante la propiedad CustomerQnASupport en el manifiesto.
Experiencia predeterminada (no se requieren cambios en el manifiesto)
En el caso de las extensiones con un repositorio de GitHub, Marketplace redirige a
los usuarios de la sección Q&A a los problemas de GitHub asociados.
En el caso de las extensiones sin un repositorio de GitHub, marketplace Q&A está
habilitado.
Para una experiencia diferente a una de las opciones predeterminadas, use la propiedad
CustomerQnASupport en el manifiesto.
JSON
"CustomerQnASupport": {
"enablemarketplaceqna": true,
"url": "http://uservoice.visualstudio.com"
Propiedades
Propiedades de la sección Soporte técnico de Q & A del cliente:
enablemarketplaceqna : campo booleano, establecido en true para Marketplace o
Q&A personalizado; false para deshabilitar Q&A
url : cadena, dirección URL para Q&A personalizado
Ejemplos que muestran el uso de la compatibilidad con Q
&A
Ejemplo: Extensión con Q & A personalizado
JSON
"CustomerQnASupport": {
"enablemarketplaceqna":"true",
"url": "http://uservoice.visualstudio.com"
Ejemplo: Extensión con repositorio de GitHub, pero uso de Q & A
de Marketplace en lugar de problemas de GitHub
JSON
{
"CustomerQnASupport": {
"enablemarketplaceqna":"true"
Ejemplo: sección Deshabilitación de Q & A de extensión
JSON
"CustomerQnASupport": {
"enablemarketplaceqna":"false"
Ámbitos
La extensión puede especificar uno o varios ámbitos. Los ámbitos controlan a qué
recursos puede acceder la extensión y las operaciones que la extensión puede hacer con
esos recursos. Los ámbitos que especifique en el manifiesto de extensión son los
ámbitos establecidos en los tokens de acceso emitidos a la extensión. Para más
información, consulte Autenticación y seguridad.
Si no se especifica ningún ámbito, las extensiones solo se proporcionan acceso a los
datos de perfil y extensión de usuario.
Ámbitos admitidos
Category Ámbito Nombre Descripción
Grupos de vso.agentpools Grupos de agentes Concede la
agentes (lectura) capacidad de
ver tareas,
grupos, colas,
agentes y
trabajos
actualmente en
ejecución o
completados
recientemente
para los
agentes.
Category Ámbito Nombre Descripción
vso.agentpools_manage Grupos de agentes Concede la
(leer, administrar) capacidad de
administrar
grupos, colas y
agentes.
vso.environment_manage Entorno (lectura, Concede la
administración) capacidad de
administrar
grupos, colas,
agentes y
entornos.
Analytics vso.analytics Analytics (lectura) Concede la
capacidad de
consultar datos
de análisis.
Registro de vso.auditlog Registro de Concede la
auditoría auditoría (lectura) capacidad de
leer el registro
de auditoría a
los usuarios.
Compilar vso.build Compilación Concede la
(lectura) capacidad de
acceder a los
artefactos de
compilación,
incluidos los
resultados de
compilación, las
definiciones y
las solicitudes, y
la capacidad de
recibir
notificaciones
sobre eventos
de compilación
a través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.build_execute Compilación Concede la
(lectura y ejecución) capacidad de
acceder a los
artefactos de
compilación,
incluidos los
resultados de
compilación, las
definiciones y
las solicitudes, y
la capacidad de
poner en cola
una
compilación,
actualizar las
propiedades de
compilación y la
capacidad de
recibir
notificaciones
sobre eventos
de compilación
a través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
Código vso.code Código (leer) Concede la
capacidad de
leer el código
fuente y los
metadatos
sobre
confirmaciones,
conjuntos de
cambios, ramas
y otros
artefactos de
control de
versiones.
También
concede la
capacidad de
buscar código y
recibir
notificaciones
sobre los
eventos de
control de
versiones a
través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.code_write Código (lectura y Concede la
escritura) capacidad de
leer, actualizar y
eliminar código
fuente, acceder
a los metadatos
sobre
confirmaciones,
conjuntos de
cambios, ramas
y otros
artefactos de
control de
versiones.
También
concede la
capacidad de
crear y
administrar
solicitudes de
incorporación
de cambios y
revisiones de
código y recibir
notificaciones
sobre eventos
de control de
versiones a
través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.code_manage Código (lectura, Concede la
escritura y capacidad de
administración) leer, actualizar y
eliminar código
fuente, acceder
a los metadatos
sobre
confirmaciones,
conjuntos de
cambios, ramas
y otros
artefactos de
control de
versiones.
También
concede la
capacidad de
crear y
administrar
repositorios de
código, crear y
administrar
solicitudes de
incorporación
de cambios y
revisiones de
código, y recibir
notificaciones
sobre eventos
de control de
versiones a
través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.code_full Código (completo) Concede acceso
completo al
código fuente,
metadatos
sobre
confirmaciones,
conjuntos de
cambios, ramas
y otros
artefactos de
control de
versiones.
También
concede la
capacidad de
crear y
administrar
repositorios de
código, crear y
administrar
solicitudes de
incorporación
de cambios y
revisiones de
código, y recibir
notificaciones
sobre eventos
de control de
versiones a
través de
enlaces de
servicio.
También incluye
compatibilidad
limitada con las
API de OM de
cliente.
vso.code_status Código (estado) Concede la
capacidad de
leer y escribir el
estado de la
solicitud de
incorporación
de cambios y
confirmación.
Category Ámbito Nombre Descripción
Derechos vso.entitlements Derechos (lectura) Proporciona
acceso de solo
lectura al punto
de conexión de
derechos de
licencia para
obtener
derechos de
cuenta.
vso.memberentitlementmanagement Administración de Concede la
MemberEntitlement capacidad de
(lectura) leer a los
usuarios, sus
licencias, así
como proyectos
y extensiones a
los que pueden
acceder.
vso.memberentitlementmanagement_write Administración de Concede la
MemberEntitlement capacidad de
(escritura) administrar
usuarios, sus
licencias, así
como proyectos
y extensiones a
los que pueden
acceder.
Extensiones vso.extension Extensiones Concede la
(lectura) capacidad de
leer extensiones
instaladas.
vso.extension_manage Extensiones (leer y Concede la
administrar) capacidad de
instalar,
desinstalar y
realizar otras
acciones
administrativas
en las
extensiones
instaladas.
Category Ámbito Nombre Descripción
vso.extension.data Datos de extensión Concede la
(lectura) capacidad de
leer datos
(configuración y
documentos)
almacenados
por extensiones
instaladas.
vso.extension.data_write Datos de extensión Concede la
(lectura y escritura) capacidad de
leer y escribir
datos
(configuración y
documentos)
almacenados
por extensiones
instaladas.
Identidad del vso.graph Gráfico (lectura) Concede la
grafo & capacidad de
leer
información de
usuario, grupo,
ámbito y
pertenencia a
grupos.
vso.graph_manage Gráfico Concede la
(administrar) capacidad de
leer
información de
usuario, grupo,
ámbito y
pertenencia a
grupos, y para
agregar
usuarios,
grupos y
administrar
pertenencias a
grupos.
vso.identity Identidad (leer) Concede la
capacidad de
leer identidades
y grupos.
Category Ámbito Nombre Descripción
vso.identity_manage Identidad Concede la
(administrar) capacidad de
leer, escribir y
administrar
identidades y
grupos.
Prueba de vso.loadtest Prueba de carga Concede la
carga (lectura) capacidad de
leer las
ejecuciones de
pruebas de
carga, los
resultados de
las pruebas y
los artefactos
de APM.
vso.loadtest_write Prueba de carga Concede la
(lectura y escritura) capacidad de
crear y
actualizar
ejecuciones de
pruebas de
carga y leer
metadatos,
incluidos los
resultados de
las pruebas y
los artefactos
de APM.
Grupo de vso.machinegroup_manage Grupo de Proporciona la
equipos implementación capacidad de
(leer, administrar) administrar
grupos de
implementación
y grupos de
agentes.
Marketplace vso.gallery Marketplace Concede acceso
de lectura a
elementos y
publicadores
públicos y
privados.
Category Ámbito Nombre Descripción
vso.gallery_acquire Marketplace Concede acceso
(adquisición) de lectura y la
capacidad de
adquirir
elementos.
vso.gallery_publish Marketplace Concede acceso
(publicación) de lectura y la
capacidad de
cargar,
actualizar y
compartir
elementos.
vso.gallery_manage Marketplace Concede acceso
(administrar) de lectura y la
capacidad de
publicar y
administrar
elementos y
publicadores.
Notificaciones vso.notification Notificaciones Proporciona
(lectura) acceso de
lectura a
suscripciones y
metadatos de
eventos,
incluidos los
valores de
campo
filtrables.
vso.notification_write Notificaciones Proporciona
(escritura) acceso de
lectura y
escritura a las
suscripciones y
acceso de
lectura a los
metadatos de
eventos,
incluidos los
valores de
campo
filtrables.
Category Ámbito Nombre Descripción
vso.notification_manage Notificaciones Proporciona
(administrar) acceso de
lectura,
escritura y
administración
a las
suscripciones y
acceso de
lectura a los
metadatos de
eventos,
incluidos los
valores de
campo
filtrables.
vso.notification_diagnostics Notificaciones Proporciona
(diagnósticos) acceso a los
registros de
diagnóstico
relacionados
con
notificaciones y
proporciona la
capacidad de
habilitar
diagnósticos
para
suscripciones
individuales.
Packaging vso.packaging Empaquetado Concede la
(lectura) capacidad de
leer fuentes y
paquetes.
vso.packaging_write Empaquetado Concede la
(lectura y escritura) capacidad de
crear y leer
fuentes y
paquetes.
vso.packaging_manage Empaquetado Concede la
(lectura, escritura y capacidad de
administración) crear, leer,
actualizar y
eliminar fuentes
y paquetes.
Category Ámbito Nombre Descripción
Proyecto y vso.project Proyecto y equipo Concede la
equipo (leer) capacidad de
leer proyectos y
equipos.
vso.project_write Proyecto y equipo Concede la
(lectura y escritura) capacidad de
leer y actualizar
proyectos y
equipos.
vso.project_manage Proyecto y equipo Concede la
(leer, escribir y capacidad de
administrar) crear, leer,
actualizar y
eliminar
proyectos y
equipos.
Versión vso.release Versión (lectura) Concede la
capacidad de
leer artefactos
de versión,
incluidas las
versiones, las
definiciones de
versión y el
entorno de
versión.
vso.release_execute Versión (lectura, Concede la
escritura y capacidad de
ejecución) leer y actualizar
artefactos de
versión,
incluidas las
versiones, las
definiciones de
versión y el
entorno de
versión, y la
capacidad de
poner en cola
una nueva
versión.
Category Ámbito Nombre Descripción
vso.release_manage Versión (lectura, Concede la
escritura, ejecución capacidad de
y administración) leer, actualizar y
eliminar
artefactos de
versión,
incluidas las
versiones, las
definiciones de
versión y el
entorno de
versión, y la
capacidad de
poner en cola y
aprobar una
nueva versión.
Seguridad vso.security_manage Seguridad Concede la
(administrar) capacidad de
leer, escribir y
administrar
permisos de
seguridad.
Conexiones de vso.serviceendpoint Puntos de conexión Concede la
servicio de servicio (lectura) capacidad de
leer puntos de
conexión de
servicio.
vso.serviceendpoint_query Puntos de conexión Concede la
de servicio (lectura capacidad de
y consulta) leer y consultar
los puntos de
conexión del
servicio.
vso.serviceendpoint_manage Puntos de conexión Concede la
de servicio (leer, capacidad de
consultar y leer, consultar y
administrar) administrar
puntos de
conexión de
servicio.
Category Ámbito Nombre Descripción
Configuración vso.settings Configuración Concede la
(lectura) capacidad de
leer la
configuración.
vso.settings_write Configuración Concede la
(lectura y escritura) capacidad de
crear y leer la
configuración.
Symbols vso.symbols Símbolos (lectura) Concede la
capacidad de
leer símbolos.
vso.symbols_write Símbolos (lectura y Concede la
escritura) capacidad de
leer y escribir
símbolos.
vso.symbols_manage Símbolos (lectura, Concede la
escritura y capacidad de
administración) leer, escribir y
administrar
símbolos.
Grupos de vso.taskgroups_read Grupos de tareas Concede la
tareas (lectura) capacidad de
leer grupos de
tareas.
vso.taskgroups_write Grupos de tareas Concede la
(leer, crear) capacidad de
leer y crear
grupos de
tareas.
vso.taskgroups_manage Grupos de tareas Concede la
(leer, crear y capacidad de
administrar) leer, crear y
administrar
grupos de
tareas.
Category Ámbito Nombre Descripción
Panel de vso.dashboards Paneles de equipo Concede la
equipo (lectura) capacidad de
leer la
información del
panel del
equipo.
vso.dashboards_manage Paneles de equipo Concede la
(administrar) capacidad de
administrar la
información del
panel del
equipo.
Administración vso.test Administración de Concede la
de pruebas pruebas (lectura) capacidad de
leer planes de
prueba, casos,
resultados y
otros artefactos
relacionados
con la
administración
de pruebas.
vso.test_write Administración de Concede la
pruebas (lectura y capacidad de
escritura) leer, crear y
actualizar
planes de
prueba, casos,
resultados y
otros artefactos
relacionados
con la
administración
de pruebas.
Tokens vso.tokens Tokens de Concede la
autorización capacidad de
delegados administrar
tokens de
autorización
delegados a los
usuarios.
Category Ámbito Nombre Descripción
vso.tokenadministration Administración de Concede la
tokens capacidad de
administrar (ver
y revocar)
tokens
existentes a los
administradores
de la
organización.
Perfil de vso.profile Perfil de usuario Concede la
usuario (leer) capacidad de
leer el perfil, las
cuentas, las
colecciones, los
proyectos, los
equipos y otros
artefactos de la
organización de
nivel superior.
vso.profile_write Perfil de usuario Concede la
(escritura) capacidad de
escribir en su
perfil.
Grupos de vso.variablegroups_read Grupos de variables Concede la
variables (lectura) capacidad de
leer grupos de
variables.
vso.variablegroups_write Grupos de variables Concede la
(lectura, creación) capacidad de
leer y crear
grupos de
variables.
vso.variablegroups_manage Grupos de variables Concede la
(leer, crear y capacidad de
administrar) leer, crear y
administrar
grupos de
variables.
Category Ámbito Nombre Descripción
Wiki vso.wiki Wiki (lectura) Concede la
capacidad de
leer wikis,
páginas wiki y
datos adjuntos
wiki. También
concede la
capacidad de
buscar páginas
wiki.
vso.wiki_write Wiki (lectura y Concede la
escritura) capacidad de
leer, crear y
actualizar wikis,
páginas wiki y
datos adjuntos
wiki.
Category Ámbito Nombre Descripción
Elementos de vso.work Elementos de Concede la
trabajo trabajo (leer) capacidad de
leer elementos
de trabajo,
consultas,
paneles, rutas
de acceso de
área e
iteraciones y
otros
metadatos
relacionados
con el
seguimiento de
elementos de
trabajo.
También
concede la
capacidad de
ejecutar
consultas,
buscar
elementos de
trabajo y recibir
notificaciones
sobre eventos
de elementos
de trabajo a
través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.work_write Elementos de Concede la
trabajo (lectura y capacidad de
escritura) leer, crear y
actualizar
elementos de
trabajo y
consultas,
actualizar
metadatos del
panel, leer áreas
de lectura e
iteraciones
rutas de acceso
a otros
metadatos
relacionados de
seguimiento de
elementos de
trabajo, ejecutar
consultas y
recibir
notificaciones
sobre eventos
de elementos
de trabajo a
través de
enlaces de
servicio.
Category Ámbito Nombre Descripción
vso.work_full Elementos de Concede acceso
trabajo (completos) completo a
elementos de
trabajo,
consultas,
trabajos
pendientes,
planes y
metadatos de
seguimiento de
elementos de
trabajo.
También
proporciona la
capacidad de
recibir
notificaciones
sobre eventos
de elementos
de trabajo a
través de
enlaces de
servicio.
Cambio del ámbito de la extensión publicada
Puede cambiar el ámbito de una extensión publicada. Si instaló previamente la
extensión (y autorizó el conjunto anterior de ámbitos), debe autorizar los nuevos
ámbitos para poder actualizar a la versión más reciente.
La sección Action Required (Acción requerida ) del centro de configuración de
extensiones muestra un usuario que, si existe, las extensiones instaladas requieren
autorización:
Después, un administrador puede revisar y autorizar el nuevo conjunto de ámbitos:
Destinos de instalación
Como su nombre indica, los destinos de instalación definen los productos y servicios
donde puede instalar la extensión. Microsoft.VisualStudio.Services es el destino de
instalación más común e indica que la extensión se puede instalar en Azure DevOps.
Los destinos de instalación de una extensión o integración se especifican a través del
targets campo del manifiesto.
Identificadores admitidos para extensiones:
Microsoft.VisualStudio.Services.Cloud : se instala en Azure DevOps Services
Microsoft.TeamFoundation.Server : se instala en TFS.
Microsoft.VisualStudio.Services : se instala en ambos. Acceso directo para
Microsoft.VisualStudio.Services.Cloud y Microsoft.TeamFoundation.Server
versión [14.2,)
Identificadores admitidos para integraciones:
Microsoft.VisualStudio.Services.Cloud.Integration : se integra con Azure DevOps
Services
Microsoft.TeamFoundation.Server.Integration : se integra con TFS.
Microsoft.VisualStudio.Services.Integration : se integra con ambos. Acceso
directo para Microsoft.VisualStudio.Services.Cloud.Integration y
Microsoft.TeamFoundation.Server.Integration
Para obtener más información, vea Puntos de extensibilidad.
Ejemplos de destinos de instalación
Ejemplo: extensión que funciona con Azure DevOps
JSON
"targets": [
"id": "Microsoft.VisualStudio.Services"
Ejemplo: Extensión que solo funciona con Azure DevOps Services
JSON
"targets": [
"id": "Microsoft.VisualStudio.Services.Cloud"
Los destinos de instalación también se pueden usar en el manifiesto de integraciones.
Por ejemplo, productos, aplicaciones o herramientas que funcionan con, pero que no se
instalan en Azure DevOps.
Ejemplo: Integración que funciona con Azure DevOps
JSON
"targets": [
"id": "Microsoft.VisualStudio.Services.Integration"
Ejemplo: Integración que solo funciona con TFS
JSON
"targets": [
"id": "Microsoft.TeamFoundation.Server.Integration"
Versiones de destino de instalación
Algunos identificadores de destino de instalación, como
Microsoft.TeamFoundation.Server y Microsoft.TeamFoundation.Server.Integration ,
admiten un intervalo de versiones opcional. Este intervalo de versiones opcional aclara
aún más las versiones admitidas en las que se admite la extensión o la integración.
La versión o el intervalo de versiones se especifica a través del version campo en el
objeto de destino de instalación. Este valor puede ser:
Una versión específica, por ejemplo: 15.0 (solo 2017 RTM)
Una gama de versiones admitidas, por ejemplo: [14.0) (2015 RTM y versiones
posteriores), [14.3,15.1] (actualización 3 a 2017 Update 1). Los valores de rango
se refinan mediante:
[ : versión mínima inclusiva
] : versión máxima inclusiva
( : versión mínima exclusiva
) : versión máxima exclusiva
Números de versión para Azure DevOps Server:
Release Lanzamientos Versión
2010 Todas las versiones 10.0
2012 Todas las versiones 11.0
2013 RTM y actualizaciones 12.0, 12.1, 12.2, 12.3, 12.4
2015 RTM y actualizaciones 14.0, 14.1, 14.2, 14.3
2017 RTM y actualizaciones 15.0, 15.1
2018 RTM y actualizaciones 16.0
2019 RTM y actualizaciones 17.0
Release Lanzamientos Versión
2020 RTM y actualizaciones 18.0
Ejemplos en los que se muestran las versiones
Ejemplo: extensión que funciona con Azure DevOps
JSON
"targets": [
"id": "Microsoft.VisualStudio.Services.Cloud"
},
"id": "Microsoft.TeamFoundation.Server",
"version": "[15.0,)"
Accesos directos
Microsoft.VisualStudio.Services es un acceso directo para Azure DevOps.
JSON
"targets": [
"id": "Microsoft.VisualStudio.Services"
equivale a:
JSON
"targets": [
"id": "Microsoft.VisualStudio.Services.Cloud"
},
"id": "Microsoft.TeamFoundation.Server",
"version": "[14.2,)"
Uso de destinos y demandas de instalación
Los destinos de instalación y las demandas se usan conjuntamente para presentar a los
usuarios una vista correcta de los productos o servicios con los que la extensión o la
integración son compatibles. Por ejemplo, especificar un destino de instalación de
Microsoft.VisualStudio.Services con una demanda de api-version/3.0 significa que la
extensión funciona con Azure DevOps.
Sugerencia
Para más información sobre las API REST, consulte la referencia de la API rest.
Ejemplo: extensión que usa las API de la versión 3.0
JSON
"targets": [
"id": "Microsoft.VisualStudio.Services"
],
"demands": [
"api-version/3.0"
Se resuelve en los siguientes destinos de instalación:
1. Microsoft.VisualStudio.Services.Cloud
2. Microsoft.TeamFoundation.Server Versión: [15.0,)
Ejemplo: Integración que usa las API de la versión 2.0
JSON
"targets": [
"id": "Microsoft.VisualStudio.Services.Integration"
],
"demands": [
"api-version/2.0"
Se resuelve en los siguientes destinos de instalación:
1. Microsoft.VisualStudio.Services.Cloud.Integration
2. Microsoft.TeamFoundation.Server.Integration Versión: [14.0,)
Peticiones
Las demandas le permiten especificar funcionalidades y otras características necesarias
para la extensión. Puede usar estas demandas para limitar dónde se puede publicar o
instalar la extensión.
Las demandas se usan en Visual Studio Marketplace para enumerar los productos y
entornos con los que la extensión es compatible, lo que ayuda a los clientes a
comprender si la extensión funciona con su versión de Azure DevOps, por ejemplo.
Vea el ejemplo siguiente de cómo se especifican las demandas en el manifiesto de
extensión.
JSON
"demands": [
"api-version/3.0",
"contribution/ms.vss-dashboards-web.widget-catalog"
En este ejemplo, la extensión exige la versión 3.0 de las API, lo que significa que solo se
puede instalar en Azure DevOps. También requiere que la ms.vss-dashboards-web
extensión (y su widget-catalog contribución) se instale (y se habilite) en la colección
para poder instalar la extensión.
Demandas admitidas
Tipo Descripción ¿Está protegido ¿Se ha
en la comprobado en
publicación? la instalación?
environment/cloud Requiere la ejecución en un Sí Sí
entorno de nube
environment/onprem Requiere la ejecución en un Sí Sí
entorno local
api-version/{version} Requiere una versión de API No Sí
específica (mínimo)
extension/{id} Requiere que se instale o No Sí
habilite una extensión
específica.
contribution/{id} Requiere que haya disponible No Sí
una contribución específica.
contributionType/{id} Requiere que haya disponible No Sí
un tipo de contribución
específico.
7 Nota
Use environment/cloud y environment/onprem solo cuando la extensión tenga
requisitos relacionados con la topología que requieren la ejecución en ese
entorno determinado.
extension Las demandas , contribution y contributionType se evalúan en
tiempo de instalación y requiere que la extensión especificada ya esté
instalada y habilitada en la organización o colección.
Archivos
En la files sección se hace referencia a los archivos que quiera incluir en la extensión.
Puede agregar carpetas y archivos individuales:
JSON
"files": [
"path": "hello-world.html", "addressable": true
},
"path": "scripts", "addressable": true
},
"path": "images/logo.png", "addressable": true, "packagePath":
"/"
Propiedades
Propiedades de la sección Archivos:
path : ruta de acceso al recurso en el disco, que puede ser relativa al directorio raíz.
direccionable : (opcional) Se establece en true si quiere que el archivo sea
direccionable con dirección URL. El valor predeterminado es false.
packagePath : (opcional) Ruta de acceso al recurso dentro del paquete. El valor
predeterminado es la ruta de acceso relativa en el disco desde el directorio raíz.
contentType : tipo MIME (opcional) del archivo. El valor predeterminado es una
mejor estimación en función de la extensión de archivo y la configuración del
sistema operativo.
assetType : (opcional) Especifique el valor del atributo Type de la entrada de
recurso en el manifiesto VSIX. También puede ser una matriz de cadenas, en cuyo
caso se agregan varias entradas de recursos para este archivo. El valor
predeterminado es packagePath.
lang : (opcional) Idioma de este recurso. Los archivos localizados se sirven en
función del encabezado Accept-Language. Deje en blanco para indicar que este
archivo está en el idioma predeterminado (o reserva). Las versiones localizadas del
mismo archivo deben tener el mismo assetType.
Contribuciones
Cada entrada de contribución tiene las siguientes propiedades:
id : identificador de referencia (cadena) para la contribución. El identificador de
cada contribución debe ser único dentro de una extensión. Consulte referencia a
contribuciones y tipos.
type : el identificador del tipo de contribución de esta contribución.
description : (opcional) Cadena que describe lo que proporciona la contribución.
targets : matriz de identificadores de contribución a los que se dirige la
contribución (contribuyendo). Consulte Targeting contributions (Contribuciones
dirigidas).
properties : (opcional) Objeto que incluye las propiedades de la contribución tal y
como se define en el tipo de contribución.
Para más información, consulte la introducción al modelo de contribución.
Tipos de contribución
Cada entrada de contribución tiene las siguientes propiedades:
id : identificador de referencia (cadena) para el tipo de contribución. El
identificador de cada tipo de contribución debe ser único dentro de una extensión.
Consulte referencia a contribuciones y tipos.
name : nombre descriptivo del tipo de contribución.
description : (opcional) Cadena que describe con más detalle para qué es el tipo
de contribución.
properties : (opcional) Diccionario que asigna nombres de propiedad a
descripciones de propiedades. Estas propiedades describen las propiedades
obligatorias y opcionales que pueden usar las contribuciones de este tipo.
Las descripciones de propiedades tienen las siguientes propiedades:
description : (opcional) Cadena que describe para qué se usa la propiedad.
required : (opcional) Un valor booleano, que si es true indica que la propiedad es
necesaria para todas las contribuciones de este tipo.
type : el tipo de valor que la propiedad puede tener, que podría ser string, uri,
guid, boolean, integer, double, dateTime, array o object.
Para más información, consulte la introducción al modelo de contribución.
Referencia a contribuciones y tipos
Sus identificadores hacen referencia a las contribuciones y los tipos de contribución. Las
contribuciones hacen referencia a tipos a través de la type propiedad y hacen referencia
a otras contribuciones a través de la targets propiedad .
Una referencia de contribución completa incluye el identificador del publicador, el
identificador de extensión y el identificador de tipo de contribución, separados por
un punto (.). Por ejemplo, ms.vss-web.hub es el identificador completo de la
contribución con el identificador "hub" en la extensión "vss-web" publicada por el
publicador "ms" (Microsoft).
Las referencias de contribución relativas se pueden usar dentro de un manifiesto
de extensión para la referencia de una contribución a otro tipo de contribución o
contribución dentro de esa misma extensión. En este caso, no se incluyen los
identificadores de publicador y extensión, y el identificador es un punto (.) seguido
del identificador de contribución. Por ejemplo, ".hub" se puede usar dentro de la
extensión "vss-web" mencionada anteriormente como acceso directo para "ms.vss-
web.hub".
Contribuciones dirigidas
Algunas contribuciones actúan como contenedores a los que pueden dirigirse otras
contribuciones.
Las contribuciones del centro pueden tener como destino grupos concentradores.
Cuando se representa una página, la interfaz de usuario web muestra todas las
contribuciones del centro de conectividad destinadas al grupo concentrador
seleccionado. Los grupos concentradores tienen como destino una colección de
grupos concentradores, que define un conjunto de grupos concentradores que se
muestran en un área de navegación determinada, por ejemplo, páginas de
administración de nivel de proyecto.
Los menús se pueden destinar mediante contribuciones de diferentes tipos: acción,
acción de hipervínculo y proveedor de acciones. Las acciones y las acciones de
hipervínculo proporcionan entradas de elemento de menú único. Un proveedor de
acciones puede proporcionar varios elementos de menú dinámicos. Para un menú
determinado, los elementos se agregan en todas las contribuciones (de cualquiera
de estos tipos) que tienen como destino esa contribución de menú específica.
Adición de un icono de concentrador
Para obtener información sobre cómo agregar un icono al centro, consulte la guía del
icono del centro.
Servicios de distintivo admitidos
Marketplace solo admite distintivos de los siguientes servicios de confianza:
api.travis-ci.org/
badge.fury.io/
badges.frapsoft.com/
badges.gitter.im/
badges.greenkeeper.io/
cdn.travis-ci.org/
ci.appveyor.com/
codeclimate.com/
codecov.io/
coveralls.io/
david-dm.org/
gemnasium.com/
img.shields.io/
isitmaintained.com/
marketplace.visualstudio.com/
snyk.io/
travis-ci.com/
travis-ci.org/
vsmarketplacebadges.dev/
bithound.io/
deepscan.io/
githost.io/
gitlab.com/
opencollective.co/
7 Nota
Reemplace "vsmarketplacebadge.apphb.com" por "vsmarketplacebadges.dev".
Si desea mostrar un distintivo de otro servicio, póngase en contacto con
vsmarketplace@microsoft.com.
Manifiesto de ejemplo
La siguiente extensión contribuye a una acción al menú contextual de compilaciones
completadas y un centro al grupo del concentrador de compilación:
JSON
"manifestVersion": 1,
"id": "tools",
"version": "0.1.0",
"name": "Fabrikam Tools",
"publisher": "fabrikam",
"description": "Awesome tools to help you and your team do great things
everyday.",
"targets": [
"id": "Microsoft.VisualStudio.Services"
],
"demands": [
"api-version/3.0"
],
"icons": {
"default": "images/fabrikam-logo.png"
},
"scopes": [
"vso.work",
"vso.code_write"
],
"categories": [
"Plan and track"
],
"tags": [
"working",
"people person",
"search"
],
"branding": {
"color": "rgb(34, 34, 34)",
"theme": "dark"
},
"screenshots": [
"path": "screenshots/screen1.png"
},
"path": "screenshots/screen2.png"
],
"content": {
"details": {
"path": "overview.md"
},
"license": {
"path": "eula.md"
},
"links": {
"home": {
"uri": "https://www.fabrikam-fiber-inc.com"
},
"getstarted": {
"uri": "https://www.fabrikam-fiber-inc.com/help/getstarted"
},
"learn": {
"uri": "https://www.fabrikam-fiber-inc.com/features"
},
"support": {
"uri": "https://www.fabrikam-fiber-inc.com/support"
},
"repository": {
"uri": "https://github.com/fabrikam-fiber-inc/tools"
},
"issues": {
"uri": "https://github.com/fabrikam-fiber-inc/tools/issues"
},
"repository": {
"type": "git",
"uri": "https://github.com/fabrikam-fiber-inc/myextension"
},
"badges": [
"href": "https://travis.ci/fabrikam-fiber-inc/myextension",
"uri": "https://travis.ci/fabrikam-fiber-inc/myextension.svg?
branch=master",
"description": "TravisCI build for the project"
},
"href": "https://ci.appveyor.com/projects/fabrikam-fiber-
inc/myextension",
"uri":
"https://ci.appveyor.com/api/projects/status/vlg2sgs2y7tsdxpj4c?svg=true",
"description": "AppVeyor build for the project"
],
"contributions": [
"id": "showCommits",
"type": "ms.vss-web.action",
"description": "Adds a menu action from builds grid to show
associated items.",
"targets": [
"ms.vss-build-web.completed-build-menu"
],
"properties": {
"title": "View associated items",
"uri": "launch.html"
Referencia: integración de tareas de
compilación personalizadas en
extensiones
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Use esta referencia cuando quiera crear e integrar tareas de canalización de compilación
personalizadas con extensiones en Azure DevOps.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Tareas personalizadas
Las tareas son los bloques de creación para definir la automatización en una
canalización de compilación o versión. Ofrecemos muchas tareas integradas para
habilitar escenarios fundamentales de compilación e implementación. Se recomienda
revisar estos escenarios antes de crear los suyos propios. Si las tareas existentes no
satisfacen sus necesidades, puede crear una tarea personalizada.
JSON de la tarea de compilación personalizada
Al crear una tarea de compilación o versión personalizada con una extensión, la
extensión incluye un task.json archivo para cada tarea de compilación o versión.
El
task.json archivo describe la tarea de compilación o versión. El sistema de compilación
lo usa para representar las opciones de configuración al usuario y para saber qué scripts
se ejecutarán en tiempo de compilación.
La documentación del SDK de la tarea de compilación y versión está en GitHub .
En
concreto, puede que le interese el esquema task.json .
Agrupación de varias versiones de tareas de
compilación y versión en una extensión
Puede incluir varias versiones de una tarea de compilación o versión dentro de la
extensión. Implemente versiones futuras de la extensión sin interrumpir el servicio de los
usuarios en versiones anteriores. La siguiente información muestra el diseño para tener
varias versiones en una extensión.
Diseño de extensión tradicional
extensionManifest.json
extensionIcon.png
Tarea1
task.json
icon.png
taskScript.ps1
7 Nota
Al configurar un icono de tarea, asegúrese de que lo siguiente es true.
El nombre del icono es icon.png
El tamaño del icono es de 32 x 32 píxeles.
El icono está en la misma ubicación que el task.json archivo.
Diseño de varias versiones
7 Nota
El código busca el task.json archivo dentro de la carpeta de tareas y, a
continuación, un nivel más profundo.
Si no se encuentra ninguno de los dos
niveles, verá un mensaje de error.
extensionManifest.json
extensionIcon.png
Tarea1
Task1V1
task.json
icon.png
taskScript.ps1
Task1V2
task.json
icon.png
taskScript.ps1
Tarea2
Task2V1
task.json
icon.png
taskScript.ps1
Task2V2
task.json
icon.png
taskScript.ps1
Sugerencia
Para asegurarse de que la _build/Tasks/ssrsfilesdeploy carpeta contiene el
contenido V1 y V2, establezca matchCopy(item, srcPath, destPath, {
noRecurse: false en en en el make-util.js archivo .
Artículos relacionados
Adición de una extensión de tarea de canalizaciones personalizadas
Documentación de GitHub de la tarea de servidor
Ejemplos de tareas de compilación y versión
Contexto de expresión de decorador de
canalización
Artículo • 18/11/2022 • Tiempo de lectura: 3 minutos
Azure DevOps Services
Los decoradores de canalización tienen acceso al contexto sobre la canalización en la
que se ejecutan.
Como autor de decorador de canalización, puede usar este contexto
para tomar decisiones sobre el comportamiento del decorador. La información
disponible en contexto es diferente para las canalizaciones y para la versión.
Además,
los decoradores se ejecutan después de que los nombres de tarea se resuelvan en GUID
de tareas.
Cuando el decorador desea hacer referencia a una tarea, debe usar el GUID
en lugar del nombre o la palabra clave.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK Azure DevOps Extension.
Recursos
Los recursos de canalización están disponibles en el resources objeto .
Repositorios
Actualmente, solo hay una clave: repositories .
repositories es un mapa del
identificador del repositorio para obtener información sobre el repositorio.
En una compilación del diseñador, el alias del repositorio principal es __designer_repo .
En una canalización YAML, el repositorio principal se denomina self .
En una
canalización de versión, los repositorios no están disponibles.
Las variables de artefacto
de versión están disponibles.
Por ejemplo, para imprimir el nombre del repositorio self en una canalización YAML:
steps:
- script: echo ${{ resources.repositories['self'].name }}
Los repositorios contienen estas propiedades:
JavaScript
resources['repositories']['self'] =
"alias": "self",
"id": "<repo guid>",
"type": "Git",
"version": "<commit hash>",
"name": "<repo name>",
"project": "<project guid>",
"defaultBranch": "<default ref of repo, like 'refs/heads/main'>",
"ref": "<current pipeline ref, like 'refs/heads/topic'>",
"versionInfo": {
"author": "<author of tip commit>",
"message": "<commit message of tip commit>"
},
"checkoutOptions": {}
Trabajo
Los detalles del trabajo están disponibles en el job objeto .
Los datos tienen un aspecto similar al siguiente:
JavaScript
job =
"steps": [
"environment": null,
"inputs": {
"script": "echo hi"
},
"type": "Task",
"task": {
"id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
"name": "CmdLine",
"version": "2.146.1"
},
"condition": null,
"continueOnError": false,
"timeoutInMinutes": 0,
"id": "5c09f0b5-9bc3-401f-8cfb-09c716403f48",
"name": "CmdLine",
"displayName": "CmdLine",
"enabled": true
Por ejemplo, para agregar condicionalmente una tarea solo si aún no existe:
YAML
- ${{ if not(containsValue(job.steps.*.task.id, 'f3ab91e7-bed6-436a-b651-
399a66fe6c2a')) }}:
- script: echo conditionally inserted
Variables
Las variables de canalización también están disponibles.
Por ejemplo, si la canalización tuviera una variable denominada myVar , su valor estaría
disponible para el decorador como variables['myVar'] .
Por ejemplo, para dar a un decorador una opción de no participar, podríamos buscar
una variable.
Los autores de canalizaciones que deseen no participar en el decorador
pueden establecer esta variable y no se insertará el decorador.
Si la variable no está
presente, el decorador se inserta como de costumbre.
my-decorator.yml
YAML
- ${{ if ne(variables['skipInjecting'], 'true') }}:
- script: echo Injected the decorator
A continuación, en una canalización de la organización, el autor puede solicitar al
decorador que no se inyecte a sí mismo.
pipeline-with-opt-out.yml
YAML
variables:
skipInjecting: true
steps:
- script: echo This is the only step. No decorator is added.
Nombres de tareas y GUID
Los decoradores se ejecutan después de que las tareas ya se hayan convertido en GUID.
Tenga en cuenta el siguiente código YAML:
YAML
steps:
- checkout: self
- bash: echo This is the Bash task
- task: PowerShell@2
inputs:
targetType: inline
script: Write-Host This is the PowerShell task
Cada uno de esos pasos se asigna a una tarea.
Cada tarea tiene un GUID único.
Los
nombres de tarea y las palabras clave se asignan a GUID de tareas antes de que se
ejecuten los decoradores.
Si un decorador desea comprobar la existencia de otra tarea,
debe buscar por GUID de tarea en lugar de por nombre o palabra clave.
En el caso de las tareas normales (que se especifican con la task palabra clave ),
task.json puede buscar en la tarea para determinar su GUID.
Para palabras clave
especiales como checkout y bash en el ejemplo anterior, puede usar los siguientes
GUID:
Palabra clave GUID Nombre de tarea
checkout 6D15AF64-176C-496D-B583-FD2AE21D4DF4 n/a, consulte la nota siguiente
bash 6C731C3C-3C68-459A-A5C9-BDE6E6595B5B Bash
script D9BAFED4-0B18-4F58-968D-86655B4D2CE9 CmdLine
powershell E213FF0F-5D5C-4791-802D-52EA3E7BE1F1 PowerShell
pwsh E213FF0F-5D5C-4791-802D-52EA3E7BE1F1 PowerShell
publish ECDC45F6-832D-4AD9-B52B-EE49E94659BE PublishPipelineArtifact
download 61F2A582-95AE-4948-B34D-A1B3C4F6A737 DownloadPipelineArtifact
Después de resolver nombres de tarea y palabras clave, el código YAML anterior se
convierte en:
YAML
steps:
- task: 6D15AF64-176C-496D-B583-FD2AE21D4DF4@1
inputs:
repository: self
- task: 6C731C3C-3C68-459A-A5C9-BDE6E6595B5B@3
inputs:
targetType: inline
script: echo This is the Bash task
- task: E213FF0F-5D5C-4791-802D-52EA3E7BE1F1@2
inputs:
targetType: inline
script: Write-Host This is the PowerShell task
Sugerencia
Cada uno de estos GUID se puede encontrar en para la task.json tarea en cuadro
correspondiente .
La única excepción es checkout , que es una funcionalidad
nativa del agente.
Su GUID está integrado en el Azure Pipelines y el agente.
Esquemas de autenticación de punto de
conexión de servicio
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Obtenga información sobre cómo establecer las credenciales en el encabezado de
solicitud HTTP al llamar al punto de conexión externo. Después, Azure DevOps puede
conectarse al servicio externo mediante las credenciales. Azure DevOps admite un
conjunto cerrado de esquemas de autenticación que un tipo de punto de conexión de
servicio personalizado puede usar. Azure DevOps interpreta el esquema de
autenticación que se usa en cualquier punto de conexión & personalizado que admita la
conexión al servicio externo.
Consulte los siguientes esquemas de autenticación que forman parte del conjunto
cerrado.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Autenticación básica
Este esquema toma dos entradas: Contraseña de nombre de usuario & (confidencial)
El encabezado de autenticación predeterminado usado es: "Basic {{ #base64
endpoint.username ":" endpoint.password }}"
JSON
"id": "endpoint-auth-scheme-basic",
"description": "Basic Authentication based endpoint authentication
scheme",
"type": "ms.vss-endpoint.service-endpoint-type",
"targets": [
"ms.vss-endpoint.endpoint-types"
],
"properties": {
"name": "UsernamePassword",
"displayName": "i18n:Basic Authentication",
"authenticationSchemes": [
"type": "ms.vss-endpoint.endpoint-auth-scheme-basic",
"headers": [
"name": "Authorization",
"value": "Basic {{ #base64 endpoint.username \":\"
endpoint.password }}"
],
"inputDescriptors": [
"id": "username",
"name": "i18n:Username",
"description": "i18n:Username for connecting to the
endpoint",
"inputMode": "textbox",
"isConfidential": false,
"validation": {
"isRequired": true,
"dataType": "string",
"maxLength": 300
},
"id": "password",
"name": "i18n:Password",
"description": "i18n:Password for connecting to the
endpoint",
"inputMode": "passwordbox",
"isConfidential": true,
"validation": {
"isRequired": true,
"dataType": "string",
"maxLength": 300
Autenticación basada en tokens
Este esquema toma una entrada: token de API (confidencial)
El encabezado de autenticación predeterminado usado es: {{endpoint.apitoken}}
JSON
{
"id": "endpoint-auth-scheme-token",
"description": "i18n:Token based endpoint authentication scheme",
"type": "ms.vss-endpoint.service-endpoint-type",
"targets": [
"ms.vss-endpoint.endpoint-types"
],
"properties": {
"name": "Token",
"displayName": "i18n:Token Based Authentication",
"authenticationSchemes": [
"type": "ms.vss-endpoint.endpoint-auth-scheme-token",
"headers": [
"name": "Authorization",
"value": "{{endpoint.apitoken}}"
],
"inputDescriptors": [
"id": "apitoken",
"name": "i18n:API Token",
"description": "i18n:API Token for connection to
endpoint",
"inputMode": "textbox",
"isConfidential": true,
"validation": {
"isRequired": true,
"dataType": "string",
"maxLength": 300
Autenticación basada en certificados
Este esquema toma una entrada: certificado (confidencial)
El valor del certificado debe proporcionarse en el área de texto.
JSON
"id": "endpoint-auth-scheme-cert",
"description": "i18n:Creates a certificate-based endpoint authentication
scheme",
"type": "ms.vss-endpoint.service-endpoint-type",
"targets": [
"ms.vss-endpoint.endpoint-types"
],
"properties": {
"name": "Certificate",
"displayName": "i18n:Certificate Based",
"authenticationSchemes": [
"type": "ms.vss-endpoint.endpoint-auth-scheme-cert",
"inputDescriptors": [
"id": "certificate",
"name": "i18n:Certificate",
"description": "Content of the certificate",
"inputMode": "TextArea",
"isConfidential": true,
"validation": {
"isRequired": true,
"dataType": "string"
Sin autenticación
Este esquema se usa cuando un tipo de punto de conexión no requiere tomar ninguna
entrada. Por ejemplo, servicios externos que admiten el acceso anónimo a sus recursos.
JSON
"id": "endpoint-auth-scheme-none",
"description": "i18n:Creates an endpoint authentication scheme with no
authentication.",
"type": "ms.vss-endpoint.endpoint-auth-scheme-none",
"targets": [
"ms.vss-endpoint.endpoint-auth-schemes"
],
"properties": {
"name": "None",
"displayName": "i18n:No Authentication"
Hospedaje de contenido estático
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services
Elija hospedar contenido estático para la extensión, como archivos HTML, CSS y
JavaScript, en su propio servicio, en un servicio de hospedaje de terceros, como Azure o
Heroku, o en Azure DevOps Services directamente.
) Importante
Si la extensión necesita crear una tabla personalizada en la base de datos de TFS,
no la cree con el esquema "dbo". En su lugar, las tablas personalizadas deben
crearse en un esquema independiente. Por ejemplo, "YourExtensionName".
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK Azure DevOps Extension.
Hospedar en Azure DevOps Services
En este modelo, el contenido estático se empaqueta con el archivo .vsix de la extensión
y se sirve desde un punto de conexión público en
https://publisher.gallerycdn.vsassets.io .
El contenido estático de la extensión es útil al mejorar o decorar datos de Azure DevOps
Services. El pub de extensiones no requiere que usted (el publicador de extensiones)
configure, administre o pague por los servicios de hospedaje de la extensión.
Pasos
1. En el archivo de manifiesto de extensión, especifique los archivos que desea incluir
a través de la files propiedad :
JSON
"files": [
"path": "scripts", "addressable": true
},
"path": "images/extra/icon1.png", "addressable": true
2. Quite la baseUri propiedad (si se establece) del manifiesto de extensión.
3. Empaquetar la extensión (pasos)
4. Publicar (o volver a publicar) la extensión (pasos)
> [! IMPORTANTE] > asegúrese de incrementar la versión de la extensión al realizar
cambios en los archivos de contenido estático incluidos en .vsix.
Tenga en cuenta lo siguiente:
El valor especificado por el atributo path puede ser una carpeta o un archivo
individual. Si es una carpeta, se incluye toda la carpeta (y todas las subcarpetas).
El addressable atributo es importante y es lo que indica a Visual Studio
Codespaces que haga que la dirección URL de los archivos sea direccionable.
Todas las addressable solicitudes de recursos distinguen mayúsculas de
minúsculas. Si la solicitud de un recurso tiene un caso diferente al recurso cargado
real, se produce un error HTTP 404 (no encontrado).
No especificar baseUri ni establecer un valor vacío indica a Visual Studio
Codespaces en tiempo de ejecución que calcule el URI base como si el contenido
estático se hospeda en Azure DevOps Services.
Hospedar en su propio servicio (o en un
servicio de terceros)
En este modelo, el contenido estático se proporciona desde su propio servicio y no se
incluye en el archivo .vsix de la extensión.
Pasos
1. Establezca la baseUri propiedad en el manifiesto de extensión Por ejemplo,
suponiendo un valor de https://myservice.net/extension y esta contribución del
centro:
JSON
"baseUri": "https://myservice.net/extension",
"contributions": [
"id": "Fabrikam.HelloWorld",
"type": "ms.vss-web.hub",
"targets": [
"ms.vss-work-web.work-hub-group"
],
"properties": {
"name": "Hello",
"uri": "hello-world.html"
Azure DevOps Services carga el contenido de este centro cuando se representa en
https://myservice.net/extension/hello-world.html .
Pasos siguientes
Empaquetar, publicar e instalar extensiones
Cuadro de diálogo modal
Artículo • 18/11/2022 • Tiempo de lectura: 4 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
HostDialogService permite presentar un cuadro de diálogo modal al usuario e impedir
la interacción con todas las partes del acceso web hasta que se descarte el diálogo.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
A diferencia del control de diálogo estándar, un cuadro de diálogo modal
presentado a través de HostDialogService impide la interacción del usuario en toda
la página, no solo dentro de la extensión.
Contenido del cuadro de diálogo
Para empezar, declare una contribución de tipo ms.vss-web.control en el manifiesto de
extensión. Esta contribución representa el contenido que se muestra en el cuadro de
diálogo.
JSON
"id": "registration-form",
"type": "ms.vss-web.control",
"description": "The content to be displayed in the dialog",
"targets": [],
"properties": {
"uri": "registration-form.html"
La uri propiedad hace referencia a una página que se representa dentro del área de
contenido del cuadro de diálogo:
HTML
<!DOCTYPE html>
<html>
<head>
<script src="sdk/scripts/VSS.SDK.js"></script>
</head>
<body>
<h2 id="header">Register now</h2>
<p>
<label>Name:</label>
<input id="inpName" />
</p>
<p>
<label>Date of birth:</label>
<input id="inpDob" />
</p>
<p>
<label>Email address:</label>
<input id="inpEmail" />
</p>
<script>
VSS.init();
var registrationForm = (function() {
var callbacks = [];
function inputChanged() {
// Execute registered callbacks
for(var i = 0; i < callbacks.length; i++) {
callbacks[i](isValid());
function isValid() {
// Check whether form is valid or not
return !!(name.value) && !!(dateOfBirth.value) && !!
(email.value);
function getFormData() {
// Get form values
return {
name: name.value,
dateOfBirth: dateOfBirth.value,
email: email.value
};
var name = document.getElementById("inpName");
var dateOfBirth = document.getElementById("inpDob");
var email = document.getElementById("inpEmail");
name.addEventListener("change", inputChanged);
dateOfBirth.addEventListener("change", inputChanged);
email.addEventListener("change", inputChanged);
return {
isFormValid: function() {
return isValid();
},
getFormData: function() {
return getFormData();
},
attachFormChanged: function(cb) {
callbacks.push(cb);
};
})();
// Register form object to be used across this extension
VSS.register("registration-form", registrationForm);
</script>
</body>
</html>
Mostrar el cuadro de diálogo
Para mostrar el cuadro de diálogo (por ejemplo, cuando un usuario selecciona una
acción en una barra de herramientas o un menú), llame a la openDialog función en una
instancia de HostDialogService, pasando el identificador completo del contenido del
diálogo, por ejemplo my-publisher.my-extension.registration-form y cualquier opción
de diálogo:
JavaScript
VSS.getService(VSS.ServiceIds.Dialog).then(function(dialogService) {
var extensionCtx = VSS.getExtensionContext();
// Build absolute contribution ID for dialogContent
var contributionId = extensionCtx.publisherId + "." +
extensionCtx.extensionId + ".registration-form";
// Show dialog
var dialogOptions = {
title: "My Dialog",
width: 800,
height: 600
};
dialogService.openDialog(contributionId, dialogOptions);
});
Mostrar el cuadro de diálogo (avanzado)
Se puede llamar a una función cuando se selecciona el botón Aceptar. Esta función se
especifica getDialogResult en las opciones que se proporcionan al mostrar el cuadro de
diálogo.
Si una llamada a getDialogResult devuelve un valor distinto de NULL, este valor se pasa
a la función especificada por okCallback (también en las opciones) y se cierra el cuadro
de diálogo.
En este ejemplo, se llama a la attachFormChanged devolución de llamada cuando
cambian las entradas del formulario. En función de si el formulario es válido o no, el
botón Aceptar está habilitado o deshabilitado.
JavaScript
VSS.getService(VSS.ServiceIds.Dialog).then(function(dialogService) {
var registrationForm;
var extensionCtx = VSS.getExtensionContext();
var contributionId = extensionCtx.publisherId + "." +
extensionCtx.extensionId + ".registration-form";
var dialogOptions = {
title: "Registration Form",
width: 800,
height: 600,
getDialogResult: function() {
// Get the result from registrationForm object
return registrationForm ? registrationForm.getFormData() :
null;
},
okCallback: function (result) {
// Log the result to the console
console.log(JSON.stringify(result));
};
dialogService.openDialog(contributionId,
dialogOptions).then(function(dialog) {
// Get registrationForm instance which is registered in
registrationFormContent.html
dialog.getContributionInstance("registration-
form").then(function (registrationFormInstance) {
// Keep a reference of registration form instance (to be
used previously in dialog options)
registrationForm = registrationFormInstance;
// Subscribe to form input changes and update the Ok enabled
state
registrationForm.attachFormChanged(function(isValid) {
dialog.updateOkButton(isValid);
});
// Set the initial ok enabled state
registrationForm.isFormValid().then(function (isValid) {
dialog.updateOkButton(isValid);
});
});
});
});
Habilitación o deshabilitación del botón Aceptar
Inicialmente, el botón Aceptar está deshabilitado. Sin embargo, puede habilitar o
deshabilitar este botón llamando al updateOkButton método en el cuadro de diálogo:
JavaScript
dialogService.openDialog(contributionId,
dialogOptions).then(function(dialog) {
// Set true/false to enable/disable ok button
dialog.updateOkButton(true);
});
Pasar valores al control de diálogo
Es posible pasar valores iniciales al contenido del cuadro de diálogo cuando se abre en
el cuadro de diálogo host.
JSON
"id": "registration-form",
"type": "ms.vss-web.control",
"description": "The content displayed in the dialog",
"targets": [],
"properties": {
"uri": "registration-form.html?id={{myId}}"
Cuando se abre el cuadro de diálogo, es necesario especificar las siguientes opciones
para pasar myId :
JavaScript
var dialogOptions = {
title: "My Dialog Title",
width: 800,
height: 600,
urlReplacementObject: { myId: new Date().getTime() }
};
Personalización de los botones de diálogo
Los okText atributos y cancelText se pueden usar para especificar títulos alternativos
para los botones Aceptar y Cancelar:
JavaScript
var dialogOptions = {
title: "My Dialog Title",
width: 800,
height: 600,
okText: "Yes",
cancelText: "No"
};
Para no mostrar ningún botón en el cuadro de diálogo, puede establecer el buttons
atributo en null :
JavaScript
var dialogOptions = {
title: "My Dialog Title",
width: 800,
height: 600,
buttons: null
};
Más información
Si tiene una pregunta o busca más información, considere la posibilidad de ir a una de
las siguientes áreas:
Azure DevOps en Stack Overflow
Comunidad de desarrolladores
Navegación por la página del host
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
HostNavigationService proporciona API para interactuar con el marco de host primario,
incluida la actualización y el acceso al hash de la dirección URL:
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
Obtención del valor hash actual
JavaScript
// Get navigation service
VSS.getService(VSS.ServiceIds.Navigation).then(function(navigationService) {
// Get current hash value from host url
navigationService.getHash().then(function (hash) {
console.log("Host hash value: " + hash);
});
});
Recibir notificaciones cuando cambia el valor hash
JavaScript
// Get navigation service
VSS.getService(VSS.ServiceIds.Navigation).then(function(navigationService) {
navigationService.onHashChanged(function (hash) {
// Adding #something to the end of browser url executes this
handler with the hash value "something"
console.log("Hash changed to : " + hash);
});
});
Cambio del valor hash
Hay dos métodos disponibles para cambiar el valor hash de la dirección URL de la
página host:
setHash agrega una nueva entrada al historial del explorador.
replaceHash no agrega una nueva entrada al historial del explorador.
JavaScript
// Get navigation service
VSS.getService(VSS.ServiceIds.Navigation).then(function(navigationService) {
// Adds a new entry to browser history
navigationService.setHash("new-hash-value");
});
Actualizar la página host
El siguiente fragmento de código muestra cómo se puede volver a cargar la página
host.
JavaScript
// Get navigation service
VSS.getService(VSS.ServiceIds.Navigation).then(function(navigationService) {
// Reload whole page
navigationService.reload();
});
Estilos básicos para los widgets
Artículo • 18/11/2022 • Tiempo de lectura: 8 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Se recomienda usar los estilos básicos proporcionados a través del SDK de Widget. El
uso de estos estilos le ayuda a crear rápidamente y fácilmente un widget coherente con
el resto de los widgets del panel.
Para usar estos estilos, agregue la línea siguiente
dentro del VSS.require bloque en el código JavaScript del widget.
Sugerencia
Consulte nuestra documentación más reciente sobre el desarrollo de extensiones
mediante el SDK de extensión de Azure DevOps.
JavaScript
WidgetHelpers.IncludeWidgetStyles();
Esto extrae una hoja de estilos por el nombre sdk-widget.css y la incluye en el iframe del
widget. Incluye estilos para la familia de fuentes, el tamaño de fuente, el margen y los
rellenos para el widget.
También incluye estilos para encabezados (h1, h2, h3, etc.),
vínculos y mucho más.
Del mismo modo, para usar estilos comunes en la configuración del widget, incluya la
línea siguiente dentro del VSS.require bloque en el código JavaScript para la
configuración del widget.
JavaScript
WidgetHelpers.IncludeWidgetConfigurationStyles();
Esto extrae una hoja de estilos por el nombre sdk-widget-configuration.css y la incluye
en el iframe para la configuración del widget.
Incluye estilos para la familia de fuentes, el
tamaño de fuente y los estilos para elementos de formulario comunes, como entrada,
área de texto y selección.
7 Nota
Para que estos estilos se apliquen al widget, debe agregar una clase "widget" en el
elemento HTML que contiene el widget. Todos los estilos del sdk-widgets.css tienen
como ámbito esta clase.
Del mismo modo, agregue una clase "widget-
configuration" en el elemento HTML que contiene la configuración del widget.
Todos los estilos de sdk-widget-configuration.css tienen como ámbito esta clase.
Descargue los ejemplos para empezar o usar los fragmentos de código que se
proporcionan a continuación.
Cuerpo del widget, título y descripción
Al agregar la clase "widget" en el elemento HTML que contiene el widget, obtendrá
automáticamente relleno, fuente y color para el contenido del widget.
Siempre debe tener un título para el widget. Esto ayuda al usuario a identificar el widget
y a su funcionalidad de un vistazo.
Use <h2> con la clase "title". Esto también ayuda a
los usuarios a usar lectores de pantalla para identificar rápidamente los diferentes
widgets del panel.
Principio de diseño: Los widgets deben tener un título. Use la <h2> etiqueta con la
clase "title".
A veces, es posible que quiera proporcionar una descripción pequeña sobre el widget o
cómo usarlo.
En tales casos, use la clase "description" en el elemento HTML que desea
usar para la descripción del widget.
Principio de diseño: Use la clase "description" para la descripción del widget. Las
descripciones deben tener sentido incluso cuando se leen fuera del contexto del
widget.
HTML
<div class="widget">
<h2 class="title">Widget title</h2>
<div class="description">The widget description is used to describe
the widget. It makes sense even when read outside of the widget context.
</div>
<p>Place widget content here.</p>
</div>
Títulos y subtítulos del widget
Los subtítulos son texto que complementa el título. Es posible que no siempre tengan
sentido cuando se leen fuera del contexto sin leer el título.
Principio de diseño: Use la clase "subtítulo" para proporcionar más información
sobre el widget. Puede que no tenga sentido fuera del contexto del widget.
Use la estructura y las clases siguientes "title", "inner-title" y "subtitle" para obtener la
fuente, el color y los márgenes adecuados para una combinación de títulos y subtítulos.
El título obtiene un tamaño de fuente mayor que el subtítulo. El subtítulo tiene un color
subduido en relación con el título o el resto del widget.
HTML
<div class="widget">
<h2 class="title">
<div class="inner-title">Widget title</div>
<div class="subtitle">Widget subtitle</div>
</h2>
<div class="content">
Place widget content here.
</div>
</div>
Puede usar cualquier elemento html para la combinación de títulos y subtítulos. A
continuación se incluyen algunas sugerencias:
Cuando necesite que el subtítulo aparezca en la misma línea que el título, use un
elemento insertado como <span>
Cuando necesite que el subtítulo aparezca en la siguiente línea del título, use un
elemento de bloque como <div>
Mostrar hipervínculos, iconos, texto y subtexto en un
widget
Algunos widgets tienen vínculos que tienen un icono, texto y subtexto por vínculo.
Principio de diseño: Use vínculos con un icono y subtexto para que el propósito del
vínculo sea obvio para el usuario. Asegúrese de que el icono simboliza el destino del
vínculo.
Para obtener la misma apariencia, use la siguiente estructura y clases HTML.
HTML
<div class="widget">
<h2 class="title">Widget title</h2>
<div class="content">
<p>Place your content here.</p>
<a class="link-with-icon-text" href="http://bing.com"
target="_blank">
<span class="icon-container" style="background-color:
#68217A"></span>
<div class="title">
Primary link text
<div class="subtitle">Link subtext</div>
</div>
</a>
</div>
</div>
Mostrar contadores en un widget
El propósito principal de algunos widgets es mostrar el recuento de algunos datos. El
icono de consulta y los widgets icono de código son ejemplos en esta categoría de
widgets.
Para usar los mismos estilos que estos widgets, agregue la clase "big-count" en
el elemento HTML que contiene el número para obtener la fuente grande que usa el
icono de consulta y los widgets de icono de código.
Principio de diseño: Use la clase "big-count" para presentar al usuario números en
una fuente grande. No debe usarse con caracteres no numéricos.
HTML
<div class="widget">
<h2 class="title">Counter widget</h2>
<div class="big-count">223</div>
<div>Additional text</div>
</div>
Convertir un widget en un hipervínculo
Al hacer clic en cualquier parte de algunos widgets, el usuario redirige a otra página.
Para que el widget haga lo mismo, puede hacer lo siguiente:
Agregue una etiqueta de delimitador como elemento secundario al elemento
HTML que actúa como contenedor de widgets.
Coloque todo el contenido del widget dentro de la etiqueta de anclaje.
Dado que el widget se hospeda en un iframe, agregue el atributo "target" con el
valor "_blank" a la etiqueta de anclaje para que el vínculo se abra en una nueva
pestaña o ventana en lugar de dentro del mismo iframe.
Además de la clase "widget", agregue la clase "clickable" al contenedor de widgets.
El contenido del widget obtiene los colores correctos aunque estén dentro de una
etiqueta de anclaje. Sin la clase "clickable", el color azul predeterminado se fuerza en
todo el texto dentro del widget.
El widget también obtiene una indicación visual
personalizada sobre el foco para ayudar a los usuarios que usan el teclado para navegar
por el panel.
Principio de diseño: Use la clase "clickable" y la <a> etiqueta para hacer clic en todo
el widget. Esto es ideal cuando el widget es un resumen de los datos disponibles en
otra página.
HTML
<div class="widget clickable">
<a href="https://bing.com" target="_blank">
<h2 class="title">Counter widget</h2>
<div class="big-count">223</div>
<div>Click me!</div>
</a>
</div>
Estilos para elementos de formulario comunes en la
configuración del widget
Para usar estilos básicos del sdk de widget para elementos de formulario comunes en la
configuración del widget, siga estas instrucciones:
Elemento Elemento Instrucciones
Form Wrapping
Cuadro de div con la Use un label elemento para agregar texto junto al cuadro de texto.
texto clase Use el input elemento para crear un cuadro de texto. Use el
simple "single-line- placeholder atributo para proporcionar texto de marcador de
text-input". posición.
Casilla de fieldset Use un label elemento para agregar texto junto a cada casilla. Use
verificación con la clase un legend elemento para etiquetar el grupo de casillas. Use el for
"checkbox" atributo en cada label elemento para ayudar a los lectores de
pantalla a comprender el elemento de formulario.
Botón de fieldset Use un label elemento para agregar texto junto a cada botón de
selección con la clase radio. Use un legend elemento para etiquetar el grupo de botones
"radio" de radio. Use el for atributo en cada label elemento para ayudar a
los lectores de pantalla a comprender el elemento de formulario.
Elemento Elemento Instrucciones
Form Wrapping
Menú div con la Use un label elemento para agregar texto junto a la lista
desplegable clase desplegable. Si desea que una lista desplegable ocupe la mitad del
"dropdown" ancho, agregue la clase "half" al elemento de ajuste div . Si desea
usar el icono de flecha estándar del SDK en lugar del proporcionado
por el explorador, encapsula el select elemento con otro div con
la clase "wrapper".
Cuadro de div con la Use label el elemento para etiquetar el textarea elemento
texto clase utilizado como cuadro de texto de varias líneas.
multilínea "multilínea-
text-input".
En el ejemplo siguiente se usa cada uno de los elementos de formulario enumerados en
la tabla.
HTML
<div class="widget-configuration">
<div class="single-line-text-input" id="name-input">
<label>Your name</label>
<input type="text" value="Contoso"></input>
</div>
<div class="dropdown" id="query-path-dropdown">
<label>Drop down</label>
<div class="wrapper">
<select>
<option value="Shared Queries/Feedback">Shared
Queries/Feedback</option>
<option value="Shared Queries/My Bugs">Shared Queries/My
Bugs</option>
<option value="Shared Queries/My Tasks">Shared Queries/My
Tasks</option>
</select>
</div>
<fieldset class="checkbox" id="select-results">
<legend>Select results to display</legend>
<input type="checkbox" id="check-option1" value="id"
name="check" checked="true">
<label for="check-option1">Query ID</label><br/>
<input type="checkbox" id="check-option2" value="name"
name="check" checked="true">
<label for="check-option2">Query Name</label><br/>
<input type="checkbox" id="check-option3" value="createdBy"
name="check" checked="true">
<label for="check-option3">Created By</label><br/>
</fieldset>
<fieldset class="radio" id="display-options">
<legend>Display as </legend>
<input type="radio" id="radio-option1" value="ordered"
name="radio" checked="true">
<label for="radio-option1">Ordered List</label><br/>
<input type="radio" id="radio-option2" value="unordered"
name="radio">
<label for="radio-option2">Unordered List</label><br/>
</fieldset>
<div class="multi-line-text-input">
<label>Comments</label>
<textarea></textarea>
</div>
</div>
</div>
Mostrar errores de validación debajo de un elemento de
formulario
Se recomienda proporcionar errores de validación por debajo de los elementos de
formulario pertinentes.
Para mostrar estos mensajes de forma coherente con los widgets
de primera entidad, agregue el siguiente fragmento de código en cada elemento de
formulario para el que desea mostrar el mensaje de error.
HTML
<span class="validation-error">
<span class="icon-error-exclamation"></span>
<span class="validation-error-text"></span>
</span>
El fragmento de código anterior tiene la visibilidad oculta de forma predeterminada.
Siempre que quiera mostrar un mensaje de error, busque el correspondiente
"validation-error-text", agréguele texto y establezca visibility:visible en su elemento
primario.
Ejemplo: hay un cuadro de texto simple en el que el usuario debe escribir una cadena.
Debe mostrar un mensaje de error si el cuadro de texto está vacío.
El html para esto sería:
HTML
<div class="widget-configuration">
<div class="single-line-text-input">
<label>Your name</label>
<input type="text">Type Here</input>
<span class="validation-error">
<span class="icon-error-exclamation"></span>
<span class="validation-error-text"></span>
</span>
</div>
</div>
Y el código de JavaScript subyacente sería:
JavaScript
var $singleLineInput = $(".single-line-text-input input");
var $errorSingleLineInput = $(".single-line-text-input input .validation-
error-text");
$singleLineInput.on("input", function(){
if ($singleLineInput.val() == ""){
$errorSingleLineInput.text("Please enter your name.");
$errorSingleLineInput.parent().css("visibility", "visible");
return;
$errorSingleLineInput.parent().css("visibility", "hidden");
});
Implementar contenido web en Azure
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Si la extensión no requiere ninguna lógica de back-end, considere la posibilidad de
hospedar el contenido estático directamente en Azure DevOps. Consulte el
hospedaje de contenido.
Después de crear una extensión, puede publicarla en Azure para que esté disponible en
la nube.
1. Si no tiene una suscripción de Azure, cree una.
Puede usar la evaluación gratuita .
2. Cree una aplicación web en Microsoft Azure para hospedar la extensión.
3. Publique el sitio web desde el Explorador de soluciones.
4. Publicar en Azure.
5. Seleccione la aplicación web que configuró para hospedar la extensión.
Si el sitio web no aparece, use el cuadro de diálogo Administrar suscripciones
para conectar la organización de Visual Studio a la suscripción de Microsoft Azure.
6. Publique la extensión.
7. Cambie el manifiesto de extensión para usar la aplicación web de Microsoft Azure
en lugar de localhost.
JSON
"baseUri": "https://fabrikam-vso-extensions.azurewebsites.net/",
8. Vuelva a instalar la extensión y pruébela.
Integración con enlaces de servicio
Artículo • 17/01/2023 • Tiempo de lectura: 5 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Los enlaces de servicio permiten ejecutar tareas en otros servicios cuando se producen
eventos en el proyecto en Azure DevOps.
Por ejemplo, puede crear una tarjeta en Trello cuando se crea un elemento de trabajo o
enviar una notificación push a los dispositivos móviles del equipo cuando se produce un
error en una compilación. También puede usar enlaces de servicio en aplicaciones y
servicios personalizados como una manera más eficaz de impulsar actividades cuando
se producen eventos en los proyectos.
¿Cómo funcionan los enlaces de servicio?
Los publicadores de enlaces de servicio definen un conjunto de eventos a los que puede
suscribirse.
Las suscripciones escuchan estos eventos y definen las acciones que se
deben realizar en función del evento.
Las suscripciones también tienen como destino los consumidores, que son servicios
externos que pueden ejecutar sus propias acciones cuando se producen eventos.
7 Nota
Los enlaces de servicio requieren permitir intervalos IP para la conexión entrante a
los puntos de conexión de servicio. El punto de conexión de servicio es el conjunto
de propiedades proporcionadas a un enlace de servicio. Para obtener más
información, consulte Listas de direcciones permitidas y conexiones de red,
direcciones IP y restricciones de intervalo.
Servicios disponibles
Los siguientes servicios están disponibles como destino de los enlaces de servicio. Para
más información sobre otras aplicaciones y servicios que se integran con Azure DevOps,
vaya a Visual Studio Marketplace .
Servicio Eventos admitidos Acciones admitidas
App Center Elemento de trabajo actualizado Enviar notificación
AppVeyor Código insertado Desencadenamiento de una
compilación de AppVeyor
Azuqua All Publicación del evento en FLO
Azure App Código insertado Implementación de una aplicación
Service web
Azure Service All Envío de un mensaje a un centro
Bus de notificaciones, una cola de
Service Bus o un tema de Service
Bus
Almacenamiento All Insertar un mensaje en una cola de
de Azure Storage
Bamboo Compilación completada, Código Poner en cola una compilación
insertado
Campfire All Publicar un mensaje en una sala
Datadog All Publicación de un evento en
Datadog
Grafana Implementación de versión completada Agregar anotación a la base de
datos de Grafana
HipChat (Ya no se admite)
HockeyApp Elemento de trabajo actualizado Enviar notificación
Jenkins Compilación completada, inserción de Desencadenamiento de
código, combinación de pr intentada, compilación genérica o de Git
implementación de versión completada
Microsoft Teams All Publicar un mensaje en un canal
MyGet Compilación completada, código Publicar el paquete NuGet en
insertado MyGet, desencadenar una
compilación de MyGet
Office 365 All Publicar un mensaje en un grupo
Servicio Eventos admitidos Acciones admitidas
Slack All Publicar un mensaje en un canal
Trello All Crear una tarjeta o una lista
UserVoice Elemento de trabajo creado o Envío de un evento de elemento
actualizado de trabajo vinculado
Web Hooks All Publicación a través de HTTP
Workplace All Envío de notificaciones
Message Apps
Zapier All Enviar notificación
Zendesk Elemento de trabajo comentado en Creación de un comentario
privado en un vale
una suscripción
Al integrar uno de estos servicios con Azure DevOps, debe crear una nueva suscripción.
En muchos casos, también debe realizar algún trabajo en el otro servicio. Para obtener
detalles específicos, consulte la información sobre el servicio que le interesa.
1. Abra la página de administración de un proyecto en el acceso web.
2. Ejecute el asistente para crear la suscripción.
3. Seleccione el servicio con el que desea realizar la integración.
4. Seleccione el evento en el que se desencadenará y los filtros aplicables.
5. Seleccione una acción para ejecutarse en el servicio de destino.
7 Nota
La lista de acciones disponibles puede limitarse en función del tipo de evento
seleccionado.
6. Para confirmar que la configuración es correcta, pruebe la suscripción y, a
continuación, finalice el asistente.
Preguntas más frecuentes
P: ¿Qué permisos necesito para configurar una
suscripción?
R: Editar suscripciones y Ver suscripciones. De forma predeterminada, solo los
administradores de proyectos tienen estos permisos. Para concederlos directamente a
otros usuarios, puede usar la herramienta de línea de comandos o la API rest de
seguridad .
P: ¿Cuáles son las implicaciones de seguridad de
conceder permisos editar suscripciones y Ver suscripciones
?
R: El usuario con estos permisos puede ver todas las suscripciones creadas en el
proyecto y el historial de notificaciones de esas suscripciones. Después, ese usuario
puede crear cualquier tipo de suscripción de enlace de servicio en ese proyecto. Si el
usuario configura una suscripción para un recurso al que no tiene permiso de acceso, la
suscripción no se desencadenará.
Por ejemplo: Si no tiene acceso a elementos de trabajo en la ruta de acceso de área XYZ
y configura una suscripción a los eventos de actualización de elementos de trabajo, no
recibirá notificaciones para actualizaciones de elementos de trabajo en la ruta de acceso
de área XYZ. Sin embargo, si otro usuario, que tiene acceso a los elementos de trabajo
de la ruta de acceso de área XYZ, recibe esos eventos de "actualización de elementos de
trabajo", podría ver el historial de notificaciones de los eventos del otro usuario, que
incluye datos de elementos de trabajo a los que no tiene acceso de otro modo.
P: ¿Puedo crear suscripciones de enlace de servicio para
un proyecto mediante programación?
R: Sí. Para más información, consulte Creación de una suscripción de enlaces de servicio.
P: ¿Puedo quitar el acceso de una aplicación a mi
organización después de haberla autorizado?
R: Sí. Puede revocar las autorizaciones del perfil.
1. Vaya a la página de perfil desde https://visualstudio.microsoft.com/ .
Asegúrese de empezar desde el sitio de Visual Studio
(https://visualstudio.microsoft.com/ ) en lugar de la organización
( https://dev.azure.com/{orgName} ) porque el perfil al que se accede desde la
organización le lleva a la implementación incorrecta de la característica de
administración de autorizaciones.
2. Administrar las autorizaciones.
3. Revoque las autorizaciones que ya no desee permitir.
P: ¿Por qué ya no se pueden configurar enlaces de
servicio para HipChat?
R: Atlassian eliminó oficialmente el soporte técnico para HipChat. Obtenga más
información sobre ese anuncio aquí .
Artículos relacionados
Solución de problemas de enlaces de servicio y preguntas más frecuentes
Visual Studio Marketplace
Información de facturación
Aplicaciones de mensajería del área de
trabajo
Artículo • 27/09/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Las siguientes integraciones ayudan a los usuarios a recibir notificaciones en respuesta a
eventos en Azure DevOps dentro de sus aplicaciones de mensajería del área de trabajo,
como Microsoft Teams y Slack .
Junto con la recepción de notificaciones, las integraciones siguientes también ayudan a
los usuarios a completar flujos de trabajo en Azure DevOps, como permitir a los
usuarios aprobar implementaciones de versiones y crear elementos de trabajo desde sus
canales. Estas aplicaciones solo se pueden usar con un proyecto hospedado en Azure
DevOps Services.
Microsoft Teams
Azure Boards aplicación para Microsoft Teams
Aplicación Azure Pipelines para Microsoft Teams
aplicación de Azure Repos para Microsoft Teams
Slack
Azure Boards aplicación para Slack
Aplicación de Azure Pipelines para Slack
Azure Repos aplicación para Slack
Creación de un enlace de servicio para
Azure DevOps con Grafana
Artículo • 27/09/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019
Grafana es un panel de métricas con características y un editor de gráficos de código
abierto. Admite los servicios de análisis Graphite, Elasticsearch, OpenTSDB, Prometheus
y InfluxDB. Use el enlace de servicio de Grafana para anotar los paneles de Grafana al
finalizar las implementaciones de Azure Pipelines.
Creación de una suscripción de enlace de
servicio
1. Vaya a la configuración del proyecto:
https://dev.azure.com/{orgName}/{project_name}/_settings/serviceHooks
Seleccione Crear suscripción.
2. Elija Grafana entre la lista de servicios y elija Siguiente.
3. Para el evento De implementación de versión completada, configure los filtros
opcionales: Nombre de canalización de versión, Nombre de fase y Estado
4. Proporcione la dirección URL de Grafana y el token de API de Grafana necesarios
para que Azure DevOps publique anotaciones.
Si comprueba la ventana Annotate deployment duration (Anotar duración
de la implementación), la anotación agregada corresponde a la duración de
la implementación (marcas de tiempo de inicio y finalización de la
implementación).
Si no está activada, la anotación corresponde solo a la marca de tiempo de
finalización de la implementación. La entrada del panel se puede usar para
elegir un panel específico como destino de anotaciones en lugar del
comportamiento predeterminado de anotar todos los paneles.
5. Elija Probar para comprobar que Azure DevOps puede usar la configuración
proporcionada y crear correctamente una suscripción.
6. Una vez comprobado, elija Finalizar para completar la creación de la suscripción.
Creación de un enlace de servicio para
Azure DevOps con Slack
Artículo • 27/09/2022 • Tiempo de lectura: 3 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Publique mensajes en Slack en respuesta a eventos de la organización de Azure
DevOps, como compilaciones completadas, cambios de código, solicitudes de
incorporación de cambios, versiones, cambios en los elementos de trabajo, etc.
7 Nota
Para Azure DevOps Services, se recomienda usar el siguiente conjunto de
aplicaciones que ofrecen características enriquecidas para integrarse con Slack.
Azure Boards aplicación para Slack
Azure Boards aplicación para Slack ayuda a crear y supervisar fácilmente elementos de
trabajo desde los canales de Slack.
Los usuarios pueden crear elementos de trabajo
mediante un comando de barra diagonal o usar acciones de mensaje para convertir
conversaciones en el canal en elementos de trabajo.
Los usuarios también pueden
configurar y administrar suscripciones para obtener notificaciones en su canal siempre
que se creen o actualicen los elementos de trabajo.
Aplicación de Azure Pipelines para Slack
La aplicación Azure Pipelines para Slack ayuda a supervisar fácilmente los eventos de las
canalizaciones. Los usuarios pueden configurar y administrar suscripciones para
compilaciones, versiones, aprobaciones pendientes y mucho más desde la aplicación y
obtener notificaciones para estos eventos en sus canales. Los usuarios también pueden
aprobar implementaciones de versiones desde sus canales.
Azure Repos aplicación para Slack
Azure Repos aplicación para Slack ayuda a supervisar fácilmente los eventos de los
repositorios. Los usuarios pueden configurar y administrar suscripciones para
confirmaciones de código, creación de solicitudes de incorporación de cambios y
actualizaciones de solicitudes de incorporación de cambios, etc. desde la aplicación y
obtener notificaciones para estos eventos en sus canales.
Creación de una aplicación personalizada en
Slack
1. Consulte la documentación de Slack, Envío de mensajes mediante webhooks
entrantes para comprender el proceso de uso de webhooks para insertar
información en un canal de Slack.
2. Creación de una nueva aplicación de Slack Creación de
3. Activar webhook entrante y agregar un nuevo webhook al área de trabajo
4. Seleccione el canal para el que se debe crear webhook.
5. Copie la dirección URL del webhook y vaya a Azure DevOps.
Creación de una suscripción de enlace de
servicio en su organización
1. Vaya a la página Service Hooks del proyecto:
https://{orgName}/{project_name}/_settings/serviceHooks
Seleccione Crear suscripción.
2. Elija los tipos de eventos que desea que aparezcan en el canal de Slack.
Puede filtrar cada uno de los desencadenadores de maneras específicas.
Por
ejemplo, el desencadenador creado por la solicitud de incorporación de
cambios se puede filtrar en el repositorio en el que se produce la solicitud de
incorporación de cambios, la rama de destino a la que se aplica y los
miembros del equipo que son necesarios o invitados a revisar la solicitud.
3. Pegue la dirección URL del webhook de la integración de Slack que creó y
seleccione Finalizar.
4. Ahora, cuando se produce el evento que configuró en el proyecto, aparece una
notificación en el canal de Slack del equipo.
Preguntas y respuestas
P: ¿Por qué no tengo los eventos de solicitud de incorporación de
cambios como opción al configurar el desencadenador?
R: Las solicitudes de incorporación de cambios solo están disponibles con proyectos que
usan Git.
Si el proyecto usa TFVC, los desencadenadores de eventos de extracción no
están disponibles y el evento de código se denomina "Código protegido" en lugar de
"Código insertado".
P: ¿Cómo puedo obtener varios eventos para aparecer en mi canal
de Slack?
R: Cree una nueva suscripción para cada tipo de evento que desee.
Por ejemplo, si
quiere ver errores de compilación y nuevos elementos de trabajo en el canal de Slack,
cree dos suscripciones adicionales.
Creación de un enlace de servicio para
Azure DevOps con Jenkins
Artículo • 27/09/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Si usa Jenkins para compilar las aplicaciones, puede almacenar el código en Azure
DevOps y seguir usando Jenkins para las compilaciones de integración continua.
Puede
desencadenar una compilación de Jenkins al insertar código en el repositorio de Git del
proyecto o al proteger el código en el control de versiones de Team Foundation.
) Importante
Azure DevOps ya no admite la autenticación de credenciales alternativas desde el 2
de marzo de 2020. Si sigue usando credenciales alternativas, le recomendamos
encarecidamente que cambie a un método de autenticación más seguro (por
ejemplo, tokens de acceso personal). Más información .
Configuración de Jenkins
1. Si aún no lo ha hecho, configure un servidor Jenkins .
2. Si va a configurar Jenkins localmente, habilite HTTPS .
Configuración de una compilación de Jenkins
1. En Jenkins, cree un nuevo elemento.
2. Cree el tipo de compilación adecuado para el proyecto.
3. Establezca la dirección URL del repositorio de Git en Azure DevOps Services.
La
dirección URL tiene el formato
https://dev.azure.com/{orgName}/DefaultCollection/_git/{projectName} .
Desencadenador de Jenkins
1. Vaya a la página Service Hooks del proyecto:
https://{orgName}/{project_name}/_settings/serviceHooks
Seleccione Crear suscripción.
2. Agregue Jenkins.
3. Elija el evento de Azure DevOps Services que desea desencadenar una compilación
de Jenkins.
4. Configure la acción que se va a realizar en Jenkins.
Ahora, cuando se produce ese evento en Azure DevOps Services, se desencadena la
compilación de Jenkins.
Precios
Azure DevOps Services no cobra por el marco para la integración con servicios externos.
Consulte el sitio del servicio específico para conocer los precios relacionados con sus
servicios.
Preguntas y respuestas
P: ¿Puedo compilar parte de mi aplicación en Azure DevOps
Services y parte en Jenkins?
R: Sí. Puede desencadenar una compilación de Jenkins cuando se complete la
compilación de Azure DevOps Services para que use ambos sistemas para compilar la
aplicación.
P: ¿Puedo crear suscripciones mediante programación?
R: Sí, use las API REST.
Creación de un enlace de servicio para
Azure DevOps Services y TFS con Trello
Artículo • 27/09/2022 • Tiempo de lectura: 4 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Cree tarjetas y listas en Trello en respuesta a eventos de Azure DevOps.
Por ejemplo,
cuando se inserta código o se produce una compilación.
Obtención de un token de autorización de
Trello
1. Si no tiene una cuenta de Trello, regístrese en Trello .
2. Vaya a la página Autorizar Azure DevOps Services para Trello e inicie sesión con
sus credenciales de Trello.
3. Permita que Azure DevOps use su cuenta de Trello.
4. Copie el token de autorización.
Cree una tarjeta o lista de Trello a partir de un evento de Azure DevOps Services.
1. Vaya a la página Service Hooks del proyecto:
https://{orgName}/{project_name}/_settings/serviceHooks
Seleccione Crear suscripción.
2. Elija el servicio trello.
3. Configure el evento desencadenador de Visual Studio. En este caso, vamos a hacer
que la suscripción responda cuando se cree un elemento de trabajo.
4. Configure la acción que Trello realizará en respuesta al desencadenador: cree una
tarjeta o una lista.
Puede usar marcadores de posición para insertar contenido del evento en el
nombre y la descripción de las tarjetas o listas que crea la suscripción.
Por ejemplo,
cuando ejecutamos la notificación de prueba, la tarjeta que se crea se denomina
"Bug #5: Some great new idea!" porque el elemento de trabajo de prueba es un
error (ID=5) con el título "Some great new idea!".
5. Pruebe la suscripción del enlace de servicio y finalice el asistente.
Ahora está configurado. Ve a Trello y ve que aparecen las tarjetas.
Marcadores de posición
Puede insertar marcadores de posición en el nombre de una lista o el nombre o la
descripción de una tarjeta que va a crear la suscripción.
Cuando se crea una lista o
tarjeta, los marcadores de posición se reemplazarán por valores del evento que se
generó.
En el ejemplo que usamos para el nombre de tarjeta de esta página se usa:
{{workitem.workItemType}} #{{workitem.id}}: {{workitem.title}}
Por lo tanto, cuando se crea un error con el id. 5 y el título "Some great new idea!", el
nombre de la tarjeta es "Bug #5: Some great new idea!".
La forma básica del marcador de posición es {{resource.field}} donde el recurso es el
nombre del recurso que genera el evento (elemento de trabajo, compilación, etc.) y el
campo es un campo dentro de la sección de recursos del evento, como el identificador.
Por lo tanto, si la suscripción es para una compilación completada, podría ser algo
parecido a
Build {{build.id}} completed at {{build.finishTime}}
Donde build es el nombre del recurso y el identificador, finishTime son los campos
disponibles en este recurso. Para comprender los tipos de eventos, los campos y los
recursos disponibles para su uso, examine la referencia de eventos.
Campos de elementos de trabajo
Los campos de elemento de trabajo aparecen en el evento de la matriz fields, como en
este ejemplo:
" fields": {
" System.AreaPath": "Fabrikam-Fiber-Git",
" System.TeamProject": "Fabrikam-Fiber-Git",
" System.IterationPath": "Fabrikam-Fiber-Git",
" System.WorkItemType": "Product Backlog Item",
" System.State": "New",
" System.Reason": "New backlog item",
" System.CreatedDate": "2014-11-05T21:11:28.85Z",
" System.CreatedBy": "Normal Paulk",
" System.ChangedDate": "2014-11-05T21:11:29.23Z",
" System.ChangedBy": "Normal Paulk",
" System.Title": "Test PBI",
" Microsoft.Azure DevOps Services.Common.BacklogPriority":
999999999,
" WEF_6CB513B6E70E43499D9FC94E5BBFB784_Kanban.Column": "New"
},
Trabajando directamente desde la definición de evento, habríamos creado nuestro
nombre de tarjeta como este ejemplo:
{{workitem.fields["System.workItemType"]}} #
{{workitem.fields["System.id"]}: {{workitem.fields["System.title"]}}
Como acceso directo, puede hacer referencia a cualquier campo del sistema o Microsoft.
Azure DevOps Services. Espacios de nombres comunes como si fueran campos del
recurso.
De esta forma, {{workitem.fields["System.workItemType"]}} se convierte en
{{workitem.workItemType}} .
Expresiones de marcador de posición
Estos marcadores de posición usan una implementación de plantillas de
controladores que es muy compatible con Mustache .
Algunas expresiones útiles
incluyen
Tipo de expresión ejemplos
expresiones básicas {{workitem.name}}
expresiones de matriz {{pullRequest.reviewers.[0].displayName}}
Secciones de bigote {{#workitem.assignedTo}} Se asigna esta wi-fi
{{/workitem.assignedTo}}
Secciones invertidas de bigote {{^workitem.assignedTo}} Esta WI no está asignada
{{/workitem.assignedTo}}
Asistentes de bloques de con
controladores if/else
Salvo
Cada
Rutas de acceso de ...
controladores this
Por ejemplo, {{../comment/id}} o {{this/title}} .
Comentarios de plantilla {{!-- this is a handlebar comment --}}
Precios
Azure DevOps no cobra por el marco para la integración con servicios externos.
Consulte el sitio del servicio específico para conocer los precios relacionados con sus
servicios.
Preguntas y respuestas
P: ¿Puedo crear suscripciones mediante programación?
R: Sí, consulte los detalles aquí.
P: ¿Puedo obtener más información sobre Trello?
R: Sí, trello.com .
Creación de un enlace de servicio para
Azure DevOps con Datadog
Artículo • 27/09/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019
Aprenda a crear eventos y métricas en Datadog en respuesta a eventos de Azure
DevOps. Use estas métricas y eventos en Datadog para crear paneles, solucionar
problemas y crear monitores para avisarle de problemas críticos. Datadog acepta todos
los tipos de eventos de Azure DevOps.
) Importante
Es posible que la característica Datadog no esté activada de forma predeterminada
para Azure DevOps Server 2019 y 2020. Se trata de un problema conocido. Hasta
que se resuelva, puede usar el siguiente comando SQL en la base de datos de
configuración para activar la característica: exec prc_SetRegistryValue 1,
'#\FeatureAvailability\Entries\ServiceHooks.Consumers.datadog\AvailabilityStat
e\', 1
Requisitos previos
1. Debe tener permisos Editar suscripciones y Ver suscripciones . De forma
predeterminada, solo los administradores de proyectos tienen estos permisos. Para
conceder los permisos a otros usuarios, puede usar la herramienta de línea de
comandos o la API rest de seguridad .
2. Si no tiene una cuenta de Datadog, empiece a trabajar con Datadog .
a. En la
aplicación Datadog, vaya a Integrations > API .
b. Cree una nueva clave o
seleccione una existente y, a continuación, copie la clave en el Portapapeles.
Empezar a enviar eventos de Azure DevOps a
Datadog
1. Vaya a Configuración> del proyectoEnlaces de servicio:
https://{orgName}/{project_name}/_settings/serviceHooks .
2. Seleccione Crear suscripción.
3. Elija Datadog entre la lista de servicios y, a continuación, elija Siguiente.
4. Seleccione un evento en el que se desencadenará, configure los filtros y, a
continuación, seleccione Siguiente.
5. Configure la acción que se va a realizar.
Pegue (ctrl+v) la clave de API de Datadog en el campo necesario.
Indique si su cuenta de Datadog es DE EE. UU. o UE.
6. Elija Probar para comprobar que Azure DevOps puede usar la configuración
proporcionada y crear correctamente una suscripción.
7. Una vez comprobado, elija Finalizar para completar la creación de la suscripción.
8. Repita los pasos del 2 al 7 para cada tipo de evento que quiera enviar a Datadog.
Datadog acepta y anima a los usuarios a enviar todos los tipos de eventos.
9. Vaya a Datadog para ver los eventos y las métricas que empiezan a fluir en su
entorno.
Preguntas más frecuentes
P: ¿Puedo crear suscripciones de enlace de servicio
mediante programación?
R: Sí. Para obtener más información, consulte Creación de una suscripción de enlaces de
servicio mediante programación. Envíe a cualquiera de los siguientes puntos de
conexión de Datadog:
Nos: https://app.datadoghq.com/intake/webhook/azuredevops?api_key=<API_KEY>
Ue: https://app.datadoghq.eu/intake/webhook/azuredevops?api_key=<API_KEY>
US3: https://us3.datadoghq.com/intake/webhook/azuredevops?api_key=<API_KEY>
Gov: https://app.ddog-gov.com/intake/webhook/azuredevops?api_key=<API_KEY>
P: ¿Cómo puedo usar estos eventos en Datadog?
R: Los eventos de Azure DevOps que se envían a Datadog son útiles para crear paneles,
configurar monitores y buscar correlaciones durante la solución de problemas. También
puede usarlos para obtener información sobre cómo los procesos de operaciones de
desarrollador afectan al rendimiento de la aplicación.
P: ¿Qué tipos de eventos puedo enviar a Datadog?
R: Datadog acepta todos los tipos de eventos.
P: ¿Puedo obtener más información general sobre
Datadog?
R: Sí, consulte datadoghq.com .
Creación de un enlace de servicio para
Azure DevOps con Microsoft Teams
Artículo • 27/09/2022 • Tiempo de lectura: 3 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Vea la actividad sobre los proyectos de Azure DevOps Server (2017.2 y versiones
posteriores) directamente en el canal de Microsoft Teams, por ejemplo:
Actualizaciones de elementos de trabajo
Solicitudes de incorporación de cambios
Confirmaciones de código
Compilaciones
Implementaciones y aprobaciones de versión
7 Nota
Para Azure DevOps Services, se recomienda usar el siguiente conjunto de
aplicaciones que ofrecen características enriquecidas para integrarse con Microsoft
Teams.
Azure Boards aplicación para Teams
Azure Boards aplicación para Microsoft Teams ayuda a crear y supervisar fácilmente
elementos de trabajo desde los canales de Teams. Los usuarios pueden crear elementos
de trabajo mediante un comando o usar acciones de mensaje para convertir
conversaciones en el canal en elementos de trabajo. Los usuarios también pueden
configurar y administrar suscripciones para obtener notificaciones en su canal siempre
que se creen o actualicen los elementos de trabajo.
Aplicación Azure Pipelines para Teams
La aplicación Azure Pipelines para Microsoft Teams ayuda a supervisar fácilmente los
eventos de las canalizaciones. Los usuarios pueden configurar y administrar
suscripciones para compilaciones, versiones, aprobaciones pendientes y mucho más
desde la aplicación y obtener notificaciones para estos eventos en sus canales. Los
usuarios también pueden aprobar las implementaciones de lanzamiento desde sus
canales.
aplicación de Azure Repos para Teams
Azure Repos aplicación para Microsoft Teams ayuda a supervisar fácilmente los eventos
de los repositorios. Los usuarios pueden configurar y administrar suscripciones para
confirmaciones de código, creación de pr y actualizaciones de PR, etc. desde la
aplicación y recibir notificaciones para estos eventos en sus canales.
Configuración de un nuevo conector para
Azure DevOps Server
La configuración de la integración entre Azure DevOps Server y Teams es un proceso de
dos pasos. En primer lugar, configure un conector en Teams y, a continuación, configure
una o varias suscripciones de enlace de servicio en el proyecto de Azure DevOps Server.
7 Nota
Los permisos de administrador del proyecto son necesarios para crear
suscripciones de enlace de servicio.
No se admiten eventos para canalizaciones
YAML.
Desde Teams
1. Para traer eventos de Azure DevOps a Microsoft Teams, seleccione "...", los puntos
suspensivos o, en la navegación superior del canal de equipo, seleccione
Conectores.
2. Seleccione Azure DevOps en la lista.
3. Haga clic en Agregar.
4. Configure el conector.
5. Copie la dirección URL del webhook generada. Proporcione esta dirección URL al
configurar suscripciones de enlace de servicio en el proyecto de Azure DevOps.
Desde Azure DevOps Server
1. En la página del proyecto ( https://mycompany/tfs/[collection]/[project] ), vaya a
Enlaces de servicio en la configuración:
2. Haga clic en Crear suscripción y seleccione el servicio teams .
3. Elija el tipo de actividad que desea que aparezca en el canal de Teams. Puede filtrar
cada uno de los desencadenadores de maneras específicas.
Por ejemplo, el desencadenador creado de la solicitud de incorporación de cambios
se puede filtrar en el repositorio en el que se produce la solicitud de incorporación
de cambios, la rama de destino a la que se aplica y los miembros del equipo
necesarios o invitados a revisar la solicitud.
4. Pegue la dirección URL del webhook en el paso de configuración del conector de
Teams y seleccione Finalizar.
La actividad del proyecto comienza a aparecer en el canal de Teams.
Configuración de pestañas de Azure DevOps en
Microsoft Teams
1. Para incorporar el panel kanban o el panel a Microsoft Teams, seleccione +
Agregar nueva pestaña en la parte superior del canal de equipo. Busque el icono
sitio web y agregue el vínculo al panel o panel de Azure DevOps.
2. Una vez que se haya autenticado, aparecerá el panel kanban o el panel.
Preguntas más frecuentes (P+F)
P: ¿Cómo puedo obtener varios eventos de mi proyecto
de Azure DevOps Server para mostrarse en mi canal de
Teams?
R: Cree una nueva suscripción para cada tipo de evento que desee.
Por ejemplo, si
quiere ver errores de compilación y nuevos elementos de trabajo en el canal de Teams,
cree dos suscripciones adicionales.
P: ¿Por qué no veo mi organización al intentar conectar
Microsoft Teams?
R: Solo las organizaciones del mismo inquilino de Azure Active Directory que la cuenta
de Microsoft Teams se pueden conectar. Incluso si la dirección de correo electrónico es
la misma para Azure DevOps Services y Microsoft Teams, pueden estar respaldadas por
distintos inquilinos, por lo que no se pueden vincular.
Cree un equipo en la misma instancia de Azure Active Directory (Azure AD) que Azure
DevOps Services o mueva el Azure DevOps Services a la misma instancia de Azure AD
que Teams, consulte Preguntas más frecuentes sobre el acceso a través de Azure AD,
¿por qué mi organización ya está conectada a un directorio?.
webhooks
Artículo • 27/09/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Los webhooks proporcionan una manera de enviar una representación JSON de un
evento a cualquier servicio. Todo lo que se requiere es un punto de conexión público
(HTTP o HTTPS).
Para obtener más información sobre las cargas JSON publicadas por este consumidor,
consulte eventos.
Requisitos previos
Solo los propietarios de la organización o los administradores de colecciones de
proyectos pueden administrar webhooks para una organización.
Envío de representación JSON a un servicio
1. Vaya a la página Enlaces de servicio del proyecto:
https://{orgName}/{project_name}/_settings/serviceHooks
Seleccione Crear suscripción.
2. Seleccione y configure el evento Azure DevOps Services:
3. Configure qué hacer cuando se produzca el evento:
Consulte la siguiente Q & A para obtener información sobre los detalles del
recurso que se van a enviar, los mensajes que se van a enviar y los mensajes
detallados para enviar la configuración.
4. Pruebe la suscripción de enlace de servicio y finalice el asistente:
Ahora se ha configurado el webhook. Vaya al servicio de destino para ver la
representación JSON:
Precios
Azure DevOps no cobra por el marco de trabajo para la integración con servicios
externos. Consulte el sitio del servicio específico para conocer los precios relacionados
con sus servicios.
Preguntas y respuestas
P: ¿Cuáles son los detalles del recurso que se van a enviar, los
mensajes que se van a enviar y los mensajes detallados para los
que se va a enviar la configuración?
R: Controlan el tamaño de la carga JSON que se envía.
Los detalles del recurso que se van a enviar controlan la cantidad de recursos que se
envía.
El valor predeterminado es All, pero también puede elegir enviar Mínimo (solo
envía campos clave como URL e ID) o Ninguno.
Ninguno y Mínimo son útiles en escenarios en los que el autor de la llamada realmente
no necesita mucho, si hay algo, sobre el recurso porque se basa en el mensaje o en el
mensaje detallado.
Ninguno y Mínimo también son útiles por motivos de seguridad,
por ejemplo, el autor de la llamada debe volver a llamar a Azure DevOps Services y
pasar por comprobaciones normales de seguridad y permisos para obtener más detalles
sobre el recurso.
Ejemplo de JSON:
JSON
"eventType": "git.push",
...
"messages": {
"text": "...",
"html": "...",
"markdown": "..."
},
"detailedMessage": {
"text": "...",
"html": "...",
"markdown": "..."
},
"resource": {
"id": "...",
"url": "https://...",
"name": "...",
"field1:": "..."
P: ¿Puedo crear suscripciones mediante programación?
Un: Sí, consulte los detalles aquí.
P: ¿Puedo enviar webhooks a puntos de conexión que no son
HTTPS?
R: Sí. Sin embargo, se recomienda usar solo puntos de conexión HTTPS para los
webhooks. El uso de HTTP significa que existe la posibilidad de enviar datos privados sin
cifrar. Esto incluye los encabezados de autenticación del webhook.
P: ¿Puedo usar la autenticación básica al configurar un webhook
que no sea HTTPS?
R: No. Debe usar HTTPS al usar la autenticación básica en un webhook.
P: ¿Podemos usar localhost o direcciones IP de intervalo especiales
como destinos de webhook?
A. No. Los webhooks no pueden tener como destino localhost (bucle invertido) ni
direcciones IPv6 / de intervalo especial.
Administración de la autorización de
servicios para acceder a Azure DevOps
Artículo • 27/09/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Cuando se usa un servicio integrado con Azure DevOps, se usa el marco de autorización
de OAuth 2.0 estándar del sector para proporcionar acceso seguro y seguro a los
recursos por parte de esos otros servicios.
Con OAuth, se concede a un servicio la
autorización para acceder a los recursos de Azure DevOps Services, como elementos de
trabajo, código fuente, resultados de compilación.
Las autorizaciones están enlazadas a sus credenciales, por lo que el servicio puede
usar la autorización para acceder a los recursos de Azure DevOps a los que tiene
acceso.
Use su cuenta Microsoft (como me@live.com ) o su cuenta profesional (su cuenta en
Azure AD, como me@my-workplace.com ) para autorizar el servicio.
El servicio que autoriza nunca tiene acceso a las credenciales de Azure DevOps.
Revoque las autorizaciones que haya concedido a otros servicios.
Autorización de un servicio
Un flujo de autorización típico podría ser similar al siguiente:
1. Está usando un servicio que usa Azure DevOps Services recursos, por lo que el
servicio solicita autorización.
2. Si aún no ha iniciado sesión, Azure DevOps Services le pedirá sus credenciales.
3. Una vez que haya iniciado sesión, obtendrá la página de aprobación de
autorización.
En este momento, los servicios solo pueden solicitar acceso total a todos los
recursos que están disponibles a través de las API rest, por lo que no se sorprenda
de que la solicitud de autorización no sea más específica.
4. Revise la solicitud y apruebe la autorización.
5. El servicio autorizado usa esa autorización para acceder a los recursos de la cuenta
de Visual Studio.
Para asegurarse de que una solicitud de autorización es legítima:
Busque el Azure DevOps Services personalización de marca en la parte superior de
la página de aprobación de autorización.
Asegúrese de que la dirección URL de la página de aprobación de autorización
comienza por https://app.vssps.visualstudio.com/ .
Preste atención a las advertencias de seguridad relacionadas con HTTPS en el
explorador.
Recuerde que otros servicios no solicitan sus credenciales directamente. Permiten
proporcionarles Azure DevOps Services a través de la página de aprobación de
autorización.
Administrar autorizaciones
Para ver los servicios que ha autorizado para acceder a su cuenta, vaya a
https://app.vssps.visualstudio.com/Profile/View y siga el vínculo Administrar
autorizaciones .
Puede revocar las autorizaciones aquí y el servicio ya no puede acceder a su cuenta en
su nombre.
Consumidores de enlace de servicio
para Azure DevOps Services
Artículo • 27/09/2022 • Tiempo de lectura: 15 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Use consumidores de enlace de servicio para crear una suscripción mediante
programación. La suscripción especifica el evento, el consumidor y la acción.
Seleccione
el consumidor que desea usar en la suscripción de los siguientes consumidores:
Azure Service Bus
Almacenamiento de Azure
Campfire
Flowdock
HipChat
Jenkins
Kato
Trello
Web Hooks
Zendesk
Azure Service Bus
Proporciona integración con Microsoft Azure Service Bus, incluidos Notification Hubs.
Enviar un mensaje a un centro de notificaciones
Esta acción envía una notificación genérica de plantilla al Centro de notificaciones de
Azure especificado. Más información.
Id. de consumidor: azureServiceBus
Id. de acción: serviceBusNotificationHubSend
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
connectionString
Cadena de conexión de SAS
Cadena de conexión saS (firma de acceso compartido) que se va a usar para
conectarse con Azure Service Bus. Esta cadena de conexión está disponible
en el Azure Portal.
Tipo de datos: cadena
Obligatorio: Sí
notificationHubName
Nombre de centro de notificaciones
Nombre del centro de notificaciones al que se va a enviar la notificación. El
nombre solo puede contener letras, números, puntos, guiones, barras
diagonales y caracteres de subrayado. debe empezar y terminar con una letra
o un número. El centro ya debe existir.
Tipo de datos: cadena
Obligatorio: Sí
tagsExpression
Etiquetas
Expresión de etiquetas (para establecer como destino conjuntos específicos
de dispositivos). Más información.
Tipo de datos: cadena
Obligatorio: No
Envío de un mensaje a una cola de Service Bus
Esta acción envía una representación de cadena JSON del evento a la cola de Azure
Service Bus especificada. Para más información, consulte Colas, temas y suscripciones de
Service Bus.
Id. de consumidor: azureServiceBus
Id. de acción: serviceBusQueueSend
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
connectionString
Cadena de conexión de SAS
Cadena de conexión saS (firma de acceso compartido) que se va a usar para
conectarse con Azure Service Bus. Esta cadena de conexión está disponible
en el Azure Portal.
Tipo de datos: cadena
Obligatorio: Sí
queueName
Nombre de la cola
Nombre de la cola a la que se va a enviar el mensaje. El nombre solo puede
contener letras, números, puntos, guiones, barras diagonales y caracteres de
subrayado. debe empezar y terminar con una letra o un número. Si la cola no
existe, se crea si la cadena de conexión especificada tiene los permisos
necesarios.
Tipo de datos: cadena
Obligatorio: Sí
resourceDetailsToSend
Detalles del recurso que se van a enviar
Controlar los campos de recursos que se van a enviar
Tipo de datos: cadena
Obligatorio: No
messagesToSend
Mensajes que se van a enviar
Controlar los mensajes que se van a enviar
Tipo de datos: cadena
Obligatorio: No
detailedMessagesToSend
Mensajes detallados que se van a enviar
Controlar los mensajes detallados que se van a enviar
Tipo de datos: cadena
Obligatorio: No
Envío de un mensaje a un tema de Service Bus
Esta acción envía una representación de cadena JSON del evento al tema de Azure
Service Bus especificado. Para más información, consulte Uso de la Azure Portal para
crear un tema y suscripciones de Service Bus al tema.
Id. de consumidor: azureServiceBus
Id. de acción: serviceBusTopicSend
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
connectionString
Cadena de conexión de SAS
Cadena de conexión saS (firma de acceso compartido) que se va a usar para
conectarse con Azure Service Bus. Esta cadena de conexión está disponible
en el Azure Portal.
Tipo de datos: cadena
Obligatorio: Sí
topicName
Nombre del tema
Nombre del tema al que se va a enviar el mensaje. El nombre solo puede
contener letras, números, puntos, guiones, barras diagonales y caracteres de
subrayado. debe empezar y terminar con una letra o un número. Si el tema
no existe, se crea si la cadena de conexión especificada tiene los permisos
necesarios.
Tipo de datos: cadena
Obligatorio: Sí
resourceDetailsToSend
Detalles del recurso que se van a enviar
Controlar los campos de recursos que se van a enviar
Tipo de datos: cadena
Obligatorio: No
messagesToSend
Mensajes que se van a enviar
Controlar los mensajes que se van a enviar
Tipo de datos: cadena
Obligatorio: No
detailedMessagesToSend
Mensajes detallados que se van a enviar
Controlar los mensajes detallados que se van a enviar
Tipo de datos: cadena
Obligatorio: No
Azure Storage
Proporciona integración con Microsoft Azure Storage.
Insertar un mensaje en una cola de Storage
Esta acción inserta una representación de cadena JSON del evento en la cola de Azure
Storage especificada. Para más información, consulte ¿Qué son las colas de Azure?
Identificador de consumidor: azureStorageQueue
Id. de acción: puesta en cola
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
accountName
Nombre de la cuenta de almacenamiento
Nombre asociado a la cuenta de almacenamiento de Azure (por ejemplo,
https://STORAGE_ACCOUNT_NAME.queue.core.windows.net ).
Tipo de datos: cadena
Obligatorio: Sí
accountKey
Clave de cuenta de almacenamiento
Clave asociada a la cuenta de Almacenamiento de Azure.
Tipo de datos: cadena
Obligatorio: Sí
queueName
Nombre de la cola
Nombre de solo minúsculas de la cola que se va a usar en Azure Storage. Se
crea una cola por este nombre si aún no existe.
Tipo de datos: cadena
Obligatorio: Sí
visiTimeout
Tiempo de espera de visibilidad de mensajes (en segundos)
Especifica el valor de tiempo de espera de visibilidad, en segundos, para el
mensaje en cola, en relación con la hora del servidor. El valor debe ser mayor
o igual que 0 y no puede ser mayor que 7 días o 604 800 segundos. El
tiempo de espera de visibilidad debe establecerse en un valor menor que el
valor de período de vida del mensaje.
Tipo de datos: número
Obligatorio: Sí
ttl
Período de vida del mensaje (en segundos)
Especifica el intervalo de tiempo de vida para el mensaje de cola, en
segundos. El período máximo de vida permitido es de 7 días o 604 800
segundos.
Tipo de datos: número
Obligatorio: Sí
resourceDetailsToSend
Detalles del recurso que se van a enviar
Controlar los campos de recursos que se van a enviar
Tipo de datos: cadena
Obligatorio: No
messagesToSend
Mensajes que se van a enviar
Controlar los mensajes que se van a enviar
Tipo de datos: cadena
Obligatorio: No
detailedMessagesToSend
Mensajes detallados que se van a enviar
Controlar los mensajes detallados que se van a enviar
Tipo de datos: cadena
Obligatorio: No
Campfire
Campfire es similar a la mensajería instantánea, pero diseñada exclusivamente para
grupos.
Publicar un mensaje en una sala
Publique un mensaje sobre el evento en una sala en Campfire. Para más información,
consulte Campfire .
Id. de consumidor: campfire
Id. de acción: postMessageToRoom
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
accountName
Nombre de cuenta
Nombre de cuenta como https://{account name}.campfirenow.com
Tipo de datos: cadena
Obligatorio: Sí
authToken
Token de autenticación de API
Token de autenticación de API para el usuario desde el que se publican los
mensajes. Puede obtener este token visitando la página de perfil de usuario
en Campfire.
Tipo de datos: cadena
Obligatorio: Sí
roomId
Sala
Espacio en el que se va a publicar el mensaje.
Tipo de datos: número
Obligatorio: Sí
showDetails
Enviar un mensaje detallado
Publique un mensaje breve o detallado sobre el evento.
Tipo de datos: booleano
Obligatorio: No
Flowdock
Flowdock es chat y bandeja de entrada para los equipos.
Publicar un mensaje en un chat de equipo
Publique un mensaje sobre el evento en un chat de equipo en Flowdock.
Id. de consumidor: flowdock
Id. de acción: postMessageToChat
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
flowAPIToken
Token de LA API de Flow
Token de autorización para publicar mensajes en una bandeja de entrada de
equipo o en un chat de grupo. Puede obtener el token de API de flujo de
Flowdock (configuración de la cuenta).
Tipo de datos: cadena
Obligatorio: Sí
flowName
Nombre de flujo
Nombre de flujo tal y como se muestra en Flowdock
Tipo de datos: cadena
Obligatorio: No
showDetails
Enviar un mensaje detallado
Publique un mensaje breve o detallado sobre el evento.
Tipo de datos: booleano
Obligatorio: No
externalUserName
Nombre de usuario del remitente
Nombre del "usuario" que envía el mensaje.
Tipo de datos: cadena
Obligatorio: Sí
etiquetas
Etiquetas
Lista de etiquetas que se van a agregar al mensaje (separados por comas).
Las etiquetas de usuario deben empezar por '@'. Opcionalmente, los
hashtags se pueden prefijar con "#". Las etiquetas no distinguen mayúsculas
de minúsculas.
Tipo de datos: cadena
Obligatorio: No
Publicar un mensaje en una bandeja de entrada de
equipo
Publique un mensaje sobre el evento en una bandeja de entrada de equipo en
Flowdock.
Id. de consumidor: flowdock
Id. de acción: postMessageToTeamInbox
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
flowAPIToken
Token de LA API de Flow
Token de autorización para publicar mensajes en una bandeja de entrada de
equipo o en un chat de grupo. Puede obtener el token de API de flujo de
Flowdock (configuración de la cuenta ).
Tipo de datos: cadena
Obligatorio: Sí
flowName
Nombre de flujo
Nombre de flujo tal y como se muestra en Flowdock
Tipo de datos: cadena
Obligatorio: No
showDetails
Enviar un mensaje detallado
Publique un mensaje breve o detallado sobre el evento.
Tipo de datos: booleano
Obligatorio: No
subject
Contenido
Línea de asunto del mensaje (que se muestra como el título del mensaje de
la bandeja de entrada del equipo)
Tipo de datos: cadena
Obligatorio: Sí
fromName
Desde el nombre
Nombre del remitente del mensaje
Tipo de datos: cadena
Obligatorio: No
fromAddress
Dirección De
Email dirección del remitente del mensaje (usado para mostrar un avatar del
remitente)
Tipo de datos: cadena
Obligatorio: Sí
replyTo
Responder a
Email dirección de las respuestas (usadas al responder al mensaje dentro de
Flowdock)
Tipo de datos: cadena
Obligatorio: No
project
Project
Identificador legible humano para la categorización de mensajes más
detallada
Tipo de datos: cadena
Obligatorio: No
etiquetas
Etiquetas
Lista de etiquetas que se van a agregar al mensaje (separados por comas).
Las etiquetas de usuario deben empezar por '@'. Opcionalmente, los
hashtags se pueden prefijar con "#". Las etiquetas no distinguen mayúsculas
de minúsculas.
Tipo de datos: cadena
Obligatorio: No
HipChat
HipChat proporciona mensajería instantánea de grupo para empresas y equipos.
Publicar un mensaje en una sala
Publique un mensaje sobre el evento en una sala en HipChat. Mensajes, Guía para
desarrolladores y la nube de Hipchat .
Id. de consumidor: hipChat
Id. de acción: postMessageToRoom
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
authToken
El token de autorización
Token de autorización que permite publicar mensajes en una sala. Puede ser
un token de sala que solo está autorizado a una sala determinada o a un
token de acceso personal, que está autorizado a todas las salas autorizadas
por el propietario del token.
Tipo de datos: cadena
Obligatorio: Sí
roomName
Sala
Espacio en el que se va a publicar el mensaje.
Tipo de datos: cadena
Obligatorio: Sí
notifyRoom
Notificar a los participantes de la sala
Si este mensaje debe desencadenar o no una notificación para las personas
de la sala (cambie el color de la pestaña, reproduzca un sonido, etc.). Se
tienen en cuenta las preferencias de notificación de cada destinatario.
Tipo de datos: booleano
Obligatorio: No
showDetails
Enviar un mensaje detallado
Publique mensajes breves o detallados sobre el evento.
Tipo de datos: booleano
Obligatorio: No
Bgcolor
Color del mensaje
Color de fondo del mensaje. Valores válidos: amarillo, rojo, verde, púrpura,
gris, aleatorio (valor predeterminado: "amarillo")
Tipo de datos: cadena
Obligatorio: No
Jenkins
Jenkins es un servidor de integración continua que permite compilar y probar proyectos
de software continuamente.
Desencadenamiento de la compilación de Git
Desencadena una compilación configurada para usar un repositorio de Git mediante el
complemento de Git de Jenkins .
Id. de consumidor: jenkins
Id. de acción: triggerGitBuild
Eventos admitidos: git.push
Configuración:
serverBaseUrl
Jenkins base URL
La dirección URL base que hospeda el servidor Jenkins
Tipo de datos: URI
Obligatorio: Sí
username
Nombre de usuario
El nombre de usuario de Jenkins de un usuario que tiene permiso para
desencadenar la compilación
Tipo de datos: cadena
Obligatorio: Sí
password
Token de API de usuario (o contraseña)
Token de API del usuario, que está disponible en la página de configuración
de usuario de Jenkins. El token de API es nuevo desde la versión 1.426. Para
versiones anteriores de Jenkins, se debe especificar la contraseña de usuario
real.
Tipo de datos: cadena
Obligatorio: Sí
Desencadenamiento de la compilación genérica
Desencadena una compilación genérica de Jenkins, invocando la dirección URL de
compilación de Jenkins.
Id. de consumidor: jenkins
Id. de acción: triggerGenericBuild
Eventos admitidos: git.push, build.complete, tfvc.checkin
Configuración:
serverBaseUrl
Jenkins base URL
La dirección URL base que hospeda el servidor Jenkins
Tipo de datos: URI
Obligatorio: Sí
username
Nombre de usuario
El nombre de usuario de Jenkins de un usuario que tiene permiso para
desencadenar la compilación
Tipo de datos: cadena
Obligatorio: Sí
password
Token de API de usuario (o contraseña)
Token de API del usuario, que está disponible en la página de configuración
de usuario de Jenkins. El token de API es nuevo desde la versión 1.426. Para
versiones anteriores de Jenkins, se debe especificar la contraseña de usuario
real.
Tipo de datos: cadena
Obligatorio: Sí
buildName
Build
Nombre de compilación que se va a desencadenar
Tipo de datos: cadena
Obligatorio: Sí
buildAuthToken
Token de compilación
Token de autorización en forma de cadena para que solo aquellos que lo
sepan puedan desencadenar de forma remota las compilaciones de este
proyecto.
Tipo de datos: cadena
Obligatorio: No
buildParameterized
Acepta parámetros
Indica si la compilación está parametrizada o no (los parámetros de
compilación se especifican opcionalmente anteriormente).
Tipo de datos: booleano
Obligatorio: No
buildParams
Parámetros de compilación
Generar nombres y valores de parámetros separados por dos puntos (por
ejemplo, "param1:value1") con cada par nombre-valor que aparece en su
propia línea de texto
Tipo de datos: cadena
Obligatorio: No
Kato
Kato proporciona un servicio de mensajería para organizaciones modernas.
Publicar evento en sala
Publica un evento en una sala kato
Id. de consumidor: kato
Id. de acción: postEventToRoom
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
roomToken
Token de sala
Token para interactuar con una sala mediante la API de Kato
Tipo de datos: cadena
Obligatorio: Sí
roomName
Nombre de la sala
Nombre de la habitación como se ve en Kato
Tipo de datos: cadena
Obligatorio: No
Trello
Proporciona integración con Trello.
Crear una tarjeta
Esta acción crea una tarjeta en una lista existente de Trello. Una tarjeta puede
representar una tarea, un problema, un evento o casi cualquier cosa. Normalmente, el
estado de una tarjeta viene determinado por la lista en la que se encuentra. Para más
información, consulte Creación de un enlace de servicio para Azure DevOps con Trello.
Id. de consumidor: trello
Id. de acción: createCard
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
userToken
Token de usuario (¿necesita uno? Ábalo ahora .
El token de usuario proporcionado por Trello. Seleccione el vínculo en la
descripción de la acción descrita anteriormente para obtener este token.
Tipo de datos: cadena
Obligatorio: Sí
boardId
Board
Nombre del panel en el que se crea la tarjeta trello.
Tipo de datos: cadena
Obligatorio: Sí
listId
List
Nombre de la lista en la que se crea la tarjeta trello.
Tipo de datos: cadena
Obligatorio: Sí
etiquetas
Etiquetas
Lista separada por comas de colores de etiqueta que se aplicarán a la tarjeta
creada. Los nombres de color de etiqueta válidos son rojo, naranja, amarillo,
verde, azul y púrpura.
Tipo de datos: cadena
Obligatorio: No
addToTop
Crear al principio de la lista
Indica si la tarjeta debe crearse al principio de la lista de Trello, en lugar del
final.
Tipo de datos: booleano
Obligatorio: No
Crear una lista
Esta acción crea una lista en un panel existente en Trello. Una lista se usa para organizar
tarjetas en un panel y normalmente representa un estado. Para más información,
consulte Creación de un enlace de servicio para Azure DevOps con Trello.
Id. de consumidor: trello
Id. de acción: createList
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
userToken
Token de usuario (¿necesita uno? Ábalo ahora .
El token de usuario proporcionado por Trello. Seleccione el vínculo en la
descripción de la acción descrita anteriormente para obtener este token.
Tipo de datos: cadena
Obligatorio: Sí
boardId
Board
Nombre del panel en el que se crea la lista de Trello.
Tipo de datos: cadena
Obligatorio: Sí
addToBottom
Crear en la parte inferior del panel
Indica si la lista se debe crear en la parte inferior del panel, en lugar de en la
parte superior.
Tipo de datos: booleano
Obligatorio: No
Webhooks
Proporciona comunicación de eventos a través de HTTP.
Publicación a través de HTTP
Esta acción publica una representación de objeto JSON del evento en la dirección URL
especificada. Se recomiendan puntos de conexión HTTPS debido al potencial de datos
privados en la carga del evento. Para más información, consulte Webhooks.
Id. de consumidor: webHooks
Id. de acción: httpRequest
Eventos admitidos: build.complete, git.push, tfvc.checkin, workitem.created,
workitem.commented, workitem.updated
Configuración:
url
URL
Dirección URL a la que se envía una solicitud HTTP POST.
Tipo de datos: URI
Obligatorio: Sí
httpHeaders
Encabezados HTTP
Claves y valores de encabezado HTTP separados por dos puntos (por
ejemplo, "Key1:value1") con cada par clave-valor que aparece en su propia
línea de texto.
Tipo de datos: cadena
Obligatorio: No
basicAuthUsername
Nombre de usuario de autenticación básica
Escriba un nombre de usuario para la autenticación HTTP estándar. La
autenticación HTTP básica envía credenciales en texto sin formato (sin cifrar),
lo que significa que debe usar una dirección URL a partir de "https" para
habilitar el cifrado de estas credenciales a través de la capa de transporte
segura (SSL).
Tipo de datos: cadena
Obligatorio: No
basicAuthPassword
Contraseña de autenticación básica
Escriba una contraseña para la autenticación HTTP estándar. La autenticación
HTTP básica envía credenciales en texto sin formato (sin cifrar), lo que
significa que debe usar una dirección URL a partir de "https" para habilitar el
cifrado de estas credenciales a través de la capa de transporte segura (SSL).
Tipo de datos: cadena
Obligatorio: No
resourceDetailsToSend
Detalles del recurso que se van a enviar
Controlar los campos de recursos que se van a enviar
Tipo de datos: cadena
Obligatorio: No
messagesToSend
Mensajes que se van a enviar
Controlar los mensajes que se van a enviar
Tipo de datos: cadena
Obligatorio: No
detailedMessagesToSend
Mensajes detallados que se van a enviar
Controlar los mensajes detallados que se van a enviar
Tipo de datos: cadena
Obligatorio: No
Zendesk
Zendesk es un conjunto de aplicaciones SaaS que ofrece incidencias del departamento
de soporte técnico, seguimiento de problemas y servicio al cliente.
Creación de un comentario privado en un vale
Creación de un comentario privado en un vale
Id. de consumidor: zendesk
Id. de acción: createPrivateComment
Eventos admitidos: workitem.commented
Configuración:
accountName
Nombre de cuenta
Nombre de cuenta de Zendesk, como https://{account name}.zendesk.com
Tipo de datos: cadena
Obligatorio: Sí
username
Nombre de usuario
El nombre de usuario de Zendesk de un usuario que actualiza vales
Tipo de datos: cadena
Obligatorio: Sí
apiToken
Token de API
El token de LA API de Zendesk (se puede encontrar en la aplicación Zendesk
en Administración > Channels > API)
Tipo de datos: cadena
Obligatorio: Sí
Eventos de enlaces de servicio
Artículo • 13/12/2022 • Tiempo de lectura: 35 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Tipos de eventos disponibles
Compilación y versión
Compilación completada
Versión creada
Liberación abandonada
Aprobación de implementación de versión completada
Aprobación de implementación de versión pendiente
Implementación de versión completada
Implementación de versión iniciada
Canalizaciones
Estado de ejecución cambiado
Estado de fase de ejecución cambiado
Fase de ejecución en espera de aprobación
Aprobación de fase de ejecución completada
Se ha cambiado el estado del trabajo de ejecución
Código
Código protegido
Código insertado
Solicitud de incorporación de cambios creada
Confirmación de combinación de solicitudes de incorporación de cambios
creada
Solicitud de incorporación de cambios actualizada
Elementos de trabajo
Elemento de trabajo comentado en
Elemento de trabajo creado
Elemento de trabajo eliminado
Elemento de trabajo restaurado
Elemento de trabajo actualizado
7 Nota
El paquete Receptores de WebHooks de Nuget proporciona compatibilidad
para recibir webhooks de Azure DevOps.
Compilación y versión
Compilación completada
Evento: se completa una compilación.
Id. del publicador: tfs
Id. de evento: build.complete
Nombre del recurso: build
Configuración
definitionName : filtra los eventos para incluir solo compilaciones completadas para
la canalización especificada.
buildStatus : filtra los eventos para incluir solo compilaciones completadas para el
estado de finalización especificado.
Valores válidos:
Succeeded
PartiallySucceeded
Failed
Stopped
Carga de ejemplo
JSON
"subscriptionId": "4f6e6328-0251-4814-a009-c01dfa368e3f",
"notificationId": 1,
"id": "33433986-7f56-4969-bfd4-3e59774c75ad",
"eventType": "build.complete",
"publisherId": "tfs",
"message": {
"text": "Build 20221202.1 succeeded",
"html": "Build <a
href=\"https://dev.azure.com/FabrikamFiber/web/build.aspx?pcguid=54d02617-
2ebd-42b0-b1e2-
257059c4c03d&builduri=vstfs%3a%2f%2f%2fBuild%2fBuild%2f2727068\">2022120
2.1</a> succeeded",
"markdown": "Build [20221202.1]
(https://dev.azure.com/FabrikamFiber/web/build.aspx?pcguid=54d02617-2ebd-
42b0-b1e2-257059c4c03d&builduri=vstfs%3a%2f%2f%2fBuild%2fBuild%2f2727068)
succeeded"
},
"detailedMessage": {
"text": "Build 20221202.1 succeeded",
"html": "Build <a
href=\"https://dev.azure.com/FabrikamFiber/web/build.aspx?pcguid=54d02617-
2ebd-42b0-b1e2-
257059c4c03d&builduri=vstfs%3a%2f%2f%2fBuild%2fBuild%2f2727068\">2022120
2.1</a> succeeded",
"markdown": "Build [20221202.1]
(https://dev.azure.com/FabrikamFiber/web/build.aspx?pcguid=54d02617-2ebd-
42b0-b1e2-257059c4c03d&builduri=vstfs%3a%2f%2f%2fBuild%2fBuild%2f2727068)
succeeded"
},
"resource": {
"_links": {
"self": {
"href": "https://dev.azure.com/FabrikamFiber/16dcfeeb-d8fd-495c-
917b-fec46cb44fbb/_apis/build/Builds/2727068"
},
"web": {
"href": "https://dev.azure.com/FabrikamFiber/16dcfeeb-d8fd-495c-
917b-fec46cb44fbb/_build/results?buildId=2727068"
},
"sourceVersionDisplayUri": {
"href": "https://dev.azure.com/FabrikamFiber/16dcfeeb-d8fd-495c-
917b-fec46cb44fbb/_apis/build/builds/2727068/sources"
},
"timeline": {
"href": "https://dev.azure.com/FabrikamFiber/16dcfeeb-d8fd-495c-
917b-fec46cb44fbb/_apis/build/builds/2727068/Timeline"
},
"badge": {
"href": "https://dev.azure.com/FabrikamFiber/16dcfeeb-d8fd-495c-
917b-fec46cb44fbb/_apis/build/status/4658"
},
"properties": {},
"tags": [],
"validationResults": [],
"plans": [
"planId": "cd96240e-881a-49e9-8135-89a4ad458a6d"
],
"triggerInfo": {},
"id": 2727068,
"buildNumber": "20221202.1",
"status": "completed",
"result": "succeeded",
"queueTime": "2022-12-02T12:18:45.7367977Z",
"startTime": "2022-12-02T12:18:56.6205723Z",
"finishTime": "2022-12-02T12:21:08.520904Z",
"url": "https://dev.azure.com/FabrikamFiber/16dcfeeb-d8fd-495c-917b-
fec46cb44fbb/_apis/build/Builds/2727068",
"definition": {
"drafts": [],
"id": 4658,
"name": "MainRepo (1)",
"url": "https://dev.azure.com/FabrikamFiber/16dcfeeb-d8fd-495c-917b-
fec46cb44fbb/_apis/build/Definitions/4658?revision=1",
"uri": "vstfs:///Build/Definition/4658",
"path": "\\",
"type": "build",
"queueStatus": "enabled",
"revision": 1,
"project": {
"id": "16dcfeeb-d8fd-495c-917b-fec46cb44fbb",
"name": "FabrikamFiberChat",
"url": "https://dev.azure.com/FabrikamFiber/_apis/projects/16dcfeeb-
d8fd-495c-917b-fec46cb44fbb",
"state": "wellFormed",
"revision": 876,
"visibility": "organization",
"lastUpdateTime": "2022-04-06T14:51:16.337Z"
},
"buildNumberRevision": 1,
"project": {
"id": "16dcfeeb-d8fd-495c-917b-fec46cb44fbb",
"name": "FabrikamFiberChat",
"url": "https://dev.azure.com/FabrikamFiber/_apis/projects/16dcfeeb-
d8fd-495c-917b-fec46cb44fbb",
"state": "wellFormed",
"revision": 876,
"visibility": "organization",
"lastUpdateTime": "2022-04-06T14:51:16.337Z"
},
"uri": "vstfs:///Build/Build/2727068",
"sourceBranch": "refs/heads/main",
"sourceVersion": "6e12f6141917f66a2964af55952ee33914d2d91f",
"queue": {
"id": 4799,
"name": "Azure Pipelines",
"pool": {
"id": 112,
"name": "Azure Pipelines",
"isHosted": true
},
"priority": "normal",
"reason": "manual",
"requestedFor": {
"displayName": "Jack Fabrikam",
"url": "https://spsprodwus22.vssps.visualstudio.com/A9985ce4a-0206-
43df-a8ea-076ae68596a9/_apis/Identities/57a5d794-9773-6c32-bbb6-
550585695119",
"_links": {
"avatar": {
"href":
"https://dev.azure.com/FabrikamFiber/_apis/GraphProfile/MemberAvatars/aad.NT
dhNWQ3OTQtOTc3My03YzMyLQJiYjYtNTUwNTg1Njk1MTE5"
},
"id": "57a5d794-9473-6c32-bbb6-550585695119",
"uniqueName": "jack@FabrikamFiber.com",
"imageUrl":
"https://dev.azure.com/FabrikamFiber/_apis/GraphProfile/MemberAvatars/aad.NT
dhNWQ3OTQtOTc1My03YzMyLWJiYjYtNTUwNTg1Njk1MTE5",
"descriptor": "aad.NTdhNWQ3OTQtOTc6My03YzMyLWJiYjYtNTUwNTg1Njk1MTE5"
},
"requestedBy": {
"displayName": "Jack Fabrikam",
"url": "https://spsprodwus22.vssps.visualstudio.com/A9985ce4a-0206-
43df-a8ea-076ae68596a9/_apis/Identities/57a5d794-9773-6c32-bbb6-
550585695119",
"_links": {
"avatar": {
"href":
"https://dev.azure.com/FabrikamFiber/_apis/GraphProfile/MemberAvatars/aad.NT
dhNWQ3OTQtOTc3My03YzMyLQJiYjYtNTUwNTg1Njk1MTE5"
},
"id": "57a5d794-9473-6c32-bbb6-550585695119",
"uniqueName": "jack@FabrikamFiber.com",
"imageUrl":
"https://dev.azure.com/FabrikamFiber/_apis/GraphProfile/MemberAvatars/aad.NT
dhNWQ3OTQtOTc1My03YzMyLWJiYjYtNTUwNTg1Njk1MTE5",
"descriptor": "aad.NTdhNWQ3OTQtOTc6My03YzMyLWJiYjYtNTUwNTg1Njk1MTE5"
},
"lastChangedDate": "2022-12-02T12:21:08.96Z",
"lastChangedBy": {
"displayName": "Microsoft.VisualStudio.Services.TFS",
"url": "https://spsprodwus22.vssps.visualstudio.com/A9982ce4a-0206-
43df-a8ea-076ae68596a9/_apis/Identities/00000002-0000-8888-8000-
000000000000",
"_links": {
"avatar": {
"href":
"https://dev.azure.com/FabrikamFiber/_apis/GraphProfile/MemberAvatars/s2s.MD
AwMDAwMDItMDAwMC02ODg4LTgwMDAtMDAwMDAwMDAwMDAwQDJjODk1OTA4LTA0ZTAtNDk1Mi04OW
ZkLTU0YjAwNDZkNjI4OA"
},
"id": "00000002-0000-8888-8000-000000000000",
"uniqueName": "00000002-0000-8888-8000-000000000000@2c895908-04e0-
4952-89fd-54b0046d6288",
"imageUrl":
"https://dev.azure.com/FabrikamFiber/_apis/GraphProfile/MemberAvatars/s2s.MD
AwMDAwMDItMDAwMC04ODg4LTgwMDAtMDAwMDAwMDAwMDAwQDJjODk1OTA4LTA2ZTAtNDk1Mi04OW
ZkLTU0YjAwNDZkNjI4OA",
"descriptor":
"s2s.MDAwMDAwMDItMDAwMC04ODg4LTgwMDAtMDAwMDAwMDAwMDAwQDJjODk1OTA4LTA2ZTAtNDk
1Mi04OWZkLTU0YjAwNDZkNjI4OA"
},
"orchestrationPlan": {
"planId": "cd96240e-881a-42e9-8135-89a4ad458a6d"
},
"logs": {
"id": 0,
"type": "Container",
"url": "https://dev.azure.com/FabrikamFiber/16dcfeeb-d2fd-495c-917b-
fec46cb44fbb/_apis/build/builds/2727068/logs"
},
"repository": {
"id": "e5994ecb-b917-4d23-aa75-d52205c3c19b",
"type": "TfsGit",
"name": "MainRepo",
"url":
"https://dev.azure.com/FabrikamFiber/FabrikamFiberChat/_git/FabrikamFiberCha
t",
"clean": null,
"checkoutSubmodules": false
},
"retainedByRelease": false,
"triggeredByBuild": null,
"appendCommitMessageToRunName": true
},
"resourceVersion": "2.0",
"resourceContainers": {
"collection": {
"id": "54d02617-2e2d-42b0-b1e2-257059c4c03d",
"baseUrl": "https://dev.azure.com/FabrikamFiber/"
},
"account": {
"id": "998ace4a-0206-432f-a8ea-076ae68596a9",
"baseUrl": "https://dev.azure.com/FabrikamFiber/"
},
"project": {
"id": "16dc2eeb-d8fd-495c-917b-fec46cb44fbb",
"baseUrl": "https://dev.azure.com/FabrikamFiber/"
},
"createdDate": "2022-12-02T12:21:13.8866607Z"
Liberación abandonada
Evento: Se abandonó una versión.
Id. del publicador: rm
Id. de evento: ms.vss-release.release-abandoned-event
Nombre del recurso: resource
Configuración
releaseDefinitionId : filtra los eventos para incluir solo las implementaciones
completadas para la canalización especificada.
Carga de ejemplo
JSON
"id": "b0497ad3-50c9-4722-96da-a8fa5b80d77f",
"eventType": "ms.vss-release.release-abandoned-event",
"publisherId": "rm",
"scope": "all",
"message": {
"text": "Release Release-1 abandoned.",
"html": "Release <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/5'>Release-1</a> abandoned.",
"markdown": "Release [Release-1]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/5) abandoned."
},
"detailedMessage": {
"text": "Release Release-1 from release pipeline Fabrikam.CD
abandoned.\\r\\nRelease description: QFE release for fixing
title\\r\\nContinuousIntegration Requested for Chuck
Reinhart\\r\\n<li>Build: fabrikam.Bd.2016.04.10 & 2 more<\\li>",
"html": "Release <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/5'>Release-1</a> from <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releasedefinitions/1'>Fabrikam.CD</a> release pipeline
abandoned.\\r\\n<li>Release description: QFE release for fixing
title</li>\\r\\n<li>ContinuousIntegration Requested for Chuck
Reinhart</li>\\r\\n<li>Build: fabrikam.Bd.2016.04.10 & 2 more <\\li>",
"markdown": "Release [Release-1]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/5) from release pipeline [Fabrikam.CD]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releasedefinitions/1) abandoned.\\r\\n<li>Release
description: QFE release for fixing
title</li>\\r\\n<li>ContinuousIntegration Requested for Chuck
Reinhart</li>\\r\\n<li>Build: fabrikam.Bd.2016.04.10 & 2 more<\\li>"
},
"resource": {
"release": {
"id": 4,
"name": "Release-1",
"status": "abandoned",
"createdOn": "2016-01-21T08:19:17.26Z",
"modifiedOn": "2016-01-21T08:19:17.26Z",
"modifiedBy": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"createdBy": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"environments": [
{
"id": 5,
"releaseId": 0,
"name": "Dev",
"status": "succeeded",
"variables": {},
"preDeployApprovals": [],
"postDeployApprovals": [],
"preApprovalsSnapshot": {
"approvals": [],
"approvalOptions": {
"requiredApproverCount": 0,
"releaseCreatorCanBeApprover": true
},
"postApprovalsSnapshot": {
"approvals": []
},
"deploySteps": [],
"rank": 1,
"definitionEnvironmentId": 1,
"queueId": 1,
"environmentOptions": {
"emailNotificationType": "OnlyOnFailure",
"emailRecipients": "release.environment.owner;release.creator",
"skipArtifactsDownload": false,
"timeoutInMinutes": 0,
"enableAccessToken": false
},
"demands": [],
"conditions": [],
"modifiedOn": "2016-01-21T08:19:17.26Z",
"workflowTasks": [
"taskId": "00000000-0000-0000-0000-000000000000",
"version": "*",
"name": "Deploy Website to Azure",
"enabled": true,
"alwaysRun": false,
"continueOnError": false,
"timeoutInMinutes": 0,
"definitionType": null,
"inputs": {
"ConnectedServiceName": "b460b0f8-fe23-4dc2-a99c-
fd8b0633fe1c",
"WebSiteName": "$(webAppName)",
"WebSiteLocation": "Southeast Asia",
"Slot": "",
"Package": "$(System.DefaultWorkingDirectory)\\**\\*.zip"
],
"deployPhasesSnapshot": [],
"owner": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"scheduledDeploymentTime": "2016-01-21T08:19:17.26Z",
"schedules": [],
"release": {
"id": 5,
"name": "Release-1",
"url":
"http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/5"
],
"variables": {},
"artifacts": [
"sourceId": "31419848-1780-4137-b7e3-62092e986fd6:1",
"type": "Build",
"alias": "Fabrikam.CI",
"definitionReference": {
"Definition": {
"id": "1",
"name": "Fabrikam.CI"
},
"Project": {
"id": "31419848-1780-4137-b7e3-62092e986fd6",
"name": "Fabrikam"
},
"isPrimary": true
],
"releaseDefinition": {
"id": 1,
"name": "Fabrikam.CD",
"url":
"http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/definitions/1"
},
"description": "QFE release for fixing title",
"reason": "continuousIntegration",
"releaseNameFormat": "Release-$(rev:r)",
"keepForever": false,
"definitionSnapshotRevision": 0,
"comment": "",
"logsContainerUrl": null,
"_links": {}
},
"project": {
"id": "00000000-0000-0000-0000-000000000000",
"name": "Fabrikam"
},
"resourceVersion": "3.0-preview.1",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"createdDate": "2016-09-19T13:03:27.784654Z"
Versión creada
Evento: se creó una versión.
Id. del publicador: rm
Id. de evento: ms.vss-release.release-created-event
Nombre del recurso: resource
Configuración
releaseDefinitionId : filtra los eventos para incluir solo las implementaciones
completadas para la canalización especificada.
Carga de ejemplo
JSON
"id": "d4d69db4-18d4-413e-bc43-07f56b531160",
"eventType": "ms.vss-release.release-created-event",
"publisherId": "rm",
"scope": "all",
"message": {
"text": "Release Release-1 created.",
"html": "<a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/5'>Release-1</a> created.",
"markdown": "Release [Release-1]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/5) created."
},
"detailedMessage": {
"text": "Release Release-1 created from release pipeline
Fabrikam.CD.\\r\\nRelease description: QFE release for fixing
title\\r\\nContinuousIntegration Requested for Chuck
Reinhart\\r\\n<li>Build: fabrikam.Bd.2016.04.10 & 2 more<\\li>",
"html": "Release <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/5'>Release-1</a> created from release pipeline <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releasedefinitions/1'>Fabrikam.CD</a>.\\r\\n<li>Release
description: QFE release for fixing
title</li>\\r\\n<li>ContinuousIntegration Requested for Chuck
Reinhart</li>\\r\\n<li>Build: fabrikam.Bd.2016.04.10 & 2 more<\\li>",
"markdown": "Release [Release-1]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/5) created from release pipeline [Fabrikam.CD]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releasedefinitions/1).\\r\\n<li>Release description: QFE
release for fixing title</li>\\r\\n<li>ContinuousIntegrationRequested for
Chuck Reinhart</li>\\r\\n<li>Build: fabrikam.Bd.2016.04.10 & 2 more<\\li>"
},
"resource": {
"release": {
"id": 4,
"name": "Release-1",
"status": "active",
"createdOn": "2016-01-21T08:19:17.26Z",
"modifiedOn": "2016-01-21T08:19:17.26Z",
"modifiedBy": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"createdBy": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"environments": [
{
"id": 5,
"releaseId": 0,
"name": "Dev",
"status": "succeeded",
"variables": {},
"preDeployApprovals": [],
"postDeployApprovals": [],
"preApprovalsSnapshot": {
"approvals": [],
"approvalOptions": {
"requiredApproverCount": 0,
"releaseCreatorCanBeApprover": true
},
"postApprovalsSnapshot": {
"approvals": []
},
"deploySteps": [],
"rank": 1,
"definitionEnvironmentId": 1,
"queueId": 1,
"environmentOptions": {
"emailNotificationType": "OnlyOnFailure",
"emailRecipients": "release.environment.owner;release.creator",
"skipArtifactsDownload": false,
"timeoutInMinutes": 0,
"enableAccessToken": false
},
"demands": [],
"conditions": [],
"modifiedOn": "2016-01-21T08:19:17.26Z",
"workflowTasks": [
"taskId": "00000000-0000-0000-0000-000000000000",
"version": "*",
"name": "Deploy Website to Azure",
"enabled": true,
"alwaysRun": false,
"continueOnError": false,
"timeoutInMinutes": 0,
"definitionType": null,
"inputs": {
"ConnectedServiceName": "b460b0f8-fe23-4dc2-a99c-
fd8b0633fe1c",
"WebSiteName": "$(webAppName)",
"WebSiteLocation": "Southeast Asia",
"Slot": "",
"Package": "$(System.DefaultWorkingDirectory)\\**\\*.zip"
],
"deployPhasesSnapshot": [],
"owner": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"scheduledDeploymentTime": "2016-01-21T08:19:17.26Z",
"schedules": [],
"release": {
"id": 5,
"name": "Release-1",
"url":
"http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/5"
],
"variables": {},
"artifacts": [
"sourceId": "31419848-1780-4137-b7e3-62092e986fd6:1",
"type": "Build",
"alias": "Fabrikam.CI",
"definitionReference": {
"Definition": {
"id": "1",
"name": "Fabrikam.CI"
},
"Project": {
"id": "31419848-1780-4137-b7e3-62092e986fd6",
"name": "Fabrikam"
},
"isPrimary": true
],
"releaseDefinition": {
"id": 1,
"name": "Fabrikam.CD",
"url":
"http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/definitions/1"
},
"description": "QFE release for fixing title",
"reason": "continuousIntegration",
"releaseNameFormat": "Release-$(rev:r)",
"keepForever": false,
"definitionSnapshotRevision": 0,
"comment": "",
"logsContainerUrl": null,
"_links": {}
},
"project": {
"id": "00000000-0000-0000-0000-000000000000",
"name": "Fabrikam"
},
"resourceVersion": "3.0-preview.1",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"createdDate": "2016-09-19T13:03:27.6570261Z"
Aprobación de implementación de versión completada
Evento: se completa una aprobación de implementación.
Id. del publicador: rm
Id. de evento: ms.vss-release.deployment-approval-completed-event
Nombre del recurso: resource
Configuración
releaseApprovalStatus : filtra los eventos para incluir solo las implementaciones
con la aprobación del estado especificado.
Valores válidos:
2 -Aprobado
4 -Rechazado
releaseApprovalType : filtra los eventos para incluir solo las implementaciones que
solicitan una aprobación del tipo especificado.
Valores válidos:
1 - Implementación previa
2 - Posterior a la implementación
releaseEnvironmentId : filtra los eventos para incluir solo las implementaciones
completadas para el entorno especificado.
releaseDefinitionId : filtra los eventos para incluir solo las implementaciones
completadas para la definición especificada.
Carga de ejemplo
JSON
"id": "106acb39-c61e-4efd-995e-a9f5e71ba3cd",
"eventType": "ms.vss-release.deployment-approval-completed-event",
"publisherId": "rm",
"scope": "all",
"message": {
"text": "Pre Deployment approval for deployment of release Release-1 on
environment Dev Succeeded.",
"html": "Pre Deployment approval for release <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/1'>Release-1</a> on environment <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/definitions/1'>Dev</a> Succeeded.",
"markdown": "Pre Deployment approval for deployment of release [Release-
1](http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/1) on environment [Dev]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/definitions/1) Succeeded."
},
"detailedMessage": {
"text": "Pre Deployment approval for release Release-1 on environment
Dev Succeeded.\\r\\nApprover: Chuck Reinhart\\r\\nComment: Approving",
"html": "Pre Deployment approval for release <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/1'>Release-1</a> on environment <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/definitions/1'>Dev</a> Succeeded.\\r\\nApprover: Chuck
Reinhart\\r\\nComment: Approving",
"markdown": "Pre Deployment approval for release [Release-1]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/1) on environment [Dev]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/definitions/1) Succeeded.\\r\\nApprover: Chuck
Reinhart\\r\\nComment: Approving"
},
"resource": {
"approval": {
"id": 0,
"revision": 0,
"approver": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"approvedBy": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"approvalType": "preDeploy",
"createdOn": "2016-01-21T08:19:17.26Z",
"modifiedOn": "2016-01-21T08:19:17.26Z",
"status": "approved",
"comments": "",
"isAutomated": false,
"isNotificationOn": true,
"trialNumber": 1,
"attempt": 0,
"rank": 1,
"release": {
"id": 1,
"name": "Release-1"
},
"releaseDefinition": {
"id": 1,
"name": "Fabrikam.CD",
"url":
"http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/definitions/1"
},
"releaseEnvironment": {
"id": 8,
"name": "Dev"
},
"release": {
"id": 1,
"name": "Release-1",
"status": "active",
"createdOn": "2016-01-21T08:19:17.26Z",
"modifiedOn": "2016-01-21T08:19:17.26Z",
"modifiedBy": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"createdBy": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"environments": [
{
"id": 1,
"releaseId": 0,
"name": "Dev",
"status": "succeeded",
"variables": {},
"preDeployApprovals": [],
"postDeployApprovals": [],
"preApprovalsSnapshot": {
"approvals": [],
"approvalOptions": {
"requiredApproverCount": 0,
"releaseCreatorCanBeApprover": true
},
"postApprovalsSnapshot": {
"approvals": []
},
"deploySteps": [],
"rank": 1,
"definitionEnvironmentId": 1,
"queueId": 1,
"environmentOptions": {
"emailNotificationType": "OnlyOnFailure",
"emailRecipients": "release.environment.owner;release.creator",
"skipArtifactsDownload": false,
"timeoutInMinutes": 0,
"enableAccessToken": false
},
"demands": [],
"conditions": [],
"modifiedOn": "2016-01-21T08:19:17.26Z",
"workflowTasks": [
"taskId": "00000000-0000-0000-0000-000000000000",
"version": "*",
"name": "Deploy Website to Azure",
"enabled": true,
"alwaysRun": false,
"continueOnError": false,
"timeoutInMinutes": 0,
"definitionType": null,
"inputs": {
"ConnectedServiceName": "b460b0f8-fe23-4dc2-a99c-
fd8b0633fe1c",
"WebSiteName": "$(webAppName)",
"WebSiteLocation": "Southeast Asia",
"Slot": "",
"Package": "$(System.DefaultWorkingDirectory)\\**\\*.zip"
],
"deployPhasesSnapshot": [],
"owner": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"scheduledDeploymentTime": "2016-01-21T08:19:17.26Z",
"schedules": [],
"release": {
"id": 1,
"name": "Release-1",
"url":
"http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/1"
],
"variables": {},
"artifacts": [
"sourceId": "31419848-1780-4137-b7e3-62092e986fd6:1",
"type": "Build",
"alias": "Fabrikam.CI",
"definitionReference": {
"Definition": {
"id": "1",
"name": "Fabrikam.CI"
},
"Project": {
"id": "31419848-1780-4137-b7e3-62092e986fd6",
"name": "Fabrikam"
},
"isPrimary": true
],
"releaseDefinition": {
"id": 1,
"name": "Fabrikam.CD",
"url":
"http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/definitions/1"
},
"description": "QFE release for fixing title",
"reason": "continuousIntegration",
"releaseNameFormat": "Release-$(rev:r)",
"keepForever": false,
"definitionSnapshotRevision": 0,
"comment": "",
"logsContainerUrl": null,
"_links": {}
},
"project": {
"id": "00000000-0000-0000-0000-000000000000",
"name": "Fabrikam"
},
"resourceVersion": "3.0-preview.1",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"createdDate": "2016-09-19T13:03:28.1594606Z"
Aprobación de implementación de versión pendiente
Evento: se solicita una aprobación de implementación.
Id. del publicador: rm
Id. de evento: ms.vss-release.deployment-approval-pending-event
Nombre del recurso: resource
Configuración
releaseApprovalType : filtra los eventos para incluir solo las implementaciones que
solicitan una aprobación del tipo especificado.
Valores válidos:
1 - Implementación previa
2 - Posterior a la implementación
releaseEnvironmentId : filtra los eventos para incluir solo las implementaciones
completadas para el entorno especificado.
releaseDefinitionId : filtra los eventos para incluir solo las implementaciones
completadas para la canalización especificada.
Carga de ejemplo
JSON
"id": "a73e7272-e96d-4249-93ac-7404eacd6801",
"eventType": "ms.vss-release.deployment-approval-pending-event",
"publisherId": "rm",
"scope": "all",
"message": {
"text": "Pre deployment approval pending for release Release-1 on
environment Dev.",
"html": "Pre deployment approval pending for release <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/1'>Release-1</a> on environment <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?_a=environment-
summary&definitionEnvironmentId=8&definitionId=1'>Dev</a>.",
"markdown": "Pre deployment approval pending for release [Release-1]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/1) on environment [Dev]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?_a=environment-
summary&definitionEnvironmentId=8&definitionId=1)."
},
"detailedMessage": {
"text": "Pre deployment approval pending for release Release-1 on
environment Dev.\\r\\nPending on: Chuck Reinhart\\r\\nPending since: 09 May
2016 12:09:29 (UTC)",
"html": "Pre deployment approval pending of release <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/1'>Release-1</a> on environment <a
href='http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?_a=environment-
summary&definitionEnvironmentId=8&definitionId=1'>Dev</a>.\\r\\nPending on:
Chuck Reinhart\\r\\nPending since: 09 May 2016 12:09:29 (UTC)",
"markdown": "Pre deployment approval pending for release [Release-1]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/1) on environment [Dev]
(http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?_a=environment-
summary&definitionEnvironmentId=8&definitionId=1).\\r\\nPending on: Chuck
Reinhart\\r\\nPending since: 09 May 2016 12:09:29 (UTC)"
},
"resource": {
"approval": {
"id": 0,
"revision": 0,
"approver": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"approvalType": "preDeploy",
"createdOn": "2016-01-21T08:19:17.26Z",
"modifiedOn": "2016-01-21T08:19:17.26Z",
"status": "pending",
"comments": "",
"isAutomated": false,
"isNotificationOn": true,
"trialNumber": 1,
"attempt": 0,
"rank": 1,
"release": {
"id": 1,
"name": "Release-1"
},
"releaseDefinition": {
"id": 1,
"name": "Fabrikam.CD",
"url":
"http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/definitions/1"
},
"releaseEnvironment": {
"id": 8,
"name": "Dev"
},
"release": {
"id": 1,
"name": "Release-1",
"status": "active",
"createdOn": "2016-01-21T08:19:17.26Z",
"modifiedOn": "2016-01-21T08:19:17.26Z",
"modifiedBy": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"createdBy": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"environments": [
{
"id": 5,
"releaseId": 0,
"name": "Dev",
"status": "succeeded",
"variables": {},
"preDeployApprovals": [],
"postDeployApprovals": [],
"preApprovalsSnapshot": {
"approvals": [],
"approvalOptions": {
"requiredApproverCount": 0,
"releaseCreatorCanBeApprover": true
},
"postApprovalsSnapshot": {
"approvals": []
},
"deploySteps": [],
"rank": 1,
"definitionEnvironmentId": 1,
"queueId": 1,
"environmentOptions": {
"emailNotificationType": "OnlyOnFailure",
"emailRecipients": "release.environment.owner;release.creator",
"skipArtifactsDownload": false,
"timeoutInMinutes": 0,
"enableAccessToken": false
},
"demands": [],
"conditions": [],
"modifiedOn": "2016-01-21T08:19:17.26Z",
"workflowTasks": [
"taskId": "00000000-0000-0000-0000-000000000000",
"version": "*",
"name": "Deploy Website to Azure",
"enabled": true,
"alwaysRun": false,
"continueOnError": false,
"timeoutInMinutes": 0,
"definitionType": null,
"inputs": {
"ConnectedServiceName": "b460b0f8-fe23-4dc2-a99c-
fd8b0633fe1c",
"WebSiteName": "$(webAppName)",
"WebSiteLocation": "Southeast Asia",
"Slot": "",
"Package": "$(System.DefaultWorkingDirectory)\\**\\*.zip"
],
"deployPhasesSnapshot": [],
"owner": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"scheduledDeploymentTime": "2016-01-21T08:19:17.26Z",
"schedules": [],
"release": {
"id": 1,
"name": "Release-1",
"url":
"http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/1"
],
"variables": {},
"artifacts": [
"sourceId": "31419848-1780-4137-b7e3-62092e986fd6:1",
"type": "Build",
"alias": "Fabrikam.CI",
"definitionReference": {
"Definition": {
"id": "1",
"name": "Fabrikam.CI"
},
"Project": {
"id": "31419848-1780-4137-b7e3-62092e986fd6",
"name": "Fabrikam"
},
"isPrimary": true
],
"releaseDefinition": {
"id": 1,
"name": "Fabrikam.CD",
"url":
"http://vsrm.dev.azure.com/fabfiber/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/definitions/1"
},
"description": "QFE release for fixing title",
"reason": "continuousIntegration",
"releaseNameFormat": "Release-$(rev:r)",
"keepForever": false,
"definitionSnapshotRevision": 0,
"comment": "",
"logsContainerUrl": null,
"_links": {}
},
"project": {
"id": "00000000-0000-0000-0000-000000000000",
"name": "Fabrikam"
},
"resourceVersion": "3.0-preview.1",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"createdDate": "2016-09-19T13:03:28.0320509Z"
Implementación de versión completada
Evento: una implementación completada.
Id. del publicador: rm
Id. de evento: ms.vss-release.deployment-completed-event
Nombre del recurso: resource
Configuración
releaseEnvironmentId : filtra los eventos para incluir solo las implementaciones
completadas para el entorno especificado.
releaseDefinitionId : filtra los eventos para incluir solo las implementaciones
completadas de la canalización especificada.
releaseEnvironmentStatus : filtra los eventos para incluir solo las implementaciones
completadas con el estado especificado.
Valores válidos:
8 -Cancelado
16 -Rechazado
4 -Tuvo éxito
128 - Parcialmente correcto
Carga de ejemplo
JSON
"id": "c3e52c57-187a-45c4-abe2-184a48291bad",
"eventType": "ms.vss-release.deployment-completed-event",
"publisherId": "rm",
"scope": "all",
"message": {
"text": "Deployment of release Release-1 on environment Dev Succeeded.",
"html": "Deployment on environment <a
href='http://fabfiber.vsrm.visualstudio.com/DefaultCollection/Fabrikam-
Fiber-Git/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?
_a=environment-summary&definitionEnvironmentId=8&definitionId=1'>Dev</a>
Succeeded.",
"markdown": "Deployment on environment [Dev]
(http://fabfiber.vsrm.visualstudio.com/DefaultCollection/Fabrikam-Fiber-
Git/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?_a=environment-
summary&definitionEnvironmentId=8&definitionId=1) Succeeded."
},
"detailedMessage": {
"text": "Deployment of release Release-1 on environment Dev Succeeded.
Time to deploy: 0.11 minutes.",
"html": "Deployment on environment <a
href='http://fabfiber.vsrm.visualstudio.com/DefaultCollection/Fabrikam-
Fiber-Git/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?
_a=environment-summary&definitionEnvironmentId=8&definitionId=1'>Dev</a>
Succeeded. Time to deploy: 0.11 minutes.",
"markdown": "Deployment on environment [Dev]
(http://fabfiber.vsrm.visualstudio.com/DefaultCollection/Fabrikam-Fiber-
Git/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?_a=environment-
summary&definitionEnvironmentId=8&definitionId=1) Succeeded. Time to deploy:
0.11 minutes."
},
"resource": {
"environment": {
"id": 5,
"releaseId": 0,
"name": "Dev",
"status": "succeeded",
"variables": {},
"preDeployApprovals": [],
"postDeployApprovals": [],
"preApprovalsSnapshot": {
"approvals": [],
"approvalOptions": {
"requiredApproverCount": 0,
"releaseCreatorCanBeApprover": true
},
"postApprovalsSnapshot": {
"approvals": []
},
"deploySteps": [],
"rank": 1,
"definitionEnvironmentId": 1,
"queueId": 1,
"environmentOptions": {
"emailNotificationType": "OnlyOnFailure",
"emailRecipients": "release.environment.owner;release.creator",
"skipArtifactsDownload": false,
"timeoutInMinutes": 0,
"enableAccessToken": false
},
"demands": [],
"conditions": [],
"modifiedOn": "2016-01-21T08:19:17.26Z",
"workflowTasks": [
"taskId": "00000000-0000-0000-0000-000000000000",
"version": "*",
"name": "Deploy Website to Azure",
"enabled": true,
"alwaysRun": false,
"continueOnError": false,
"timeoutInMinutes": 0,
"definitionType": null,
"inputs": {
"ConnectedServiceName": "b460b0f8-fe23-4dc2-a99c-fd8b0633fe1c",
"WebSiteName": "$(webAppName)",
"WebSiteLocation": "Southeast Asia",
"Slot": "",
"Package": "$(System.DefaultWorkingDirectory)\\**\\*.zip"
],
"deployPhasesSnapshot": [],
"owner": {
"id": "4247c988-4060-4712-abca-ff44681dd78a",
"displayName": "Chuck Reinhart"
},
"scheduledDeploymentTime": "2016-01-21T08:19:17.26Z",
"schedules": [],
"release": {
"id": 1,
"name": "Release-1",
"url":
"http://fabfiber.vsrm.visualstudio.com/DefaultCollection/Fabrikam-Fiber-
Git/_apis/Release/releases/1"
},
"project": {
"id": "00000000-0000-0000-0000-000000000000",
"name": "Fabrikam"
},
"resourceVersion": "3.0-preview.1",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"createdDate": "2016-09-19T13:03:28.5345098Z"
Implementación de versión iniciada
Evento: se inició una implementación.
Id. del publicador: rm
Id. de evento: ms.vss-release.deployment-started-event
Nombre del recurso: resource
Configuración
releaseEnvironmentId : filtra los eventos para incluir solo las implementaciones
completadas para el entorno especificado.
releaseDefinitionId : filtra los eventos para incluir solo las implementaciones
completadas para la definición especificada.
Carga de ejemplo
JSON
"id": "1f04688d-98bb-4206-850f-43389f4c8cb4",
"eventType": "ms.vss-release.deployment-started-event",
"publisherId": "rm",
"message": {
"text": "Deployment of release Release-5 to stage Dev started.",
"html": "Deployment on stage <a
href='http://fabfiber.visualstudio.com/Fabrikam-Fiber-Git/_apps/hub/ms.vss-
releaseManagement-web.hub-explorer?_a=environment-
summary&definitionEnvironmentId=1&definitionId=4'>Dev</a> started.",
"markdown": "Deployment on stage [Dev]
(https://fabfiber.visualstudio.com/Fabrikam-Fiber-Git/_apps/hub/ms.vss-
releaseManagement-web.hub-explorer?_a=environment-
summary&definitionEnvironmentId=1&definitionId=4) started."
},
"detailedMessage": {
"text": "Deployment of release Release-5 on stage Dev
started.\r\nTrigger: Manual",
"html": "Deployment on stage <a
href='Dev'>http://fabfiber.visualstudio.com/Fabrikam-Fiber-
Git/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?_a=environment-
summary&definitionEnvironmentId=1&definitionId=4</a> started.<br>Trigger:
Manual",
"markdown": "Deployment on stage [Release-1]
(https://fabfiber.visualstudio.com/Fabrikam-Fiber-Git/_apps/hub/ms.vss-
releaseManagement-web.hub-explorer?_a=environment-
summary&definitionEnvironmentId=1&definitionId=4) started.\r\nTrigger: Dev"
},
"resource": {
"environment": {
"id": 5,
"releaseId": 0,
"name": "Dev",
"status": "queued",
"variables": {},
"variableGroups": [],
"preDeployApprovals": [],
"postDeployApprovals": [],
"preApprovalsSnapshot": {
"approvals": [],
"approvalOptions": {
"requiredApproverCount": 0,
"releaseCreatorCanBeApprover": true,
"autoTriggeredAndPreviousEnvironmentApprovedCanBeSkipped": false,
"enforceIdentityRevalidation": false,
"timeoutInMinutes": 0,
"executionOrder": "beforeGates"
},
"postApprovalsSnapshot": {
"approvals": []
},
"deploySteps": [],
"rank": 1,
"definitionEnvironmentId": 1,
"queueId": 1,
"environmentOptions": {
"emailNotificationType": "OnlyOnFailure",
"emailRecipients":
"release.environment.owner;release.creator",
"skipArtifactsDownload": false,
"timeoutInMinutes": 0,
"enableAccessToken": false,
"publishDeploymentStatus": false,
"badgeEnabled": false,
"autoLinkWorkItems": false,
"pullRequestDeploymentEnabled": false
},
"demands": [],
"conditions": [],
"modifiedOn": "2016-01-21T08:19:17.26Z",
"workflowTasks": [],
"deployPhasesSnapshot": [],
"owner": {
"displayName": "Chuck Reinhart",
"id": "4247c988-4060-4712-abca-ff44681dd78a"
},
"scheduledDeploymentTime": "2016-01-21T08:19:17.26Z",
"schedules": [],
"release": {
"id": 5,
"name": "Release-5",
"_links": {
"web": {
"href": "https://fabfiber.visualstudio.com/Fabrikam-
Fiber-Git/_release?releaseId=1&_a=release-summary"
},
"preDeploymentGatesSnapshot": {
"id": 0,
"gatesOptions": null,
"gates": []
},
"postDeploymentGatesSnapshot": {
"id": 0,
"gatesOptions": null,
"gates": []
},
"release": {
"id": 0,
"name": null,
"status": "undefined",
"createdOn": "0001-01-01T00:00:00",
"modifiedOn": "0001-01-01T00:00:00",
"modifiedBy": null,
"createdBy": null,
"environments": [],
"variables": {},
"variableGroups": [],
"artifacts": [],
"releaseDefinition": {
"id": 1,
"name": "Fabrikam.CD",
"projectReference": null,
"_links": {}
},
"releaseDefinitionRevision": 0,
"reason": "none",
"releaseNameFormat": null,
"keepForever": false,
"definitionSnapshotRevision": 0,
"logsContainerUrl": null,
"_links": {},
"tags": [],
"triggeringArtifactAlias": null,
"projectReference": null
},
"project": {
"id": "00000000-0000-0000-0000-000000000000",
"name": "Fabrikam"
},
"resourceVersion": "3.0-preview.1",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2019-10-10T17:49:39.157Z"
Pipelines
7 Nota
Habilite la característica de vista previa, canalizaciones de varias fases, para estos
eventos.
Estado de ejecución cambiado
Evento: los estados generales de una ejecución de canalización han cambiado. Se ha
iniciado una nueva ejecución o una ejecución ha pasado a cancelar, cancelar, cancelar,
con errores, parcialmente correctos o correctos.
Id. del publicador: pipelines
Id. de evento: ms.vss-pipelines.run-state-changed-event
Nombre del recurso: resource
Configuración
PipelineId : filtro para incluir solo eventos para la canalización especificada.
runStateId : filtra los eventos en función del nuevo estado de la ejecución.
Valores válidos:
InProgress
Canceling
Completed
Carga de ejemplo
JSON
"id": "62e4351f-1c24-40f9-8510-7af03692ab45",
"eventType": "ms.vss-pipelines.run-state-changed-event",
"publisherId": "pipelines",
"message": {
"text": "Run 11 succeeded.",
"html": "Run <a href=\"https://codedev.ms/org/863d0a5b-3c91-4bf3-8ad7-
7f33736b7f4c/_build/results?buildId=11\">11</a> succeeded.",
"markdown": "Run [11](https://codedev.ms/org/863d0a5b-3c91-4bf3-8ad7-
7f33736b7f4c/_build/results?buildId=11) succeeded."
},
"detailedMessage": {
"text": "Run 11 succeeded.",
"html": "Run <a href=\"https://codedev.ms/org/863d0a5b-3c91-4bf3-8ad7-
7f33736b7f4c/_build/results?buildId=11\">11</a> succeeded.",
"markdown": "Run [11](https://codedev.ms/org/863d0a5b-3c91-4bf3-8ad7-
7f33736b7f4c/_build/results?buildId=11) succeeded."
},
"resource": {
"run": {
"_links": {
"self": {
"href": "https://codedev.ms/org/863d0a5b-3c91-4bf3-8ad7-
7f33736b7f4c/_apis/Pipelines/1/runs/11"
},
"web": {
"href": "https://codedev.ms/org/863d0a5b-3c91-4bf3-8ad7-
7f33736b7f4c/_build/results?buildId=11"
},
"pipeline.web": {
"href": "https://codedev.ms/org/863d0a5b-3c91-4bf3-8ad7-
7f33736b7f4c/_build/definition?definitionId=1"
},
"pipeline": {
"href": "https://codedev.ms/org/863d0a5b-3c91-4bf3-8ad7-
7f33736b7f4c/_apis/Pipelines/1?revision=1"
},
"pipeline": {
"url": "https://codedev.ms/org/091d79ee-dc21-465e-86a2-
b4006b9d0921/_apis/Pipelines/1?revision=1",
"id": 11,
"revision": 1,
"name": "TEST-CI",
"folder": "\\"
},
"state": "completed",
"result": "succeeded",
"createdDate": "2019-12-13T04:46:13.613Z",
"finishedDate": "2019-12-13T04:46:13.613Z",
"url": "https://codedev.ms/org/863d0a5b-3c91-4bf3-8ad7-
7f33736b7f4c/_apis/Pipelines/1/runs/11",
"id": 11,
"name": "11"
},
"pipeline": {
"url": "https://codedev.ms/org/091d79ee-dc21-465e-86a2-
b4006b9d0921/_apis/Pipelines/1?revision=1",
"id": 11,
"revision": 1,
"name": "TEST-CI",
"folder": "\\"
},
"repositories": [
"type": "Git",
"change":
"author":
"name": "Fabrikam John",
"email": "john@fabrikamfiber.com",
"date": "2022-11-11T15:09:21Z"
},
"committer":
"name": "Fabrikam John",
"email": "john@fabrikamfiber.com",
"date": "2022-11-11T15:09:21Z"
},
"message": "Added Viva support"
},
"url":
"https://fabrikamfiber@dev.azure.com/fabrikamfiber/fabrikamfiber-
viva/_git/fabrikamfiber"
},
"resourceVersion": "5.1-preview.1",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2019-12-13T04:46:13.683Z"
Estado de la fase de ejecución cambiado
Evento: se ha iniciado una nueva fase o una fase ha pasado a cancelar, cancelar,
cancelar, con errores, parcialmente correctos o correctos.
Id. del publicador: pipelines
Id. de evento: ms.vss-pipelines.stage-state-changed-event
Nombre del recurso: resource
Configuración
PipelineId : filtro para incluir solo eventos para la canalización especificada.
stageNameId : filtra eventos a un nombre de fase específico.
stageStateId : filtra los eventos en función del nuevo estado de la fase.
Valores válidos:
NotStarted
Waiting
Running
Completed
Carga de ejemplo
JSON
"id": "ac1dd6da-af30-43cb-8434-e1005864b0a3",
"eventType": "ms.vss-pipelines.stage-state-changed-event",
"publisherId": "pipelines",
"message": {
"text": "Run 2 stage __default succeeded.",
"html": "Run 2 stage <a href=\"https://codedev.ms/org/863d0a5b-3c91-
4bf3-8ad7-7f33736b7f4c/_build/results?buildId=2\">__default</a> succeeded.",
"markdown": "Run 2 stage [__default](https://codedev.ms/org/863d0a5b-
3c91-4bf3-8ad7-7f33736b7f4c/_build/results?buildId=2) succeeded."
},
"detailedMessage": {
"text": "Run 2 stage __default succeeded.",
"html": "Run 2 stage <a href=\"https://codedev.ms/org/863d0a5b-3c91-
4bf3-8ad7-7f33736b7f4c/_build/results?buildId=2\">__default</a> succeeded.",
"markdown": "Run 2 stage [__default](https://codedev.ms/org/863d0a5b-
3c91-4bf3-8ad7-7f33736b7f4c/_build/results?buildId=2) succeeded."
},
"resource": {
"stage": {
"_links": {
"web": {
"href": "https://codedev.ms/org/863d0a5b-3c91-4bf3-8ad7-
7f33736b7f4c/_build/results?buildId=2"
},
"pipeline.web": {
"href": "https://codedev.ms/org/863d0a5b-3c91-4bf3-8ad7-
7f33736b7f4c/_build/definition?definitionId=2"
},
"id": "00000000-0000-0000-0000-000000000000",
"name": "__default",
"displayName": null,
"state": "completed",
"result": "succeeded"
},
"run": {
"pipeline": {
"url": "https://codedev.ms/org/091d79ee-dc21-465e-86a2-
b4006b9d0921/_apis/Pipelines/2?revision=2",
"id": 2,
"revision": 2,
"name": "TEST-CI",
"folder": "\\"
},
"state": "completed",
"result": "succeeded",
"createdDate": "2019-12-13T06:10:10.164Z",
"finishedDate": "2019-12-13T06:10:10.164Z",
"id": 2,
"name": "2"
},
"pipeline": {
"url": "https://codedev.ms/org/091d79ee-dc21-465e-86a2-
b4006b9d0921/_apis/Pipelines/2?revision=2",
"id": 2,
"revision": 2,
"name": "TEST-CI",
"folder": "\\"
},
"repositories": [
"type": "Git",
"change":
"author":
"name": "Fabrikam John",
"email": "john@fabrikamfiber.com",
"date": "2022-11-11T15:09:21Z"
},
"committer":
"name": "Fabrikam John",
"email": "john@fabrikamfiber.com",
"date": "2022-11-11T15:09:21Z"
},
"message": "Added Viva support"
},
"url":
"https://fabrikamfiber@dev.azure.com/fabrikamfiber/fabrikamfiber-
viva/_git/fabrikamfiber"
},
"resourceVersion": "5.1-preview.1",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2019-12-13T06:10:10.186Z"
Fase de ejecución en espera de aprobación
Evento: se crea una aprobación para una fase de ejecución.
Id. del publicador: pipelines
Id. de evento: ms.vss-pipelinechecks-events.approval-pending
Nombre del recurso: resource
Configuración
PipelineId : filtro para incluir solo eventos para la canalización especificada.
stageName : filtra eventos a un nombre de fase específico.
environmentName : filtra eventos para aprobaciones de implementaciones en un
entorno especificado.
Carga de ejemplo
JSON
"id": "55382df7-24fa-453c-9173-3369b2417a5b",
"eventType": "ms.vss-pipelinechecks-events.approval-pending",
"publisherId": "pipelines",
"message": {
"text": "Approval pending for deployment of pipeline run1 to environment
env1.",
"html": "Approval pending for deployment of pipeline <a
href=https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_build/results?
buildId=2&view=results> run1 </a> to environment <a
href=https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_environments/1?
view=resources>env1</a>.",
"markdown": "Approval pending for deployment of pipeline
[https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_build/results?
buildId=2&view=results](run1) to environment [env1]
(https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_environments/1?
view=resources)"
},
"detailedMessage": {
"text": "Approval pending for deployment of pipeline run1 to environment
env1.",
"html": "Approval pending for deployment of pipeline <a
href=https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_build/results?
buildId=2&view=results> run1 </a> to environment <a
href=https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_environments/1?
view=resources>env1</a>.",
"markdown": "Approval pending for deployment of pipeline
[https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_build/results?
buildId=2&view=results](run1) to environment [env1]
(https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_environments/1?
view=resources)"
},
"resource": {
"approval": {
"id": "0f027b05-0942-4a35-9218-26fa07d8760a",
"steps": [
"assignedApprover": {
"displayName": null,
"id": "743f73b7-cdeb-4de7-80b7-00cee17476b8"
},
"status": "pending",
"comment": "Sample comment",
"initiatedOn": "2019-12-13T06:14:11.642Z"
],
"status": "pending",
"createdOn": "2019-12-13T06:14:11.642Z",
"lastModifiedOn": "2019-12-13T06:14:11.642Z",
"instructions": "Instructions",
"minRequiredApprovers": 2,
"blockedApprovers": [
"displayName": null,
"id": "d651e716-a205-4b37-a803-e373df09fea6"
],
"_links": {}
},
"projectId": "00000000-0000-0000-0000-000000000000",
"pipeline": null,
"stage": null,
"run": null,
"resource": null,
"id": 0,
"url": null,
"stageName": null,
"attemptId": 0
},
"resourceVersion": "5.1-preview.1",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2019-12-13T06:14:11.671Z"
Ejecución de la aprobación de fase completada
Evento: aprobación completada para una fase de ejecución.
Id. del publicador: pipelines
Id. de evento: ms.vss-pipelinechecks-events.approval-completed
Nombre del recurso: resource
Configuración
PipelineId : filtro para incluir solo eventos para la canalización especificada.
stageName : filtra eventos a un nombre de fase específico.
environmentName : filtra eventos para aprobaciones de implementaciones en un
entorno especificado.
Carga de ejemplo
JSON
"id": "5810cce3-55e9-46dc-ad4f-681c57cf620e",
"eventType": "ms.vss-pipelinechecks-events.approval-completed",
"publisherId": "pipelines",
"message": {
"text": "Approval completed for deployment of pipeline run1 to
environment env1.",
"html": "Approval completed for deployment of pipeline <a
href=https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_build/results?
buildId=2&view=results> run1 </a> to environment <a
href=https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_environments/1?
view=resources>env1</a>.",
"markdown": "Approval completed for deployment of pipeline
[https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_build/results?
buildId=2&view=results](run1) to environment [env1]
(https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_environments/1?
view=resources)"
},
"detailedMessage": {
"text": "Approval completed for deployment of pipeline run1 to
environment env1.",
"html": "Approval completed for deployment of pipeline <a
href=https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_build/results?
buildId=2&view=results> run1 </a> to environment <a
href=https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_environments/1?
view=resources>env1</a>.",
"markdown": "Approval completed for deployment of pipeline
[https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_build/results?
buildId=2&view=results](run1) to environment [env1]
(https://dev.azure.com/fabfiber/Fabrikam-Fiber-Git/_environments/1?
view=resources)"
},
"resource": {
"approval": {
"id": "0f027b05-0942-4a35-9218-26fa07d8760a",
"steps": [
"assignedApprover": {
"displayName": null,
"id": "f8482ec0-3e2f-489b-ba62-ea01cf84afa8"
},
"status": "approved",
"comment": "Sample comment",
"initiatedOn": "2019-12-13T06:18:22.460Z"
],
"status": "approved",
"createdOn": "2019-12-13T06:18:22.460Z",
"lastModifiedOn": "2019-12-13T06:18:22.460Z",
"instructions": "Instructions",
"minRequiredApprovers": 2,
"blockedApprovers": [
"displayName": null,
"id": "23241e2e-59af-4b58-842e-5604d508c6b5"
],
"_links": {}
},
"projectId": "00000000-0000-0000-0000-000000000000",
"pipeline": null,
"stage": null,
"run": null,
"resource": null,
"id": 0,
"url": null,
"stageName": null,
"attemptId": 0
},
"resourceVersion": "5.1-preview.1",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2019-12-13T06:18:22.487Z"
Se ha cambiado el estado del trabajo de ejecución
Evento: se está ejecutando un nuevo trabajo, o se ha completado o está esperando un
agente.
Id. del publicador: pipelines
Id. de evento: ms.vss-pipelines.job-state-changed-event
Nombre del recurso: resource
Configuración
pipelineId : filtro para incluir solo eventos para la canalización especificada.
stageNameId : filtra eventos a un nombre de fase específico.
jobNameId : filtrar eventos a un nombre de trabajo específico
jobStateId : filtra los eventos en función del nuevo estado del trabajo.
Valores válidos:
Waiting
Running
Completed
jobResultId : filtra los eventos en función del resultado del trabajo.
Valores válidos:
Succeeded
Skipped
Rejected
Failed
Canceled
Carga de ejemplo
JSON
"subscriptionId": "00000000-0000-0000-0000-000000000000",
"notificationId": 3,
"id": "ac1dd6da-af30-43cb-8434-e1005864b0a3",
"eventType": "ms.vss-pipelines.job-state-changed-event",
"publisherId": "pipelines",
"message":
"text": "Run 20221121.5 stage Build job Compile succeeded.",
"html": "Run 20221121.5 stage Build job <a
href=\"https://dev.azure.com/fabrikamfiber/fabrikamfiber-
viva/_build/results?buildId=2710088\">Compile</a> succeeded.",
"markdown": "Run 20221121.5 stage Build job [Compile]
(https://dev.azure.com/fabrikamfiber/fabrikamfiber-viva/_build/results?
buildId=2710088) succeeded."
},
"detailedMessage":
"text": "Run 20221121.5 stage Build job Compile succeeded.",
"html": "Run 20221121.5 stage Build job <a
href=\"https://dev.azure.com/fabrikamfiber/fabrikamfiber-
viva/_build/results?buildId=2710088\">Compile</a> succeeded.",
"markdown": "Run 20221121.5 stage Build job [Compile]
(https://dev.azure.com/fabrikamfiber/fabrikamfiber-viva/_build/results?
buildId=2710088) succeeded."
},
"resource":
"job":
"_links":
"web":
"href":
"https://dev.azure.com/fabrikamfiber/fabrikamfiber-viva/_build/results?
buildId=2"
},
"pipeline.web":
"href":
"https://dev.azure.com/fabrikamfiber/fabrikamfiber-viva/_build/definition?
definitionId=2"
},
"id": "00000000-0000-0000-0000-000000000000",
"name": "__default",
"state": "completed",
"result": "succeeded",
"startTime": "2022-11-21T16:42:52.7761408Z",
"finishTime": "2022-11-21T16:42:52.7761408Z"
},
"stage":
"id": "00000000-0000-0000-0000-000000000000",
"name": "__default",
"displayName": null,
"state": "completed",
"result": "succeeded",
"startTime": null,
"finishTime": null
},
"run":
"pipeline":
"url": "https://codedev.ms/org/091d79ee-dc21-465e-86a2-
b4006b9d0921/_apis/Pipelines/2?revision=2",
"id": 2,
"revision": 2,
"name": "TEST-CI",
"folder": "\\"
},
"state": "completed",
"result": "succeeded",
"createdDate": "2022-11-21T16:42:52.7761408Z",
"finishedDate": "2022-11-21T16:42:52.7761408Z",
"id": 2,
"name": "2"
},
"pipeline":
"url": "https://codedev.ms/org/091d79ee-dc21-465e-86a2-
b4006b9d0921/_apis/Pipelines/2?revision=2",
"id": 2,
"revision": 2,
"name": "TEST-CI",
"folder": "\\"
},
"repositories":
"type": "Git",
"change":
"author":
"name": "Fabrikam John",
"email": "john@fabrikamfiber.com",
"date": "2022-11-11T15:09:21Z"
},
"committer":
"name": "Fabrikam John",
"email": "john@fabrikamfiber.com",
"date": "2022-11-11T15:09:21Z"
},
"message": "Added Viva support"
},
"url":
"https://fabrikamfiber@dev.azure.com/fabrikamfiber/fabrikamfiber-
viva/_git/fabrikamfiber"
},
"type": "GitHub",
"change":
"author":
"name": "Fabrikam John",
"email": "john@github.com",
"date": "2022-08-11T15:05:20Z"
},
"committer":
"name": "Fabrikam John",
"email": "john@github.com",
"date": "2022-08-11T15:05:20Z"
},
"message": "Added Viva open source REST API library"
},
"url": "https://api.github.com/repos/FabrikamFiber/Viva"
},
"resourceVersion": "5.1-preview.1",
"resourceContainers":
"collection":
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account":
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project":
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2022-11-21T16:42:53.5254422Z"
Código
Código protegido
Evento: se comprueba un conjunto de cambios en TFVC.
Id. del publicador: tfs
Id. de evento: tfvc.checkin
Nombre del recurso: changeset
Configuración
path : filtra para comprobar que cambian uno o varios archivos en la ruta de
acceso especificada.
Obligatorio
Carga de ejemplo
JSON
"id": "f9b4c23e-88dd-4516-b04d-849787304e32",
"eventType": "tfvc.checkin",
"publisherId": "tfs",
"scope": "all",
"message": {
"text": "Normal Paulk checked in changeset 18: Dropping in new Java
sample",
"html": "Normal Paulk checked in changeset <a
href=\"https://dev.azure.com/fabrikam-fiber-inc/web/cs.aspx?pcguid=d81542e4-
cdfa-4333-b082-1ae2d6c3ad16&cs=18\">18</a>: Dropping in new Java
sample",
"markdown": "Normal Paulk checked in changeset [18]
(https://dev.azure.com/fabrikam-fiber-inc/web/cs.aspx?pcguid=d81542e4-cdfa-
4333-b082-1ae2d6c3ad16&cs=18): Dropping in new Java sample"
},
"detailedMessage": {
"text": "Normal Paulk checked in changeset 18: Dropping in new Java
sample",
"html": "Normal Paulk checked in changeset <a
href=\"https://dev.azure.com/fabrikam-fiber-inc/web/cs.aspx?pcguid=d81542e4-
cdfa-4333-b082-1ae2d6c3ad16&cs=18\">18</a>: Dropping in new Java
sample",
"markdown": "Normal Paulk checked in changeset [18]
(https://dev.azure.com/fabrikam-fiber-inc/web/cs.aspx?pcguid=d81542e4-cdfa-
4333-b082-1ae2d6c3ad16&cs=18): Dropping in new Java sample"
},
"resource": {
"changesetId": 18,
"url": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/tfvc/changesets/18",
"author": {
"id": "d6245f20-2af8-44f4-9451-8107cb2767db",
"displayName": "Normal Paulk",
"uniqueName": "fabrikamfiber16@hotmail.com"
},
"checkedInBy": {
"id": "d6245f20-2af8-44f4-9451-8107cb2767db",
"displayName": "Normal Paulk",
"uniqueName": "fabrikamfiber16@hotmail.com"
},
"createdDate": "2014-05-12T22:41:16Z",
"comment": "Dropping in new Java sample"
},
"resourceVersion": "1.0",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"createdDate": "2016-09-19T13:03:26.2056408Z"
Código insertado
Evento: el código se insertó en un repositorio de Git.
Id. del publicador: tfs
Id. de evento: git.push
Nombre del recurso: push
Configuración
branch : rama en la que se insertó el código.
pushedBy : un grupo que tiene el pusher como miembro.
repository : repositorio en el que se insertó el código.
Tipo de datos: guid
Carga de ejemplo
JSON
"id": "03c164c2-8912-4d5e-8009-3707d5f83734",
"eventType": "git.push",
"publisherId": "tfs",
"scope": "all",
"message": {
"text": "Jamal Hartnett pushed updates to branch master of repository
Fabrikam-Fiber-Git.",
"html": "Jamal Hartnett pushed updates to branch master of repository
Fabrikam-Fiber-Git.",
"markdown": "Jamal Hartnett pushed updates to branch `master` of
repository `Fabrikam-Fiber-Git`."
},
"detailedMessage": {
"text": "Jamal Hartnett pushed 1 commit to branch master of repository
Fabrikam-Fiber-Git.\n - Fixed bug in web.config file 33b55f7c",
"html": "Jamal Hartnett pushed 1 commit to branch <a
href=\"https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_git/Fabrikam-Fiber-Git/#version=GBmaster\">master</a>
of repository <a href=\"https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_git/Fabrikam-Fiber-Git/\">Fabrikam-Fiber-
Git</a>.\n<ul>\n<li>Fixed bug in web.config file <a
href=\"https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_git/Fabrikam-Fiber-
Git/commit/33b55f7cb7e7e245323987634f960cf4a6e6bc74\">33b55f7c</a>\n</ul>",
"markdown": "Jamal Hartnett pushed 1 commit to branch [master]
(https://dev.azure.com/fabrikam-fiber-inc/DefaultCollection/_git/Fabrikam-
Fiber-Git/#version=GBmaster) of repository [Fabrikam-Fiber-Git]
(https://dev.azure.com/fabrikam-fiber-inc/DefaultCollection/_git/Fabrikam-
Fiber-Git/).\n* Fixed bug in web.config file [33b55f7c]
(https://dev.azure.com/fabrikam-fiber-inc/DefaultCollection/_git/Fabrikam-
Fiber-Git/commit/33b55f7cb7e7e245323987634f960cf4a6e6bc74)"
},
"resource": {
"commits": [
"commitId": "33b55f7cb7e7e245323987634f960cf4a6e6bc74",
"author": {
"name": "Jamal Hartnett",
"email": "fabrikamfiber4@hotmail.com",
"date": "2015-02-25T19:01:00Z"
},
"committer": {
"name": "Jamal Hartnett",
"email": "fabrikamfiber4@hotmail.com",
"date": "2015-02-25T19:01:00Z"
},
"comment": "Fixed bug in web.config file",
"url": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_git/Fabrikam-Fiber-
Git/commit/33b55f7cb7e7e245323987634f960cf4a6e6bc74"
],
"refUpdates": [
"name": "refs/heads/master",
"oldObjectId": "aad331d8d3b131fa9ae03cf5e53965b51942618a",
"newObjectId": "33b55f7cb7e7e245323987634f960cf4a6e6bc74"
],
"repository": {
"id": "278d5cd2-584d-4b63-824a-2ba458937249",
"name": "Fabrikam-Fiber-Git",
"url": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/repos/git/repositories/278d5cd2-584d-4b63-824a-
2ba458937249",
"project": {
"id": "6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"name": "Fabrikam-Fiber-Git",
"url": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/projects/6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"state": "wellFormed"
},
"defaultBranch": "refs/heads/master",
"remoteUrl": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_git/Fabrikam-Fiber-Git"
},
"pushedBy": {
"id": "00067FFED5C7AF52@Live.com",
"displayName": "Jamal Hartnett",
"uniqueName": "Windows Live ID\\fabrikamfiber4@hotmail.com"
},
"pushId": 14,
"date": "2014-05-02T19:17:13.3309587Z",
"url": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/repos/git/repositories/278d5cd2-584d-4b63-824a-
2ba458937249/pushes/14"
},
"resourceVersion": "1.0",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2016-09-19T13:03:27.0379153Z"
Solicitud de incorporación de cambios creada
Evento: se crea una solicitud de incorporación de cambios en un repositorio de Git.
Id. del publicador: tfs
Id. de evento: git.pullrequest.created
Nombre del recurso: pullrequest
Configuración
repository : repositorio en el que se insertó el código.
Tipo de datos: guid
pullrequestCreatedBy : un grupo que tiene el solicitante como miembro.
pullrequestReviewersContains : un grupo incluido en la lista de revisores
branch : la rama de destino de la solicitud de incorporación de cambios.
Carga de ejemplo
JSON
"id": "2ab4e3d3-b7a6-425e-92b1-5a9982c1269e",
"eventType": "git.pullrequest.created",
"publisherId": "tfs",
"scope": "all",
"message": {
"text": "Jamal Hartnett created a new pull request",
"html": "Jamal Hartnett created a new pull request",
"markdown": "Jamal Hartnett created a new pull request"
},
"detailedMessage": {
"text": "Jamal Hartnett created a new pull request\r\n\r\n- Merge
status: Succeeded\r\n- Merge commit:
eef717(https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repo
sitories/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72)\r\n",
"html": "Jamal Hartnett created a new pull request\r\n<ul>\r\n<li>Merge
status: Succeeded</li>\r\n<li>Merge commit: <a
href=\"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repo
sitories/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72\">eef717</a>
</li>\r\n</ul>",
"markdown": "Jamal Hartnett created a new pull request\r\n\r\n+ Merge
status: Succeeded\r\n+ Merge commit: [eef717]
(https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72)\r\n"
},
"resource": {
"repository": {
"id": "4bc14d40-c903-45e2-872e-0462c7748079",
"name": "Fabrikam",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-0462c7748079",
"project": {
"id": "6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"name": "Fabrikam",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/projects/6ce954b1-
ce1f-45d1-b94d-e6bf2464ba2c",
"state": "wellFormed"
},
"defaultBranch": "refs/heads/master",
"remoteUrl":
"https://dev.azure.com/fabrikam/DefaultCollection/_git/Fabrikam"
},
"pullRequestId": 1,
"status": "active",
"createdBy": {
"id": "54d125f7-69f7-4191-904f-c5b96b6261c8",
"displayName": "Jamal Hartnett",
"uniqueName": "fabrikamfiber4@hotmail.com",
"url":
"https://vssps.dev.azure.com/fabrikam/_apis/Identities/54d125f7-69f7-4191-
904f-c5b96b6261c8",
"imageUrl":
"https://dev.azure.com/fabrikam/DefaultCollection/_api/_common/identityImage
?id=54d125f7-69f7-4191-904f-c5b96b6261c8"
},
"creationDate": "2014-06-17T16:55:46.589889Z",
"title": "my first pull request",
"description": " - test2\r\n",
"sourceRefName": "refs/heads/mytopic",
"targetRefName": "refs/heads/master",
"mergeStatus": "succeeded",
"mergeId": "a10bb228-6ba6-4362-abd7-49ea21333dbd",
"lastMergeSourceCommit": {
"commitId": "53d54ac915144006c2c9e90d2c7d3880920db49c",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/53d54ac915144006c2c9e90d2c7d3880920db49c"
},
"lastMergeTargetCommit": {
"commitId": "a511f535b1ea495ee0c903badb68fbc83772c882",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/a511f535b1ea495ee0c903badb68fbc83772c882"
},
"lastMergeCommit": {
"commitId": "eef717f69257a6333f221566c1c987dc94cc0d72",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72"
},
"reviewers": [
"reviewerUrl": null,
"vote": 0,
"id": "2ea2d095-48f9-4cd6-9966-62f6f574096c",
"displayName": "[Mobile]\\Mobile Team",
"uniqueName": "vstfs:///Classification/TeamProject/f0811a3b-8c8a-
4e43-a3bf-9a049b4835bd\\Mobile Team",
"url":
"https://vssps.dev.azure.com/fabrikam/_apis/Identities/2ea2d095-48f9-4cd6-
9966-62f6f574096c",
"imageUrl":
"https://dev.azure.com/fabrikam/DefaultCollection/_api/_common/identityImage
?id=2ea2d095-48f9-4cd6-9966-62f6f574096c",
"isContainer": true
],
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-0462c7748079/pullRequests/1"
},
"resourceVersion": "1.0",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2016-09-19T13:03:27.2879096Z"
Confirmación de combinación de solicitudes de
incorporación de cambios creada
Evento: se creó una confirmación de combinación en una solicitud de incorporación de
cambios.
Id. del publicador: tfs
Id. de evento: git.pullrequest.merged
Nombre del recurso: pullrequest
Configuración
repository : repositorio en el que se insertó el código.
Tipo de datos: guid
pullrequestCreatedBy : un grupo que tiene el solicitante como miembro.
pullrequestReviewersContains : un grupo incluido en la lista de revisores
branch : la rama de destino de la solicitud de incorporación de cambios.
Carga de ejemplo
JSON
{
"id": "6872ee8c-b333-4eff-bfb9-0d5274943566",
"eventType": "git.pullrequest.merged",
"publisherId": "tfs",
"scope": "all",
"message": {
"text": "Jamal Hartnett has created a pull request merge commit",
"html": "Jamal Hartnett has created a pull request merge commit",
"markdown": "Jamal Hartnett has created a pull request merge commit"
},
"detailedMessage": {
"text": "Jamal Hartnett has created a pull request merge commit\r\n\r\n-
Merge status: Succeeded\r\n- Merge commit:
eef717(https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repo
sitories/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72)\r\n",
"html": "Jamal Hartnett has created a pull request merge
commit\r\n<ul>\r\n<li>Merge status: Succeeded</li>\r\n<li>Merge commit: <a
href=\"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repo
sitories/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72\">eef717</a>
</li>\r\n</ul>",
"markdown": "Jamal Hartnett has created a pull request merge
commit\r\n\r\n+ Merge status: Succeeded\r\n+ Merge commit: [eef717]
(https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72)\r\n"
},
"resource": {
"repository": {
"id": "4bc14d40-c903-45e2-872e-0462c7748079",
"name": "Fabrikam",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-0462c7748079",
"project": {
"id": "6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"name": "Fabrikam",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/projects/6ce954b1-
ce1f-45d1-b94d-e6bf2464ba2c",
"state": "wellFormed"
},
"defaultBranch": "refs/heads/master",
"remoteUrl":
"https://dev.azure.com/fabrikam/DefaultCollection/_git/Fabrikam"
},
"pullRequestId": 1,
"status": "completed",
"createdBy": {
"id": "54d125f7-69f7-4191-904f-c5b96b6261c8",
"displayName": "Jamal Hartnett",
"uniqueName": "fabrikamfiber4@hotmail.com",
"url":
"https://vssps.dev.azure.com/fabrikam/_apis/Identities/54d125f7-69f7-4191-
904f-c5b96b6261c8",
"imageUrl":
"https://dev.azure.com/fabrikam/DefaultCollection/_api/_common/identityImage
?id=54d125f7-69f7-4191-904f-c5b96b6261c8"
},
"creationDate": "2014-06-17T16:55:46.589889Z",
"closedDate": "2014-06-30T18:59:12.3660573Z",
"title": "my first pull request",
"description": " - test2\r\n",
"sourceRefName": "refs/heads/mytopic",
"targetRefName": "refs/heads/master",
"mergeStatus": "succeeded",
"mergeId": "a10bb228-6ba6-4362-abd7-49ea21333dbd",
"lastMergeSourceCommit": {
"commitId": "53d54ac915144006c2c9e90d2c7d3880920db49c",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/53d54ac915144006c2c9e90d2c7d3880920db49c"
},
"lastMergeTargetCommit": {
"commitId": "a511f535b1ea495ee0c903badb68fbc83772c882",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/a511f535b1ea495ee0c903badb68fbc83772c882"
},
"lastMergeCommit": {
"commitId": "eef717f69257a6333f221566c1c987dc94cc0d72",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72"
},
"reviewers": [
"reviewerUrl": null,
"vote": 0,
"id": "2ea2d095-48f9-4cd6-9966-62f6f574096c",
"displayName": "[Mobile]\\Mobile Team",
"uniqueName": "vstfs:///Classification/TeamProject/f0811a3b-8c8a-
4e43-a3bf-9a049b4835bd\\Mobile Team",
"url":
"https://vssps.dev.azure.com/fabrikam/_apis/Identities/2ea2d095-48f9-4cd6-
9966-62f6f574096c",
"imageUrl":
"https://dev.azure.com/fabrikam/DefaultCollection/_api/_common/identityImage
?id=2ea2d095-48f9-4cd6-9966-62f6f574096c",
"isContainer": true
],
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-0462c7748079/pullRequests/1"
},
"resourceVersion": "1.0",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2016-09-19T13:03:27.3156388Z"
Solicitud de incorporación de cambios actualizada
Evento: se actualiza una solicitud de incorporación de cambios; status, review list,
reviewer vote changed, or the source branch is updated with a push.
Id. del publicador: tfs
Id. de evento: git.pullrequest.updated
Nombre del recurso: pullrequest
Configuración
notificationType : el tipo de cambio de solicitud de incorporación de cambios
Valores válidos:
PushNotification - Rama de origen actualizada
ReviewersUpdateNotification - Los revisores han cambiado
StatusUpdateNotification - Estado cambiado
ReviewerVoteNotification - Puntuación de votos modificada
repository : repositorio en el que se insertó el código.
Tipo de datos: guid
pullrequestCreatedBy : un grupo que tiene el solicitante como miembro.
pullrequestReviewersContains : un grupo incluido en la lista de revisores
branch : la rama de destino de la solicitud de incorporación de cambios.
Carga de ejemplo
JSON
{
"id": "af07be1b-f3ad-44c8-a7f1-c4835f2df06b",
"eventType": "git.pullrequest.updated",
"publisherId": "tfs",
"scope": "all",
"message": {
"text": "Jamal Hartnett marked the pull request as completed",
"html": "Jamal Hartnett marked the pull request as completed",
"markdown": "Jamal Hartnett marked the pull request as completed"
},
"detailedMessage": {
"text": "Jamal Hartnett marked the pull request as completed\r\n\r\n-
Merge status: Succeeded\r\n- Merge commit:
eef717(https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repo
sitories/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72)\r\n",
"html": "Jamal Hartnett marked the pull request as
completed\r\n<ul>\r\n<li>Merge status: Succeeded</li>\r\n<li>Merge commit:
<a
href=\"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repo
sitories/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72\">eef717</a>
</li>\r\n</ul>",
"markdown": "Jamal Hartnett marked the pull request as
completed\r\n\r\n+ Merge status: Succeeded\r\n+ Merge commit: [eef717]
(https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72)\r\n"
},
"resource": {
"repository": {
"id": "4bc14d40-c903-45e2-872e-0462c7748079",
"name": "Fabrikam",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-0462c7748079",
"project": {
"id": "6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"name": "Fabrikam",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/projects/6ce954b1-
ce1f-45d1-b94d-e6bf2464ba2c",
"state": "wellFormed"
},
"defaultBranch": "refs/heads/master",
"remoteUrl":
"https://dev.azure.com/fabrikam/DefaultCollection/_git/Fabrikam"
},
"pullRequestId": 1,
"status": "completed",
"createdBy": {
"id": "54d125f7-69f7-4191-904f-c5b96b6261c8",
"displayName": "Jamal Hartnett",
"uniqueName": "fabrikamfiber4@hotmail.com",
"url":
"https://vssps.dev.azure.com/fabrikam/_apis/Identities/54d125f7-69f7-4191-
904f-c5b96b6261c8",
"imageUrl":
"https://dev.azure.com/fabrikam/DefaultCollection/_api/_common/identityImage
?id=54d125f7-69f7-4191-904f-c5b96b6261c8"
},
"creationDate": "2014-06-17T16:55:46.589889Z",
"closedDate": "2014-06-30T18:59:12.3660573Z",
"title": "my first pull request",
"description": " - test2\r\n",
"sourceRefName": "refs/heads/mytopic",
"targetRefName": "refs/heads/master",
"mergeStatus": "succeeded",
"mergeId": "a10bb228-6ba6-4362-abd7-49ea21333dbd",
"lastMergeSourceCommit": {
"commitId": "53d54ac915144006c2c9e90d2c7d3880920db49c",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/53d54ac915144006c2c9e90d2c7d3880920db49c"
},
"lastMergeTargetCommit": {
"commitId": "a511f535b1ea495ee0c903badb68fbc83772c882",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/a511f535b1ea495ee0c903badb68fbc83772c882"
},
"lastMergeCommit": {
"commitId": "eef717f69257a6333f221566c1c987dc94cc0d72",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72"
},
"reviewers": [
"reviewerUrl": null,
"vote": 0,
"id": "2ea2d095-48f9-4cd6-9966-62f6f574096c",
"displayName": "[Mobile]\\Mobile Team",
"uniqueName": "vstfs:///Classification/TeamProject/f0811a3b-8c8a-
4e43-a3bf-9a049b4835bd\\Mobile Team",
"url":
"https://vssps.dev.azure.com/fabrikam/_apis/Identities/2ea2d095-48f9-4cd6-
9966-62f6f574096c",
"imageUrl":
"https://dev.azure.com/fabrikam/DefaultCollection/_api/_common/identityImage
?id=2ea2d095-48f9-4cd6-9966-62f6f574096c",
"isContainer": true
],
"commits": [
"commitId": "53d54ac915144006c2c9e90d2c7d3880920db49c",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-
0462c7748079/commits/53d54ac915144006c2c9e90d2c7d3880920db49c"
],
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/repos/git/repositori
es/4bc14d40-c903-45e2-872e-0462c7748079/pullRequests/1"
},
"resourceVersion": "1.0",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2016-09-19T13:03:27.2813828Z"
Elemento de trabajo
Elemento de trabajo creado
Filtrar eventos para incluir solo elementos de trabajo recién creados.
Id. del publicador: tfs
Id. de evento: workitem.created
Nombre del recurso: workitem
Configuración
areaPath : filtra los eventos para incluir solo elementos de trabajo en la ruta de
acceso de área especificada.
workItemType : filtra los eventos para incluir solo elementos de trabajo del tipo
especificado.
Carga de ejemplo
JSON
"id": "d2d46fb1-dba5-403c-9373-427583f19e8c",
"eventType": "workitem.created",
"publisherId": "tfs",
"scope": "all",
"message": {
"text": "Bug #5 (Some great new idea!) created by Jamal
Hartnett.\r\n(https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5)",
"html": "<a href=\"https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5\">Bug #5</a> (Some
great new idea!) created by Jamal Hartnett.",
"markdown": "[Bug #5](https://dev.azure.com/fabrikam-fiber-
inc/web/wi.aspx?pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5) (Some
great new idea!) created by Jamal Hartnett."
},
"detailedMessage": {
"text": "Bug #5 (Some great new idea!) created by Jamal
Hartnett.\r\n(https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5)\r\n\r\n- Area:
FabrikamCloud\r\n- Iteration: FabrikamCloud\\Release 1\\Sprint 1\r\n- State:
New\r\n- Assigned to: \r\n- Comment: \r\n- Severity: 3 - Medium\r\n",
"html": "<a href=\"https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5\">Bug #5</a> (Some
great new idea!) created by Jamal Hartnett.<ul>\r\n<li>Area:
FabrikamCloud</li>\r\n<li>Iteration: FabrikamCloud\\Release 1\\Sprint
1</li>\r\n<li>State: New</li>\r\n<li>Assigned to: </li>\r\n<li>Comment:
</li>\r\n<li>Severity: 3 - Medium</li></ul>",
"markdown": "[Bug #5](https://dev.azure.com/fabrikam-fiber-
inc/web/wi.aspx?pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5) (Some
great new idea!) created by Jamal Hartnett.\r\n\r\n* Area:
FabrikamCloud\r\n* Iteration: FabrikamCloud\\Release 1\\Sprint 1\r\n* State:
New\r\n* Assigned to: \r\n* Comment: \r\n* Severity: 3 - Medium\r\n"
},
"resource": {
"id": 5,
"rev": 1,
"fields": {
"System.AreaPath": "FabrikamCloud",
"System.TeamProject": "FabrikamCloud",
"System.IterationPath": "FabrikamCloud\\Release 1\\Sprint 1",
"System.WorkItemType": "Bug",
"System.State": "New",
"System.Reason": "New defect reported",
"System.CreatedDate": "2014-07-15T17:42:44.663Z",
"System.CreatedBy": "Jamal Hartnett",
"System.ChangedDate": "2014-07-15T17:42:44.663Z",
"System.ChangedBy": "Jamal Hartnett",
"System.Title": "Some great new idea!",
"Microsoft.Azure DevOps Services.Common.Severity": "3 - Medium",
"WEF_EB329F44FE5F4A94ACB1DA153FDF38BA_Kanban.Column": "New"
},
"_links": {
"self": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5"
},
"workItemUpdates": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5/updates"
},
"workItemRevisions": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5/revisions"
},
"workItemType": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/ea830882-2a3c-4095-a53f-
972f9a376f6e/workItemTypes/Bug"
},
"fields": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/fields"
},
"url": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5"
},
"resourceVersion": "1.0",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2016-09-19T13:03:29.7688022Z"
Elemento de trabajo eliminado
Filtrar eventos para incluir solo elementos de trabajo recién eliminados.
Id. del publicador: tfs
Id. de evento: workitem.deleted
Nombre del recurso: resource
Configuración
areaPath : filtra los eventos para incluir solo elementos de trabajo en la ruta de
acceso de área especificada.
workItemType : filtra los eventos para incluir solo elementos de trabajo del tipo
especificado.
Carga de ejemplo
JSON
"id": "72da0ade-0709-40ee-beb7-104287bf7e84",
"eventType": "workitem.deleted",
"publisherId": "tfs",
"scope": "all",
"message": {
"text": "Bug #5 (Some great new idea!) deleted by Jamal Hartnett.",
"html": "Bug #5 (Some great new idea!) deleted by Jamal Hartnett.",
"markdown": "[Bug #5](Some great new idea!) deleted by Jamal Hartnett."
},
"detailedMessage": {
"text": "Bug #5 (Some great new idea!) deleted by Jamal
Hartnett.\r\n\r\n- Area: FabrikamCloud\r\n- Iteration:
FabrikamCloud\\Release 1\\Sprint 1\r\n- State: New\r\n",
"html": "Bug #5 (Some great new idea!) deleted by Jamal Hartnett.
<ul>\r\n<li>Area: FabrikamCloud</li>\r\n<li>Iteration:
FabrikamCloud\\Release 1\\Sprint 1</li>\r\n<li>State: New</li></ul>",
"markdown": "[Bug #5](Some great new idea!) deleted by Jamal
Hartnett.\r\n\r\n* Area: FabrikamCloud\r\n* Iteration:
FabrikamCloud\\Release 1\\Sprint 1\r\n* State: New\r\n"
},
"resource": {
"id": 5,
"rev": 1,
"fields": {
"System.AreaPath": "FabrikamCloud",
"System.TeamProject": "FabrikamCloud",
"System.IterationPath": "FabrikamCloud\\Release 1\\Sprint 1",
"System.WorkItemType": "Bug",
"System.State": "New",
"System.Reason": "New defect reported",
"System.CreatedDate": "2014-07-15T17:42:44.663Z",
"System.CreatedBy": "Jamal Hartnett",
"System.ChangedDate": "2014-07-15T17:42:44.663Z",
"System.ChangedBy": "Jamal Hartnett",
"System.Title": "Some great new idea!",
"Microsoft.Azure DevOps Services.Common.Severity": "3 - Medium",
"WEF_EB329F44FE5F4A94ACB1DA153FDF38BA_Kanban.Column": "New"
},
"_links": {
"self": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/recyclebin/5"
},
"workItemType": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/ea830882-2a3c-4095-a53f-
972f9a376f6e/workItemTypes/Bug"
},
"fields": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/fields"
},
"url": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/recyclebin/5"
},
"resourceVersion": "1.0",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2016-09-19T13:03:30.0657064Z"
Elemento de trabajo restaurado
Filtre los eventos para incluir solo los elementos de trabajo recién restaurados.
Id. del publicador: tfs
Id. de evento: workitem.restored
Nombre del recurso: resource
Configuración
areaPath : filtra los eventos para incluir solo elementos de trabajo en la ruta de
acceso de área especificada.
workItemType : filtra los eventos para incluir solo elementos de trabajo del tipo
especificado.
Carga de ejemplo
JSON
"id": "1ca023d6-6cff-49dd-b3d1-302b69311810",
"eventType": "workitem.restored",
"publisherId": "tfs",
"scope": "all",
"message": {
"text": "Bug #5 (Some great new idea!) restored by Jamal
Hartnett.\r\n(https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5)",
"html": "<a href=\"https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5\">Bug #5</a> (Some
great new idea!) restored by Jamal Hartnett.",
"markdown": "[Bug #5](https://dev.azure.com/fabrikam-fiber-
inc/web/wi.aspx?pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5) (Some
great new idea!) restored by Jamal Hartnett."
},
"detailedMessage": {
"text": "Bug #5 (Some great new idea!) restored by Jamal
Hartnett.\r\n(https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5)\r\n\r\n- Area:
FabrikamCloud\r\n- Iteration: FabrikamCloud\\Release 1\\Sprint 1\r\n- State:
New\r\n- Severity: 3 - Medium\r\n",
"html": "<a href=\"https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5\">Bug #5</a> (Some
great new idea!) restored by Jamal Hartnett.<ul>\r\n<li>Area:
FabrikamCloud</li>\r\n<li>Iteration: FabrikamCloud\\Release 1\\Sprint
1</li>\r\n<li>State: New</li>Severity: 3 - Medium</li></ul>",
"markdown": "[Bug #5](https://dev.azure.com/fabrikam-fiber-
inc/web/wi.aspx?pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5) (Some
great new idea!) restored by Jamal Hartnett.\r\n\r\n* Area:
FabrikamCloud\r\n* Iteration: FabrikamCloud\\Release 1\\Sprint 1\r\n* State:
New\r\n* Severity: 3 - Medium\r\n"
},
"resource": {
"id": 5,
"rev": 1,
"fields": {
"System.AreaPath": "FabrikamCloud",
"System.TeamProject": "FabrikamCloud",
"System.IterationPath": "FabrikamCloud\\Release 1\\Sprint 1",
"System.WorkItemType": "Bug",
"System.State": "New",
"System.Reason": "New defect reported",
"System.CreatedDate": "2014-07-15T17:42:44.663Z",
"System.CreatedBy": "Jamal Hartnett",
"System.ChangedDate": "2014-07-15T17:42:44.663Z",
"System.ChangedBy": "Jamal Hartnett",
"System.Title": "Some great new idea!",
"Microsoft.Azure DevOps Services.Common.Severity": "3 - Medium",
"WEF_EB329F44FE5F4A94ACB1DA153FDF38BA_Kanban.Column": "New"
},
"_links": {
"self": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5"
},
"workItemUpdates": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5/updates"
},
"workItemRevisions": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5/revisions"
},
"workItemType": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/ea830882-2a3c-4095-a53f-
972f9a376f6e/workItemTypes/Bug"
},
"fields": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/fields"
},
"html": {
"href": "https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=d81542e4-cdfa-4333-b082-1ae2d6c3ad16&id=5"
},
"workItemHistory": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5/history"
},
"url": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5"
},
"resourceVersion": "1.0",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2016-09-19T13:03:30.1456784Z"
Elemento de trabajo actualizado
Filtrar eventos para incluir solo elementos de trabajo modificados.
Id. del publicador: tfs
Id. de evento: workitem.updated
Nombre del recurso: workitem
Configuración
areaPath : filtra los eventos para incluir solo elementos de trabajo en la ruta de
acceso de área especificada.
changedFields : filtra los eventos para incluir solo elementos de trabajo con los
campos especificados modificados.
workItemType : filtra los eventos para incluir solo elementos de trabajo del tipo
especificado.
Carga de ejemplo
JSON
```json
"id": "1ca023d6-6cff-49dd-b3d1-302b69311810",
"eventType": "workitem.updated",
"publisherId": "tfs",
"scope": "all",
"message": {
"text": "Bug #5 (Some great new idea!) updated by Jamal
Hartnett.\r\n(https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5)",
"html": "<a href=\"https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5\">Bug #5</a> (Some
great new idea!) updated by Jamal Hartnett.",
"markdown": "[Bug #5](https://dev.azure.com/fabrikam-fiber-
inc/web/wi.aspx?pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5) (Some
great new idea!) updated by Jamal Hartnett."
},
"detailedMessage": {
"text": "Bug #5 (Some great new idea!) updated by Jamal
Hartnett.\r\n(https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5)\r\n\r\n- Area:
FabrikamCloud\r\n- Iteration: FabrikamCloud\\Release 1\\Sprint 1\r\n- State:
New\r\n- Severity: 3 - Medium\r\n",
"html": "<a href=\"https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5\">Bug #5</a> (Some
great new idea!) updated by Jamal Hartnett.<ul>\r\n<li>Area:
FabrikamCloud</li>\r\n<li>Iteration: FabrikamCloud\\Release 1\\Sprint
1</li>\r\n<li>State: New</li>Severity: 3 - Medium</li></ul>",
"markdown": "[Bug #5](https://dev.azure.com/fabrikam-fiber-
inc/web/wi.aspx?pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5) (Some
great new idea!) updated by Jamal Hartnett.\r\n\r\n* Area:
FabrikamCloud\r\n* Iteration: FabrikamCloud\\Release 1\\Sprint 1\r\n* State:
New\r\n* Severity: 3 - Medium\r\n"
},
"resource": {
"id": 5,
"rev": 1,
"fields": {
"System.AreaPath": "FabrikamCloud",
"System.TeamProject": "FabrikamCloud",
"System.IterationPath": "FabrikamCloud\\Release 1\\Sprint 1",
"System.WorkItemType": "Bug",
"System.State": "New",
"System.Reason": "New defect reported",
"System.CreatedDate": "2014-07-15T17:42:44.663Z",
"System.CreatedBy": "Jamal Hartnett",
"System.ChangedDate": "2014-07-15T17:42:44.663Z",
"System.ChangedBy": "Jamal Hartnett",
"System.Title": "Some great new idea!",
"Microsoft.Azure DevOps Services.Common.Severity": "3 - Medium",
"WEF_EB329F44FE5F4A94ACB1DA153FDF38BA_Kanban.Column": "New"
},
"_links": {
"self": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5"
},
"workItemUpdates": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5/updates"
},
"workItemRevisions": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5/revisions"
},
"workItemType": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/ea830882-2a3c-4095-a53f-
972f9a376f6e/workItemTypes/Bug"
},
"fields": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/fields"
},
"html": {
"href": "https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=d81542e4-cdfa-4333-b082-1ae2d6c3ad16&id=5"
},
"workItemHistory": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5/history"
},
"url": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5"
},
"resourceVersion": "1.0",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2016-09-19T13:03:30.1456784Z"
Elemento de trabajo comentado en
Filtrar eventos para incluir solo elementos de trabajo comentados.
Id. del publicador: tfs
Id. de evento: workitem.commented
Nombre del recurso: workitem
Configuración
areaPath : filtra los eventos para incluir solo elementos de trabajo en la ruta de
acceso de área especificada.
commentPattern : cadena que se debe encontrar en el comentario.
workItemType : filtra los eventos para incluir solo elementos de trabajo del tipo
especificado.
Carga de ejemplo
JSON
"id": "fb2617ed-60df-4518-81fa-749faa6c5cd6",
"eventType": "workitem.commented",
"publisherId": "tfs",
"scope": "all",
"message": {
"text": "Bug #5 (Some great new idea!) commented on by Jamal
Hartnett.\r\n(https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5)",
"html": "<a href=\"https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5\">Bug #5</a> (Some
great new idea!) commented on by Jamal Hartnett.",
"markdown": "[Bug #5](https://dev.azure.com/fabrikam-fiber-
inc/web/wi.aspx?pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5) (Some
great new idea!) commented on by Jamal Hartnett."
},
"detailedMessage": {
"text": "Bug #5 (Some great new idea!) commented on by Jamal
Hartnett.\r\n(https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5)\r\nThis is a great new
idea",
"html": "<a href=\"https://dev.azure.com/fabrikam-fiber-inc/web/wi.aspx?
pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5\">Bug #5</a> (Some
great new idea!) commented on by Jamal Hartnett.<br/>This is a great new
idea",
"markdown": "[Bug #5](https://dev.azure.com/fabrikam-fiber-
inc/web/wi.aspx?pcguid=74e918bf-3376-436d-bd20-8e8c1287f465&id=5) (Some
great new idea!) commented on by Jamal Hartnett.\r\nThis is a great new
idea"
},
"resource": {
"id": 5,
"rev": 4,
"fields": {
"System.AreaPath": "FabrikamCloud",
"System.TeamProject": "FabrikamCloud",
"System.IterationPath": "FabrikamCloud\\Release 1\\Sprint 1",
"System.WorkItemType": "Bug",
"System.State": "New",
"System.Reason": "New defect reported",
"System.CreatedDate": "2014-07-15T17:42:44.663Z",
"System.CreatedBy": "Jamal Hartnett",
"System.ChangedDate": "2014-07-15T17:42:44.663Z",
"System.ChangedBy": "Jamal Hartnett",
"System.Title": "Some great new idea!",
"Microsoft.Azure DevOps Services.Common.Severity": "3 - Medium",
"WEF_EB329F44FE5F4A94ACB1DA153FDF38BA_Kanban.Column": "New",
"System.History": "This is a great new idea"
},
"_links": {
"self": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5"
},
"workItemUpdates": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5/updates"
},
"workItemRevisions": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5/revisions"
},
"workItemType": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/ea830882-2a3c-4095-a53f-
972f9a376f6e/workItemTypes/Bug"
},
"fields": {
"href": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/fields"
},
"url": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection/_apis/wit/workItems/5"
},
"resourceVersion": "1.0",
"resourceContainers": {
"collection": {
"id": "c12d0eb8-e382-443b-9f9c-c52cba5014c2"
},
"account": {
"id": "f844ec47-a9db-4511-8281-8b63f4eaf94e"
},
"project": {
"id": "be9b3917-87e6-42a4-a549-2bc06a7a878f"
},
"createdDate": "2016-09-19T13:03:28.9695265Z"
Contenedores de recursos
La carga del evento contiene un resourceContainers diccionario que incluye los
identificadores del proyecto, la colección o la cuenta o el servidor desde los que se
inició el evento.
Algunos productos o entornos también incluyen un baseUrl campo con cada entrada
que proporciona la dirección URL completa al contenedor. Puede usar esta dirección
URL para crear una conexión al contenedor para realizar llamadas a la API rest.
Solución de problemas de enlaces de
servicio
Artículo • 03/12/2022 • Tiempo de lectura: 5 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Use este artículo para obtener instrucciones generales de solución de problemas y
respuestas a las preguntas más frecuentes (P+F).
Visualización de problemas de actividad y
depuración
La página Service Hooks del administrador de acceso web muestra la actividad reciente
(últimos 14 días) para cada suscripción y si una suscripción está habilitada, deshabilitada
o restringida.
Puede acceder al historial detallado sobre una suscripción, incluidos datos detallados de
solicitud y respuesta, lo que resulta útil para depurar un servicio o una suscripción
problemáticos.
1. Para ver la actividad y el estado de las suscripciones, vaya a la página Enlaces de
servicio .
2. Para ver la actividad detallada de una suscripción, incluidos los datos completos de
solicitud, respuesta y carga de eventos, seleccione una suscripción en la tabla y, a
continuación, seleccione Historial.
Errores de suscripción y probación (restringido)
Tipos de error
Los errores de una notificación de enlaces de servicio se agrupan en las siguientes
categorías:
Errores de terminal
Errores transitorios
Errores duraderos
Errores de terminal
El único error de terminal es código de estado HTTP 410 (desaparecido). Cuando una
suscripción ve un error de terminal, se deshabilita automáticamente
independientemente de su estado anterior.
Errores transitorios
Cuando una suscripción ve un error transitorio, intenta volver a enviar la notificación
hasta ocho veces, con un retraso creciente entre cada intento. Los errores transitorios
incluyen los siguientes códigos:
408 (tiempo de espera de solicitud)
502 (puerta de enlace incorrecta)
503 (Servicio no disponible)
504 (tiempo de espera de puerta de enlace)
Secuencia de reintentos para errores transitorios
Reintentar # Tiempo de espera
Antes de esperar ~1 segundo
reintentar 1
Antes del esperar ~2 segundos (retraso total de 3 segundos)
reintento 2
Antes de esperar ~4 segundos (retraso total de 7 segundos)
reintentar 3
Antes de esperar ~8 segundos (retraso total de 15 segundos)
reintentar 4
Antes de espera ~16 segundos (retraso total de 31 segundos)
reintentar 5
Reintentar # Tiempo de espera
Antes de esperar ~32 segundos (retraso total de 63 segundos)
reintentar 6
Antes de esperar ~60 segundos (tiempo de retroceso máximo, retraso total de 123
reintentar 7 segundos)
Antes de esperar ~60 segundos (tiempo de retroceso máximo, retraso total de 183
reintentar 8 segundos)
Si la notificación agota todos sus reintentos y continúa viendo un error transitorio para
cada intento, la suscripción deja de intentar enviar la notificación y trata la notificación
como si viera un error duradero.
Errores duraderos
Los errores duraderos incluyen todos los demás códigos de error HTTP, por ejemplo:
404 (no encontrado), 500 (error interno del servidor), etc.
Cuando una suscripción ve un error duradero, se coloca en libertad condicional.
Período de prueba
Mientras está en libertad condicional, una suscripción está limitada en el número de
notificaciones que puede enviar. Si la suscripción sigue teniendo errores duraderos, se
limita cada vez más y finalmente se deshabilita. Si la suscripción recibe una respuesta
correcta mientras está en libertad condicional, se restaura a un estado totalmente
habilitado.
Secuencia de siete reintentos máximos mientras la suscripción está
en libertad condicional
Cuando una suscripción está en libertad condicional, se pierden los eventos nuevos. Una
vez que un reintento se realiza correctamente, la suscripción está habilitada y los
eventos se vuelven a publicar.
Reintentar # Tiempo de espera
Antes de esperar aproximadamente 20 minutos
reintentar 1
Antes del esperar ~40 minutos (tiempo total de prueba de 1 hora)
reintento 2
Reintentar # Tiempo de espera
Antes de esperar aproximadamente 1 hora 20 minutos (tiempo total de prueba de
reintentar 3 2,33 horas)
Antes de esperar aproximadamente 2 horas 40 minutos (tiempo total de prueba de 5
reintentar 4 horas)
Antes de esperar aproximadamente 5 horas 20 minutos (tiempo total de prueba de
reintentar 5 10,33 horas)
Antes de esperar aproximadamente 10 horas 40 minutos (tiempo total de prueba de
reintentar 6 21 horas)
Antes de espera ~15 horas (tiempo de retroceso máximo, tiempo total de prueba de
reintentar 7 36 horas)
Después de siete reintentos, el estado de la suscripción se establece en
DisabledBySystem si se produce un error en la notificación al consumidor.
Preguntas más frecuentes
P: ¿Cuál es el límite de carga de un enlace de servicio?
Un: El límite de carga es de 2 MB. Las cargas más grandes provocan una degradación
del rendimiento y la confiabilidad. Como procedimiento recomendado, los enlaces de
servicio deben limitar la carga a 2 MB o menos.
P: ¿Qué significa el estado Habilitado (restringido)?
Un: Una suscripción se restringe si se producen demasiados errores. Habilitado
(restringido) es el mismo que estar en libertad condicional.
P: ¿Qué significa el estado Deshabilitado (debido a
errores)?
R: Una suscripción se deshabilita automáticamente después de una serie de errores
consecutivos durante un período prolongado o se encuentra un error terminal . Los tipos
de errores transitorios se reintentan varias veces antes de declararse un error. Los tipos
de error duraderos no se reintentan. A continuación se muestran ejemplos de cada tipo
de error.
Transitorio: 408 (tiempo de espera de solicitud), 502 (puerta de enlace incorrecta),
503 (servicio no disponible), 504 (tiempo de espera de puerta de enlace)
Terminal: 410 (desaparecido)
Perdurable: todos los errores que no son transitorios o terminales
P: ¿Qué significa el estado Deshabilitado (proyecto de
usuario izquierdo)?
Un: El usuario que creó la suscripción ya no es miembro del equipo.
P: ¿Qué debo probar si un enlace de servicio no funciona?
Un: Compruebe los siguientes elementos:
Confirmación de que la suscripción está habilitada
Confirme que la configuración de la suscripción es correcta (tanto los filtros de
eventos como las acciones)
Examine el historial, especialmente si hay errores.
P: ¿Puedo conceder a un usuario de proyecto normal la
capacidad de ver y administrar suscripciones de enlace de
servicio para un proyecto?
Un: De forma predeterminada, solo los administradores de proyectos tienen estos
permisos. Para concederlos directamente a otros usuarios, puede usar la herramienta de
línea de comandos o la API rest de seguridad .
P: ¿Puedo crear suscripciones mediante programación?
Un: Sí, use las API REST.
Integrar aplicaciones
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Puede compilar aplicaciones o servicios personalizados que se integren en Azure
DevOps con las API REST para realizar llamadas HTTP directas, o bien usar nuestras
bibliotecas cliente de .NET.
Además de la interacción con Azure DevOps en su aplicación, también puede realizar la
integración en servicios de terceros conocidos como Slack o Jenkins.
Para empezar, consulte:
Crear un error
Obtención de elementos de trabajo con consultas
Recursos
Referencia de API de REST
Creación de un error en Azure DevOps
Services mediante bibliotecas cliente de
.NET
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Crear un nuevo error (o cualquier elemento de trabajo) es bastante sencillo. Solo tiene
que establecer los valores de campo y enviar un objeto JSON-Patch al punto de
conexión rest.
Requisitos previos
Debe tener lo siguiente para poder crear un elemento de trabajo.
Una organización en Azure DevOps Services. Si no tiene una, puede crear una de
forma gratuita .
Un token de acceso personal, descubra cómo crear uno.
Un entorno de desarrollo de C#, puede usar Visual Studio .
Creación de un proyecto de C# en Visual Studio
Para obtener información sobre la programación de C# en Visual Studio, busque la
documentación de programación de C# de Visual Studio.
Contenido de código de C#
Hay algunas cosas que suceden en el ejemplo de código siguiente:
1. Authentication
a. Creación de credenciales mediante el PAT
b. Creación de un VSSConnection con el URI de Azure DevOps Services y las
credenciales
2. Recuperación del cliente mediante VSSConnection
3. Creación del error
a. Crear una matriz de objetos para establecer los valores de campo
b. Conversión de esa matriz en un objeto json serializado
c. Envío de ese objeto JSON serializado al punto de conexión REST
Fragmento de código C#
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi.Patch.Json;
using Microsoft.VisualStudio.Services.WebApi.Patch;
using Microsoft.VisualStudio.Services.WebApi;
using System.Net.Http.Headers;
using System.Net.Http;
using Newtonsoft.Json;
public class CreateBug
readonly string _uri;
readonly string _personalAccessToken;
readonly string _project;
/// <summary>
/// Constructor. Manually set values to match your organization.
/// </summary>
public CreateBug()
_uri = "https://dev.azure.com/{orgName}";
_personalAccessToken = "personal access token";
_project = "project name";
/// <summary>
/// Create a bug using the .NET client library
/// </summary>
///
<returns>Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models.WorkItem</r
eturns>
public WorkItem CreateBugUsingClientLib()
Uri uri = new Uri(_uri);
string personalAccessToken = _personalAccessToken;
string project = _project;
VssBasicCredential credentials = new VssBasicCredential("",
_personalAccessToken);
JsonPatchDocument patchDocument = new JsonPatchDocument();
//add fields and their values to your patch document
patchDocument.Add(
new JsonPatchOperation()
Operation = Operation.Add,
Path = "/fields/System.Title",
Value = "Authorization Errors"
);
patchDocument.Add(
new JsonPatchOperation()
Operation = Operation.Add,
Path = "/fields/Microsoft.VSTS.TCM.ReproSteps",
Value = "Our authorization logic needs to allow for users
with Microsoft accounts (formerly Live Ids) - http://
msdn.microsoft.com/library/live/hh826547.aspx"
);
patchDocument.Add(
new JsonPatchOperation()
Operation = Operation.Add,
Path = "/fields/Microsoft.VSTS.Common.Priority",
Value = "1"
);
patchDocument.Add(
new JsonPatchOperation()
Operation = Operation.Add,
Path = "/fields/Microsoft.VSTS.Common.Severity",
Value = "2 - High"
);
VssConnection connection = new VssConnection(uri, credentials);
WorkItemTrackingHttpClient workItemTrackingHttpClient =
connection.GetClient<WorkItemTrackingHttpClient>();
try
WorkItem result =
workItemTrackingHttpClient.CreateWorkItemAsync(patchDocument, project,
"Bug").Result;
Console.WriteLine("Bug Successfully Created: Bug #{0}",
result.Id);
return result;
catch (AggregateException ex)
Console.WriteLine("Error creating bug: {0}",
ex.InnerException.Message);
return null;
Pasos siguientes
Consulte otro inicio rápido: Obtención de una lista de elementos de trabajo
mediante consultas
Exploración de los ejemplos de integración
Captura de elementos de trabajo con
consultas mediante programación
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services
Un escenario común en Azure DevOps Services es capturar elementos de trabajo
mediante consultas. En este artículo se detalla cómo implementar ese escenario
mediante programación mediante nuestras API REST o bibliotecas cliente de .NET.
Prerrequisitos
Debe tener los siguientes elementos:
Una organización de Azure DevOps Services. Si no tiene una, puede crear una de
forma gratuita .
Un token de acceso personal, descubra cómo crear uno.
Un entorno de desarrollo de C#, puede usar Visual Studio
Creación de un proyecto de C# en Visual Studio
Para obtener información sobre la programación de C# Visual Studio, consulte la
documentación Visual Studio programación de C#.
Contenido de código de C#
Las siguientes tareas se producen en el ejemplo de código siguiente:
1. Authenticate
a. Creación de credenciales mediante el PAT
b. Generación del cliente
2. Obtener los elementos de trabajo
a. Cree la consulta que desea usar.
b. Obtener los resultados de esa consulta
c. Obtener cada uno de los elementos de trabajo por identificador
Fragmento de código C#
C#
// nuget:Microsoft.TeamFoundationServer.Client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models;
using Microsoft.VisualStudio.Services.Common;
public class QueryExecutor
private readonly Uri uri;
private readonly string personalAccessToken;
/// <summary>
/// Initializes a new instance of the <see cref="QueryExecutor" />
class.
/// </summary>
/// <param name="orgName">
/// An organization in Azure DevOps Services. If you don't have one,
you can create one for free:
/// <see href="https://go.microsoft.com/fwlink/?LinkId=307137" />.
/// </param>
/// <param name="personalAccessToken">
/// A Personal Access Token, find out how to create one:
/// <see href="/azure/devops/organizations/accounts/use-personal-
access-tokens-to-authenticate?view=azure-devops" />.
/// </param>
public QueryExecutor(string orgName, string personalAccessToken)
this.uri = new Uri("https://dev.azure.com/" + orgName);
this.personalAccessToken = personalAccessToken;
/// <summary>
/// Execute a WIQL (Work Item Query Language) query to return a list
of open bugs.
/// </summary>
/// <param name="project">The name of your project within your
organization.</param>
/// <returns>A list of <see cref="WorkItem"/> objects representing all
the open bugs.</returns>
public async Task<IList<WorkItem>> QueryOpenBugs(string project)
var credentials = new VssBasicCredential(string.Empty,
this.personalAccessToken);
// create a wiql object and build our query
var wiql = new Wiql()
// NOTE: Even if other columns are specified, only the ID & URL
are available in the WorkItemReference
Query = "Select [Id] " +
"From WorkItems " +
"Where [Work Item Type] = 'Bug' " +
"And [System.TeamProject] = '" + project + "' " +
"And [System.State] <> 'Closed' " +
"Order By [State] Asc, [Changed Date] Desc",
};
// create instance of work item tracking http client
using (var httpClient = new WorkItemTrackingHttpClient(this.uri,
credentials))
// execute the query to get the list of work items in the
results
var result = await
httpClient.QueryByWiqlAsync(wiql).ConfigureAwait(false);
var ids = result.WorkItems.Select(item => item.Id).ToArray();
// some error handling
if (ids.Length == 0)
return Array.Empty<WorkItem>();
// build a list of the fields we want to see
var fields = new[] { "System.Id", "System.Title", "System.State"
};
// get work items for the ids found in query
return await httpClient.GetWorkItemsAsync(ids, fields,
result.AsOf).ConfigureAwait(false);
/// <summary>
/// Execute a WIQL (Work Item Query Language) query to print a list
of open bugs.
/// </summary>
/// <param name="project">The name of your project within your
organization.</param>
/// <returns>An async task.</returns>
public async Task PrintOpenBugsAsync(string project)
var workItems = await
this.QueryOpenBugs(project).ConfigureAwait(false);
Console.WriteLine("Query Results: {0} items found",
workItems.Count);
// loop though work items and write to console
foreach (var workItem in workItems)
Console.WriteLine(
"{0}\t{1}\t{2}",
workItem.Id,
workItem.Fields["System.Title"],
workItem.Fields["System.State"]);
Artículos relacionados
Crear un error
Integración de ejemplos
Procedimientos recomendados de
integración
Artículo • 18/11/2022 • Tiempo de lectura: 4 minutos
Azure DevOps Services
Las herramientas e integraciones entre los servicios se crean para mejorar las eficiencias
de los Azure DevOps Services. Si no tiene cuidado, las herramientas automatizadas
pueden salir del control de la ejecución de una alta tasa de solicitudes. Las solicitudes
hacen que Azure DevOps Services aplique rápidamente los límites de velocidad a su
organización. Para ayudar a reducir el riesgo de alcanzar los límites de velocidad, siga
estos procedimientos recomendados al usar las API REST para integrarse con Azure
DevOps Services.
Insertar solo elementos de trabajo accionables
Solo inserte elementos accionables en Azure DevOps Services que el equipo planea
participar o abordar en el futuro. Mantenga los elementos de trabajo fuera de Azure
DevOps Services hasta que sea necesario. Por ejemplo, no intente almacenar datos de
telemetría en Azure DevOps.
Mantenimiento de su propio almacén de datos
No agregue elementos de trabajo a Azure DevOps Services por el bien de tenerlos
todos en un solo lugar. Azure DevOps Services no está diseñado como un servicio de
almacenamiento de datos. Mantenga su propio almacén de datos.
Procesamiento por lotes de los cambios
Realizar operaciones únicas es lenta y costosa, que es la causa principal de problemas
de rendimiento y limitación de velocidad. Procesar por lotes los cambios en una sola
llamada. Consulte nuestra documentación por lotes y el código de ejemplo para
obtener instrucciones.
Limitar las revisiones
Muchas revisiones en un solo elemento de trabajo crean sobredimensionamiento y
provocan problemas de rendimiento. Se recomienda realizar las siguientes tareas:
Reduzca las actualizaciones mediante el procesamiento por lotes de los cambios
de campo. No actualice solo un campo a la vez.
Si tiene cambios en varios elementos de trabajo, realice un lote de esos cambios
en una sola acción.
Mantenga el número de revisiones en un mínimo para evitar los límites de revisión.
7 Nota
Un límite de revisión de elemento de trabajo de 10 000 está en vigor para las
actualizaciones realizadas a través de la API REST para Azure DevOps Services. Este
límite restringe las actualizaciones de la API REST, sin embargo, las actualizaciones
del portal web no se ven afectadas.
Optimización de consultas
Optimice las consultas para devolver un número modesto de resultados. Las
condiciones y filtros complejos pueden dar lugar a consultas de larga duración.
Mantenga el tiempo de ejecución de las consultas en menos de 30 segundos para evitar
errores de umbral.
Sugerencias de rendimiento de las consultas
Coloque una cláusula de limitación de fecha o intervalo cerca de la parte superior
de una consulta siempre que sea posible.
Reduzca el número de cláusulas que usan el operador Ever .
Reduzca el número de cláusulas que usan el operador Contains , excepto las
etiquetas.
Use el operador Contains Words cuando esté disponible.
No use el operador Contains en campos de texto largos, ya que es costoso.
Evite los operadores "<>" y no siempre que sea posible.
Evite usar el operador In Group para grupos grandes.
Minimice la cantidad de operadores Or y asegúrese de que todavía tiene un
ámbito de nivel superior antes de su uso.
Evite usar una cláusula OR entre un operador In Group y rutas de acceso de área o
iteración.
Reduzca el número de cláusulas generales para lograr su objetivo siempre que sea
posible.
Evite ordenar en cualquier otro campo distinto de los campos principales, como el
identificador, siempre que sea posible.
Si desea ordenar en un campo personalizado, úselo en los filtros.
Especifique un proyecto si es posible. De lo contrario, la consulta se limita a toda la
colección y podría tardar considerablemente más de lo que necesita. Desactive
"Consultar entre proyectos en la esquina superior derecha" del editor de consultas.
Consultar por los proyectos
Si la consulta requiere la búsqueda entre proyectos, especifique el proyecto que
busca.
Use etiquetas en lugar de palabras clave siempre que sea posible, a menos que
busque texto parcial de una cadena.
Control de errores correctamente
Las actualizaciones y las consultas producen un error cuando los límites de recursos o la
frecuencia de uso cruzan el umbral de límite. Por ejemplo, una consulta que se ejecuta
durante más de 30 segundos devuelve el siguiente error:
VS402335: The timeout period (30 seconds) elapsed prior to completion of the query
or the server is not responding.
Cuando consuma las API REST, asegúrese de diseñar el código para controlar los errores
correctamente.
Limitar los vínculos
Limite el número de vínculos por elemento de trabajo tanto como sea posible, para
evitar el cumplimiento de los límites de vínculo.
) Importante
Aplicaremos los límites de revisión y vínculo del elemento de trabajo en un futuro
próximo. Estos límites se determinarán mediante la supervisión del rendimiento y
los comentarios de los clientes.
No use consultas para la generación de
informes
El uso de consultas y llamadas individuales a elementos de trabajo es la mejor manera
de obtener los límites de velocidad que se aplican a su organización. No ejecute
consultas para devolver listas grandes de elementos de trabajo. En su lugar, use los
vínculos de elementos de trabajo de informes y las API REST de revisión de elementos
de trabajo .
Para obtener más información, consulte nuestro ejemplo de C# en GitHub .
Artículos relacionados
Bibliotecas cliente de .NET
Guía de migración
Enlaces de servicio
Control de versiones de la API REST
Enlaces de servicio en Azure DevOps
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services
Al usar las API REST de suscripciones , puede crear mediante programación una
suscripción que realice una acción en un servicio externo (consumidor) cuando se
produzca un evento específico en un proyecto. Por ejemplo, puede crear una
suscripción para notificar al servicio cuando se produce un error en una compilación.
Eventos admitidos:
Compilación completada
Código insertado (para proyectos de Git)
Creación o actualización de solicitudes de incorporación de cambios (para
proyectos de Git)
Código protegido (proyectos de TFVC)
Elemento de trabajo creado, actualizado, eliminado, restaurado o comentado
Puede configurar filtros en las suscripciones para controlar qué eventos desencadenan
una acción. Por ejemplo, puede filtrar el evento build completed en función del estado
de compilación. Para obtener un conjunto completo de eventos admitidos y opciones
de filtro, consulte la referencia de eventos.
Para obtener un conjunto completo de servicios y acciones de consumidor admitidos,
consulte la referencia del consumidor.
Creación de una suscripción de enlaces
de servicio mediante programación
Artículo • 27/09/2022 • Tiempo de lectura: 4 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Con las API REST de suscripciones , puede crear mediante programación una suscripción
que realice una acción en un servicio externo (consumidor) cuando se produzca un
evento específico en un proyecto. Por ejemplo, puede crear una suscripción para
notificar al servicio cuando se produce un error en una compilación.
Eventos admitidos:
compilación completada
código insertado (para proyectos de Git)
Creación o actualización de la solicitud de incorporación de cambios (para
proyectos de Git)
código protegido (proyectos de TFVC)
elemento de trabajo creado, actualizado, eliminado, restaurado o comentado
Puede configurar filtros en las suscripciones para controlar qué eventos desencadenan
una acción. Por ejemplo, puede filtrar el evento build completed en función del estado
de compilación. Para obtener un conjunto completo de eventos admitidos y opciones
de filtro, consulte la referencia de eventos.
Para obtener un conjunto completo de servicios y acciones de consumidor admitidos,
consulte la referencia del consumidor.
Creación de una suscripción para un proyecto
Para crear una suscripción para un evento, elija qué consumidor va a usar y la acción
que desea realizar. Cree una solicitud HTTP POST a la dirección URL de suscripciones de
la organización de Azure DevOps con el evento, el consumidor y la acción que se
realizarán para la suscripción.
Antes de empezar
Para crear una suscripción, se requieren los siguientes datos:
id. de proyecto (use la API REST de Project para obtener el identificador del
proyecto)
id. de evento y configuración (consulte la referencia de eventos)
identificadores y configuraciones de consumidor y acción (consulte la referencia
del consumidor)
Creación de la solicitud
Construya el cuerpo de la solicitud HTTP POST para crear la suscripción en función del
identificador del proyecto, el evento, el consumidor y la acción.
Esta es una solicitud de ejemplo para crear una suscripción que hace que un evento de
compilación se poste en https://myservice/event cuando se produzca un error en la
compilación WebSite.CI .
JavaScript
"publisherId": "tfs",
"eventType": "build.complete",
"resourceVersion": "1.0",
"consumerId": "webHooks",
"consumerActionId": "httpRequest",
"publisherInputs": {
"buildStatus": "failed",
"definitionName": "WebSite.CI",
"projectId": "56479caf-1eeb-4bca-86ab-aaa6f29399d9",
},
"consumerInputs": {
"url": " https://myservice/event"
},
Las direcciones URL HTTPS seguras son muy recomendables para la seguridad de los
datos privados en el objeto JSON.
Esta es la respuesta a la solicitud para crear la suscripción:
JavaScript
"id": "74aeeed0-bf5d-48dc-893f-f862b80987e9",
"url":
"https://dev.azure.com/fabrikam/DefaultCollection/_apis/hooks/subscriptions/
74aeeed0-bf5d-48dc-893f-f862b80987e9",
"publisherId": "tfs",
"eventType": "build.complete",
"resourceVersion": "1.0",
"consumerId": "webHooks",
"consumerActionId": "httpRequest",
"createdBy": {
"id": "00ca946b-2fe9-4f2a-ae2f-40d5c48001bc"
},
"createdDate": "2014-03-28T16:10:06.523Z",
"modifiedBy": {
"id": "1c4978ae-7cc9-4efa-8649-5547304a8438"
},
"modifiedDate": "2014-04-25T18:15:26.053Z",
"publisherInputs": {
"buildStatus": "failed",
"definitionName": "WebSite.CI",
"hostId": "17f27955-99bb-4861-9550-f2c669d64fc9",
"projectId": "56479caf-1eeb-4bca-86ab-aaa6f29399d9",
"tfsSubscriptionId": "29cde8b4-f37e-4ef9-a6d4-d57d526d82cc"
},
"consumerInputs": {
"url": "http://myservice/event"
Si se produce un error en la solicitud de suscripción, se devuelve un código de respuesta
HTTP de 400 con un mensaje que tiene más detalles.
¿Qué ocurre cuando se produce el evento?
Cuando se produce un evento, se evalúan todas las suscripciones habilitadas del
proyecto y la acción del consumidor se realiza para todas las suscripciones coincidentes.
Versiones de recursos (avanzadas)
El control de versiones de recursos es aplicable cuando una API está en versión
preliminar. En la mayoría de los escenarios, especificar 1.0 como la versión del recurso
es la ruta más segura.
La carga de eventos enviada a determinados consumidores (como web hooks, Azure
Service Bus, Azure Storage) incluye una representación JSON del recurso sujeto (por
ejemplo, una compilación o un elemento de trabajo). La representación de este recurso
puede tener diferentes formularios (o versiones).
Puede especificar la versión del recurso
que desea enviar al servicio de consumidor a través del resourceVersion campo de la
suscripción.
La versión del recurso es la misma que la versión de la API. No especificar
una versión de recurso significa "última versión publicada". Siempre debe especificar
una versión de recurso: esto garantiza una carga de eventos coherente a lo largo del
tiempo.
Preguntas y respuestas
P: ¿Hay servicios a los que puedo suscribirme manualmente?
R: Sí. Estos son los servicios a los que puede suscribirse desde la página de
administración de un proyecto.
P: ¿Hay bibliotecas de C# que puedo usar para crear suscripciones?
R: No, pero este es un ejemplo para ayudarle a empezar.
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Mvc;
namespace Microsoft.Samples.VisualStudioOnline
public class ServiceHookEventController : Controller
// POST: /ServiceHookEvent/workitemcreated
[HttpPost]
public HttpResponseMessage WorkItemCreated(Content workItemEvent)
//Grabbing the title for the new workitem
var value = RetrieveFieldValue("System.field",
workItemEvent.Resource.Fields);
//Acknowledge event receipt
return new HttpResponseMessage(HttpStatusCode.OK);
/// <summary>
/// Gets the value for a specified work item field.
/// </summary>
/// <param name="key">Key used to retrieve matching value</param>
/// <param name="fields">List of fields for a work item</param>
/// <returns></returns>
public String RetrieveFieldValue(String key, IList<FieldInfo>
fields)
if (String.IsNullOrEmpty(key))
return String.Empty;
var result = fields.Single(s => s.Field.RefName == key);
return result.Value;
public class Content
public String SubscriptionId { get; set; }
public int NotificationId { get; set; }
public String EventType { get; set; }
public WorkItemResource Resource { get; set; }
public class WorkItemResource
public String UpdatesUrl { get; set; }
public IList<FieldInfo> Fields { get; set;}
public int Id { get; set; }
public int Rev { get; set; }
public String Url { get; set; }
public String WebUrl { get; set; }
public class FieldInfo
public FieldDetailedInfo Field { get; set; }
public String Value { get; set; }
public class FieldDetailedInfo
public int Id { get; set; }
public String Name { get; set; }
public String RefName { get; set; }
Introducción a las API REST
Artículo • 18/11/2022 • Tiempo de lectura: 5 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Integre la aplicación con Azure DevOps mediante estas API REST.
Estas API siguen un patrón común:
no-highlight
VERB https://{instance}/{collection}/{team-project}/_apis/{area}/{resource}?
api-version={version}
Sugerencia
Para evitar que la aplicación o el servicio se interrumpa a medida que evolucionan
las API, especifique una versión de API en cada solicitud.
Azure DevOps Services
Para Azure DevOps Services, instance es dev.azure.com/{organization} y collection
es DefaultCollection , por lo que el patrón tiene el siguiente aspecto:
no-highlight
VERB https://dev.azure.com/{organization}/_apis/{area}/{resource}?api-
version={version}
Por ejemplo, aquí se muestra cómo obtener una lista de proyectos de una organización.
dos
curl -u {username}:{personalaccesstoken}
https://dev.azure.com/{organization}/_apis/projects?api-version=2.0
Si desea proporcionar el token de acceso personal a través de un encabezado HTTP,
primero debe convertirlo en una cadena Base64 (en el ejemplo siguiente se muestra
cómo convertir a Base64 mediante C#). A continuación, la cadena resultante se puede
proporcionar como un encabezado HTTP con el formato :
Authorization: Basic BASE64PATSTRING
Aquí está en C# mediante la clase HttpClient.
C#
public static async void GetProjects()
try
var personalaccesstoken = "PAT_FROM_WEBSITE";
using (HttpClient client = new HttpClient())
client.DefaultRequestHeaders.Accept.Add(
new
System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"))
;
client.DefaultRequestHeaders.Authorization = new
AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "",
personalaccesstoken))));
using (HttpResponseMessage response = client.GetAsync(
"https://dev.azure.com/{organization}/_apis/projects").Result)
response.EnsureSuccessStatusCode();
string responseBody = await
response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
catch (Exception ex)
Console.WriteLine(ex.ToString());
Si no tiene una organización, puede configurar una de forma gratuita .
La mayoría de los ejemplos de este sitio usan tokens de acceso personal, ya que son un
ejemplo compacto para autenticarse con el servicio. Sin embargo, hay varios
mecanismos de autenticación disponibles para Azure DevOps Services, incluida la
Biblioteca de autenticación de Microsoft (MSAL), OAuth y tokens de sesión. Consulte la
sección Autenticación para obtener instrucciones sobre cuál es la más adecuada para su
escenario.
Azure DevOps Server
Para Azure DevOps Server, instance es {server:port} . El puerto predeterminado para
una conexión no SSL es 8080.
La colección predeterminada es DefaultCollection , pero puede usar cualquier
colección.
A continuación se muestra cómo obtener una lista de proyectos de Azure DevOps
Server mediante el puerto y la colección predeterminados en SSL:
dos
curl -u {username}:{personalaccesstoken}
https://{server}/DefaultCollection/_apis/projects?api-version=2.0
Para obtener la misma lista en una conexión no SSL:
dos
curl -u {username}:{personalaccesstoken}
http://{server}:8080/DefaultCollection/_apis/projects?api-version=2.0
En estos ejemplos se usan tokens de acceso personal, lo que requiere que cree un token
de acceso personal.
Respuestas
Debería obtener una respuesta como esta.
JSON
"value": [
"id": "eb6e4656-77fc-42a1-9181-4c6d8e9da5d1",
"name": "Fabrikam-Fiber-TFVC",
"url": "https: //dev.azure.com/fabrikam-fiber-
inc/_apis/projects/eb6e4656-77fc-42a1-9181-4c6d8e9da5d1",
"description": "TeamFoundationVersionControlprojects",
"collection": {
"id": "d81542e4-cdfa-4333-b082-1ae2d6c3ad16",
"name": "DefaultCollection",
"url": "https: //dev.azure.com/fabrikam-fiber-
inc/_apis/projectCollections/d81542e4-cdfa-4333-b082-1ae2d6c3ad16",
"collectionUrl": "https: //dev.azure.com/fabrikam-fiber-inc"
},
"defaultTeam": {
"id": "66df9be7-3586-467b-9c5f-425b29afedfd",
"name": "Fabrikam-Fiber-TFVCTeam",
"url": "https: //dev.azure.com/fabrikam-fiber-
inc/_apis/projects/eb6e4656-77fc-42a1-9181-4c6d8e9da5d1/teams/66df9be7-3586-
467b-9c5f-425b29afedfd"
},
"id": "6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"name": "Fabrikam-Fiber-Git",
"url": "https: //dev.azure.com/fabrikam-fiber-
inc/_apis/projects/6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"description": "Gitprojects",
"collection": {
"id": "d81542e4-cdfa-4333-b082-1ae2d6c3ad16",
"name": "DefaultCollection",
"url": "https: //dev.azure.com/fabrikam-fiber-
inc/_apis/projectCollections/d81542e4-cdfa-4333-b082-1ae2d6c3ad16",
"collectionUrl": "https: //dev.azure.com/fabrikam-fiber-inc"
},
"defaultTeam": {
"id": "8bd35c5e-30bb-4834-a0c4-d576ce1b8df7",
"name": "Fabrikam-Fiber-GitTeam",
"url": "https: //dev.azure.com/fabrikam-fiber-
inc/_apis/projects/6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c/teams/8bd35c5e-30bb-
4834-a0c4-d576ce1b8df7"
],
"count": 2
La respuesta es JSON .
Por lo general, esto es lo que obtendrá de las API REST, aunque
hay algunas excepciones, como los blobs de Git.
Ahora, puede buscar en torno a las áreas de API específicas, como el seguimiento de
elementos de trabajo o Git , y llegar a los recursos que necesita.
Siga leyendo para
obtener más información sobre los patrones generales que se usan en estas API.
Verbos HTTP
Verbo Se usa para...
Verbo Se usa para...
GET Obtener un recurso o una lista de recursos
POST Creación de un recurso, Obtención de una lista de recursos mediante una consulta más
avanzada
PUT Cree un recurso si no existe o, si lo hace, actualícelo.
PATCH Actualización de un recurso
Delete Eliminación de un recurso
Encabezados de solicitud y contenido de la solicitud
Al proporcionar el cuerpo de la solicitud (normalmente con los verbos POST, PUT y
PATCH), incluya encabezados de solicitud que describen el cuerpo. Por ejemplo,
no-highlight
POST https://dev.azure.com/fabrikam-fiber-inc/_apis/build-release/requests
HTTP
Content-Type: application/json
JSON
"definition": {
"id": 3
},
"reason": "Manual",
"priority": "Normal"
Invalidación del método HTTP
Algunos servidores proxy web solo pueden admitir los verbos HTTP GET y POST, pero
no más verbos HTTP modernos, como PATCH y DELETE.
Si las llamadas pueden pasar a
través de uno de estos servidores proxy, puede enviar el verbo real mediante un método
POST, con un encabezado para invalidar el método.
Por ejemplo, puede que desee
actualizar un elemento de trabajo ( PATCH _apis/wit/workitems/3 ), pero es posible que
tenga que pasar por un proxy que solo permita GET o POST.
Puede pasar el verbo
adecuado (PATCH en este caso) como parámetro de encabezado de solicitud HTTP y
usar POST como método HTTP real.
no-highlight
POST https://dev.azure.com/fabrikam-fiber-inc/_apis/wit/workitems/3
HTTP
X-HTTP-Method-Override: PATCH
JSON
(PATCH request body)
Códigos de respuesta
Response Notas
200 El éxito y hay un cuerpo de respuesta.
201 Correcto, al crear recursos. Algunas API devuelven 200 al crear correctamente un
recurso. Examine los documentos de la API que está usando para asegurarse de
hacerlo.
204 El éxito y no hay ningún cuerpo de respuesta. Por ejemplo, obtendrá esta respuesta
al eliminar un recurso.
400 Los parámetros de la dirección URL o del cuerpo de la solicitud no son válidos.
401 Error de autenticación. A menudo, esta respuesta se debe a un encabezado de
autorización que falta o tiene un formato incorrecto.
403 El usuario autenticado no tiene permiso para realizar la operación.
404 El recurso no existe o el usuario autenticado no tiene permiso para ver que existe.
409 Hay un conflicto entre la solicitud y el estado de los datos en el servidor. Por ejemplo,
si intenta enviar una solicitud de incorporación de cambios y ya hay una solicitud de
incorporación de cambios para las confirmaciones, el código de respuesta es 409.
Uso compartido de recursos entre orígenes
(CORS)
Azure DevOps Services admite CORS, lo que permite que el código JavaScript se sirva
desde un dominio que dev.azure.com/* no sea para realizar solicitudes de Ajax a Azure
DevOps Services API REST. Cada solicitud debe proporcionar credenciales (los tokens de
acceso personal y los tokens de acceso de OAuth son ambas opciones compatibles).
Ejemplo:
JavaScript
$( document ).ready(function() {
$.ajax({
url: 'https://dev.azure.com/fabrikam/_apis/projects?api-
version=1.0',
dataType: 'json',
headers: {
'Authorization': 'Basic ' + btoa("" + ":" + myPatToken)
}).done(function( results ) {
console.log( results.value[0].id + " " + results.value[0].name
);
});
});
(reemplace por myPatToken un token de acceso personal)
Control de versiones
Las API REST de Azure DevOps tienen versiones para garantizar que las aplicaciones y
los servicios sigan funcionando a medida que evolucionan las API.
Instrucciones
La versión de la API debe especificarse con cada solicitud.
Las versiones de API tienen el formato {major}. {minor}-{stage}. {resource-version}:
por ejemplo, 1.0 , 1.1 , 1.2-preview , 2.0 .
Aunque una API está en versión preliminar, puede especificar una versión precisa
de una revisión concreta de la API cuando sea necesario (por ejemplo, 1.0-
preview.1 , 1.0-preview.2 ).
Una vez publicada una API (1.0, por ejemplo), su versión preliminar (1.0-preview)
está en desuso y se puede desactivar después de 12 semanas.
Ahora, debe actualizar a la versión publicada de la API. Una vez desactivada una
API en versión preliminar, se rechazan las solicitudes que especifican -preview la
versión.
Uso
La versión de API se puede especificar en el encabezado de la solicitud HTTP o como
parámetro de consulta de dirección URL:
Encabezado de solicitud HTTP:
HTTP
Accept: application/json;api-version=1.0
Parámetro de consulta:
no-highlight
GET https://dev.azure.com/{organization}/_apis/{area}/{resource}?api-
version=1.0
Versiones compatibles
Para obtener información sobre las versiones admitidas, consulte Versiones admitidas de
la API rest.
Control de versiones de la API REST
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Las API REST de Azure DevOps tienen versiones para garantizar que las aplicaciones y
los servicios sigan funcionando a medida que evolucionan las API.
Instrucciones
La versión de API debe especificarse con cada solicitud.
Las versiones de API tienen el formato {major}. {minor} [-{stage}[.{ resource-
version}]] : por ejemplo, 1.0 , 1.1 , 1.2-preview , 2.0 .
Aunque una API está en versión preliminar, puede especificar una versión precisa
de una revisión concreta de la API cuando sea necesario (por ejemplo, 1.0-
preview.1 , 1.0-preview.2 ).
Una vez publicada una API (1.0, por ejemplo), su versión preliminar (1.0-preview)
está en desuso y se puede desactivar después de 12 semanas.
Durante este tiempo, debe actualizar a la versión publicada de la API. Una vez
desactivada una API en versión preliminar, se rechazan las solicitudes que
especifican una -preview versión.
Uso
La versión de la API se puede especificar en el encabezado de la solicitud HTTP o como
parámetro de consulta de dirección URL:
Encabezado de solicitud HTTP:
HTTP
Accept: application/json;api-version=1.0
Uri:
no-highlight
[scheme"://"][host[':'port]]"/v" major-version '/'namespace '/'resource
('/'resource)* '?' query
i.e. GET https://dev.azure.com/v1.0/{organization}/_apis/{area}/{resource}?
some-query=1000
Versiones compatibles
Producto 1.0 2.0 3.0 4.0 5.0 6,0
Azure DevOps Services X X X X X X
Azure DevOps Server 2020 X X X X X X
Azure DevOps Server 2019 X X X X X -
Team Foundation Server 2018 X X X X - -
Team Foundation Server 2017 X X X - - -
Team Foundation Server 2015 X X - - - -
Las versiones principales de la versión de API se alinean con las versiones RTM de Team
Foundation Server. Por ejemplo, el 3.0 conjunto de API se introdujo con Team
Foundation Server 2017.
Algunas API no documentadas de la versión 1.0 existían en Team Foundation Server
2013, pero no se admiten.
Artículos relacionados
Introducción a las API REST
Referencia de la API REST de Azure DevOps Services
Bibliotecas cliente de .NET
Artículo • 18/11/2022 • Tiempo de lectura: 6 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS 2018
Las bibliotecas cliente están disponibles para los desarrolladores de .NET que compilan aplicaciones y servicios de Windows que se
integran con Azure DevOps. Las bibliotecas cliente se integran con el seguimiento de elementos de trabajo, el control de versiones, la
compilación y otros servicios. Estos paquetes reemplazan al instalador de OM del cliente TFS tradicional y facilitan la adquisición y
redistribuir las bibliotecas necesarias para la aplicación o el servicio.
Sugerencia
Para más información, consulte la referencia de la API REST de Azure DevOps.
Diagrama de dependencia
Características
Descargable desde nuget.org y fácilmente importable en los proyectos de Visual Studio
Las bibliotecas tienen licencia para la redistribución en sus aplicaciones y servicios (ver la licencia )
Acceso a las API tradicionales del modelo de objetos de cliente y a las nuevas API REST
7 Nota
Los clientes basados en REST solo funcionan con Azure DevOps y TFS 2015 o posterior.
Para más información sobre cómo extender e
integrar con Azure DevOps mediante las bibliotecas cliente, consulte Extensión de Team Foundation.
Tabla de asignación de versiones de paquetes y Azure DevOps Server
Versión del paquete versión de Azure DevOps Server
16.170.0 versions >= Azure DevOps Server 2020
16.153.x versions >= Azure DevOps Server 2019 Update 1
16.143.x versions >= Azure DevOps Server 2019
15.131.x versions >= TFS 2018 Update 1
15.112.x versions >= TFS 2017 Update 1
14.102.x versions >= TFS 2015 Update 3
14.95.x versions >= TFS 2015 Update 2
14.89.x versions >= TFS 2015 Update 1
14.83.x versions >= TFS 2015
Para obtener las versiones preliminares más recientes, consulte la galería de paquetes NuGet .
Paquetes REST
Paquetes y descripción Binarios
Microsoft.VisualStudio.Services.Client
Microsoft.VisualStudio.Services.WebApi.dll , Microsoft.VisualStudio.Services.Common.
Proporciona acceso a servicios de plataforma compartida a través de api Microsoft.TeamFoundation.Common.dll
REST públicas, como organización, perfil, identidad, seguridad, etc.
Microsoft.TeamFoundationServer.Client
Microsoft.TeamFoundation.Build2.WebApi.dll , Microsoft.TeamFoundation.Core.WebApi.dl
Proporciona acceso al control de versiones, el seguimiento de elementos Microsoft.TeamFoundation.WorkItemTracking.Process.WebApi.dll Microsoft.TeamFoundati
de trabajo, la compilación y mucho más a través de las API REST públicas. , Microsoft.TeamFoundation.TestManagement.WebApi.dll , etc.
Microsoft.VisualStudio.Services.InteractiveClient
Microsoft.VisualStudio.Services.Client.Interactive.dll
Admite aplicaciones que requieren el inicio de sesión interactivo por parte
de un usuario.
Microsoft.VisualStudio.Services.Release.Client
Microsoft.VisualStudio.Services.ReleaseManagement.WebApi.dll
Proporciona acceso al servicio de versión a través de las API REST públicas.
Microsoft.TeamFoundation.DistributedTask.Common.Contracts
Microsoft.TeamFoundation.DistributedTask.Common.Contracts.dll
Proporciona los modelos que se usan para acceder al servicio de tareas
distribuidas a través de las API REST públicas.
Microsoft.TeamFoundation.DistributedTask.WebApi
Microsoft.TeamFoundation.DistributedTask.WebApi.dll
Proporciona acceso al servicio de tareas distribuidas a través de las API
REST públicas.
Microsoft.VisualStudio.Services.ServiceHooks.WebApi
Microsoft.VisualStudio.Services.ServiceHooks.WebApi.dll
Proporciona acceso al servicio de enlaces de servicio a través de las API
REST públicas.
Microsoft.VisualStudio.Services.Gallery.WebApi
Microsoft.VisualStudio.Services.Gallery.WebApi.dll
Proporciona acceso al servicio Gallery a través de las API REST públicas.
Microsoft.VisualStudio.Services.Notifications.WebApi
Microsoft.VisualStudio.Services.Notifications.WebApi.dll
Proporciona acceso al servicio de notificaciones a través de las API rest
públicas.
Microsoft.VisualStudio.Services.ExtensionManagement.WebApi
Microsoft.VisualStudio.Services.ExtensionManagement.WebApi.dll
Proporciona acceso al servicio de administración de extensiones a través
de las API REST públicas.
Microsoft.VisualStudio.Services.MemberEntitlementManagement.WebApi
Microsoft.VisualStudio.Services.MemberEntitlementManagement.WebApi.dll
Proporciona acceso al servicio de administración de derechos de miembro
a través de las API REST públicas.
Microsoft.VisualStudio.Services.ServiceEndpoints.WebApi
Microsoft.VisualStudio.Services.ServiceEndpoints.WebApi.dll
Proporciona acceso a los puntos de conexión de servicio a través de las API
rest públicas.
Microsoft.VisualStudio.Services.Search.Client
Microsoft.VisualStudio.Services.Search.Shared.WebApi.dll , Microsoft.VisualStudio.Se
Proporciona acceso al servicio de búsqueda a través de las API REST
públicas.
Microsoft.TeamFoundation.PublishTestResults
Microsoft.TeamFoundation.TestClient.PublishTestResults.dll
Esta tarea se puede usar para publicar resultados de pruebas y cargar
datos adjuntos de prueba en Azure DevOps. Los siguientes formatos de
resultados son compatibles con este paquete: 1. JUnit: publicar pruebas de
proyectos junit, 2. NUnit- publicar pruebas de proyectos Nunit, 3. VSTest:
publicar pruebas desde proyectos de Visual Studio, 4. Xunit: publicar
pruebas de proyectos de Xunit
Microsoft.VisualStudio.Services.Audit.WebApi
Microsoft.VisualStudio.Services.Audit.WebApi.dll
Proporciona acceso al servicio de auditoría a través de las API REST
públicas.
Microsoft.Azure.Pipelines.Policy.Client
Microsoft.Azure.Pipelines.Policy.Client.dll
Proporciona acceso a las aprobaciones de canalización, comprobaciones y
autorización a través de las API REST públicas.
Sugerencia
Si tiene una aplicación o servicio de Windows existente que usa el modelo de objetos de cliente de TFS, use
Microsoft.TeamFoundationServer.ExtendedClient .
Paquete Soap
Paquete y descripción Archivos binarios
Microsoft.TeamFoundationServer.ExtendedClient
Microsoft.TeamFoundation.Build.Client.dll ,
Trabaje con y administre el control de versiones, los elementos de trabajo y Microsoft.TeamFoundation.DeleteTeamProject.dll ,
la compilación, y otros recursos de la aplicación cliente. Este paquete no Microsoft.TeamFoundation.Diff.dll Microsoft.TeamFoundation.Git.Client.dll ,
admite el OM de cliente Net Standard. Use este paquete solo cuando , Microsoft.TeamFoundation.SharePointReporting.Integration.dll , etc.
nuestras API REST no ofrezcan la funcionalidad que necesita (por ejemplo,
crear áreas de trabajo en TFVC).
Instalar
Desde un símbolo del sistema del administrador de paquetes NuGet:
PowerShell
PM> Install-Package Microsoft.TeamFoundationServer.ExtendedClient
Patrón para su uso
Cree una conexión autenticada a Azure DevOps, obtenga httpClient para el servicio con el que desea trabajar y, a continuación, llame a
métodos en ese servicio.
Consulte los siguientes ejemplos:
C#
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.Client;
using Microsoft.TeamFoundation.SourceControl.WebApi;
using Microsoft.VisualStudio.Services.WebApi;
const String c_collectionUri = "https://dev.azure.com/fabrikam";
const String c_projectName = "MyGreatProject";
const String c_repoName = "MyRepo";
// Connect to Azure DevOps Services
VssConnection connection = new VssConnection(orgUrl, new VssBasicCredential(string.Empty, personalAccessToken));
// Get a GitHttpClient to talk to the Git endpoints
using (GitHttpClient gitClient = connection.GetClient<GitHttpClient>())
// Get data about a specific repository
var repo = gitClient.GetRepositoryAsync(c_projectName, c_repoName).Result;
Las rutas de acceso de autenticación que generan un cuadro de diálogo interactivo no están disponibles en la versión de .NET Standard de
las bibliotecas de cliente de .NET. Cuando use la versión de .NET Standard, proporcione las credenciales más explícitamente para
autenticarse, como en el ejemplo siguiente.
C#
using System;
using Microsoft.TeamFoundation.SourceControl.WebApi;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi;
namespace ConsoleApp1
class Program
const string collectionUri = "https://dev.azure.com/fabrikam";
const string projectName = "MyGreatProject";
const string repoName = "MyRepo";
const string pat = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
static void Main(string[] args)
var creds = new VssBasicCredential(string.Empty, pat);
// Connect to Azure DevOps Services
var connection = new VssConnection(new Uri(collectionUri), creds);
// Get a GitHttpClient to talk to the Git endpoints
using var gitClient = connection.GetClient<GitHttpClient>();
// Get data about a specific repository
var repo = gitClient.GetRepositoryAsync(projectName, repoName).Result;
Encontrará más ejemplos de autenticación en nuestra página de ejemplos de .NET.
Referencia
Para más información y para obtener documentación de referencia actualizada, consulte el explorador de API de .NET.
Ejemplos
Consulte ejemplos en nuestra página de ejemplos de .NET o directamente en nuestro repositorio de GitHub de .NET .
Para obtener más información sobre los paquetes NuGet, vea Microsoft.VisualStudio.Services.Client .
Problemas conocidos
El cuadro de diálogo de autenticación interactiva no aparece cuando se usa el OM de Azure
DevOps en un único apartamento en subprocesos (STA)
El cuadro de diálogo de autenticación interactiva no aparece en los casos en los que el código se ejecuta desde un apartamento
uniproceso (STA). Este problema se puede producir normalmente desde aplicaciones WPF . Para solucionar este problema, puede cambiar
el método de inicialización para que sea asincrónico y solicitar autenticación como en el ejemplo siguiente.
C#
async void InitAzureDevOps()
Uri _uri = new Uri("https://dev.azure.com/MyAccount/");
var creds = new VssClientCredentials(new WindowsCredential(false),
new VssFederatedCredential(false),
CredentialPromptType.PromptIfNeeded);
VssConnection vssConnection = new VssConnection(_uri, creds);
await vssConnection.ConnectAsync();
...
Uso de las versiones de NetStandard 2.0 del OM de Azure DevOps
Para la versión 16.143.1 de nuestros paquetes NuGet, se admite NetStandard 2.0. Estos paquetes se correlacionan con Azure DevOps Server
2019 RTW y son totalmente compatibles con Azure DevOps.
El paquete Microsoft.TeamFoundationServer.ExtendedClient no tiene compatibilidad con
NetStandard
Microsoft.TeamFoundationServer.ExtendedClient no admite actualmente una versión compatible con NetStandard. Este paquete incluye
nuestro modelo de objetos SOAP anterior, que ha sido reemplazado por nuestro modelo de objetos REST más reciente. En este momento,
ya no estamos invirtiendo en el modelo de objetos SOAP anterior y no tenemos planes para crear una versión de NetStandard de él.
Uso compartido de recursos entre
orígenes (CORS)
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services
Azure DevOps admite el uso compartido de recursos entre orígenes (CORS). CORS
habilita el código JavaScript que se sirve desde un dominio distinto dev.azure.com/* de
para realizar solicitudes Ajax a Azure DevOps Services API REST. Para que esto funcione,
cada solicitud debe proporcionar credenciales (los tokens de acceso personal y los
tokens de acceso de OAuth son ambas opciones admitidas). Ejemplo:
JavaScript
$( document ).ready(function() {
$.ajax({
url: 'https://dev.azure.com/fabrikam/_apis/projects?api-
version=1.0',
dataType: 'json',
headers: {
'Authorization': 'Basic ' + btoa("" + ":" + myPatToken)
}).done(function( results ) {
console.log( results.value[0].id + " " + results.value[0].name
);
});
});
(reemplace myPatToken por un token de acceso personal)
Ejemplos de la biblioteca cliente de C#
Artículo • 18/11/2022 • Tiempo de lectura: 3 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Ejemplos que muestran cómo ampliar e integrar con Azure DevOps mediante las
bibliotecas de cliente de .NET.
Ejemplos en GitHub
Hay muchos ejemplos con instrucciones sobre cómo ejecutarlos en nuestra página de
GitHub de ejemplo de .NET.
Otros ejemplos
Los ejemplos de REST de esta página requieren los siguientes paquetes NuGet:
Microsoft.TeamFoundationServer.Client
Microsoft.VisualStudio.Services.Client
Microsoft.VisualStudio.Services.InteractiveClient
7 Nota
El seguimiento de elementos de trabajo (WIT) y el OM del cliente de prueba están
programados para quedar en desuso en 2020. Para obtener más información,
consulte Deprecation of WIT and Test Client OM (Deprecation of WIT and Test
Client OM).
Ejemplo: Uso de un cliente HTTP basado en REST
C#
// https://www.nuget.org/packages/Microsoft.TeamFoundationServer.Client/
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models;
//
https://www.nuget.org/packages/Microsoft.VisualStudio.Services.InteractiveCl
ient/
using Microsoft.VisualStudio.Services.Client;
// https://www.nuget.org/packages/Microsoft.VisualStudio.Services.Client/
using Microsoft.VisualStudio.Services.Common;
/// <summary>
/// This sample creates a new work item query for New Bugs, stores it under
'MyQueries', runs the query, and then sends the results to the console.
/// </summary>
public static void SampleREST()
// Connection object could be created once per application and we use it
to get httpclient objects.
// Httpclients have been reused between callers and threads.
// Their lifetime has been managed by connection (we don't have to
dispose them).
// This is more robust then newing up httpclient objects directly.
// Be sure to send in the full collection uri, i.e.
http://myserver:8080/tfs/defaultcollection
// We are using default VssCredentials which uses NTLM against an Azure
DevOps Server. See additional provided
// Create a connection with PAT for authentication
VssConnection connection = new VssConnection(orgUrl, new
VssBasicCredential(string.Empty, personalAccessToken));
// Create instance of WorkItemTrackingHttpClient using VssConnection
WorkItemTrackingHttpClient witClient =
connection.GetClient<WorkItemTrackingHttpClient>();
// Get 2 levels of query hierarchy items
List<QueryHierarchyItem> queryHierarchyItems =
witClient.GetQueriesAsync(teamProjectName, depth: 2).Result;
// Search for 'My Queries' folder
QueryHierarchyItem myQueriesFolder =
queryHierarchyItems.FirstOrDefault(qhi => qhi.Name.Equals("My Queries"));
if (myQueriesFolder != null)
string queryName = "REST Sample";
// See if our 'REST Sample' query already exists under 'My Queries'
folder.
QueryHierarchyItem newBugsQuery = null;
if (myQueriesFolder.Children != null)
newBugsQuery = myQueriesFolder.Children.FirstOrDefault(qhi =>
qhi.Name.Equals(queryName));
if (newBugsQuery == null)
// if the 'REST Sample' query does not exist, create it.
newBugsQuery = new QueryHierarchyItem()
Name = queryName,
Wiql = "SELECT [System.Id],[System.WorkItemType],
[System.Title],[System.AssignedTo],[System.State],[System.Tags] FROM
WorkItems WHERE [System.TeamProject] = @project AND [System.WorkItemType] =
'Bug' AND [System.State] = 'New'",
IsFolder = false
};
newBugsQuery = witClient.CreateQueryAsync(newBugsQuery,
teamProjectName, myQueriesFolder.Name).Result;
// run the 'REST Sample' query
WorkItemQueryResult result =
witClient.QueryByIdAsync(newBugsQuery.Id).Result;
if (result.WorkItems.Any())
int skip = 0;
const int batchSize = 100;
IEnumerable<WorkItemReference> workItemRefs;
do
workItemRefs = result.WorkItems.Skip(skip).Take(batchSize);
if (workItemRefs.Any())
// get details for each work item in the batch
List<WorkItem> workItems =
witClient.GetWorkItemsAsync(workItemRefs.Select(wir => wir.Id)).Result;
foreach (WorkItem workItem in workItems)
// write work item to console
Console.WriteLine("{0} {1}", workItem.Id,
workItem.Fields["System.Title"]);
skip += batchSize;
while (workItemRefs.Count() == batchSize);
else
Console.WriteLine("No work items were returned from query.");
Autenticación
Para cambiar el método de autenticación a Azure DevOps Services o Azure DevOps
Server, cambie el tipo VssCredential pasado a VssConnection al crearlo.
Autenticación de token de acceso personal para servicios REST
C#
public static void PersonalAccessTokenRestSample()
// Create instance of VssConnection using Personal Access Token
VssConnection connection = new VssConnection(orgUrl, new
VssBasicCredential(string.Empty, personalAccessToken));
Solicitud de inicio de sesión de Visual Studio (cuenta Microsoft o
Azure Active Directory respaldada) para servicios REST (solo .NET
Framework)
Dado que los diálogos interactivos no son compatibles con la versión de .NET Core de
los clientes, este ejemplo solo se aplica a la versión de .NET Framework de los clientes.
C#
public static void MicrosoftAccountRestSample()
// Create instance of VssConnection using Visual Studio sign-in prompt
VssConnection connection = new VssConnection(new Uri(collectionUri), new
VssClientCredentials());
Autenticación de Azure Active Directory para servicios REST
C#
public static void AADRestSample()
// Create instance of VssConnection using Azure AD Credentials for Azure
AD backed account
VssConnection connection = new VssConnection(new Uri(collectionUri), new
VssAadCredential(userName, password));
Autenticación de OAuth para servicios REST
Siga este vínculo para obtener y actualizar un accessToken de OAuth:
https://github.com/microsoft/azure-devops-auth-samples
C#
public static void OAuthSample()
// Create instance of VssConnection using OAuth Access token
VssConnection connection = new VssConnection(new Uri(collectionUri), new
VssOAuthAccessTokenCredential(accessToken));
Ejemplos de biblioteca cliente de C#
para clientes y servicios SOAP
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Ejemplos que muestran cómo ampliar e integrar con Team Foundation Server y Azure
DevOps Services mediante los clientes SOAP heredados. Estos clientes solo están
disponibles en la versión de .NET Framework de los clientes. Para el desarrollo nuevo,
prefiera los clientes basados en JSON que se describen en las bibliotecas cliente de
.NET.
Los ejemplos de esta página requieren los siguientes paquetes NuGet:
Microsoft.TeamFoundationServer.ExtendedClient
Microsoft.TeamFoundationServer.Client
Microsoft.VisualStudio.Services.Client
Microsoft.VisualStudio.Services.InteractiveClient
Ejemplo: Uso del cliente basado en SOAP
C#
//
https://www.nuget.org/packages/Microsoft.TeamFoundationServer.ExtendedClient
/
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
/// <summary>
/// This sample creates a new work item query under 'MyQueries', runs the
query, and then sends the results to the console.
/// </summary>
public static void SampleSOAP()
// create TfsTeamProjectCollection instance using default credentials
using (TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new
Uri(collectionUri)))
// get the WorkItemStore service
WorkItemStore workItemStore = tpc.GetService<WorkItemStore>();
// get the project context for the work item store
Project workItemProject = workItemStore.Projects[teamProjectName];
// search for the 'My Queries' folder
QueryFolder myQueriesFolder =
workItemProject.QueryHierarchy.FirstOrDefault(qh => qh is QueryFolder &&
qh.IsPersonal) as QueryFolder;
if (myQueriesFolder != null)
// search for the 'SOAP Sample' query
string queryName = "SOAP Sample";
QueryDefinition newBugsQuery = myQueriesFolder.FirstOrDefault(qi
=> qi is QueryDefinition && qi.Name.Equals(queryName)) as QueryDefinition;
if (newBugsQuery == null)
// if the 'SOAP Sample' query does not exist, create it.
newBugsQuery = new QueryDefinition(queryName, "SELECT
[System.Id],[System.WorkItemType],[System.Title],[System.AssignedTo],
[System.State],[System.Tags] FROM WorkItems WHERE [System.WorkItemType] =
'Bug' AND [System.State] = 'New'");
myQueriesFolder.Add(newBugsQuery);
workItemProject.QueryHierarchy.Save();
// run the 'SOAP Sample' query
WorkItemCollection workItems =
workItemStore.Query(newBugsQuery.QueryText);
foreach (WorkItem workItem in workItems)
// write work item to console
Console.WriteLine("{0} {1}", workItem.Id,
workItem.Fields["System.Title"].Value);
Autenticación
Para cambiar el método de autenticación a Azure DevOps Services o Azure DevOps
Server, cambie el tipo VssCredential pasado a VssConnection al crearlo.
Autenticación de token de acceso personal para servicios
SOAP
C#
public static void PersonalAccessTokenSoapSample()
// Authenticate using Personal Access Token
VssBasicCredential vssBasicCredential = new
VssBasicCredential(string.Empty, pat);
using (TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new
Uri(collectionUri), vssBasicCredential))
tpc.Authenticate();
Console.WriteLine(tpc.InstanceId);
Autenticación de Azure Active Directory para servicios
SOAP
C#
public static void AADSoapSample()
// Authenticate using Azure Active Directory credential (requires a
Azure AD-backed organization)
using (TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new
Uri(collectionUri), new VssAadCredential()))
tpc.Authenticate();
Console.WriteLine(tpc.InstanceId);
Solicitud de inicio de sesión de Visual Studio (cuenta
Microsoft o Azure Active Directory respaldada) para
servicios SOAP
C#
public static void MicrosoftAccountSample()
// authenticate using Visual Studio sign-in prompt
using (TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new
Uri(collectionUri), new VssClientCredentials()))
tpc.Authenticate();
Console.WriteLine(tpc.InstanceId);
Get started sample (Ejemplo de
introducción)
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Tokens de acceso personal
Autentíquese con Azure DevOps cuando use las API REST o las bibliotecas de .NET. La
mayoría de los ejemplos de este artículo usan PAT. Los PAT son un ejemplo compacto de
autenticación. Hay muchos otros mecanismos de autenticación disponibles, como la
Biblioteca de autenticación de Microsoft, OAuth y tokens de sesión. Para obtener más
información para medir cuál es la más adecuada para su escenario, consulte
Autenticación.
Empiece a trabajar con estos ejemplos y cree un token de acceso personal.
Sugerencia
Los tokens de acceso personal son como contraseñas. Manténgalos secretos.
Asegúrese de guardarlos en una ubicación segura una vez creado el token de
acceso personal.
Para proporcionar el token de acceso personal a través de un encabezado HTTP,
primero conviértalo en una cadena Base64. En el ejemplo siguiente se muestra cómo
convertir en Base64 mediante C#. A continuación, la cadena resultante se puede
proporcionar como un encabezado HTTP en el formato siguiente:
Authorization: Basic BASE64USERNAME:PATSTRING
API DE REST
Consulte el ejemplo siguiente de obtención de una lista de proyectos para su
organización a través de la API REST.
C#
using System.Net.Http;
using System.Net.Http.Headers;
...
//encode your personal access token
string credentials =
Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Forma
t("{0}:{1}", "", personalAccessToken)));
ListOfProjectsResponse.Projects viewModel = null;
//use the httpclient
using (var client = new HttpClient())
client.BaseAddress = new Uri($"https://dev.azure.com/{OrgName}/");
//url of your organization
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new
System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"))
;
client.DefaultRequestHeaders.Authorization = new
AuthenticationHeaderValue("Basic", credentials);
//connect to the REST endpoint
HttpResponseMessage response = client.GetAsync("_apis/projects?
stateFilter=All&api-version=1.0").Result;
//check to see if we have a successful response
if (response.IsSuccessStatusCode)
//set the viewmodel from the content in the response
viewModel =
response.Content.ReadAsAsync<ListOfProjectsResponse.Projects>().Result;
//var value = response.Content.ReadAsStringAsync().Result;
Bibliotecas de cliente de .NET
Aquí se usan dos de las bibliotecas de cliente de .NET. Asegúrese de que se hace
referencia a estas bibliotecas de cliente de .NET en el proyecto de .NET.
Microsoft.TeamFoundationServer.Client
Microsoft.Visual Studio.Services.Client
Consulte el ejemplo siguiente de obtención de una lista de proyectos para su
organización a través de bibliotecas de cliente de .NET.
C#
using Microsoft.TeamFoundation.Core.WebApi;
using Microsoft.VisualStudio.Services.Common;
...
//create uri and VssBasicCredential variables
Uri uri = new Uri(url);
VssBasicCredential credentials = new VssBasicCredential("",
personalAccessToken);
using (ProjectHttpClient projectHttpClient = new ProjectHttpClient(uri,
credentials))
IEnumerable<TeamProjectReference> projects =
projectHttpClient.GetProjects().Result;
Preguntas y respuestas
P: ¿Dónde puedo obtener el código fuente de los
ejemplos de código?
R: Vea .https://github.com/Microsoft/vsts-restapi-samplecode
P: ¿Dónde puedo encontrar más información sobre la
biblioteca .NET?
R: Consulte la información general de las bibliotecas cliente.
Creación de un servidor de estado de
solicitud de incorporación de cambios
con Node.js
Artículo • 27/09/2022 • Tiempo de lectura: 10 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
El flujo de trabajo de solicitud de incorporación de cambios (PR) proporciona a los
desarrolladores una oportunidad para obtener comentarios sobre su código de
elementos del mismo nivel, así como de herramientas automatizadas. Las herramientas
y servicios de terceros pueden participar en el flujo de trabajo de solicitud de
incorporación de cambios mediante la API de estado de la solicitud de incorporación de
cambios. Este artículo le guía por el proceso de creación de un servidor de estado para
validar las solicitudes de incorporación de cambios en un repositorio de Git de Azure
DevOps Services. Para más información sobre el estado de solicitud de incorporación de
cambios, consulte Personalización y ampliación de flujos de trabajo de solicitud de
incorporación de cambios con el estado de la solicitud de incorporación de cambios.
Requisitos previos
Una organización de Azure DevOps con un repositorio de Git. Si no tiene una
organización, regístrese para cargar y compartir código en repositorios de Git
privados ilimitados gratuitos.
Instale VS Code u otro editor de código de su elección. Las instrucciones de esta
guía usan VS Code, pero los pasos de otros editores de código son similares.
Instalación de Node.js
Para instalar Node.js, descargue la versión LTS adecuada para su plataforma. La
descarga contiene un instalador, que puede ejecutar para instalar el entorno de
ejecución de Node.js en el equipo local. Al instalar Node.js, asegúrese de mantener la
parte del administrador de paquetes npm de la instalación, que está seleccionada de
forma predeterminada.
Creación de un servidor web básico mediante
Express
Los pasos de esta sección usan Express , que es un marco web ligero para Node.js que
proporciona una serie de métodos de utilidad HTTP que simplifican la creación de un
servidor web. Este marco proporciona las funciones básicas necesarias para escuchar
eventos de solicitud de incorporación de cambios.
1. Desde la línea de comandos, cree una carpeta de proyecto para el servidor web.
mkdir pr-server
cd pr-server
2. Use el npm init comando para crear un nuevo package.json archivo para el
proyecto.
npm init
Presione Entrar para aceptar los valores predeterminados de todas las opciones
excepto el punto de entrada. Cámbiela a app.js .
entry point: (index.js) app.js
3. Instale Express en el directorio pr-server mediante el siguiente comando. Esto
instala Express y lo guarda en la lista de dependencias.
npm install express
4. Cree una aplicación express sencilla en la que se compilará para el servidor de
estado de pr. Los pasos siguientes se basan en el ejemplo Express Hello world .
Abra la carpeta del proyecto en VS Code ejecutando el siguiente comando desde
la pr-server carpeta .
code .
5. Cree un archivo (Ctrl + N) y pegue el código de ejemplo siguiente.
JavaScript
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('Hello World!')
})
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})
6. Guarde el archivo como app.js .
7. Ejecute el servidor web básico mediante el siguiente comando:
node app.js
Compruebe que el servidor se está ejecutando; para ello, vaya a
http://localhost:3000/ .
Escucha de solicitudes HTTP POST
El servidor web va a recibir POST solicitudes de Azure DevOps Services, por lo que debe
controlar esas solicitudes en el servidor.
1. Al final del app.js archivo, agregue el código siguiente y guarde el archivo.
JavaScript
app.post('/', function (req, res) {
res.send('Received the POST')
})
2. Vuelva a ejecutar el servidor web con el siguiente comando:
node app.js
Configuración de un enlace de servicio para
eventos de solicitud de incorporación de
cambios
Los enlaces de servicio son una característica Azure DevOps Services que puede alertar a
servicios externos cuando se producen determinados eventos. Para este ejemplo, querrá
configurar dos enlaces de servicio para eventos de solicitud de incorporación de
cambios, por lo que se puede notificar al servidor de estado. El primero será para el
evento de solicitud de incorporación de cambios creado y el segundo será para el
evento de solicitud de incorporación de cambios actualizado .
Para recibir las notificaciones de enlace de servicio, deberá exponer un puerto a la red
pública de Internet. La utilidad ngrok es muy útil para hacerlo en un entorno de
desarrollo.
1. Descargue y descomprima la versión de ngrok adecuada para su plataforma.
2. Use ngrok para empezar a escuchar en el mismo puerto que el servidor de
ejemplo: puerto 3000. Ejecute el siguiente comando en una nueva ventana de
comandos.
ngrok http 3000
Ngrok creará una dirección URL pública que reenvía a localhost:3000 . Tenga en
cuenta que la dirección URL, ya que la necesitará en el paso siguiente. Tendrá un
aspecto similar al siguiente:
http://c3c1bffa.ngrok.io
3. Vaya al proyecto en Azure DevOps, por ejemplo. https://dev.azure.com/<your
account>/<your project name>
4. En el menú de navegación, mantenga el puntero sobre el engranaje y seleccione
Enlaces de servicio.
5. Si se trata de su primer enlace de servicio, seleccione + Crear suscripción.
Si ya tiene configurados otros enlaces de servicio, seleccione el signo verde más
(+) para crear una nueva suscripción de enlace de servicio.
6. En el cuadro de diálogo Nueva suscripción de enlaces de servicio, seleccione Web
Hooks en la lista de servicios y, a continuación, seleccione Siguiente.
7. Seleccione Solicitud de incorporación de cambios creada en la lista de
desencadenadores de eventos y, a continuación, seleccione Siguiente.
8. En la página Acción, escriba la dirección URL de ngrok en el cuadro DIRECCIÓN
URL . Seleccione Probar para enviar un evento de prueba al servidor.
En la ventana de la consola de ngrok, verá un entrante POST que devolvió un 200
OK , que indica que el servidor recibió el evento de enlace de servicio.
HTTP Requests
-------------
POST / 200 OK
En la ventana Notificación de prueba, seleccione la pestaña Respuesta para ver los
detalles de la respuesta del servidor. Debería ver una longitud de contenido de 17
que coincida con la longitud de la cadena del controlador POST (es decir,
"Recibido el POST").
9. Cierre la ventana Notificación de prueba y seleccione Finalizar para crear el enlace
de servicio.
Siga los pasos del 3 al 9 de nuevo, pero esta vez configure el evento de actualización de
la solicitud de incorporación de cambios .
) Importante
Asegúrese de seguir los pasos anteriores dos veces y crear enlaces de servicio tanto
para la solicitud de incorporación de cambios creada como para los eventos
actualizados de la solicitud de incorporación de cambios.
Publicar el estado en solicitudes de
incorporación de cambios
Ahora que el servidor puede recibir eventos de enlace de servicio cuando se creen
nuevas solicitudes de incorporación de cambios, actualícela para volver a publicar el
estado en la solicitud de incorporación de cambios.
1. Las solicitudes de enlace de servicio incluyen una carga JSON que describe el
evento. Para ayudar a analizar el JSON devuelto por el enlace de servicio, instale el
paquete del analizador de cuerpo .
npm install body-parser
2. Actualice app.js para usar el analizador de cuerpo para analizar application/json .
JavaScript
var bodyParser = require('body-parser')
app.use(bodyParser.json())
3. Para simplificar la realización de llamadas api rest a Azure Repos, instale el paquete
azure-devops-node-api .
npm install azure-devops-node-api
4. Actualice app.js para usar el paquete azure-devops-node-api, configure los
detalles de una conexión a la cuenta y obtenga una instancia de la API de Git.
JavaScript
const vsts = require("azure-devops-node-api")
const collectionURL = process.env.COLLECTIONURL
const token = process.env.TOKEN
var authHandler = vsts.getPersonalAccessTokenHandler(token)
var connection = new vsts.WebApi(collectionURL, authHandler)
var vstsGit = connection.getGitApi().then(
vstsGit => {
vstsGit.createPullRequestStatus(prStatus, repoId,
pullRequestId).then( result => {
console.log(result);
},
error => {
console.log(error);
})
},
error => {
console.log(error);
);
5. Cree una variable de entorno para la dirección URL de la colección y reemplace por
<your account> el nombre de la organización de Azure DevOps.
setx COLLECTIONURL "https://dev.azure.com/<your account>"
6. Cree un token de autenticación personal (PAT) para que la aplicación lo use,
siguiendo estas instrucciones: Autenticación con tokens de acceso personal. Debe
crear un nuevo PAT para cada servicio que use para acceder a su cuenta, asígnele
el nombre adecuado.
7. Cree una variable de entorno para el PAT.
setx TOKEN "yourtokengoeshere"
8. Actualice la post() función para leer los detalles de la solicitud de incorporación
de cambios de la carga del enlace de servicio. Necesitará estos valores para
devolver el estado.
JavaScript
var repoId = req.body.resource.repository.id
var pullRequestId = req.body.resource.pullRequestId
var title = req.body.resource.title
9. Compile el objeto de estado que se va a publicar en la solicitud de incorporación
de cambios.
State es una enumeración de tipo GitStatusState. Use succeeded para indicar que
la solicitud de incorporación de cambios ha superado la comprobación de estado y
está lista para combinarse.
description es un valor de cadena que se mostrará al usuario en la sección Estado
y la fuente de actividades en la vista de detalles de la solicitud de incorporación de
cambios.
targetUrl es una dirección URL que se usará para crear un vínculo para el texto de
descripción de la sección Estado y la fuente de actividades. Este es el lugar donde
los usuarios pueden ir para obtener más información sobre el estado, por ejemplo,
un informe de compilación o una ejecución de prueba. Si no se especifica ninguna
dirección URL, la descripción aparecerá como texto sin vínculo.
El contexto name y genre se usan para clasificar el estado y distinguirlo de otros
servicios que publican el estado.
JavaScript
var prStatus = {
"state": "succeeded",
"description": "Ready for review",
"targetUrl": "https://visualstudio.microsoft.com",
"context": {
"name": "wip-checker",
"genre": "continuous-integration"
10. En lugar de simplemente publicar el succeeded estado de forma ciega, inspeccione
el título de la solicitud de incorporación de cambios para ver si el usuario ha
indicado si la solicitud de incorporación de cambios es un trabajo en curso
agregando WIP al título. Si es así, cambie el estado devuelto a la solicitud de
incorporación de cambios.
JavaScript
if (title.includes("WIP")) {
prStatus.state = "pending"
prStatus.description = "Work in progress"
11. Por último, publique el estado mediante el createPullRequestStatus() método .
Requiere el objeto de estado, el identificador del repositorio y el identificador de la
solicitud de incorporación de cambios. Genera la respuesta a la consola del nodo
para que pueda ver el resultado de la publicación.
JavaScript
vstsGit.createPullRequestStatus(prStatus, repoId, pullRequestId).then(
result => {
console.log(result)
})
12. El método resultante debe tener un aspecto similar al siguiente:
JavaScript
app.post("/", function (req, res) {
// Get the details about the PR from the service hook payload
var repoId = req.body.resource.repository.id
var pullRequestId = req.body.resource.pullRequestId
var title = req.body.resource.title
// Build the status object that we want to post.
// Assume that the PR is ready for review...
var prStatus = {
"state": "succeeded",
"description": "Ready for review",
"targetUrl": "https://visualstudio.microsoft.com",
"context": {
"name": "wip-checker",
"genre": "continuous-integration"
// Check the title to see if there is "WIP" in the title.
if (title.includes("WIP")) {
// If so, change the status to pending and change the
description.
prStatus.state = "pending"
prStatus.description = "Work in progress"
// Post the status to the PR
vstsGit.createPullRequestStatus(prStatus, repoId,
pullRequestId).then( result => {
console.log(result)
})
res.send("Received the POST")
})
13. Guarde app.js y reinicie la aplicación de nodo.
node app.js
Creación de una nueva solicitud de
incorporación de cambios para probar el
servidor de estado
Ahora que el servidor se está ejecutando y escuchando notificaciones de enlace de
servicio, cree una solicitud de incorporación de cambios para probarla.
1. Comience en la vista de archivos. Edite el archivo readme.md en el repositorio (o
cualquier otro archivo si no tiene un readme.md).
2. Realice una edición y confirme los cambios en el repositorio.
3. Asegúrese de confirmar los cambios en una nueva rama para que pueda crear una
solicitud de incorporación de cambios en el paso siguiente.
4. Seleccione el vínculo Crear una solicitud de incorporación de cambios .
5. Agregue WIP en el título para probar la funcionalidad de la aplicación. Seleccione
Crear para crear la solicitud de incorporación de cambios.
6. Una vez creada la solicitud de incorporación de cambios, verá la sección de estado,
con la entrada Trabajo en curso que vincula a la dirección URL especificada en la
carga.
7. Actualice el título de la solicitud de incorporación de cambios y quite el texto de
WIP y tenga en cuenta que el estado cambia de Trabajo en curso a Listo para
revisión.
Pasos siguientes
En este artículo, ha aprendido los conceptos básicos de cómo crear un servicio que
escucha eventos de solicitud de incorporación de cambios a través de enlaces de
servicio y puede publicar mensajes de estado mediante la API de estado. Para
obtener más información sobre la API de estado de la solicitud de incorporación
de cambios, consulte la documentación de la API REST.
Configure una directiva de rama para un servicio externo.
Usar Azure Functions para crear
directivas de rama personalizadas
Artículo • 27/09/2022 • Tiempo de lectura: 8 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
El flujo de trabajo de solicitud de incorporación de cambios (PR) proporciona a los
desarrolladores la oportunidad de recibir comentarios sobre su código de elementos del
mismo nivel, así como de herramientas automatizadas. Las herramientas y servicios de
terceros pueden participar en el flujo de trabajo de solicitud de incorporación de
cambios mediante la API de estado de la solicitud de incorporación de cambios. Este
artículo le guía por el proceso de creación de una directiva de rama personalizada
mediante Azure Functions para validar las solicitudes de incorporación de cambios en
un repositorio de Git de Azure DevOps Services. Con Azure Functions no tiene que
preocuparse por el aprovisionamiento y el mantenimiento de servidores, especialmente
cuando crece la carga de trabajo. Azure Functions proporcionar una plataforma de
proceso totalmente administrada con alta confiabilidad y seguridad.
Para obtener más información sobre el estado de solicitud de incorporación de cambios,
consulte Personalización y ampliación de flujos de trabajo de solicitud de incorporación
de cambios con el estado de la solicitud de incorporación de cambios.
Requisitos previos
Una organización de Azure DevOps con un repositorio de Git. Si no tiene una
organización, regístrese para cargar y compartir código en repositorios de Git privados
ilimitados gratuitos.
Creación de una función básica de Azure para
escuchar eventos de Azure Repos
Siga la documentación de creación de la primera función de Azure para crear una
función sencilla. Modifique el código del ejemplo para que tenga este aspecto:
C#
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,
TraceWriter log)
try
log.Info("Service Hook Received.");
// Get request body
dynamic data = await req.Content.ReadAsAsync<object>();
log.Info("Data Received: " + data.ToString());
// Get the pull request object from the service hooks payload
dynamic jObject = JsonConvert.DeserializeObject(data.ToString());
// Get the pull request id
int pullRequestId;
if (!Int32.TryParse(jObject.resource.pullRequestId.ToString(), out
pullRequestId))
log.Info("Failed to parse the pull request id from the service
hooks payload.");
};
// Get the pull request title
string pullRequestTitle = jObject.resource.title;
log.Info("Service Hook Received for PR: " + pullRequestId + " " +
pullRequestTitle);
return req.CreateResponse(HttpStatusCode.OK);
catch (Exception ex)
log.Info(ex.ToString());
return req.CreateResponse(HttpStatusCode.InternalServerError);
Configuración de un enlace de servicio para
eventos de solicitud de incorporación de
cambios
Los enlaces de servicio son una característica de Azure DevOps Services que puede
alertar a servicios externos cuando se producen determinados eventos. En este ejemplo,
le interesará configurar un enlace de servicio para eventos de solicitud de incorporación
de cambios, se notificará a la función de Azure cuando cambie una solicitud de
incorporación de cambios. Para recibir POST solicitudes cuando cambien las solicitudes
de incorporación de cambios, deberá proporcionar el enlace de servicio con la dirección
URL de la función de Azure.
Para este ejemplo, deberá configurar 2 enlaces de servicio. La primera será para el
evento de creación de la solicitud de incorporación de cambios y el segundo será para
el evento actualizado de la solicitud de incorporación de cambios .
1. Obtenga la dirección URL de la función del Azure Portal haciendo clic en la
dirección URL de obtención de la función en la vista de funciones de Azure y
copie la dirección URL.
2. Vaya al proyecto en Azure DevOps, por ejemplo. https://dev.azure.com/<your
organization>/<your project name>
3. En el menú de navegación, mantenga el puntero sobre el engranaje y seleccione
Enlaces de servicio.
4. Si este es el primer enlace de servicio, seleccione + Crear suscripción.
Si ya tiene otros enlaces de servicio configurados, seleccione el signo verde más
(+) para crear una nueva suscripción de enlace de servicio.
5. En el cuadro de diálogo Nueva suscripción de enlaces de servicio, seleccione Web
Hooks en la lista de servicios y, a continuación, seleccione Siguiente.
6. Seleccione Solicitud de incorporación de cambios creada en la lista de
desencadenadores de eventos y, a continuación, seleccione Siguiente.
7. En la página Acción, escriba la dirección URL que copió en el paso 1 en el cuadro
DIRECCIÓN URL . Seleccione Probar para enviar un evento de prueba al servidor.
En la ventana del registro de funciones de Azure, verá una entrada POST que
devolvió un 200 OK , que indica que la función recibió el evento de enlace de
servicio.
HTTP Requests
-------------
POST / 200 OK
En la ventana Notificación de prueba, seleccione la pestaña Respuesta para ver los
detalles de la respuesta del servidor. Debería ver la respuesta del servidor.
8. Cierre la ventana Notificación de prueba y seleccione Finalizar para crear el enlace
de servicio.
Vuelva a seguir los pasos del 2 al 8, pero esta vez configure el evento de actualización
de la solicitud de incorporación de cambios .
) Importante
Asegúrese de seguir los pasos anteriores dos veces y crear enlaces de servicio para
la solicitud de incorporación de cambios creada y los eventos actualizados de
solicitud de incorporación de cambios .
Cree una solicitud de incorporación de cambios para comprobar que la función de
Azure recibe notificaciones.
Publicar el estado en las solicitudes de
incorporación de cambios
Ahora que el servidor puede recibir eventos de enlace de servicio cuando se creen
nuevas solicitudes de incorporación de cambios, actualícelo para volver a publicar el
estado en la solicitud de incorporación de cambios. Puede usar la carga JSON publicada
por el enlace de servicio para determinar qué estado se va a establecer en la solicitud de
incorporación de cambios.
Actualice el código de la función de Azure para que tenga un aspecto similar al del
ejemplo siguiente.
Asegúrese de actualizar el código con el nombre de la organización, el nombre del
proyecto, el nombre del repositorio y el token pat. Para tener permiso para cambiar el
estado de la solicitud de incorporación de cambios, el PAT requiere vso.code_status
ámbito, que puede conceder seleccionando el ámbito Código (estado) en la página
Crear un token de acceso personal .
) Importante
Este código de ejemplo almacena el PAT en el código para simplificar el ejemplo. Se
recomienda almacenar secretos en KeyVault y recuperarlos desde allí.
En este ejemplo se inspecciona el título de la solicitud de incorporación de cambios para
ver si el usuario ha indicado si la solicitud de incorporación de cambios es un trabajo en
curso agregando WIP al título. Si es así, el código de ejemplo cambia el estado
publicado en la solicitud de incorporación de cambios. Reemplace el código de la
función de Azure por el código siguiente para implementar la actualización del estado
publicado en la solicitud de incorporación de cambios.
C#
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;
private static string organizationName = "[Organization Name]"; //
Organization name
private static string projectName = "[Project Name]"; // Project
name
private static string repositoryName = "[Repo Name]"; //
Repository name
/*
This is here just to simplify the sample, it is recommended to store
secrets in KeyVault and retrieve them from there.
*/
private static string pat = "[PAT TOKEN]";
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,
TraceWriter log)
try
log.Info("Service Hook Received.");
// Get request body
dynamic data = await req.Content.ReadAsAsync<object>();
log.Info("Data Received: " + data.ToString());
// Get the pull request object from the service hooks payload
dynamic jObject = JsonConvert.DeserializeObject(data.ToString());
// Get the pull request id
int pullRequestId;
if (!Int32.TryParse(jObject.resource.pullRequestId.ToString(), out
pullRequestId))
log.Info("Failed to parse the pull request id from the service
hooks payload.");
};
// Get the pull request title
string pullRequestTitle = jObject.resource.title;
log.Info("Service Hook Received for PR: " + pullRequestId + " " +
pullRequestTitle);
PostStatusOnPullRequest(pullRequestId,
ComputeStatus(pullRequestTitle));
return req.CreateResponse(HttpStatusCode.OK);
catch (Exception ex)
log.Info(ex.ToString());
return req.CreateResponse(HttpStatusCode.InternalServerError);
private static void PostStatusOnPullRequest(int pullRequestId, string
status)
string Url = string.Format(
@"https://dev.azure.com/{0}/{1}/_apis/git/repositories/{2}/pullrequests/{3}/
statuses?api-version=4.1",
organizationName,
projectName,
repositoryName,
pullRequestId);
using (HttpClient client = new HttpClient())
client.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new
AuthenticationHeaderValue("Basic", Convert.ToBase64String(
ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "", pat))));
var method = new HttpMethod("POST");
var request = new HttpRequestMessage(method, Url)
Content = new StringContent(status, Encoding.UTF8,
"application/json")
};
using (HttpResponseMessage response =
client.SendAsync(request).Result)
{
response.EnsureSuccessStatusCode();
private static string ComputeStatus(string pullRequestTitle)
string state = "succeeded";
string description = "Ready for review";
if (pullRequestTitle.ToLower().Contains("wip"))
state = "pending";
description = "Work in progress";
return JsonConvert.SerializeObject(
new
State = state,
Description = description,
TargetUrl = "https://visualstudio.microsoft.com",
Context = new
Name = "PullRequest-WIT-App",
Genre = "pr-azure-function-ci"
});
Creación de una nueva solicitud de
incorporación de cambios para probar el
servidor de estado
Ahora que el servidor se está ejecutando y escuchando notificaciones de enlace de
servicio, cree una solicitud de incorporación de cambios para probarlo.
1. Comience en la vista de archivos. Edite el archivo readme.md en el repositorio (o
cualquier otro archivo si no tiene un readme.md).
2. Realice una edición y confirme los cambios en el repositorio.
3. Asegúrese de confirmar los cambios en una nueva rama para poder crear una
solicitud de incorporación de cambios en el paso siguiente.
4. Seleccione el vínculo Crear una solicitud de incorporación de cambios .
5. Agregue WIP en el título para probar la funcionalidad de la aplicación. Seleccione
Crear para crear la solicitud de incorporación de cambios.
6. Una vez creada la solicitud de incorporación de cambios, verá la sección de estado,
con la entrada Trabajo en curso que vincula a la dirección URL especificada en la
carga.
7. Actualice el título de la solicitud de incorporación de cambios y quite el texto de
WIP y observe que el estado cambia de Trabajo en curso a Listo para su revisión.
Pasos siguientes
En este artículo, ha aprendido los conceptos básicos de cómo crear una función de
Azure sin servidor que escucha eventos de PR a través de enlaces de servicio y
puede publicar mensajes de estado mediante la API de estado. Para más
información sobre la API de estado de la solicitud de incorporación de cambios,
consulte la documentación de la API REST.
Configure una directiva de rama para un servicio externo.
Uso de la aplicación Azure Boards con
Slack para administrar elementos de
trabajo
Artículo • 17/11/2022 • Tiempo de lectura: 8 minutos
Azure DevOps Services
Si usa Slack , puede usar la aplicación Azure Boards para Slack para crear elementos
de trabajo y supervisar la actividad del elemento de trabajo en el proyecto de Azure
Boards desde el canal de Slack.
La aplicación Azure Boards para Slack permite a los usuarios configurar y administrar
suscripciones en su canal de Slack. Pueden administrar suscripciones para crear,
actualizar y otros eventos de elemento de trabajo. Los usuarios también pueden recibir
notificaciones para estos eventos en su canal de Slack. Las conversaciones en el canal de
Slack se pueden usar para crear elementos de trabajo. Las versiones preliminares de las
direcciones URL del elemento de trabajo ayudan a los usuarios a iniciar discusiones
sobre el trabajo.
Lea este artículo para aprender a:
" Adición de la aplicación Azure Boards al área de trabajo de Slack
" Vinculación y desvinculación del proyecto de Azure Boards a la aplicación de Azure
Boards
" Configuración de suscripciones para eventos relacionados con elementos de
trabajo en el canal de Slack
" Creación de elementos de trabajo desde el canal de Slack
" Supervisión de la actividad del elemento de trabajo en el canal de Slack
" Obtención de notificaciones en canales privados de Slack
7 Nota
Azure Boards y la integración de Slack solo se admiten para Azure DevOps
Services.
Actualmente no se admiten notificaciones dentro de mensajes directos.
Requisitos previos
Para crear un elemento de trabajo, debe ser colaborador del proyecto de Azure
Boards. Si aún no tiene un proyecto, puede registrarse y crear un proyecto. Para
obtener más información, consulte Empezar a usar Azure Boards.
Para crear suscripciones en un canal de Slack para eventos de elementos de
trabajo, debe ser miembro del grupo administradores de Azure Boards Project o
del grupo Administradores de equipo. Para agregarlo, consulte Cambio de
permisos de nivel de proyecto o Agregar administrador de equipo.
Para recibir notificaciones, el acceso a la aplicación de terceros a través de la
configuración de OAuth debe estar habilitado para la organización. Consulte
Cambio de directivas de acceso a aplicaciones para su organización.
Adición de la aplicación Azure Boards al área
de trabajo de Slack
1. Para instalar la aplicación Azure Boards en el área de trabajo de Slack, abra un
explorador web, inicie sesión en Slack y abra la aplicación Azure Boards .
2. Una vez agregado, verá un mensaje de bienvenida de la aplicación, como se
muestra en la siguiente imagen.
3. Use el /azboards identificador de Slack para interactuar con la aplicación. Más
adelante en este artículo se proporciona una lista de comandos, referencia de
comandos.
Vinculación del proyecto de Azure Boards a la
aplicación de Azure Boards
Para usar la aplicación, primero debe vincular el proyecto de Azure Boards al canal de
Slack.
1. Una vez instalada la aplicación en el área de trabajo de Slack, conéctese y
autentíquese para Azure Boards.
2. Después de iniciar sesión, use el siguiente comando de barra diagonal dentro de
un canal de Slack para vincular al proyecto de Azure Boards que especifique con la
dirección URL:
/azboards link [project url]
Por ejemplo:
/azboards link https://dev.azure.com/myorg/myproject
Una vez vinculado el proyecto, puede crear elementos de trabajo mediante /azboards
create el comando o usar acciones de mensaje.
Configuración de suscripciones para supervisar
elementos de trabajo
Puede crear suscripciones para supervisar los elementos de trabajo en cualquier
momento mediante el /azboards subscriptions comando . Tiene la opción de
configurar suscripciones justo después de vincular un proyecto.
1. Seleccione la ruta de acceso del área que desee, el evento que le interese y use los
filtros asociados para personalizar el canal de Slack. Para configurar fácilmente las
suscripciones, las rutas de acceso del área a las que se ha accedido recientemente
se muestran en la lista desplegable de rutas de acceso del área.
En caso de que la ruta de acceso del área del equipo no aparezca en el menú
desplegable Ruta de área, siga las instrucciones mencionadas en la sección
siguiente, Agregar rutas de acceso de área. Las rutas de acceso de área agregadas
mediante las /azboards addAreapath rutas de acceso de área y comandos para las
que se crean suscripciones en el canal de Slack siempre aparecen en la lista
desplegable Ruta de acceso del área junto con las rutas de acceso de área a las
que se ha accedido recientemente.
Agregar rutas de acceso de área
Puede agregar áreas en las que trabaja el equipo al canal para que estén siempre
disponibles para crear elementos de trabajo y suscripciones. Esto es importante
principalmente para los equipos con más de 100 rutas de acceso de área.
Use el comando siguiente para agregar rutas de acceso de área desde el proyecto
al canal de Slack.
/azboards addAreapath [area path]
Por ejemplo:
/azboards addAreapath myproject\fabrikam
Si elige el nombre del proyecto como ruta de acceso del área, recibirá
notificaciones para todas las rutas de acceso de área del proyecto. Es lógicamente
equivalente a elegir la ruta de acceso de área "Cualquiera".
Creación de un elemento de trabajo con un
comando
1. Con la aplicación Azure Boards, puede crear elementos de trabajo desde el canal.
La aplicación también admite elementos de trabajo personalizados.
Para crear un elemento de trabajo, use /azboards create .
2. Puede crear elementos de trabajo directamente desde un comando pasando el
tipo de elemento de trabajo y el título como parámetros. Los elementos de trabajo
solo se crearán si no tienen campos que se rellenen obligatoriamente.
/azboards create [work item type] [work item title]
Por ejemplo:
/azboards create 'user story' Push cloud monitoring alerts to mobile
devices
Creación de un elemento de trabajo a partir de
acciones de mensaje
A menudo, las discusiones en un canal llaman a la creación de elementos de trabajo.
Puede usar acciones de mensaje para crear un elemento de trabajo. El mensaje
seleccionado se rellena previamente en la sección de descripción del elemento de
trabajo. Un vínculo a la conversación del canal se almacena en la sección Discusión del
elemento de trabajo recién creado, lo que proporciona a los usuarios acceso a la
discusión que llevó a la creación del elemento de trabajo.
Para crear elementos de trabajo mediante acciones de mensaje
Administración de suscripciones de Azure
Boards
1. Para ver, agregue y quite suscripciones para un canal, use el /azboards
subscriptions comando :
/azboards subscriptions
Este comando enumera todas las suscripciones actuales para el canal y permite
agregar nuevas suscripciones y quitar las existentes. Como parte de la adición de
suscripciones, también puede personalizar lo que recibe notificaciones mediante
varios filtros.
[! NOTA]Los administradores del equipo no pueden quitar ni modificar suscripciones
creadas por Project administradores.
Vistas previas de las direcciones URL del
elemento de trabajo
Para admitir la colaboración en torno a los elementos de trabajo descritos en un canal,
se muestra una vista previa de los elementos de trabajo a los que se hace referencia en
el canal. Cuando un usuario pega la dirección URL del elemento de trabajo, se muestra
una vista previa similar a la siguiente imagen. Esta versión preliminar ayuda a mantener
las conversaciones relacionadas con elementos de trabajo relevantes y correctos.
Para que esta característica funcione, los usuarios deben iniciar sesión. Una vez que
hayan iniciado sesión, esta característica funcionará para todos los canales de un área de
trabajo.
Desvincular un proyecto de un canal
Un canal de Slack solo puede vincularse a un proyecto de Azure Boards a la vez. Para
vincular a otro proyecto, primero debe desvincular el proyecto actual mediante
/azboards unlink el comando .
Al desvincular un proyecto, se eliminan todas las suscripciones junto con rutas de
acceso de área agregadas del canal. Si el canal no tiene suscripciones, cualquier usuario
puede desvincular un proyecto. Sin embargo, si un canal tiene suscripciones, solo los
administradores de proyectos pueden desvincular un proyecto de un canal.
Referencia de comandos
En la tabla siguiente se enumeran todos los /azboards comandos que puede usar en el
canal de Slack.
Comando Barra diagonal Funcionalidad
Vínculo /azboards [project url] Vincular un proyecto a este canal para crear
elementos de trabajo y recibir notificaciones
/azboards subscriptions Agregar o quitar suscripciones para este canal
/azboards create o /azboards create [tipo Crear un elemento de trabajo
de elemento de trabajo] [title]
/azboards addAreapath [area path] Agregar una ruta de acceso de área desde el
proyecto a este canal
/azboards signin Inicie sesión en su organización de Azure Boards
/azboards signout Cierre de sesión de la organización de Azure Boards
/azboards unlink Desvincular un proyecto de este canal
Comentarios de /azboards Notificar un problema o sugerir una característica
Administración del trabajo en canales privados
La aplicación Azure Boards para Slack también puede ayudarle a crear elementos de
trabajo y a supervisar la actividad del elemento de trabajo en los canales privados. Para
invitar al bot al canal privado, escriba /invite @azboards . Después de publicarlo, puede
crear elementos de trabajo y administrar las notificaciones de la misma manera que lo
haría para un canal público.
Solución de errores
Si experimenta los siguientes errores al usar la aplicación Azure Boards para Slack ,
siga los procedimientos de esta sección.
Algo ha ido mal. Inténtelo de nuevo.
Error de configuración. Asegúrese de que la organización '{nombre de la
organización}' existe y que tiene permisos suficientes.
Algo ha ido mal. Inténtelo de nuevo.
La aplicación Azure Boards usa el protocolo de autenticación de OAuth y requiere que
se habilite el acceso a aplicaciones de terceros a través de OAuth para que la
organización esté habilitada.
Para habilitar esta configuración, vaya a Organización
Configuración>SeguridadDirectivas> y establezca el acceso a la aplicación de terceros
a través de OAuth para la configuración de la organización en Activado.
Error de configuración. Asegúrese de que la organización
'{nombre de la organización}' existe y que tiene permisos
suficientes.
Cierre la sesión de Azure DevOps. Para ello, vaya a https://aka.ms/VsSignout mediante
el explorador.
Abra una ventana del explorador En privado o de incógnito y vaya a
https://aex.dev.azure.com/me e inicie sesión. En la lista desplegable situada debajo del
icono de perfil a la izquierda, seleccione el directorio que contiene la organización que
contiene el proyecto que desea vincular.
En el mismo explorador, inicie una nueva pestaña, vaya a https://slack.com e inicie
sesión en el espacio de trabajo (use el cliente web). Ejecute el /azboards signout
comando seguido del /azboards signin comando .
Seleccione el Sign in botón y se le redirigirá a una página de consentimiento como la
del ejemplo siguiente. Asegúrese de que el directorio que se muestra junto al correo
electrónico es el mismo que el elegido en el paso anterior. Acepte y complete el
proceso de inicio de sesión.
Si estos pasos no resuelven el problema de autenticación, póngase en contacto con
nosotros en Developer Community .
Artículos relacionados
Definición de rutas de acceso de área y asignación a un equipo
Azure Pipelines con Slack
Azure Repos con Slack
Creación de un enlace de servicio para Azure DevOps con Slack
Uso de la aplicación Azure Boards en
Microsoft Teams
Artículo • 17/11/2022 • Tiempo de lectura: 10 minutos
Azure DevOps Services
Si usa Microsoft Teams , puede crear elementos de trabajo y supervisar la actividad del
elemento de trabajo en el proyecto de Azure Boards desde el canal de Teams. Para ello,
agregue la aplicación Azure Boards para Microsoft Teams al canal de Teams.
La aplicación Azure Boards para Microsoft Teams permite a los usuarios completar las
siguientes tareas:
Configuración y administración de suscripciones para crear y actualizar elementos
de trabajo
Administrar otros eventos de elemento de trabajo
Recibir y administrar notificaciones para eventos de elemento de trabajo en su
canal de Teams
Creación de elementos de trabajo a partir de conversaciones en el canal
Buscar y compartir elementos de trabajo con otros miembros del canal mediante
la extensión de mensajería
Vea las vistas previas del elemento de trabajo de sus direcciones URL para iniciar
discusiones y mantener las conversaciones contextuales.
Lea este artículo para aprender a:
" Agregar la aplicación Azure Boards al equipo en Microsoft Teams
" Vincular y desvincular el proyecto de Azure Boards a la aplicación de Azure Boards
" Configurar suscripciones para eventos relacionados con elementos de trabajo en el
canal de Teams
" Crear elementos de trabajo desde el canal de Teams
" Supervisión de la actividad del elemento de trabajo en el canal de Teams
7 Nota
Azure Boards y la integración de Microsoft Teams solo se admiten para Azure
DevOps Services.
Además, no se admite Azure Boards y la integración de Microsoft Teams si es un
cliente de O365 Government Community Cloud (GCC) que usa una suscripción
comercial de Azure junto con el inquilino de GCC.
Prerrequisitos
Para crear un elemento de trabajo, debe ser colaborador del proyecto de Azure
Boards. Si aún no tiene un proyecto, puede registrarse y crear un proyecto. Para
obtener más información, consulte Empezar a usar Azure Boards.
Para crear suscripciones en un canal de Teams para eventos de elementos de
trabajo, debe ser miembro del grupo administradores de proyectos de Azure
Boards o agregarlo al rol de administrador del equipo para el equipo. Para
agregarlo, consulte Cambio de permisos de nivel de proyecto o Agregar
administrador de equipo.
Para recibir notificaciones, debe habilitar el acceso a la aplicación de terceros a
través de la configuración de OAuth para la organización de Azure DevOps.
Consulte Cambio de directivas de acceso a aplicaciones para su organización.
7 Nota
En este momento, puede vincular la aplicación de Azure Boards para
Microsoft Teams a un proyecto hospedado en Azure DevOps Services.
Actualmente, no se admiten notificaciones dentro de mensajes directos.
Solo se admiten canales públicos.
Agregar la aplicación Azure Boards a Microsoft
Teams
Agregue la aplicación al canal de Teams en Microsoft Teams.
1. Visite la Tienda de aplicaciones en Microsoft Teams y busque la aplicación Azure
Boards. Tras la instalación, se muestra un mensaje de bienvenida de la aplicación,
como se muestra en la imagen siguiente.
2. Use el @azure boards identificador para interactuar con la aplicación. Para obtener
una lista de comandos, consulte Referencia de comandos proporcionada más
adelante en este artículo.
Vincular el proyecto de Azure Boards a la
aplicación Azure Boards
Para usar la aplicación, primero debe vincular el proyecto de Azure Boards al canal de
Teams.
1. Una vez instalada la aplicación en el equipo, conéctese y autentíquese en Azure
Boards. Use Iniciar sesión con un correo electrónico diferente si Microsoft Teams
y Azure Boards están en distintos inquilinos.
2. Después de iniciar sesión, use el siguiente comando dentro de un canal de Teams
para vincular al proyecto de Azure Boards que especifique con la dirección URL:
@azure boards link [project url]
Por ejemplo:
@azure boards link https://dev.azure.com/myorg/myproject
Una vez vinculado el proyecto, puede crear elementos de trabajo mediante @azure
boards create el comando o usar acciones de mensaje.
Configuración de suscripciones
Puede crear suscripciones para supervisar los elementos de trabajo en cualquier
momento mediante el @azure boards subscriptions comando .
1. Seleccione la ruta de acceso del área que desee y el evento que le interese. Use los
filtros asociados para personalizar lo que recibe notificaciones en en el canal de
Teams. Para ayudar a configurar fácilmente las suscripciones, las rutas de acceso de
área a las que se ha accedido recientemente se muestran en la lista desplegable
ruta de acceso del área.
En caso de que la ruta de acceso del área que desee no aparezca en el menú
desplegable Ruta de acceso del área, siga las instrucciones mencionadas en la sección
siguiente, Agregar rutas de acceso de área. Las rutas de acceso de área agregadas
mediante las rutas de acceso de área y comandos @azure boards addAreapath para las
que se crean suscripciones en el canal siempre aparecen en la lista desplegable Ruta de
acceso del área junto con las rutas de acceso de área a las que se ha accedido
recientemente.
Agregar rutas de acceso de área
Puede agregar áreas en las que trabaja el equipo al canal para que estén siempre
disponibles para crear elementos de trabajo y suscripciones. Esta característica es útil
para los equipos con más de 100 rutas de acceso de área en su proyecto.
Use el siguiente comando para agregar rutas de acceso de área desde el proyecto
al canal de Teams.
@azure boards addAreapath [area path]
Por ejemplo:
@azure boards addAreapath myproject\fabrikam
Si elige el nombre del proyecto como ruta de acceso del área, recibirá
notificaciones para todas las rutas de acceso de área del proyecto.
Creación de un elemento de trabajo con un
comando
Con la aplicación Azure Boards, puede crear elementos de trabajo desde el canal. La
aplicación también admite elementos de trabajo personalizados.
Para crear un elemento de trabajo, use @azure boards create .
Crear un elemento de trabajo a partir de
acciones de mensaje
A menudo, las discusiones en un canal requieren la creación de elementos de trabajo.
Puede usar acciones de mensaje para crear un elemento de trabajo. El mensaje
seleccionado se rellena previamente en la sección de descripción del elemento de
trabajo. La sección Discusión del elemento de trabajo recién agregado almacena un
vínculo a la conversación en el canal.
Para crear elementos de trabajo mediante acciones de mensaje
Administración de suscripciones de Azure
Boards
1. Para ver, agregue y quite suscripciones para un canal, use el @azure boards
subscriptions comando :
@azure boards subscriptions
Este comando enumera todas las suscripciones actuales para el canal y le permite
agregar nuevas suscripciones y quitar las existentes. Como parte de la adición de
suscripciones, también puede personalizar lo que recibe notificaciones mediante varios
filtros.
7 Nota
Los administradores del equipo no pueden quitar ni modificar suscripciones
creadas por los administradores de Project.
Buscar y compartir elementos de trabajo
mediante la extensión compose
Para ayudar a los usuarios a buscar y compartir elementos de trabajo, la aplicación
Azure Boards para Microsoft Teams admite la extensión de redacción. Puede buscar
elementos de trabajo por identificador de elemento de trabajo, título o comando
funcional compatible. Para obtener una lista de comandos, consulte Búsqueda de
elementos de trabajo funcionales. Para usar la extensión compose, los usuarios deben
iniciar sesión en Azure Boards aplicación ejecutando @azure boards signin el comando
o iniciando sesión directamente en la extensión compose.
Obtener una vista previa de las direcciones URL
del elemento de trabajo
Para admitir la colaboración en torno a los elementos de trabajo descritos en un canal,
el canal muestra una vista previa de los elementos de trabajo a los que se hace
referencia. Cuando un usuario pega la dirección URL del elemento de trabajo, se
muestra una vista previa similar a la siguiente imagen. Esta versión preliminar ayuda a
mantener las conversaciones relacionadas con los elementos de trabajo relevantes y
correctos.
Para que esta característica funcione, los usuarios deben iniciar sesión. Una vez iniciada
la sesión, esta característica funciona para todos los canales de un equipo de Microsoft
Teams.
Desvincular un proyecto de un canal
Un canal de Teams solo puede vincularse a un proyecto de Azure Boards a la vez. Para
vincular a otro proyecto, primero debe desvincular el proyecto actual mediante @azure
boards unlink el comando .
Al desvincular un proyecto, se eliminan todas las suscripciones junto con rutas de
acceso de área agregadas del canal. Si el canal no tiene suscripciones, cualquier usuario
puede desvincular un proyecto. Sin embargo, si un canal tiene suscripciones, solo los
administradores de proyectos pueden desvincular un proyecto de un canal.
Notificaciones en subprocesos para vincular y
reducir las notificaciones
Las notificaciones de subprocesos del canal de Teams para vincular y reducir
lógicamente las notificaciones relacionadas en el canal. Todas las notificaciones
vinculadas a un elemento de trabajo determinado están vinculadas juntas.
Vista compacta de notificaciones en subprocesos
Vista expandida de notificaciones en subprocesos
referencia de comandos de Azure Boards
En la tabla siguiente se enumeran todos los @azure boards comandos que puede usar
en el canal de Microsoft Teams.
Comando Funcionalidad
vínculo @azure boards Vincular un proyecto a este canal para crear elementos de trabajo
[project url] y recibir notificaciones
suscripciones de @azure Agregar o quitar suscripciones para este canal
boards
creación de paneles de Crear un elemento de trabajo
@azure
Comando Funcionalidad
@azure paneles addAreapath Agregar una ruta de acceso de área desde el proyecto a este
[area path] canal
inicio de sesión de @azure Inicie sesión en su organización de Azure Boards
boards
cierre de sesión de @azure Cierre de sesión de la organización de Azure Boards
boards
@azure paneles desvinculan Desvincular un proyecto de este canal
comentarios de @azure Notificar un problema o sugerir una característica
paneles
Configurar pestañas de Azure DevOps Services
en Microsoft Teams
1. Para incorporar el panel kanban o el panel a Microsoft Teams, seleccione el botón
"+" ("agregar nueva pestaña") en la navegación superior del canal de equipo.
Se muestra el cuadro de diálogo Agregar una pestaña . Los iconos se organizan
normalmente según el acceso más reciente. Puede seleccionar A-Z para una lista
alfabética.
2. Elija el icono de Azure DevOps y autentíquela. Opcionalmente, puede elegir el
icono Sitio web y agregar la dirección URL del panel Kanban o panel al canal.
3. Elija la organización cuyo panel o panel desea agregar.
4. Rellene el formulario presentado. Por ejemplo, aquí se agrega un panel para el
equipo de Azure DevOps para el proyecto TechnicalContent.
5. Se muestra el panel Kanban o el panel seleccionado.
Compatibilidad multiinquilino
En su organización si usa un correo electrónico o inquilino diferente para Microsoft
Teams y Azure DevOps, complete los pasos siguientes para iniciar sesión y conectarse en
función de su caso de uso.
Caso
Email id. y inquilino en Microsoft Teams
Email id. y inquilino en Azure DevOps
Pasos que se deben seguir
email1@abc.com
(inquilino 1)
email1@abc.com
(inquilino 1)
Inicie sesión con el botón Iniciar sesión .
email1@abc.com
(inquilino 1)
email1@abc.com
(inquilino 2)
Inicio de sesión en la cuenta de Azure DevOps
En el mismo explorador, inicie una nueva pestaña, vaya a
https://teams.microsoft.com
Ejecute el signin comando y elija el botón Iniciar sesión .
email1@abc.com
(inquilino 1)
email2@pqr.com
(inquilino 2)
Inicie sesión con Inicio de sesión con una dirección de correo electrónico diferente, en
el selector de identificadores de correo electrónico, use el correo electrónico2 para
iniciar sesión en Azure DevOps.
email1@abc.com
(inquilino 1)
email2@pqr.com
(inquilino no predeterminado 3)
Este escenario no se admite hoy en día.
Solución de errores
Si experimenta los siguientes errores al usar la aplicación Azure Boards para Microsoft
Teams , siga los procedimientos descritos en esta sección.
Algo ha ido mal. Inténtelo de nuevo.
Error de configuración. Asegúrese de que la organización '{nombre de la
organización}' existe y que tiene permisos suficientes.
Algo ha ido mal. Inténtelo de nuevo.
La aplicación Azure Boards usa el protocolo de autenticación de OAuth y requiere que
se habilite el acceso a aplicaciones de terceros a través de OAuth para que la
organización esté habilitada.
Para habilitar esta configuración, vaya a Configuración de
la organización Directivas> deseguridad> y establezca el acceso a la aplicación de
terceros a través de OAuth para la configuración de la organización en Activado.
Error de configuración. Asegúrese de que la organización
'{nombre de la organización}' existe y que tiene permisos
suficientes.
Cierre sesión en Azure DevOps; para ello, vaya a https://aka.ms/VsSignout mediante el
explorador.
Abra una ventana del explorador En privado o de incógnito y vaya a
https://aex.dev.azure.com/me e inicie sesión. En la lista desplegable situada debajo del
icono de perfil a la izquierda, seleccione el directorio que contiene la organización que
contiene el proyecto que desea vincular.
En el mismo explorador, inicie una nueva pestaña, vaya a
https://teams.microsoft.com/ . Ejecute el @azure boards signout comando y, a
continuación, ejecute el @azure boards signin comando en el canal donde está
instalada la aplicación Azure Boards para Microsoft Teams.
Seleccione el Sign in botón y se le redirigirá a una página de consentimiento como la
del ejemplo siguiente. Asegúrese de que el directorio que se muestra junto al correo
electrónico es el mismo que el elegido en el paso anterior. Acepte y complete el
proceso de inicio de sesión.
Si estos pasos no resuelven el problema de autenticación, póngase en contacto con
nosotros en Developer Community .
Artículos relacionados
Definición de rutas de acceso de área y asignación a un equipo
Azure Pipelines con Microsoft Teams
Azure Repos con Microsoft Teams
Azure Repos con Slack
Artículo • 27/09/2022 • Tiempo de lectura: 6 minutos
Azure DevOps Services
Si usa Slack , puede usar la aplicación Azure Repos para Slack para supervisar
fácilmente los repositorios de Azure Repos. Puede configurar y administrar suscripciones
para recibir notificaciones en el canal siempre que se inserte o proteja el código y cada
vez que se crea, actualiza o se intenta combinar una solicitud de incorporación de
cambios (PR). Esta aplicación admite eventos de Git y Control de versiones de Team
Foundation (TFVC).
Lea este artículo para aprender a:
" Adición de la aplicación Azure Repos al área de trabajo de Slack
" Conectar Azure Repos aplicación a los repositorios
" Administración de suscripciones a eventos relacionados con el repositorio en el
canal de Slack
" Uso eficaz de filtros para personalizar suscripciones
" Obtención de notificaciones en canales privados de Slack
Requisitos previos
Para crear suscripciones en un canal de Slack para eventos relacionados con el
repositorio, debe ser miembro del grupo administradores de Project o
administrador de equipo. Para agregarlo, consulte Cambio de permisos de nivel de
proyecto o Agregar un administrador de equipo.
Para recibir notificaciones, el acceso a la aplicación de terceros a través de la
configuración de OAuth debe estar habilitado para la organización. Consulte
Cambio de directivas de acceso a aplicaciones para su organización.
7 Nota
Actualmente no se admiten notificaciones dentro de mensajes directos.
Solo puede vincular la aplicación de Azure Repos para Slack a un proyecto
hospedado en Azure DevOps Services en este momento.
Adición de la aplicación Azure Repos al área de
trabajo de Slack
1. Vaya a la aplicación de Slack Azure Repos para instalar la aplicación Azure Repos
en el área de trabajo de Slack.
2. Una vez agregado, verá un mensaje de bienvenida de la aplicación, como se
muestra en la siguiente imagen.
3. Use el /azrepos identificador de Slack para interactuar con la aplicación. Se
proporciona una lista completa de comandos en la sección Referencia de
comandos de este artículo.
Conectar la aplicación de Azure Repos a los
repositorios
1. Una vez instalada la aplicación en el área de trabajo de Slack, conéctese y
autentíquese para Azure Repos mediante /azrepos signin el comando .
2. Para empezar a supervisar todos los repositorios de Git de un proyecto, use el
siguiente comando de barra diagonal dentro de un canal:
/azrepos subscribe [project url]
La dirección URL del proyecto puede estar en cualquier página del proyecto
(excepto las direcciones URL de los repositorios).
Por ejemplo:
/azrepos subscribe https://dev.azure.com/myorg/myproject/
También puede supervisar un repositorio específico mediante el siguiente
comando:
/azrepos subscribe [repository url]
La dirección URL del repositorio puede ser en cualquier página del repositorio que
tenga el nombre del repositorio.
Por ejemplo, para repositorios de Git, use:
/azrepos subscribe
https://dev.azure.com/myorg/myproject/_git/myrepository
Para los repositorios de TFVC, use:
/azrepos subscribe
https://dev.azure.com/myorg/myproject/_versionControl
7 Nota
Solo puede suscribirse a repositorios públicos.
3. El comando subscribe le ayudará a empezar con una suscripción predeterminada.
En el caso de los repositorios de Git, el canal se suscribe al evento de solicitud de
incorporación de cambios (con la rama de destino = master) y, para los
repositorios TFVC, el canal se suscribe al evento Código protegido.
Administrar suscripciones
Para ver, agregue y quite suscripciones para un canal, use el subscriptions comando :
/azrepos subscriptions
Este comando enumera todas las suscripciones actuales para el canal y permite agregar
nuevas suscripciones o quitar las existentes.
Al agregar suscripciones, puede
personalizar las notificaciones que obtiene mediante varios filtros, como se describe en
la sección siguiente.
[! NOTA] Los administradores de equipo no pueden quitar ni modificar suscripciones
creadas por Project administradores.
Uso eficaz de filtros para personalizar
suscripciones
Cuando un usuario se suscribe a un repositorio mediante /azrepos subscribe el
comando , se crea una suscripción predeterminada. A menudo, los usuarios tienen la
necesidad de personalizar estas suscripciones. Por ejemplo, es posible que los usuarios
quieran recibir notificaciones solo cuando las solicitudes de incorporación de cambios
tengan un revisor específico.
En los pasos siguientes se muestra cómo personalizar las suscripciones.
1. Ejecute el comando /azrepos subscriptions .
2. En la lista de suscripciones, si hay una suscripción no deseada o debe modificarse
(ejemplo: crear ruido en el canal), seleccione el botón Quitar .
3. Seleccione el botón Agregar suscripción .
4. Seleccione el repositorio necesario y el evento deseado.
5. Seleccione los filtros adecuados para personalizar la suscripción.
Ejemplo: Obtener notificaciones solo cuando mi equipo
está en la lista de revisores de una solicitud de
incorporación de cambios
Ejemplo: Dígame cuándo se produce un error en los
intentos de combinación debido a una infracción de
directiva
7 Nota
Todos los filtros suelen ser listas desplegables. Sin embargo, si la lista
desplegable tenía más de 100 elementos, se pide a los usuarios que escriban
los valores manualmente.
Para el evento TfVC Code Checked in , el filtro Under path debe tener el
formato $/myproject/path .
Vistas previas de las direcciones URL de la
solicitud de incorporación de cambios
Cuando un usuario pega la dirección URL de una solicitud de incorporación de cambios,
se muestra una vista previa como la de la imagen siguiente. Esto ayuda a mantener
conversaciones relacionadas con pr contextuales y precisas.
Para que esta característica funcione, los usuarios deben iniciar sesión. Una vez que
hayan iniciado sesión, esta característica funcionará para todos los canales de un área de
trabajo.
Eliminación de suscripciones y repositorios de
un canal
Muchas veces, los usuarios quieren limpiar su canal quitando repositorios y
suscripciones. Use el comando siguiente para lograr lo mismo.
/azrepos unsubscribe all [project url]
Por ejemplo:
/azrepos unsubscribe all https://dev.azure.com/myorg/myproject
Este comando eliminará todas las suscripciones relacionadas con cualquier repositorio
del proyecto y quitará los repositorios del canal. Solo los administradores del proyecto
pueden ejecutar este comando.
Referencia de comandos
En la tabla siguiente se enumeran todos los /azrepos commands elementos que puede
usar en el canal de Slack.
Comando Barra diagonal Funcionalidad
/azrepos subscribe [repository url/ Suscribirse a un repositorio o a todos los repositorios de
project url] un proyecto para recibir notificaciones
/azrepos subscriptions Agregar o quitar suscripciones para este canal
/azrepos signin Inicie sesión en su organización de Azure Repos
/azrepos signout Cierre de sesión de la organización de Azure Repos
/azrepos feedback Notificar un problema o sugerir una característica
/azrepos cancela la suscripción a Quitar todos los repositorios (que pertenecen a un
todas las [dirección URL del proyecto] proyecto) y sus suscripciones asociadas de un canal
Notificaciones en canales privados
La aplicación Azure Repos también puede ayudarle a supervisar los eventos del
repositorio en los canales privados. Deberá invitar el bot al canal privado mediante
/invite @azrepos . Después, puede configurar y administrar las notificaciones de la
misma manera que lo haría para un canal público.
Solución de problemas
Si experimenta los siguientes errores al usar la aplicación Azure Repos para Slack , siga
los procedimientos de esta sección.
Algo ha ido mal. Inténtelo de nuevo.
Error de configuración. Asegúrese de que la organización '{nombre de la
organización}' existe y que tiene permisos suficientes.
Algo ha ido mal. Inténtelo de nuevo.
La aplicación Azure Repos usa el protocolo de autenticación de OAuth y requiere que se
habilite el acceso a aplicaciones de terceros a través de OAuth para que la organización
esté habilitada.
Para habilitar esta configuración, vaya a Organización
Configuración>SeguridadDirectivas> y establezca el acceso a la aplicación de terceros
a través de OAuth para la configuración de la organización en Activado.
Error de configuración. Asegúrese de que la organización
'{nombre de la organización}' existe y que tiene permisos
suficientes.
Cierre la sesión de Azure DevOps. Para ello, vaya a https://aka.ms/VsSignout mediante
el explorador.
Abra una ventana del explorador En privado o de incógnito y vaya a
https://aex.dev.azure.com/me e inicie sesión. En la lista desplegable situada debajo del
icono de perfil de la izquierda, seleccione el directorio que contiene la organización que
contiene el repositorio al que desea suscribirse.
En el mismo explorador, inicie una nueva pestaña, vaya a https://slack.com e inicie
sesión en el espacio de trabajo (use el cliente web). Ejecute el /azrepos signout
comando seguido del /azrepos signin comando .
Seleccione el Sign in botón y se le redirigirá a una página de consentimiento como la
del ejemplo siguiente. Asegúrese de que el directorio que se muestra junto al correo
electrónico es el mismo que el elegido en el paso anterior. Acepte y complete el
proceso de inicio de sesión.
Si estos pasos no resuelven el problema de autenticación, póngase en contacto con
nosotros en Developer Community .
Artículos relacionados
Azure Boards con Slack
Azure Pipelines con Slack
Creación de un enlace de servicio para Azure DevOps con Slack
Azure Repos con Microsoft Teams
Artículo • 17/12/2022 • Tiempo de lectura: 8 minutos
Azure DevOps Services
Si usa Microsoft Teams , puede usar la aplicación Azure Repos para Teams para
supervisar los repositorios. La aplicación admite la supervisión de repositorios de Git y
Control de versiones de Team Foundation (TFVC). No admite la integración con
repositorios de GitHub.
Para empezar, debe configurar y administrar suscripciones para recibir notificaciones en
el canal cada vez que se inserte o proteja el código o cuando se cree, actualice o
combine una solicitud de incorporación de cambios (PR).
Lea este artículo para aprender a:
" Agregar la aplicación de Azure Repos al equipo en Microsoft Teams
" Conexión de la aplicación Azure Repos a los repositorios
" Administración de suscripciones a eventos relacionados con el repositorio en el
canal
" Uso eficaz de filtros para personalizar suscripciones
Requisitos previos
Para crear suscripciones para eventos relacionados con el repositorio, debe ser
miembro del grupo Administradores de proyectos o administrador de equipo.
Para agregarlo, consulte Cambio de permisos de nivel de proyecto o Agregar un
administrador de equipo.
Para recibir notificaciones, debe habilitar el acceso a la aplicación de terceros a
través de la configuración de OAuth para la organización de Azure DevOps.
Consulte Cambio de directivas de acceso a aplicaciones para su organización.
7 Nota
Actualmente no se admiten notificaciones dentro de mensajes directos.
Solo puede vincular la aplicación de Azure Repos para Microsoft Teams a un
proyecto hospedado en Azure DevOps Services.
Agregar la aplicación de Azure Repos al equipo
en Microsoft Teams
Visite app store en Microsoft Teams y busque la aplicación Azure Repos. Tras la
instalación, se muestra un mensaje de bienvenida de la aplicación, como se muestra en
la imagen siguiente. Use el @azure repos identificador para empezar a interactuar con la
aplicación.
Conexión de la aplicación Azure Repos a los
repositorios
1. Una vez instalada la aplicación en el equipo, autentíquese en Azure Repos
mediante el @azure repos signin comando . Use Iniciar sesión con un correo
electrónico diferente si Microsoft Teams y Azure Boards están en distintos
inquilinos.
2. Para empezar a supervisar todos los repositorios de Git de un proyecto, use el
siguiente comando de barra diagonal dentro de un canal:
@azure repos subscribe [project url]
La dirección URL del proyecto puede estar en cualquier página del proyecto
(excepto las direcciones URL de los repositorios).
Por ejemplo:
@azure repos subscribe https://dev.azure.com/myorg/myproject/
También puede supervisar un repositorio específico mediante el siguiente
comando:
@azure repos subscribe [repository url]
La dirección URL del repositorio puede ser en cualquier página del repositorio que
tenga el nombre del repositorio.
Por ejemplo, para repositorios de Git, use:
@azure repos subscribe
https://dev.azure.com/myorg/myproject/_git/myrepository
Para los repositorios de TFVC, use:
@azure repos subscribe
https://dev.azure.com/myorg/myproject/_versionControl
3. El subscribe comando le ayudará a empezar con una suscripción predeterminada.
En el caso de los repositorios de Git, el canal se suscribe al evento de solicitud de
incorporación de cambios ( con la rama de destino = maestra). En el caso de los
repositorios de TFVC, el canal se suscribe al evento Código protegido .
Administrar suscripciones
Para ver, agregar y quitar suscripciones para un canal, use el subscriptions comando :
@azure repos subscriptions
El subscription comando enumera todas las suscripciones actuales para el canal y
permite agregar nuevas suscripciones o quitar las existentes.
Al agregar suscripciones,
puede personalizar las notificaciones que obtiene mediante varios filtros, como se
describe en la sección siguiente.
[! NOTA] Los administradores del equipo no pueden quitar ni modificar suscripciones
creadas por los administradores de Project.
Uso de filtros para obtener solo las
notificaciones que desee
Cuando un usuario se suscribe a un repositorio mediante el @azure repos subscribe
comando , se crea una suscripción predeterminada sin filtros aplicados.
A menudo, los
usuarios deben personalizar estas suscripciones para recibir notificaciones solo cuando
se cumplen ciertas condiciones.
Por ejemplo, es posible que los usuarios quieran recibir
notificaciones solo cuando las SOLICITUDES de incorporación de cambios tengan un
grupo determinado agregado como revisor.
En los pasos siguientes se muestra cómo personalizar las suscripciones.
1. Ejecute el comando @azure repos subscriptions .
2. En la lista de suscripciones, si hay una suscripción no deseada o que se debe
modificar, seleccione Quitar para eliminarla.
3. Seleccione el botón Agregar suscripción .
4. Seleccione el repositorio necesario y el evento deseado.
5. Seleccione los filtros adecuados para personalizar la suscripción.
Ejemplo: Obtener notificaciones solo cuando mi equipo
está en la lista de revisores de una solicitud de
incorporación de cambios
7 Nota
Todos los filtros suelen ser listas desplegables. Sin embargo, si la lista
desplegable tuviera más de 100 elementos, deberá escribir los valores
manualmente.
Para el evento TfVC Code Checked in , el filtro Under path debe tener el
formato $/myproject/path .
Búsqueda y uso compartido de información de
solicitud de incorporación de cambios
mediante la extensión compose
Para ayudar a los usuarios a buscar y compartir información sobre las solicitudes de
incorporación de cambios, Azure Repos aplicación para Microsoft Teams admite la
extensión de redacción. Ahora puede buscar solicitudes de incorporación de cambios
por identificador o nombre. Para que la extensión de redacción funcione, los usuarios
tendrán que iniciar sesión en Azure Repos proyecto en el que estén interesados
mediante la ejecución @azure repos signin del comando o iniciando sesión
directamente en la extensión de redacción.
Vistas previas de las direcciones URL de la
solicitud de incorporación de cambios
Cuando un usuario pega la dirección URL de una solicitud de incorporación de cambios,
se muestra una vista previa como la de la imagen siguiente. Esto ayuda a mantener
conversaciones relacionadas con pr contextuales y precisas.
Para que esta característica funcione, los usuarios deben iniciar sesión. Una vez que
hayan iniciado sesión, esta característica funcionará para todos los canales de un
equipo.
Eliminación de suscripciones y repositorios de
un canal
Muchas veces, los usuarios quieren limpiar su canal quitando repositorios y
suscripciones. Use el comando siguiente para lograr lo mismo.
@azure repos unsubscribe all [project url]
Por ejemplo:
@azure repos unsubscribe all https://dev.azure.com/myorg/myproject
Este comando eliminará todas las suscripciones relacionadas con cualquier repositorio
del proyecto y quitará los repositorios del canal. Solo los administradores del proyecto
pueden ejecutar este comando.
Notificaciones en subprocesos
Para vincular lógicamente un conjunto de notificaciones relacionadas y también
reducir el espacio ocupado por las notificaciones en un canal, las notificaciones se
procesan en subprocesos. Todas las notificaciones vinculadas a una solicitud de
incorporación de cambios determinada se vincularán juntas.
Vista compacta de notificaciones en subprocesos
Vista expandida de notificaciones en subprocesos
Referencia de comandos
En la tabla siguiente se enumeran todos los azure repos comandos que puede usar en
el canal de Teams.
Comando Funcionalidad
@azure repos subscribe [repository url/ Suscribirse a un repositorio o a todos los
project url] repositorios de un proyecto para recibir
notificaciones
@azure suscripciones de repositorios Agregar o quitar suscripciones para este canal
@azure inicio de sesión de repositorios Inicie sesión en su organización de Azure Repos
@azure cierre de sesión de repositorios Cierre la sesión de la organización de Azure Repos
Comando Funcionalidad
@azure comentarios de repositorios Notificar un problema o sugerir una característica
@azure los repositorios cancelan la Quitar todos los repositorios (que pertenecen a un
suscripción a todas las [dirección URL del proyecto) y sus suscripciones asociadas de un canal
proyecto]
Compatibilidad multiinquilino
En su organización, si usa un correo electrónico o un inquilino diferentes para Microsoft
Teams y Azure DevOps, realice los pasos siguientes para iniciar sesión y conectarse en
función de su caso de uso.
Caso Email id. e Email id. y Pasos que se deben seguir
inquilino en inquilino en
Microsoft Teams Azure DevOps
1 email1@abc.com email1@abc.com Inicie sesión con el botón Iniciar sesión.
(inquilino 1) (inquilino 1)
2 email1@abc.com email1@abc.com Inicio de sesión en la cuenta de Azure
(inquilino 1) (inquilino 2) DevOps
En el mismo explorador, inicie una nueva
pestaña, vaya a .
https://teams.microsoft.com/
Ejecute el signin comando y elija el botón
Iniciar sesión .
3 email1@abc.com email2@pqr.com Inicie sesión con Inicio de sesión con una
(inquilino 1) (inquilino 2) dirección de correo electrónico diferente, en el
selector de identificadores de correo electrónico,
use email2 para iniciar sesión en Azure DevOps.
4 email1@abc.com email2@pqr.com Este escenario no se admite actualmente.
(inquilino 1) (inquilino no
predeterminado
3)
Solución de problemas
Si experimenta los siguientes errores al usar la aplicación de Azure Repos, siga los
procedimientos de esta sección.
Algo ha ido mal. Inténtelo de nuevo.
Error de configuración. Asegúrese de que la organización '{nombre de la
organización}' existe y que tiene permisos suficientes.
Algo ha ido mal. Inténtelo de nuevo.
La aplicación Azure Repos usa el protocolo de autenticación de OAuth y requiere que se
habilite el acceso de aplicaciones de terceros a través de OAuth para que la
organización esté habilitada.
Para habilitar esta configuración, vaya a Directivas
deseguridad>de configuración> de la organización y establezca el acceso a la
aplicación de terceros a través de OAuth para la configuración de la organización en
Activado.
Error de configuración. Asegúrese de que la organización
'{nombre de la organización}' existe y que tiene permisos
suficientes.
Cierre sesión en Azure DevOps; para ello, vaya a https://aka.ms/VsSignout mediante el
explorador.
Abra una ventana del explorador En privado o de incógnito y vaya a
https://aex.dev.azure.com/me e inicie sesión. En la lista desplegable del icono de perfil
de la izquierda, seleccione el directorio que contiene la organización que contiene el
repositorio al que desea suscribirse.
En el mismo explorador, inicie una nueva pestaña e inicie sesión en
https://teams.microsoft.com/ . Ejecute el @Azure Repos signout comando y, a
continuación, ejecute el @Azure Repos signin comando en el canal donde está instalada
la aplicación de Azure Repos para Microsoft Teams.
Seleccione el Sign in botón y se le redirigirá a una página de consentimiento como la
del ejemplo siguiente. Asegúrese de que el directorio que se muestra junto al correo
electrónico es el mismo que el elegido en el paso anterior. Acepte y complete el
proceso de inicio de sesión.
Si estos pasos no resuelven el problema de autenticación, póngase en contacto con
nosotros en Developer Community .
Artículos relacionados
Azure Boards con Teams
Azure Pipelines con Teams
Azure Pipelines con Slack
Artículo • 27/09/2022 • Tiempo de lectura: 7 minutos
Azure DevOps Services
Si usa Slack , puede usar la aplicación Azure Pipelines para Slack para supervisar
fácilmente los eventos de las canalizaciones. Configure y administre suscripciones para
compilaciones, versiones, canalizaciones de YAML, aprobaciones pendientes y mucho
más desde la aplicación y obtenga notificaciones para estos eventos en los canales de
Slack.
7 Nota
Esta característica solo está disponible en Azure DevOps Services. Normalmente, las
nuevas características se introducen primero en el servicio en la nube y, a
continuación, se pone a disposición local en la siguiente versión principal o
actualización de Azure DevOps Server. Para más información, consulte Azure
DevOps escala de tiempo de características.
Incorporación de la aplicación Azure Pipelines
al área de trabajo de Slack
Vaya a Azure Pipelines aplicación de Slack para instalar la aplicación de Azure
Pipelines en el área de trabajo de Slack. Una vez agregado, verá un mensaje de
bienvenida de la aplicación como se indica a continuación. Use el /azpipelines
identificador para empezar a interactuar con la aplicación.
Conectar la aplicación Azure Pipelines a las
canalizaciones
Una vez instalada la aplicación en el área de trabajo de Slack, puede conectar la
aplicación a las canalizaciones que quiere supervisar. La aplicación le pedirá que se
autentique en Azure Pipelines antes de ejecutar cualquier comando.
Para empezar a supervisar todas las canalizaciones de un proyecto, use el siguiente
comando de barra diagonal dentro de un canal:
/azpipelines subscribe [project url]
La dirección URL del proyecto puede ser en cualquier página del proyecto (excepto las
direcciones URL de las canalizaciones).
Por ejemplo:
/azpipelines subscribe https://dev.azure.com/myorg/myproject/
También puede supervisar una canalización específica mediante el siguiente comando:
/azpipelines subscribe [pipeline url]
La dirección URL de la canalización puede ser en cualquier página de la canalización que
tenga definitionId o buildId/releaseId en la dirección URL.
Por ejemplo:
/azpipelines subscribe https://dev.azure.com/myorg/myproject/_build?
definitionId=123
O bien
/azpipelines subscribe https://dev.azure.com/myorg/myproject/_release?
definitionId=123&view=mine&_a=releases
El comando subscribe le permite empezar a usar algunas suscripciones de forma
predeterminada. En Canalizaciones de compilación, el canal se suscribe a la notificación
Compilación completada . En el caso de las canalizaciones de versión, el canal
comenzará a recibir la implementación de versión iniciada, la implementación de versión
completada y las notificaciones pendientes de aprobación de implementación de versión .
En el caso de las canalizaciones de YAML, las suscripciones se crean para el estado de
fase de ejecución cambiado y la fase de ejecución en espera de notificaciones de
aprobación.
Administrar suscripciones
Para administrar las suscripciones de un canal, use el siguiente comando:
/azpipelines subscriptions
Este comando mostrará todas las suscripciones actuales para el canal y le permitirá
agregar nuevas suscripciones.
[! NOTA] Los administradores del equipo no pueden quitar ni modificar suscripciones
creadas por Project administradores.
Uso eficaz de filtros para personalizar
suscripciones
Cuando un usuario se suscribe a cualquier canalización, se crean algunas suscripciones
de forma predeterminada sin aplicar ningún filtro. A menudo, los usuarios tienen la
necesidad de personalizar estas suscripciones.
Por ejemplo, es posible que los usuarios
quieran oír solo sobre compilaciones con errores o recibir notificaciones solo cuando las
implementaciones se insertan en producción. La aplicación Azure Pipelines admite filtros
para personalizar lo que ve en el canal.
1. Ejecute el comando /azpipelines subscriptions .
2. En la lista de suscripciones, si hay una suscripción no deseada o debe modificarse
(ejemplo: crear ruido en el canal), seleccione el botón Quitar .
3. Seleccione el botón Agregar suscripción .
4. Seleccione la canalización necesaria y el evento deseado.
5. Seleccione los filtros adecuados para personalizar la suscripción.
Ejemplo: Obtención de notificaciones solo para
compilaciones con errores
Ejemplo: Obtención de notificaciones solo si las
implementaciones se insertan en el entorno de
producción
Aprobación de implementaciones desde el
canal
Puede aprobar las implementaciones desde el canal sin navegar al portal de Azure
Pipelines mediante la suscripción a la notificación de aprobación de implementación de
versión pendiente para versiones clásicas o la fase de ejecución en espera de notificación
de aprobación para canalizaciones de YAML. Ambas suscripciones se crean de forma
predeterminada al suscribirse a la canalización.
Cada vez que la ejecución de una fase está pendiente de aprobación, una tarjeta de
notificación con opciones para aprobar o rechazar la solicitud se publica en el canal. Los
aprobadores pueden revisar los detalles de la solicitud en la notificación y tomar las
medidas adecuadas. En el ejemplo siguiente, la implementación se aprobó y el estado
de aprobación se muestra en la tarjeta.
La aplicación admite todos los escenarios de comprobación y aprobación presentes en
Azure Pipelines portal, como aprobador único, varios aprobadores (cualquier usuario,
cualquier orden, secuencia) y equipos como aprobadores. Puede aprobar solicitudes
como un individuo o en nombre de un equipo.
Vistas previas de las direcciones URL de
canalización
Cuando un usuario pega una dirección URL de canalización, se muestra una vista previa
similar a la de la imagen siguiente. Esto ayuda a mantener las conversaciones
relacionadas con la canalización relevantes y precisas.
Para que esta característica funcione, los usuarios deben iniciar sesión. Una vez que
hayan iniciado sesión, esta característica funcionará para todos los canales de un área de
trabajo.
Eliminación de suscripciones y canalizaciones
de un canal
Si desea limpiar el canal, use los siguientes comandos para cancelar la suscripción de
todas las canalizaciones de un proyecto.
/azpipelines unsubscribe all [project url]
Por ejemplo:
/azpipelines unsubscribe all https://dev.azure.com/myorg/myproject
Este comando elimina todas las suscripciones relacionadas con cualquier canalización
del proyecto y quita las canalizaciones del canal.
) Importante
Solo los administradores del proyecto pueden ejecutar este comando.
Referencia de comandos
Estos son todos los comandos admitidos por la aplicación Azure Pipelines:
Comando De barra diagonal Funcionalidad
/azpipelines subscribe [pipeline url/ Suscribirse a una canalización o a todas las
project url] canalizaciones de un proyecto para recibir
notificaciones
Suscripciones de /azpipelines Agregar o quitar suscripciones para este canal
Comentarios de /azpipelines Notificar un problema o sugerir una característica
Ayuda de /azpipelines Obtener ayuda sobre los comandos de barra diagonal
/azpipelines signin Inicie sesión en su cuenta de Azure Pipelines
/azpipelines signout Cierre la sesión de la cuenta de Azure Pipelines
/azpipelines cancela la suscripción a Quitar todas las canalizaciones (que pertenecen a un
todas las [dirección URL del proyecto] proyecto) y sus suscripciones asociadas de un canal
Notificaciones en canales privados
La aplicación Azure Pipelines puede ayudarle a supervisar también la actividad de
canalizaciones en los canales privados. Tendrá que invitar al bot a su canal privado
mediante /invite @azpipelines .
Después, puede configurar y administrar las
notificaciones de la misma manera que lo haría para un canal público.
7 Nota
Puede usar la aplicación Azure Pipelines para Slack solo con un proyecto
hospedado en Azure DevOps Services en este momento.
El usuario debe ser un administrador del proyecto que contiene la
canalización para configurar las suscripciones.
Actualmente no se admiten notificaciones dentro de mensajes directos
No se admiten las aprobaciones de implementación que tienen aplicada la
identidad "Revalidate identity of approver antes de completar la aprobación".
"El acceso a aplicaciones de terceros a través de OAuth" debe estar habilitado
para recibir notificaciones para la organización en Azure DevOps
(Organización Configuración -> Seguridad -> Directivas)
Solución de problemas
Si experimenta los siguientes errores al usar la aplicación Azure Pipelines para Slack ,
siga los procedimientos de esta sección.
Algo ha ido mal. Inténtelo de nuevo.
Error de configuración. Asegúrese de que la organización '{nombre de la
organización}' existe y que tiene permisos suficientes.
Algo ha ido mal. Inténtelo de nuevo.
La aplicación Azure Pipelines usa el protocolo de autenticación de OAuth y requiere que
se habilite el acceso de aplicaciones de terceros a través de OAuth para que la
organización esté habilitada. Para habilitar esta configuración, vaya a Organización
Configuración>SecurityPolicies> y establezca el acceso a la aplicación de terceros a
través de OAuth para la configuración de la organización en Activado.
Error de configuración. Asegúrese de que la organización
'{nombre de la organización}' existe y que tiene permisos
suficientes.
Cierre la sesión de Azure DevOps; para ello, vaya a https://aka.ms/VsSignout mediante
el explorador.
Abra una ventana del explorador En privado o de incógnito y vaya a
https://aex.dev.azure.com/me e inicie sesión. En la lista desplegable del icono de perfil
de la izquierda, seleccione el directorio que contiene la organización que contiene la
canalización para la que desea suscribirse.
En el mismo explorador, inicie una nueva pestaña, vaya a https://slack.com e inicie
sesión en el espacio de trabajo (use el cliente web). Ejecute el /azpipelines signout
comando seguido del /azpipelines signin comando .
Seleccione el Sign in botón y se le redirigirá a una página de consentimiento como la
del ejemplo siguiente. Asegúrese de que el directorio que se muestra junto al correo
electrónico es el mismo que el elegido en el paso anterior. Acepte y complete el
proceso de inicio de sesión.
Si estos pasos no resuelven el problema de autenticación, póngase en contacto con
nosotros en Developer Community .
Artículos relacionados
Azure Boards con Slack
Azure Repos con Slack
Creación de un enlace de servicio para Azure DevOps con Slack
Uso de Azure Pipelines con Microsoft
Teams
Artículo • 27/09/2022 • Tiempo de lectura: 7 minutos
Azure DevOps Services
La aplicación Azure Pipelines para Microsoft Teams le permite supervisar los eventos
de las canalizaciones. Puede configurar y obtener notificaciones en el canal de Teams
para versiones, aprobaciones pendientes, compilaciones completadas, etc. También
puede aprobar versiones desde el canal de Teams.
7 Nota
Esta característica solo está disponible en Azure DevOps Services. Normalmente, las
nuevas características se introducen primero en el servicio en la nube y, a
continuación, se pone a disposición local en la siguiente versión principal o
actualización de Azure DevOps Server. Para más información, consulte Escala de
tiempo de características de Azure DevOps.
Requisitos previos
Debe tener un proyecto de Azure DevOps. Para obtener más información, consulte
Creación de un proyecto.
Para configurar suscripciones de canalización, debe ser administrador de
proyectos.
Configuración de la aplicación de Azure
Pipelines
1. En Microsoft Teams, vaya a la tienda Aplicaciones , busque Azure Pipelines y, a
continuación, seleccione Azure Pipelines.
2. Seleccione la flecha desplegable Abrir y, a continuación, seleccione Agregar a un
equipo.
3. Seleccione o escriba el nombre del equipo y elija Configurar un bot.
4. En el panel de conversación de Teams, escriba @azurePipelines signin .
5. Seleccione Iniciar sesión y completar la autenticación en Azure Pipelines.
Usar comandos
Use los siguientes comandos para supervisar todas las canalizaciones de un proyecto o
solo canalizaciones específicas.
Supervise todas las canalizaciones de un proyecto. La dirección URL puede ser en
cualquier página del proyecto, excepto las direcciones URL de las canalizaciones.
Por ejemplo, @azure pipelines subscribe
https://dev.azure.com/myorg/myproject/ .
@azure pipelines subscribe [project url]
Supervisar una canalización específica: La dirección URL de la canalización puede
ser en cualquier página de la canalización que tenga o
definitionId buildId/releaseId presente en la dirección URL. Por ejemplo, @azure
pipelines subscribe https://dev.azure.com/myorg/myproject/_build?
definitionId=123 .
@azure pipelines subscribe [pipeline url]
Otro ejemplo de una canalización de versión que está suscrita a la implementación
de versión iniciada, implementación de versión completada y notificaciones
pendientes de aprobación de implementación de versión es @azure pipelines
subscribe https://dev.azure.com/myorg/myproject/_release?
definitionId=123&view=mine&_a=releases .
7 Nota
No se admiten aprobaciones de implementación que hayan aplicado la
identidad Revalidate del aprobador antes de completar la directiva de
aprobación .
Habilite el acceso a aplicaciones de terceros a través de OAuth para recibir
notificaciones para la organización en Azure DevOps.
Administrar suscripciones
Al suscribirse a una canalización, algunas suscripciones se crean de forma
predeterminada sin aplicar ningún filtro. Es posible que desee personalizar estas
suscripciones. Por ejemplo, puede recibir notificaciones solo cuando se produzca un
error en las compilaciones o cuando las implementaciones se inserten en un entorno de
producción. La aplicación Azure Pipelines admite filtros para personalizar lo que ve en el
canal. Para administrar las suscripciones, complete los pasos siguientes.
1. Ejecute el comando @azure pipelines subscriptions .
2. Seleccione Ver todas las suscripciones. En la lista de suscripciones, si hay una
suscripción que no desea, seleccione Quitar.
3. Desplácese hacia abajo y seleccione Agregar suscripción.
4. Seleccione la canalización y el evento necesarios.
5. Seleccione los filtros adecuados y, después, Guardar.
Ejemplo 1: Obtenga notificaciones para compilaciones con errores.
Ejemplo 2: Obtenga notificaciones solo si las implementaciones se insertan en el
entorno de producción.
7 Nota
Los administradores del equipo no pueden quitar ni modificar
suscripciones creadas por los administradores de proyectos.
Las notificaciones no se admiten dentro de mensajes directos o de chat.
Aprobación de implementaciones desde el
canal
Puede aprobar implementaciones desde el canal sin ir al portal de Azure Pipelines.
Suscríbase a la notificación pendiente de aprobación de implementación de versión para
versiones clásicas o la fase de ejecución en espera de notificación de aprobación para
canalizaciones de YAML. Ambas suscripciones se crean de forma predeterminada al
suscribirse a la canalización.
Cada vez que la ejecución de una fase está pendiente de aprobación, una tarjeta de
notificación con opciones para aprobar o rechazar la solicitud se publica en el canal. Los
aprobadores pueden revisar los detalles de la solicitud en la notificación y tomar las
medidas adecuadas. En el ejemplo siguiente, la implementación se aprobó y el estado
de aprobación se muestra en la tarjeta.
La aplicación Azure Pipelines admite todos los escenarios de comprobación y
aprobación presentes en el portal de Azure Pipelines. Puede aprobar solicitudes como
un individuo o para un equipo.
Búsqueda y uso compartido de información de
canalización mediante la extensión compose
Para ayudar a los usuarios a buscar y compartir información sobre canalizaciones, la
aplicación Azure Pipelines para Microsoft Teams admite la extensión de redacción.
Ahora puede buscar canalizaciones por identificador de canalización o por nombre de
canalización. Para que la extensión de redacción funcione, los usuarios deben iniciar
sesión en el proyecto de Azure Pipelines en el que estén interesados mediante la
ejecución @azure pipelines signin del comando o iniciando sesión en la extensión de
redacción directamente.
Vistas previas de las direcciones URL de
canalización
Al agregar una dirección URL de canalización a Teams, verá una vista previa similar a las
siguientes imágenes. La versión preliminar ayuda a mantener actualizadas y actualizadas
las conversaciones relacionadas con la canalización. Puede elegir entre tarjetas
compactas y expandidas.
Ejemplo 1: Vista previa de la dirección URL de compilación
Ejemplo 2: Versión preliminar de la dirección URL de versión
Una vez que haya iniciado sesión, esta característica funciona para todos los canales de
un equipo de Microsoft Teams.
Cancelar la suscripción de un canal de
canalización
Use el siguiente comando para cancelar la suscripción a todas las canalizaciones de un
proyecto.
@azure pipelines unsubscribe all [project url]
Ejemplo: Cancelar la suscripción a todo con la dirección URL
@azure pipelines unsubscribe all https://dev.azure.com/myorg/myproject
Este comando elimina todas las suscripciones relacionadas con cualquier canalización
del proyecto y quita las canalizaciones del canal.
) Importante
Solo los administradores de proyectos pueden ejecutar este comando.
Vinculación de las notificaciones
Vincule un conjunto de notificaciones relacionadas para reducir el espacio ocupado por
las notificaciones en un canal. Todas las notificaciones vinculadas a una ejecución
determinada de una canalización se vinculan juntas.
Ejemplo 1: Vista compacta de las notificaciones vinculadas.
Ejemplo 2: Vista expandida de notificaciones vinculadas.
Uso de comandos en la aplicación Azure
Pipelines
Consulte los siguientes comandos compatibles con la aplicación Azure Pipelines:
Comando De barra diagonal Funcionalidad
@azure pipelines subscribe [pipeline url/ Suscribirse a una canalización o a todas las
project url] canalizaciones de un proyecto para recibir
notificaciones
@azure suscripciones de canalizaciones Agregar o quitar suscripciones para este canal
@azure comentarios sobre canalizaciones Notificar un problema o sugerir una característica
@azure Ayuda de canalizaciones Obtener ayuda sobre los comandos de barra
diagonal
@azure inicio de sesión de canalizaciones Inicie sesión en su cuenta de Azure Pipelines
@azure cierre de sesión de canalizaciones Cierre la sesión de la cuenta de Azure Pipelines
@azure canalizaciones cancelan la Quitar todas las canalizaciones (que pertenecen a un
suscripción a todas las [dirección URL del proyecto) y sus suscripciones asociadas de un canal
proyecto]
Conectar multiinquilino
Si usa un correo electrónico o inquilino diferente para Microsoft Teams y Azure DevOps,
siga estos pasos para iniciar sesión y conectarse en función de su caso de uso.
Caso Inquilino de Inquilino de Acción de inicio de sesión
de identificador de & identificador & de
uso correo electrónico en correo electrónico en
Microsoft Teams Azure DevOps
1 email1@abc.com email1@abc.com Seleccione Iniciar sesión.
(inquilino 1) (inquilino 1)
2 email1@abc.com email2@pqr.com - Inicie sesión en Azure DevOps.
(inquilino 1) (inquilino 2) - En el mismo explorador, inicie
una nueva pestaña y vaya a
https://teams.microsoft.com/ .
- Ejecute el sign in comando y
seleccione Iniciar sesión.
Caso Inquilino de Inquilino de Acción de inicio de sesión
de identificador de & identificador & de
uso correo electrónico en correo electrónico en
Microsoft Teams Azure DevOps
3 email1@abc.com email2@pqr.com - Seleccione Iniciar sesión con una
(inquilino 1) (inquilino 2) dirección de correo electrónico
diferente.
- En el selector de identificadores
de correo electrónico, use el correo
electrónico2 para iniciar sesión.
4 email1@abc.com email2@pqr.com No se admite actualmente.
(inquilino 1) (inquilino no
predeterminado 3)
Solución de problemas
Algo ha ido mal. Inténtelo de nuevo.
Error de configuración. Asegúrese de que la organización '{nombre de la
organización}' existe y que tiene permisos suficientes.
Algo ha ido mal. Inténtelo de nuevo.
La aplicación Azure Pipelines usa el protocolo de autenticación de OAuth y requiere que
se habilite el acceso de aplicaciones de terceros a través de OAuth para que la
organización esté habilitada. Para habilitar esta configuración, vaya a Organización
Configuración>SecurityPolicies> y establezca el acceso a la aplicación de terceros a
través de OAuth para la configuración de la organización en Activado.
Error de configuración. Asegúrese de que la organización
'{nombre de la organización}' existe y que tiene permisos
suficientes.
Cierre la sesión de Azure DevOps; para ello, vaya a https://aka.ms/VsSignout mediante
el explorador.
Abra una ventana del explorador En privado o de incógnito y vaya a
https://aex.dev.azure.com/me e inicie sesión. En la lista desplegable del icono de perfil
de la izquierda, seleccione el directorio que contiene la organización que contiene la
canalización para la que desea suscribirse.
En el mismo explorador, inicie una nueva pestaña e inicie sesión en
https://teams.microsoft.com/ . Ejecute el @Azure Pipelines signout comando y, a
continuación, ejecute el @Azure Pipelines signin comando en el canal donde está
instalada la aplicación Azure Pipelines para Microsoft Teams.
Seleccione el Sign in botón y se le redirigirá a una página de consentimiento como la
del ejemplo siguiente. Asegúrese de que el directorio que se muestra junto al correo
electrónico es el mismo que el que eligió en el paso anterior. Acepte y complete el
proceso de inicio de sesión.
Si estos pasos no resuelven el problema de autenticación, póngase en contacto con
nosotros en Developer Community .
Artículos relacionados
Uso de Azure Boards con Microsoft Teams
Uso de Azure Repos con Microsoft Teams
Referencia de la API REST
Artículo • 18/11/2022 • Tiempo de lectura: 6 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Las API de transferencia de estado representacional (REST) son puntos de conexión de
servicio que admiten conjuntos de operaciones HTTP (métodos). Estos métodos
proporcionan acceso de creación, recuperación, actualización o eliminación a los
recursos del servicio. Obtenga información sobre los componentes básicos de un par de
solicitudes y respuestas de la API rest, y consulte información general sobre cómo crear
y enviar una solicitud REST y controlar la respuesta.
7 Nota
La mayoría de las API REST tienen una biblioteca cliente de .NET correspondiente
que puede usar para simplificar el código de cliente. Para más información,
consulte la documentación de bibliotecas de cliente de .NET.
Componentes de un par de solicitudes y
respuestas de la API REST
Puede separar un par de solicitudes y respuestas de la API rest en los cinco
componentes siguientes:
1. El URI de solicitud, en el siguiente formato: VERB https://{instance}
[/{collection}][/{team-project}]/_apis[/{area}]/{resource}?api-version=
{version}
instance: la organización de Azure DevOps o Azure DevOps Server va a enviar
la solicitud. Están estructurados de la siguiente manera:
Azure DevOps: dev.azure.com/{organization}
Azure DevOps Server: server:port (el puerto predeterminado es 8080)
collection: el valor de la colección debe ser DefaultCollection para Azure
DevOps.
ruta de acceso del recurso: la colección debe seguir a
_apis/{area}/{resource} . Por ejemplo: _apis/wit/workitems .
api-version: todas las solicitudes de API deben incluir una versión de API para
evitar que la aplicación o el servicio se interrumpan a medida que
evolucionan las API. las versiones de api tienen el siguiente formato: '{major}.
{minor} [-{stage}[.{ resource-version}]], por ejemplo:
api-version=1.0
api-version=1.2-preview
api-version=2.0-preview.1
área y proyecto de equipo son opcionales, según la solicitud de API.
2. Campos de encabezado del mensaje de solicitud HTTP:
Un método HTTP necesario (también conocido como una operación o
verbo), que indica al servicio qué tipo de operación solicita. Las API REST de
Azure admiten métodos GET, HEAD, PUT, POST y PATCH.
Campos de encabezado adicionales y opcionales, según necesite el método
HTTP y el URI especificados. Por ejemplo, un encabezado Authorization que
proporciona un token de portador que contiene información de autorización
de cliente para la solicitud.
3. Campos de cuerpo de mensaje de solicitudes HTTP opcionales para admitir la
operación HTTP y el URI. Por ejemplo, las operaciones POST contienen objetos
codificados con MIME que se pasan como parámetros complejos.
Para las operaciones POST o PUT, el tipo de codificación MIME para el cuerpo
también debe especificarse en el encabezado de solicitud Tipo de contenido.
Algunos servicios requieren que se use un tipo MIME concreto, como
application/json .
4. Campos de encabezado de mensaje de respuesta HTTP:
Un código de estado HTTP , que puede ser 2xx para los códigos correctos y
4xx o 5xx para los códigos de error. O bien, se puede devolver un código de
estado definido por el servicio, como se indica en la documentación de la
API.
Campos de encabezado adicionales y opcionales, según sea necesario para
admitir la respuesta a la solicitud, como un encabezado de respuesta
Content-type .
5. Campos de cuerpo del mensaje de respuesta HTTP opcionales:
Los objetos de respuesta codificados en MIME se pueden devolver en el
cuerpo de la respuesta HTTP, como una respuesta de un método GET que
devuelve datos. Normalmente, estos objetos se devuelven en un formato
estructurado como JSON o XML, tal y como se indica en el encabezado de
respuesta Content-type . Por ejemplo, cuando se solicita un token de acceso
desde Azure AD, se devuelve en el cuerpo de la respuesta como elemento
access_token , uno de varios objetos emparejados de nombre y valor en una
colección de datos. En este ejemplo, también se incluye un encabezado de
respuesta de Content-Type: application/json .
Creación de la solicitud
Authenticate
Hay muchas maneras de autenticar la aplicación o el servicio con Azure DevOps. La tabla
siguiente es una excelente manera de decidir qué método es el mejor para usted:
Tipo de Descripción Ejemplo Mecanismo Ejemplos de
aplicación de código
autenticación
Lado Aplicación del lado Enumeración de errores Biblioteca de Muestra
cliente cliente basada en de una aplicación de autenticación
interactivo GUI Windows para un usuario de Microsoft
JavaScript Aplicación Aplicación de página Biblioteca de ejemplo
interactivo JavaScript basada única de AngularJS que autenticación (próximamente)
en GUI muestra elementos de de Microsoft
trabajo para un usuario
Lado Aplicación del lado Aplicación de consola Perfil de Muestra
cliente no cliente solo de texto que muestra todos los dispositivo
interactivo sin encabezado errores asignados a un
usuario
Web Aplicación web Panel web personalizado OAuth Muestra
interactiva basada en GUI que muestra resúmenes
de compilación
aplicación Azure DevOps Azure DevOps Server Bibliotecas de Muestra
de Azure Server aplicación extensión que muestra cliente
DevOps mediante la paneles de errores de
Server biblioteca de OM de equipo
cliente
extensión extensión de Azure Tarjetas ágiles SDK de tutorial de
de Azure DevOps Services extensión web ejemplo
DevOps de VSS
Services
7 Nota
Puede encontrar más información sobre la autenticación en nuestra página de
instrucciones de autenticación.
Ensamblar la solicitud
Para Azure DevOps Services, la instancia es dev.azure.com/{organization} y la colección
es DefaultCollection , por lo que el patrón es similar al ejemplo siguiente:
VERB https://dev.azure.com/{organization}/_apis[/{area}]/{resource}?api-
version={version}
Por ejemplo, aquí se muestra cómo obtener una lista de proyectos de una organización.
dos
curl -u {username}[:{personalaccesstoken}]
https://dev.azure.com/{organization}/_apis/projects?api-version=2.0
Si desea proporcionar el token de acceso personal a través de un encabezado HTTP,
primero debe convertirlo en una cadena Base64 (en el ejemplo siguiente se muestra
cómo convertir a Base64 mediante C#). A continuación, la cadena resultante se puede
proporcionar como un encabezado HTTP con el formato :
HTTP
Authorization: Basic BASE64PATSTRING
Aquí está en C# mediante la clase HttpClient.
C#
public static async void GetProjects()
try
var personalaccesstoken = "PAT_FROM_WEBSITE";
using (HttpClient client = new HttpClient())
client.DefaultRequestHeaders.Accept.Add(
new
System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"))
;
client.DefaultRequestHeaders.Authorization = new
AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "",
personalaccesstoken))));
using (HttpResponseMessage response = client.GetAsync(
"https://dev.azure.com/{organization}/_apis/projects").Result)
response.EnsureSuccessStatusCode();
string responseBody = await
response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
catch (Exception ex)
Console.WriteLine(ex.ToString());
La mayoría de los ejemplos de este sitio usan tokens de acceso personal (PAT), ya que
son un ejemplo compacto para la autenticación con el servicio. Sin embargo, hay
diferentes tipos de mecanismos de autenticación disponibles para Azure DevOps
Services, incluida la Biblioteca de autenticación de Microsoft, OAuth y tokens de sesión.
Consulte la sección Autenticación para obtener instrucciones sobre cuál es la más
adecuada para su escenario.
Busque los recursos que necesita para las áreas de API, como el seguimiento de
elementos de trabajo o Git.
Contenido relacionado
Consulte la documentación integración de ejemplos y casos de uso de la API REST.
Guía de autenticación
Muestras
Detección de las bibliotecas de cliente de .NET para estas API REST
Muestras
Límites de frecuencia
Artículo • 18/11/2022 • Tiempo de lectura: 5 minutos
Azure DevOps Services
Azure DevOps, como muchas soluciones de software como servicio, usa varios inquilinos
para reducir los costos y mejorar el rendimiento. Este diseño deja a los usuarios
vulnerables a problemas de rendimiento e incluso interrupciones cuando otros usuarios,
de sus recursos compartidos, tienen picos en su consumo.
Para combatir estos
problemas, Azure DevOps limita los recursos que los usuarios pueden consumir y la
cantidad de solicitudes que pueden realizar en determinados comandos.
Cuando se
superan estos límites, las solicitudes futuras pueden retrasarse o bloquearse.
Cuando las solicitudes de un usuario se retrasan por una cantidad significativa, ese
usuario obtiene un correo electrónico y ve un banner de advertencia en la Web.
Para la
cuenta de servicio de compilación y otros sin una dirección de correo electrónico, los
miembros del grupo Administradores de la colección de proyectos obtienen el correo
electrónico.
Para obtener más información, consulte Supervisión de uso.
Cuando se bloquean las solicitudes de un usuario individual, se reciben respuestas con
código HTTP 429 (demasiadas solicitudes), con un mensaje similar al siguiente:
TF400733: The request has been canceled: Request was blocked due to exceeding usage
of resource <resource name> in namespace <namespace ID>.
Para más información, consulte los siguientes artículos.
Límites de servicio y velocidad para Azure DevOps
Límites de Git
Procedimientos recomendados para evitar alcanzar los límites de velocidad
o póngase en contacto con el soporte técnico en el Developer Community
Límites de velocidad actuales
Azure DevOps actualmente tiene un límite de consumo global.
Este límite retrasa las
solicitudes de usuarios individuales más allá de un umbral cuando los recursos
compartidos están en peligro de sobrecargarse.
Límite de consumo global
Este límite se centra exclusivamente en evitar interrupciones cuando los recursos
compartidos están cerca de sobrecargarse.
Normalmente, los usuarios individuales solo
tienen sus solicitudes retrasadas cuando se produce una de las siguientes acciones:
Uno de sus recursos compartidos está en riesgo de sobrecargarse
Su uso personal supera 200 veces el consumo de un usuario típico dentro de un
período de cinco minutos (deslizante)
La cantidad del retraso depende del nivel de consumo sostenido del usuario.
Los
retrasos oscilan entre unos milisegundos por solicitud de hasta 30 segundos.
Una vez
que el consumo va a cero o el recurso ya no está sobrecargado, los retrasos se detienen
en cinco minutos.
Si el consumo sigue siendo alto, los retrasos pueden continuar
indefinidamente para proteger el recurso.
Unidades de rendimiento de Azure DevOps (TTU)
Los usuarios de Azure DevOps consumen muchos recursos compartidos y el consumo
depende de muchos factores. Por ejemplo:
La carga de un gran número de archivos en el control de versiones crea una gran
cantidad de carga en bases de datos y cuentas de almacenamiento.
Las consultas complejas de seguimiento de elementos de trabajo crean carga de
base de datos en función del número de elementos de trabajo a los que buscan.
Compila la carga de unidades mediante la descarga de archivos del control de
versiones, la producción de la salida del registro, etc.
Todas las operaciones consumen CPU y memoria en varias partes del servicio.
Para dar cabida a todo esto, el consumo de recursos de Azure DevOps se expresa en
unidades abstractas denominadas unidades de rendimiento de Azure DevOps o TSTUs.
Las TTU finalmente incorporan una combinación de lo siguiente:
Azure SQL DTU de base de datos como medida del consumo de base de datos
Nivel de aplicación y agente de trabajo CPU, memoria y E/S como medida del
consumo de proceso
Ancho de banda de Azure Storage como medida del consumo de almacenamiento
Por ahora, las TTU se centran principalmente en las DTU de Azure SQL Base de datos, ya
que Azure SQL Bases de datos son los recursos compartidos que suelen sobrecargar el
consumo excesivo.
Una única TSTU es la carga media que esperamos que un único usuario normal de Azure
DevOps genere por cinco minutos.
Los usuarios normales también generan picos de
carga.
Estos picos suelen ser de 10 o menos TTU por cinco minutos.
Con menos
frecuencia, los picos van tan altos como 100 TTU.
El límite de consumo global es de 200
TTU dentro de un período deslizante de cinco minutos.
Pipelines
La limitación de velocidad es similar para Azure Pipelines.
Cada canalización se trata
como una entidad individual con su propio consumo de recursos de los que se realiza
un seguimiento.
Incluso si los agentes de compilación se hospedan automáticamente,
generan carga en forma de clonación y envío de registros.
Aplicamos un límite de 200 TSTU para una canalización individual en un período
deslizante de 5 minutos. Este límite es el mismo que el límite de consumo global para
los usuarios.
Si una canalización se retrasa o bloquea mediante la limitación de
velocidad, aparece un mensaje en los registros adjuntos.
Experiencia del cliente de API
Cuando las solicitudes se retrasan o bloquean, Azure DevOps devuelve encabezados de
respuesta para ayudar a los clientes de API a reaccionar.
Aunque no está totalmente
estandarizado, estos encabezados están ampliamente en línea con otros servicios
populares .
En la tabla siguiente se enumeran los encabezados disponibles y lo que significan.
Excepto , X-RateLimit-Delay todos estos encabezados se envían antes de que las
solicitudes empiecen a retrasarse.
Este diseño ofrece a los clientes la oportunidad de
ralentizar proactivamente su tasa de solicitudes.
Nombre de encabezado
Descripción
Retry-After
El encabezado especificado por RFC 6585 enviado para indicarle cuánto tiempo debe
esperar antes de enviar la siguiente solicitud para que se quede bajo el umbral de
detección. Unidades: segundos.
X-RateLimit-Resource
Encabezado personalizado que indica el servicio y el tipo de umbral alcanzado. Los tipos
de umbral y los nombres de servicio pueden variar con el tiempo y sin advertencia. Se
recomienda mostrar esta cadena en un usuario, pero no confiar en ella para el cálculo.
X-RateLimit-Delay
Cuánto tiempo se ha retrasado la solicitud. Unidades: segundos con hasta tres
posiciones decimales (milisegundos).
X-RateLimit-Limit
Número total de TTU permitidos antes de imponer retrasos.
X-RateLimit-Remaining
Número de TTU restantes antes de retrasarse. Si las solicitudes ya se retrasan o
bloquean, es 0.
X-RateLimit-Reset
Hora en la que, si todo el consumo de recursos se detuvo inmediatamente, el uso de
seguimiento volvería a 0 TSTUs. Expresado en la época de Unix.
Recomendaciones
Se recomienda que responda al menos al Retry-After encabezado. Si detecta un Retry-
After encabezado en cualquier respuesta, espere hasta que haya transcurrido esa
cantidad de tiempo antes de enviar otra solicitud. Esto ayuda a la aplicación cliente a
experimentar menos retrasos aplicados. Tenga en cuenta que la respuesta es 200, por lo
que no es necesario aplicar lógica de reintento a la solicitud.
Si es posible, se recomienda supervisar y X-RateLimit-Limit encabezados X-RateLimit-
Remaining .
Al hacerlo, podrá aproximarse a la rapidez con la que se aproxima el umbral de retraso.
El cliente puede reaccionar de forma inteligente extendiendo sus solicitudes a lo largo
del tiempo.
Artículos relacionados
Límites de servicio y tasa para Azure DevOps Services
Seguimiento del trabajo, proceso y límites del proyecto
Configuración y personalización de Azure Boards
Supervisión del uso
Desuso del seguimiento de elementos
de trabajo (WIT) y el OM del cliente de
prueba
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services
WIT y TEST Client OM forman parte del SDK de TFS más amplio. Son un conjunto de API
basadas en SOAP que se pueden usar para crear herramientas para ejecutar operaciones
en el Azure DevOps. Estas API basadas en SOAP se han reemplazado por el conjunto de
puntos de conexión modernos basados en REST. Por lo tanto, estamos en desuso de las
API basadas en SOAP (OM de cliente) para WIT y Test.
7 Nota
WIT y EL OM de cliente de prueba para Azure DevOps han quedado en desuso en
la versión más reciente Visual Studio 2019 y el paquete
Microsoft.TeamFoundationServer.ExtendedClient . Esto significa que no hay
ninguna nueva funcionalidad de seguimiento o prueba de elementos de trabajo
incluida en el OM de cliente.
Modelos de objetos afectados
Solo está en desuso el OM wiT y el cliente de prueba. Otras áreas, como la compilación
y el control de código fuente, no están en una programación de desuso en este
momento.
Impacto
Si su organización usa el OM de cliente WIT en herramientas que se ejecutan en Azure
DevOps, se recomienda empezar a migrar esas herramientas para dejar de usar el OM
del cliente WIT y empezar a usar los nuevos puntos de conexión basados en REST.
La actualización del código para usar REST es fundamental para garantizar que las
herramientas funcionen a medida que publicamos nuevas funcionalidades en Azure
Boards y Azure Test.
advertencias de Visual Studio
Cualquier referencia a las versiones más recientes de WIT Client OM da como resultado
una advertencia obsoleta. Esto incluye los archivos DLL que vienen con Visual Studio
2019 y Azure DevOps 2019. Esta es una advertencia de ejemplo que puede recibir...
CS0618: "WorkItemType" está obsoleto: "para obtener más información, vea la
documentación en https://aka.ms/witclientom "
Preguntas y respuestas
Cómo corregir mis herramientas?
Lo primero que debe investigar y determinar si la herramienta sigue siendo necesaria.
Hemos encontrado que muchas organizaciones crean una herramienta por un motivo
específico durante un breve período de tiempo. Después, por un motivo u otro, esa
herramienta continúa ejecutándose cuando ya no es necesaria. En este escenario, puede
apagar la herramienta.
Si la herramienta sigue siendo de uso, debe refactorizar esa herramienta mediante las
bibliotecas cliente de .NET basadas en REST. La refactorización requiere algún trabajo de
reacción en su parte para quitar referencias al ANTIGUO OM del cliente WIT y
reemplazarlas por las bibliotecas de cliente de .NET adecuadas.
También hemos reunido esta guía de migración útil con código de ejemplo para
ayudar a la transición del OM del cliente WIT a las bibliotecas cliente .NET basadas en
REST.
Recursos
Guía de migración
Referencia de la API rest de Azure DevOps Services
Bibliotecas cliente de .NET para Azure DevOps
Descripción de los límites de frecuencia
Procedimientos recomendados de integración
Código de ejemplo en GitHub
Guía de migración
Artículo • 18/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services
En esta guía se proporciona información para ayudar a migrar el código de .NET desde
el uso de WIT Client OM a nuestras bibliotecas de cliente .NET basadas en REST. En la
tabla siguiente se enumeran escenarios comunes de seguimiento de trabajo con
vínculos a su documentación de API respetada.
Para obtener código de ejemplo que se trata en estos escenarios, consulte la guía
GitHub Azure DevOps de migración de OM del cliente WIT .
Escenarios frecuentes
Escenario WIT Client OM Basado en REST
Obtener la lista de elementos de trabajo WorkItemStore.Query Elementos de
trabajo: lista
Obtener un solo elemento de trabajo WorkItemStore.GetWorkItem Elementos de
trabajo: obtener
elemento de
trabajo
Creación de un nuevo elemento de trabajo Workitem Elementos de
trabajo: crear
Actualización del elemento de trabajo WorkItem.Fields Elementos de
existente trabajo:
actualización:
actualización de
un campo
Validación de un elemento de trabajo WorkItem.IsValid(),
Elementos de
WorkItem.Validate() trabajo: actualizar:
validar solo
Creación de un vínculo a un elemento de WorkItem.WorkItemLinks.Add Elemento de
trabajo existente trabajo:
actualización:
agregar un
vínculo
Escenario WIT Client OM Basado en REST
Adición de un comentario WorkItem.History Elemento de
trabajo:
actualización:
actualización de
un campo
Creación de un hipervínculo WorkItem.Links.Add() Elemento de
trabajo:
actualización:
agregar un
hipervínculo
Agregar datos adjuntos WorkItem.Attachments.Add() Elemento de
trabajo:
actualización:
agregar datos
adjuntos
Consulta de elementos de trabajo mediante WorkItemStore.Query() Wiql: consulta por
WIQL Wiql
Ejecución de una consulta existente para WorkItemStore.Query() Wiql: consulta por
obtener una lista de elementos de trabajo identificador
Obtener una lista de tipos de elementos de Category.WorkItemTypes Tipos de
trabajo para el proyecto elementos de
trabajo: lista
Obtener detalles del tipo de elemento de Category.WorkItemTypes Tipos de
trabajo elementos de
trabajo: Obtener
Obtener la lista de campos para un tipo de WorkItemType.FieldDefinitions Campo Tipos de
elemento de trabajo elemento de
trabajo: lista
Obtener detalles del campo WorkItemType.FieldDefinitions Campo Tipos de
elemento de
trabajo - Obtener
Recursos
Migración de datos Azure DevOps Server a Azure DevOps Services
Guía de migración con ejemplos de código
Documentación de la API REST de seguimiento de elementos de trabajo
Soporte técnico
¿Busca ayuda en un escenario que se ha perdido? Si es así, cree un nuevo problema en
el proyecto de la guía de migración y agregaremos el escenario al repositorio.
Referencia de la API rest de Azure
DevOps Services
Artículo • 28/11/2022 • Tiempo de lectura: 8 minutos
Le damos la bienvenida a la referencia de la API rest de Azure DevOps Services/Azure
DevOps Server.
Las API de transferencia de estado representacional (REST) son puntos de conexión de
servicio que admiten una serie de operaciones HTTP (métodos), que proporcionan
acceso de creación, recuperación, actualización o eliminación del acceso a los recursos
del servicio. Este artículo le enseñará a:
Los componentes básicos de un par de solicitud/respuesta de la API REST.
Información general sobre cómo crear y enviar una solicitud REST y controlar la
respuesta.
La mayoría de las API REST son accesibles a través de nuestras bibliotecas cliente,
que se pueden usar para simplificar considerablemente el código de cliente.
Componentes de un par de solicitudes y
respuestas de la API rest
Un par de solicitud/respuesta de una API de REST puede dividirse en cinco
componentes:
1. El URI de solicitud, de la siguiente forma: VERB https://{instance}[/{team-
project}]/_apis[/{area}]/{resource}?api-version={version}
instance: el Azure DevOps Services organización o servidor TFS al que va a
enviar la solicitud. Están estructurados de la siguiente manera:
Azure DevOps Services: dev.azure.com/{organization}
TFS: {server:port}/tfs/{collection} (el puerto predeterminado es 8080 y
el valor de la colección debe ser DefaultCollection pero puede ser
cualquier colección).
ruta de acceso del recurso: la ruta de acceso del recurso es la siguiente:
_apis/{area}/{resource} . Por ejemplo, _apis/wit/workitems .
api-version: cada solicitud de API debe incluir una versión de API para evitar
que la aplicación o el servicio se interrumpan a medida que evolucionan las
API. las versiones de api tienen el siguiente formato: , por ejemplo: {major}.
{minor}[-{stage}[.{resource-version}]]
api-version=1.0
api-version=1.2-preview
api-version=2.0-preview.1
Nota: el área y el proyecto de equipo son opcionales, en función de la solicitud
de API. Consulte la matriz de asignación de versiones de la API rest de TFS a
continuación para averiguar qué versiones de la API REST se aplican a la
versión de TFS.
2. Campos de encabezado del mensaje de solicitud HTTP:
Método HTTP obligatorio (también denominado " operación" o "verbo"),
que indica al servicio qué tipo de operación se está solicitando. Las API REST
de Azure admiten métodos GET, HEAD, PUT, POST y PATCH.
Campos de encabezado adicionales y opcionales, según necesite el método
HTTP y el URI especificados. Por ejemplo, un encabezado Authorization que
proporciona un token de portador que contiene información de autorización
de cliente para la solicitud.
3. Campos de cuerpo de mensaje de solicitudes HTTP opcionales para admitir la
operación HTTP y el URI. Por ejemplo, las operaciones POST contienen objetos
codificados con MIME que se pasan como parámetros complejos.
Para las operaciones POST o PUT, también se debe especificar el tipo de
codificación MIME para el cuerpo en el encabezado de solicitud Content-
type. Algunos servicios requieren que se use un tipo MIME concreto, como
application/json .
4. Campos de encabezado de mensaje de respuesta HTTP:
Un código de estado HTTP , que puede ser 2xx para los códigos correctos y
4xx o 5xx para los códigos de error. Como alternativa se puede devolver un
código de estado definido por el servicio, como se indica en la
documentación de la API.
Campos de encabezado adicionales y opcionales, según sea necesario para
admitir la respuesta a la solicitud, como un encabezado de respuesta
Content-type .
5. Campos de cuerpo del mensaje de respuesta HTTP opcionales:
Los objetos de respuesta codificados con MIME se pueden devolver en el
cuerpo de la respuesta HTTP, como una respuesta de un método GET que
devuelve datos. Normalmente, estos objetos se devuelven en un formato
estructurado como JSON o XML, tal y como se indica en el encabezado de
respuesta Content-type . Por ejemplo, cuando se solicita un token de acceso
desde Azure AD, se devolverá en el cuerpo de la respuesta como el
access_token elemento , uno de varios objetos emparejados de nombre y
valor en una colección de datos. En este ejemplo, también se incluye un
encabezado de respuesta de Content-Type: application/json .
Creación de la solicitud
Authenticate
Hay muchas maneras de autenticar la aplicación o el servicio con Azure DevOps Services
o TFS. La tabla siguiente es una excelente manera de decidir qué método es el mejor
para usted:
Tipo de Descripción ejemplo Mecanismo Ejemplos
aplicación de de
autenticación código
Lado Aplicación cliente, que Aplicación de consola Biblioteca de sample
cliente permite la interacción del que enumera proyectos autenticación
interactivo usuario, la llamada a en una organización de Microsoft
Azure DevOps Services (MSAL)
API REST
JavaScript Aplicación JavaScript Aplicación de página MSAL sample
interactivo basada en GUI única de AngularJS que
muestra información del
proyecto para un usuario
Lado Aplicación del lado cliente Aplicación de consola Perfil de sample
cliente no solo de texto sin que muestra todos los dispositivo
interactivo encabezado errores asignados a un
usuario
Web Aplicación web basada en Panel web personalizado OAuth sample
interactiva GUI que muestra resúmenes
de compilación
Aplicación Aplicación TFS con la Extensión de TFS que Bibliotecas sample
TFS biblioteca OM de cliente muestra paneles de cliente
errores de equipo
Tipo de Descripción ejemplo Mecanismo Ejemplos
aplicación de de
autenticación código
extensión extensión de Azure Ejemplos de extensión SDK de Tutorial
de Azure DevOps Services de Azure DevOps extensión web de
DevOps de VSS ejemplo
Services
Nota: Puede encontrar más información sobre la autenticación en nuestra página de
instrucciones de autenticación.
Ensamblar la solicitud
Azure DevOps Services
Para Azure DevOps Services, la instancia es , por lo que el patrón tiene
dev.azure.com/{organization} este aspecto:
VERB https://dev.azure.com/{organization}/_apis[/{area}]/{resource}?api-
version={version}
Por ejemplo, aquí se muestra cómo obtener una lista de proyectos de equipo en una
organización de Azure DevOps Services.
dos
curl -u {username}[:{personalaccesstoken}]
https://dev.azure.com/{organization}/_apis/projects?api-version=2.0
Si desea proporcionar el token de acceso personal a través de un encabezado HTTP,
primero debe convertirlo en una cadena Base64 (en el ejemplo siguiente se muestra
cómo convertir a Base64 mediante C#). (Ciertas herramientas como Postman aplican
una codificación Base64 de forma predeterminada. Si está probando la API a través de
estas herramientas, no se requiere la codificación Base64 del PAT). La cadena resultante
se puede proporcionar como un encabezado HTTP en el formato:
Authorization: Basic BASE64PATSTRING
Aquí está en C# con la [clase HttpClient](/previous-
versions/visualstudio/hh193681(v=vs.118).
C#
public static async void GetProjects()
try
var personalaccesstoken = "PAT_FROM_WEBSITE";
using (HttpClient client = new HttpClient())
client.DefaultRequestHeaders.Accept.Add(
new
System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"))
;
client.DefaultRequestHeaders.Authorization = new
AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "",
personalaccesstoken))));
using (HttpResponseMessage response = await client.GetAsync(
"https://dev.azure.com/{organization}/_apis/projects"))
response.EnsureSuccessStatusCode();
string responseBody = await
response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
catch (Exception ex)
Console.WriteLine(ex.ToString());
La mayoría de los ejemplos de este sitio usan tokens de acceso personal, ya que son un
ejemplo compacto para la autenticación con el servicio. Sin embargo, hay una variedad
de mecanismos de autenticación disponibles para Azure DevOps Services, incluidos
MSAL, OAuth y Tokens de sesión. Consulte la sección Autenticación para obtener
instrucciones sobre cuál es la más adecuada para su escenario.
TFS
Para TFS, instance es {server:port}/tfs/{collection} y de forma predeterminada el
puerto es 8080. La colección predeterminada es DefaultCollection , pero puede ser
cualquier colección.
Aquí se muestra cómo obtener una lista de proyectos de equipo de TFS mediante el
puerto y la colección predeterminados.
dos
curl -u {username}[:{personalaccesstoken}]
https://{server}:8080/tfs/DefaultCollection/_apis/projects?api-version=2.0
En los ejemplos anteriores se usan tokens de acceso personal, lo que requiere que cree
un token de acceso personal.
Procesamiento de la respuesta
Debería obtener una respuesta como esta.
JSON
"value": [
"id": "eb6e4656-77fc-42a1-9181-4c6d8e9da5d1",
"name": "Fabrikam-Fiber-TFVC",
"url": "https://dev.azure.com/fabrikam-fiber-
inc/_apis/projects/eb6e4656-77fc-42a1-9181-4c6d8e9da5d1",
"description": "TeamFoundationVersionControlprojects",
"collection": {
"id": "d81542e4-cdfa-4333-b082-1ae2d6c3ad16",
"name": "DefaultCollection",
"url": "https: //dev.azure.com/fabrikam-fiber-
inc/_apis/projectCollections/d81542e4-cdfa-4333-b082-1ae2d6c3ad16",
"collectionUrl": "https: //dev.azure.com/fabrikam-fiber-
inc/DefaultCollection"
},
"defaultTeam": {
"id": "66df9be7-3586-467b-9c5f-425b29afedfd",
"name": "Fabrikam-Fiber-TFVCTeam",
"url": "https://dev.azure.com/fabrikam-fiber-
inc/_apis/projects/eb6e4656-77fc-42a1-9181-4c6d8e9da5d1/teams/66df9be7-3586-
467b-9c5f-425b29afedfd"
},
"id": "6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"name": "Fabrikam-Fiber-Git",
"url": "https://dev.azure.com/fabrikam-fiber-
inc/_apis/projects/6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"description": "Gitprojects",
"collection": {
"id": "d81542e4-cdfa-4333-b082-1ae2d6c3ad16",
"name": "DefaultCollection",
"url": "https://dev.azure.com/fabrikam-fiber-
inc/_apis/projectCollections/d81542e4-cdfa-4333-b082-1ae2d6c3ad16",
"collectionUrl": "https://dev.azure.com/fabrikam-fiber-
inc/DefaultCollection"
},
"defaultTeam": {
"id": "8bd35c5e-30bb-4834-a0c4-d576ce1b8df7",
"name": "Fabrikam-Fiber-GitTeam",
"url": "https://dev.azure.com/fabrikam-fiber-
inc/_apis/projects/6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c/teams/8bd35c5e-30bb-
4834-a0c4-d576ce1b8df7"
],
"count": 2
La respuesta es JSON . Esto suele ser lo que obtendrá de las API REST, aunque hay
algunas excepciones, como los blobs de Git.
Ahora debería poder buscar en las áreas de API específicas, como el seguimiento de
elementos de trabajo o Git , y acceder a los recursos que necesita. Siga leyendo para
obtener más información sobre los patrones generales que se usan en estas API.
Asignación de versiones de API y TFS
A continuación encontrará una asignación rápida de las versiones de la API REST y sus
versiones de TFS correspondientes. Todas las versiones de API funcionarán en la versión
del servidor mencionada, así como en versiones posteriores.
Versión de TFS Versión de la API REST Versión de compilación
Azure DevOps Server vNext 7.1
Azure DevOps Server 2020 6,0 versions >= 18.170.30525.1
Azure DevOps Server 2019 5,0 versions >= 17.143.28621.4
TFS 2018 Update 3 4,1 versions >= 16.131.28106.2
TFS 2018 Update 2 4,1 versions >= 16.131.27701.1
TFS 2018 Update 1 4.0 versions >= 16.122.27409.2
Versión de TFS Versión de la API REST Versión de compilación
TFS 2018 RTW 4.0 versions >= 16.122.27102.1
TFS 2017 Update 2 3.2 versions >= 15.117.26714.0
TFS 2017 Update 1 3.1 versions >= 15.112.26301.0
TFS 2017 RTW 3.0 versions >= 15.105.25910.0
TFS 2015 Update 4 2.3 versions >= 14.114.26403.0
TFS 2015 Update 3 2.3 versions >= 14.102.25423.0
TFS 2015 Update 2 2.2 versions >= 14.95.25122.0
TFS 2015 Update 1 2.1 versions >= 14.0.24712.0
TFS 2015 RTW 2.0 versions >= 14.0.23128.0
Contenido relacionado
Consulte la documentación integración de ejemplos y casos de uso de la API REST.
Guía de autenticación
Muestras
Bibliotecas de cliente
Descubra las bibliotecas cliente para estas API REST.
Documentación conceptual de .NET y documentación de referencia de .NET
Go
Node.js
Python
Swagger 2.0
SDK de extensiones web
¿Dónde están las versiones anteriores de las
API REST? (Antes de la versión 4.1)
Recientemente hicimos un cambio en nuestro sistema de ingeniería y el proceso de
generación de documentación; hemos realizado este cambio para proporcionar
documentación más clara, detallada y más precisa para todos los usuarios que intentan
usar estas API REST. Debido a las restricciones técnicas, solo podemos documentar la
versión 4.1 de la API y versiones posteriores mediante este método. Creemos que la
documentación de la API versión 4.1 y posteriores será más fácil de usar debido a este
cambio.
Si trabaja en TFS o busca las versiones anteriores de las API REST, puede echar un
vistazo a la documentación de la API REST anterior a la versión 4.1.
Introducción a la facturación
Artículo • 15/12/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Services | Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS
2018
Si necesita más que el nivel gratuito de recursos de su organización, puede configurar la
facturación. Al configurar la facturación, también puede comprar otras características
ofrecidas por Microsoft u otras empresas.
Nivel gratis
El nivel gratis incluye los siguientes aspectos:
Primeros cinco usuarios gratis (licencia básica)
Azure Pipelines:
Un ci/CD hospedado Microsoft (un trabajo simultáneo, hasta 30 horas al mes)
Un trabajo simultáneo de CI/CD autohospedado
Azure Boards: Seguimiento de elementos de trabajo y paneles Kanban
Azure Repos: repositorios de Git privados ilimitados
Azure Artifacts: Dos GiB gratis por organización
Todos los cargos aparecen en la factura mensual de Azure. Azure admite el pago
mediante tarjeta de crédito y facturación facturada a través del Enterprise Agreement
(EA), proveedores de soluciones en la nube (CSP), etc.
Servicios facturados a través de Azure
Durante la primera compra de su organización, se le pedirá que seleccione la
suscripción de Azure que se usará para la facturación. La suscripción puede formar parte
de su Enterprise Agreement, pago por uso, proveedor de soluciones en la nube (CSP) u
otros tipos de suscripciones de Azure. Todos los servicios se facturan a través de Azure.
No es necesario pagar ni usar ningún otro servicio de Azure.
Sugerencia
Para calcular los costos de Azure DevOps, consulte la calculadora de precios o la
página de precios de Azure DevOps .
Consulte los siguientes artículos para obtener información sobre los servicios de pago
ofrecidos por Microsoft:
Acceso básico para los usuarios
Básico + Test Plans
Azure Pipelines
Azure Artifacts
7 Nota
Aunque el servicio de prueba de carga basado en la nube de Azure DevOps está en
desuso, la versión preliminar de Azure Load Testing está disponible. Azure Load
Testing Preview es un servicio de pruebas de carga totalmente administrado que
permite usar scripts de Apache JMeter existentes para generar una carga a gran
escala. Para más información, consulte ¿Qué es la versión preliminar de Azure
Load Testing?. Para más información sobre el desuso de las pruebas de carga de
Azure DevOps y otros, consulte Cambios en la funcionalidad de prueba de carga
en Visual Studio y pruebas de carga en la nube en Azure DevOps.
Pasos siguientes
Configuración de facturación
Artículos relacionados
Cambio de la suscripción de Azure para la facturación
Agregar usuario que pueda realizar compras o administrador de facturación de
copia de seguridad
Extensibilidad de Marketplace &
Compra de suscripciones a la nube de Visual Studio
Suministro de extensiones de Visual
Studio
Artículo • 04/01/2023 • Tiempo de lectura: 3 minutos
Se aplica a: Visual Studio Visual Studio para Mac Visual Studio Code
Una vez que haya terminado de desarrollar la extensión, puede instalarla en otras
máquinas, compartirla con sus amigos y compañeros de trabajo, o publicarla en Visual
Studio Marketplace. En esta sección se explican todas las cosas que debe hacer para
publicar y mantener la extensión: trabajar con archivos .vsix, publicar, localizar y
actualizar.
Trabajar con extensiones VSIX
Puede crear extensiones VSIX mediante la creación de un proyecto VSIX en blanco y, a
continuación, agregarle diferentes plantillas de elementos. Para obtener más
información, consulte Plantilla de proyecto VSIX.
Puede usar el formato VSIX para empaquetar plantillas de proyecto, plantillas de
elemento, VSPackages, componentes de Managed Extensibility Framework (MEF),
controles del cuadro de herramientas , ensamblados y tipos personalizados (esto
incluye páginas de inicio personalizadas para Visual Studio 2017). El formato VSIX usa la
implementación basada en archivos. Para obtener más información sobre los paquetes
VSIX, consulte Anatomía de un paquete VSIX.
El formato VSIX no admite la instalación de fragmentos de código. Tampoco admite
ciertos otros escenarios, como escribir en la caché global de ensamblados (GAC) o en el
registro del sistema. Si necesita escribir en la GAC o en el registro en la instalación, debe
usar Windows Installer. Para obtener más información, vea Preparar extensiones para la
implementación de Windows Installer.
Publicación de la extensión en Visual Studio
Marketplace
Puede distribuir la extensión a otras personas simplemente enviando el archivo .vsix o
colocando en un servidor. Pero la mejor manera de conseguir el código en manos de
mucha gente es ponerlo en Visual Studio Marketplace . Las extensiones de Visual
Studio Marketplace están disponibles para los usuarios de Visual Studio a través de
extensiones y actualizaciones. Para más información, vea Buscar y usar extensiones de
Visual Studio.
Para obtener un ejemplo completo que muestra cómo cargar una extensión en Visual
Studio Marketplace, consulte Tutorial: Publicación de una extensión de Visual Studio.
Private Galleries
A medida que desarrolla controles, plantillas y herramientas, puede compartirlos con su
organización publicándolos en una galería privada en la intranet. Para obtener más
información, consulte Galerías privadas.
Localización de la extensión
Si tiene previsto publicar la extensión en distintas configuraciones regionales, debe
considerar la posibilidad de localizarla. Para obtener una explicación de lo que implica,
consulte Localización de paquetes VSIX.
Actualización y control de versiones de la
extensión
Después de publicar la extensión, habrá un momento en el que necesite actualizarla.
Para obtener información sobre cómo actualizar una extensión que se ha publicado en
Visual Studio Marketplace, consulte Cómo: Actualizar una extensión.
Puede establecer la extensión para admitir varias versiones de Visual Studio. Para
obtener más información, vea Compatibilidad con varias versiones de Visual Studio.
Temas relacionados
Title Descripción
Introducción a la plantilla de Explica cómo usar la plantilla de proyecto VSIX para instalar
proyecto de VSIX una plantilla de proyecto personalizada.
Anatomía de un paquete VSIX Describe los componentes de un paquete VSIX.
Plantilla de proyecto de VSIX Proporciona instrucciones paso a paso sobre cómo
empaquetar y publicar una extensión.
Adaptación de paquetes VSIX Explica cómo proporcionar texto localizado para el proceso
de instalación mediante archivos extension.vsixlangpack.
Title Descripción
Cómo actualizar una extensión Describe cómo actualizar una extensión en el sistema y cómo
implementar una actualización en una extensión de Visual
Studio existente.
Adición de una dependencia a un Describe cómo agregar referencias a paquetes de
paquete VSIX implementación de VSIX.
Preparación de las extensiones Explica cómo implementar la extensión con Windows
para la implementación de Installer.
Windows Installer
Firma de paquetes VSIX Explica cómo firmar paquetes VSIX.
Private Galleries Explica cómo crear galerías privadas para extensiones.
Compatibilidad con varias Muestra cómo tener la extensión compatible con varias
versiones de Visual Studio versiones de Visual Studio.
Búsqueda de Visual Studio Describe cómo buscar instancias de Visual Studio para la
implementación de extensiones personalizadas.
Documentación para desarrolladores de
aplicaciones de Windows
Aprende a diseñar, desarrollar e implementar aplicaciones y soluciones para equipos Windows y
otros dispositivos.
INFORMACIÓN GENERAL INICIO RÁPIDO
Opciones de desarrollo de Creación del primer
aplicaciones proyecto de WinUI 3
CONCEPTO NOVEDADES
¿Qué es el SDK de Notas de la versión del
Aplicaciones para SDK de Aplicaciones para
Windows? Windows
DESCARGAR DESCARGAR
Descarga de Visual Studio Descarga de Windows App
SDK
INFORMACIÓN GENERAL CURSOS
Subsistema de Windows Aprendizaje en línea para
para Linux y otras desarrolladores de
herramientas aplicaciones de Windows
Detalles sobre el desarrollo de aplicaciones para
Windows
Introducción Diseño
Introducción a las opciones de desarrollo de Diseño y codificación de la interfaz de usuario de
aplicaciones la aplicación
Instalación de herramientas para el SDK de Conceptos básicos de diseño para aplicaciones
Aplicaciones para Windows de Windows
Creación del primer proyecto de WinUI 3 Principios de diseño de Windows 11
Aplicaciones de ejemplo para Windows Kits de herramientas de diseño
Desarrollar Implementar
Características de desarrollo de Windows Arquitectura de implementación
Características de Windows App SDK Guía de implementación del SDK para
aplicaciones de Windows
Biblioteca de interfaz de usuario de Windows
(WinUI) Empaquetado de aplicaciones mediante MSIX
Modernización de las aplicaciones de escritorio Administración de la implementación MSIX
Desarrollo para otras plataformas de dispositivos
Windows
Realidad mixta y
Windows para IoT Xbox One
HoloLens
Contribución a proyectos de código abierto de
Windows
SDK para aplicaciones de Windows
Biblioteca de interfaz de usuario de
Windows (WinUI)
Un conjunto de herramientas y API para La capa de interfaz de usuario nativa para
desarrolladores que representan la próxima compilar aplicaciones de Windows, incluidos los
evolución en la plataforma de aplicaciones de estilos y controles modernos.
Windows.
SDK de MSIX
.NET
Permite a los desarrolladores empaquetar y Interactúe con proyectos de código abierto de
desempaquetar paquetes de aplicaciones en una .NET, incluidos .NET Core, WPF, Windows Forms
variedad de plataformas. y mucho más.
@WindowsDocs en Twitter OneDevMinute en YouTubeSoporte técnico para desarrolladores de WindowsStack
Overflow
Documentación de Azure para
desarrolladores para dispositivos
móviles
Busque la información que necesita para desarrollar aplicaciones móviles en Azure.
Introducción a los dispositivos móviles en Azure
Y ARQUITECTURA
Elección de marcos de desarrollo para aplicaciones móviles
Fases en el desarrollo de aplicaciones móviles en Azure
d CURSOS
Compilación de aplicaciones móviles con .NET MAUI
q VIDEO
Compilación de una aplicación móvil completa con Azure
Compilación de un back-end móvil personalizado para una aplicación
Llamada a servicios web
e INFORMACIÓN GENERAL
Creación de un back-end de aplicación móvil sin servidor con Azure Functions y otros
servicios
Creación de aplicaciones en tiempo real con Azure SignalR
f INICIO RÁPIDO
Primeros pasos con Azure Functions y Xamarin
Azure SignalR Service con Xamarin.Forms
d CURSOS
Consumo de un servicio web RESTful con Xamarin
Consumo de un servicio web RESTful con Xamarin
Guardar datos
e INFORMACIÓN GENERAL
Uso de datos sin conexión mediante Azure Mobile Apps
Almacenamiento, sincronización y consulta de datos de aplicaciones móviles desde la nube
Almacenamiento en la nube de aplicaciones muy escalables, seguras y duraderas con Azure
Storage
f INICIO RÁPIDO
Almacenamiento de datos con Azure Cosmos DB
Uso con Blob Storage
Compilación de una aplicación de Xamarin.Forms con el SDK de .NET y Azure Cosmos DB para
MongoDB
Enviar notificaciones de inserción
e INFORMACIÓN GENERAL
Interacción con los usuarios de la aplicación enviando notificaciones push
f INICIO RÁPIDO
Creación de un centro de notificaciones de Azure en Azure Portal
g TUTORIAL
Envío de notificaciones push a aplicaciones Xamarin.Forms mediante ASP.NET Core y Azure
Notification Hubs
Envío de notificaciones push a dispositivos Android
Inserción de contenido enriquecido en dispositivos
Autenticación de usuarios
e INFORMACIÓN GENERAL
e INFORMACIÓN GENERAL
Flujos de autenticación compatibles con la Biblioteca de autenticación de Microsoft (MSAL)
Incorporación de autenticación y administración de identidades de usuario en las aplicaciones
móviles
g TUTORIAL
Inicio de sesión de usuarios y llamada a Microsoft Graph desde una aplicación Android
Adición de una aplicación cliente nativa en su inquilino de Azure Active Directory B2C
s SAMPLE
Inicio de sesión de usuarios con una aplicación iOS de Swift
Automatización de compilaciones e implementaciones con DevOps
p CONCEPTO
Automatización de la implementación y el lanzamiento de las aplicaciones móviles con
servicios de entrega continua
Automatización del ciclo de vida de las aplicaciones con la compilación y la integración
continuas
Conceptos clave para los nuevos usuarios de Azure Pipelines
e INFORMACIÓN GENERAL
Liberación de una compilación con App Center
c GUÍA PASO A PASO
App Center CodePush
Seguimiento de análisis y bloqueos
p CONCEPTO
Análisis y comprensión del uso de las aplicaciones móviles
Supervisión de la aplicación móvil en busca de bloqueos y errores en tiempo real
e INFORMACIÓN GENERAL
App Center Analytics
c GUÍA PASO A PASO
Habilitación de diagnósticos en una aplicación
g TUTORIAL
Recepción de análisis en tiempo real
Desarrollo con SDK
a DESCARGAR
iOS
Android
.NET/Xamarin
Biblioteca de autenticación de Microsoft (MSAL) para iOS
Biblioteca de autenticación de Microsoft (MSAL) para Android
Biblioteca de autenticación de Microsoft (MSAL) para .NET/Xamarin
Introducción a las extensiones para
Azure Boards
Artículo • 17/11/2022 • Tiempo de lectura: 2 minutos
Azure DevOps Server 2022: Azure DevOps Server 2019 | TFS 2018
En Marketplace de Azure DevOps se ofrece una amplia variedad de extensiones para
personalizar o mejorar la experiencia predeterminada. Puede obtener más información
sobre las extensiones desarrolladas por Microsoft mediante los artículos y vínculos
siguientes. Para obtener información sobre cómo desarrollar una extensión propia, vea
Desarrollo de una extensión web.
7 Nota
La mayoría de las extensiones, como Escala de tiempo de características y Plan de
entrega épico , no son compatibles con las características de Azure Boards y,
por lo tanto, no son compatibles con el equipo del producto. Si tiene preguntas,
sugerencias o problemas al usar estas extensiones, visite la página correspondiente
de cada una.
Integrar con Azure Boards
Azure Boards Microsoft Teams
Azure Boards con Slack
Planeación del producto
7 Nota
Hay disponible una nueva versión de Delivery Plans. Esta característica ahora forma
parte de Azure Boards y sustituye la extensión Delivery Plans. Delivery Plans
proporciona compatibilidad con las tareas siguientes:
Agregar hasta 15 trabajos pendientes de equipo
Agregar trabajos pendientes en cartera personalizados, además de epopeyas
Ver elementos de trabajo que abarcan varias iteraciones
Restablecer la fecha de inicio y la de destino mediante bordes de arrastrar y
colocar
Agregar elementos de trabajo pendientes de un plan a un equipo
Ver el progreso de acumulación de características, epopeyas y otros
elementos de cartera
Ver dependencias de elemento de trabajo
Las partes interesadas pueden ver los planes
Para obtener más información, vea Revisión de planes de entrega de equipo.
Azure DevOps Open in Excel
Feature Timeline
Epic Roadmap
Retrospectives
Split!
Team Calendar
Informe Reactivaciones
Personalizar tipos de elemento de trabajo
Listas en cascada
Vínculos en los que se pueden hacer clic
Color picklist control
Multi-value control
Biblioteca de control de formularios de elemento de trabajo Formulario de
elemento de trabajo: acciones de un solo clic
Work Item Visualization
WSJF (trabajo más corto ponderado primero)
Además de las extensiones anteriores, puede
Consultas e informes
Abrir en Power BI
Paneles basados en consultas
Administrador de etiquetas
Wiql Editor
Wiql to OData
Paneles
widgets de Aplicación de Azure Insights
Widget de cuenta atrás
Widget de estadísticas de GitHub
Widget Work Item Details
Widget Roll-up Board
Integración con DevOps
Crea un elemento de trabajo a partir de una compilación o versión
Interfaz de la línea de comandos
CLI de Azure DevOps
Azure Boards Teams Tool CLI
Automatización y herramientas varias
herramientas de Azure Boards Kanban
Herramientas de migración para Azure DevOps
Microsoft Flow, Power Apps y Power Automate
Power Automate, Azure DevOps
Artículos relacionados
Información general sobre la integración entre servicios
Power Platform, Conectores, Azure DevOps
Conector de Microsoft Graph de elementos de trabajo de Azure DevOps
Conexión a Azure DevOps desde Power Apps
Administración de extensiones para
Visual Studio
Artículo • 27/09/2022 • Tiempo de lectura: 7 minutos
Se aplica a: Visual Studio Visual Studio para Mac Visual Studio Code
Las extensiones son paquetes de código que se ejecutan dentro de Visual Studio y que
ofrecen características nuevas o mejoradas. Las extensiones pueden ser controles,
ejemplos, plantillas, herramientas u otros componentes que agregan funcionalidad a
Visual Studio, como Live Share o Visual Studio IntelliCode .
Para obtener información sobre la creación de extensiones de Visual Studio, vea Visual
Studio SDK. Para obtener información sobre el uso de extensiones, consulte la página de
la extensión en Visual Studio Marketplace . Y para obtener información sobre cómo
encontrar extensiones, vea la entrada de blog ¿Dónde están mis extensiones favoritas
de Visual Studio 2022? .
Cuadro de diálogo Administrar extensiones
Use el cuadro de diálogo Administrar extensiones para instalar y administrar
extensiones de Visual Studio. Para abrir el cuadro de diálogo Administrar extensiones,
elija Extensiones>Administrar extensiones. O bien escriba Extensiones en el cuadro de
búsqueda y elija Administrar extensiones.
En el panel de la izquierda se clasifican las extensiones en función de las que están
instaladas, las que están disponibles en Visual Studio Marketplace (Online) y las que
tienen actualizaciones disponibles. Roaming Extension Manager mantiene una lista de
todas las extensiones de Visual Studio que se han instalado en cualquier equipo o
instancia de Visual Studio. Se ha diseñado para que pueda buscar las extensiones
favoritas más fácilmente.
Búsqueda e instalación de extensiones
Puede instalar extensiones desde Visual Studio Marketplace o desde el cuadro de
diálogo Administrar extensiones de Visual Studio.
Para instalar extensiones desde Visual Studio:
1. En Extensiones>Administrar extensiones, busque la extensión que quiere instalar.
(Si conoce el nombre o parte del nombre de la extensión, puede buscar en la
ventana Búsqueda).
2. Seleccione Descargar.
Se programa la instalación de la extensión. Una vez que se hayan cerrado todas las
instancias de Visual Studio, se instalará la extensión.
Si intenta instalar una extensión que tiene dependencias, el instalador comprueba si
están instaladas. Si no están instaladas, el cuadro de diálogo Administrar extensiones
muestra las dependencias que se deben instalar antes de poder instalar la extensión.
Instalar sin usar el cuadro de diálogo Administrar
extensiones
Es posible que las extensiones empaquetadas en archivos .vsix estén disponibles en
otras ubicaciones que no sean Visual Studio Marketplace. El cuadro de diálogo
Extensiones>Administrar extensiones no puede detectar estos archivos, pero se puede
instalar un archivo .vsix si se hace doble clic en él o si se selecciona y se presiona
ENTRAR. Después de eso, solo tiene que seguir las instrucciones. Una vez instalada la
extensión, puede usar el cuadro de diálogo Administrar extensiones para habilitarla,
deshabilitarla o desinstalarla.
7 Nota
Visual Studio Marketplace contiene las extensiones VSIX y MSI. El cuadro de
diálogo Administrar extensiones no puede habilitar ni deshabilitar las
extensiones basadas en MSI.
Si una extensión basada en MSI incluye un archivo extensión.manifiesto_vsix, la
extensión aparece en el cuadro de diálogo Administrar extensiones.
Desinstalación o deshabilitación de una
extensión
Si desea dejar de usar una extensión, puede deshabilitarla o desinstalarla. Al deshabilitar
una extensión esta sigue instalada pero está descargada. Busque la extensión y haga clic
Desinstalar o Deshabilitar. Reinicie Visual Studio para descargar una extensión
deshabilitada.
7 Nota
Puede deshabilitar las extensiones VSIX, pero no las extensiones que se instalaron
mediante MSI. Las extensiones instaladas mediante MSI solo se pueden desinstalar.
Extensiones por usuario y administrativas
La mayoría de las extensiones son por usuario y se instalan en la carpeta
%LocalAppData%\Microsoft\VisualStudio\<Visual Studio version>\Extensions\. Algunas
extensiones son extensiones administrativas y se instalan en la <carpeta> de instalación
Visual Studio\Common7\IDE\Extensions\.
Para proteger el sistema frente a extensiones que pueden contener errores o código
malintencionado, puede limitar que las extensiones por usuario solo se carguen cuando
Visual Studio se ejecuta con permisos de usuario normales. Esto significa que las
extensiones por usuario están deshabilitadas cuando Visual Studio se ejecuta con
permisos elevados.
Para restringir cuándo se cargan las extensiones por usuario:
1. Abra la página de opciones de las extensiones
(Herramientas>Opciones>Entorno>Extensiones).
2. Desactive la casilla Cargar extensiones por usuario al ejecutar como
administrador.
3. Reinicie Visual Studio.
Actualizaciones automáticas de extensión
Las extensiones se actualizan de forma automática cuando hay una versión nueva
disponible en Visual Studio Marketplace. La versión nueva de la extensión se detecta e
instala en segundo plano. La próxima vez que abra Visual Studio, se ejecutará la versión
nueva de la extensión.
Si quiere deshabilitar las actualizaciones automáticas, puede deshabilitar la característica
para todas las extensiones o solo para extensiones específicas.
Para deshabilitar las actualizaciones automáticas para todas las extensiones, haga
clic en el vínculo Cambiar la configuración para las extensiones del cuadro de
diálogo Extensiones>Administrar extensiones. En el cuadro de diálogo Opciones,
desactive Actualizar las extensiones automáticamente.
Para deshabilitar las actualizaciones automáticas de una extensión específica,
desactive la opción Actualizar automáticamente esta extensión en el panel de
detalles de la extensión situado en el lado derecho del cuadro de diálogo
Administrar extensiones.
Notificaciones de bloqueo y falta de respuesta
Visual Studio avisa si sospecha que una extensión ha estado implicada en un bloqueo
durante una sesión anterior. Cuando Visual Studio se bloquea, almacena la pila de
excepciones. La próxima vez que Visual Studio se inicia, examina la pila, comenzando
por la hoja y dirigiéndose a la base. Si Visual Studio determina que un marco pertenece
a un módulo que forma parte de una extensión habilitada e instalada, muestra una
notificación.
Visual Studio también avisa si sospecha que una extensión está provocando la falta de
respuesta de la interfaz de usuario.
Cuando aparezcan estas notificaciones, puede ignorarlas o realizar una de las acciones
siguientes:
Pulse Deshabilitar esta extensión. Visual Studio deshabilita la extensión y le
permite conocer si necesita reiniciar su sistema para que la deshabilitación surta
efecto. Si quiere, puede volver a habilitar la extensión en el cuadro de diálogo
Extensiones>Administrar extensiones.
Elija No volver a mostrar este mensaje.
Si la notificación se refiere a un bloqueo en una sesión anterior, Visual Studio ya
no muestra una notificación cuando se produzca un bloqueo asociado a esta
extensión. Visual Studio seguirá mostrando notificaciones cuando la falta de
respuesta pueda estar asociada con esta extensión, o para los bloqueos o faltas
de respuesta que puedan estar asociados a otras extensiones.
Si la notificación se refiere a una falta de respuesta, en el IDE (entorno de
desarrollo integrado) ya no se muestra una notificación cuando esa extensión
esté asociada a la falta de respuesta. Visual Studio seguirá mostrando
notificaciones relacionadas con los bloqueos para esta extensión, así como
notificaciones relacionadas con bloqueos y faltas de respuesta para otras
extensiones.
Seleccione Más información para navegar a esta página.
Pulse el botón X al final de la notificación para descartarla. Aparecerá una nueva
notificación para las instancias futuras de la extensión que estén asociadas con un
bloqueo o falta de respuesta de la interfaz de usuario.
7 Nota
Una notificación de bloqueo o falta de respuesta de la interfaz de usuario significa
únicamente que uno de los módulos de la extensión estaba en la pila cuando la
interfaz de usuario dejó de responder o cuando se produjo el bloqueo. No
necesariamente significa que la propia extensión sea la causa. Es posible que la
extensión llamara a código que forma parte de Visual Studio, lo que a su vez dio
lugar a una falta de respuesta de la interfaz de usuario o a un bloqueo. Sin
embargo, la notificación puede seguir siendo útil si el escenario que ha provocado
la falta de respuesta de la interfaz de usuario el bloqueo no es importante para
usted. En este caso, deshabilitar la extensión evita el mismo bloqueo o falta de
respuesta de la interfaz de usuario en el futuro sin afectar a su productividad.
Muestras
Cuando se instala un ejemplo en línea, la solución se almacena en dos ubicaciones:
Se almacena una copia de trabajo en la ubicación especificada al crear el proyecto.
Se almacena una copia maestra independiente en el equipo.
Puede usar el cuadro de diálogo Administrar extensiones> para realizar estas tareas
relacionadas con ejemplos:
Enumerar las copias maestras de ejemplos que ha instalado.
Deshabilitar o desinstalar la copia maestra de un ejemplo.
Instalar paquetes de ejemplo, que son colecciones de ejemplos relacionados con
una tecnología o una característica.
Instalar ejemplos en línea individuales.
Ver notificaciones de actualización cuando se publiquen cambios en el código
fuente de los ejemplos instalados.
Actualizar la copia maestra de un ejemplo instalado cuando haya una notificación
de actualización.
Vea también
Visual Studio Marketplace
Visual Studio SDK
Documentación de recursos para
desarrolladores
Use herramientas de línea de comandos, API REST y mucho más para la interfaz con
Azure DevOps mediante programación.
Azure DevOps interfaz de la línea de comandos (CLI)
b INTRODUCCIÓN
Introducción a la CLI de Azure DevOps
Inicio de sesión con un token de acceso personal (PAT)
Configurar directivas
i REFERENCIA
Referencia rápida de la CLI de Azure DevOps
Repos y CLI de prueba
i REFERENCIA
Comandos de Git
Comandos del repositorio tfvc
Comandos de administración de casos de prueba
CLI de Node para Azure DevOps
b INTRODUCCIÓN
CLI multiplataforma para Azure DevOps (tfx-cli)
Referencia de API REST de Azure DevOps
b Ó
b INTRODUCCIÓN
Introducción
Build
Core
Git
Seguimiento de elementos de trabajo
Generador de demostraciones de Azure DevOps
b INTRODUCCIÓN
Acerca del Generador de demostraciones
Introducción