{"id":38266,"date":"2020-01-16T11:10:07","date_gmt":"2020-01-16T18:10:07","guid":{"rendered":"http:\/\/devblogs.microsoft.com\/premier-developer\/?p=38266"},"modified":"2020-01-13T11:22:26","modified_gmt":"2020-01-13T18:22:26","slug":"simplificando-los-pipelines-de-azure-devops-con-decoradores","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/premier-developer\/simplificando-los-pipelines-de-azure-devops-con-decoradores\/","title":{"rendered":"Simplificando los pipelines de Azure DevOps con decoradores"},"content":{"rendered":"<p><strong>Simplificando los pipelines de Azure DevOps con decoradores.<\/strong><\/p>\n<p>Cuando se trata de DevOps, no faltan la cantidad de personalizaciones que las empresas necesitan. Desde entornos especializados hasta comprobaciones de calidad, cada empresa tiene su propia manera para determinar c\u00f3mo es una implementaci\u00f3n exitosa. Muchas de estas personalizaciones deben aplicarse en toda una organizaci\u00f3n, lo que garantiza que cada proyecto pase la prueba antes de que se implemente. Si usted est\u00e1 tratando con cientos de proyectos, esto no es una haza\u00f1a f\u00e1cil.\u00a0 Afortunadamente, en Azure DevOps, los decoradores de pipelines pueden ayudarle. D\u00e9jame mostrarle c\u00f3mo.<\/p>\n<p><strong>Entendiendo Pipelines <\/strong><\/p>\n<p>En Azure DevOps, los pipelines vienen en 2 sabores: compilaci\u00f3n y liberaci\u00f3n. Los pipelines de compilaci\u00f3n son la forma en que se compila, prueba y empaqueta el c\u00f3digo. Los pipelines de liberaci\u00f3n se tratan de implementar ese c\u00f3digo en los entornos. Azure tiene todo tipo de integraciones para ayudar a que los pipelines de compilaci\u00f3n y liberaci\u00f3n se ejecuten sin problemas, al tiempo que le permite implementar sus propios controles y puertas en el camino. Ya sea que necesite buscar credenciales, probar sus integraciones, cumplir con la pol\u00edtica o cualquier otro paso personalizado, puede hacerlo todo con pipelines.<\/p>\n<p>Tal vez tenga una gran colecci\u00f3n de proyectos (digamos 100) y necesite una verificaci\u00f3n de virus espec\u00edficos que debe realizarse para cada implementaci\u00f3n.\u00a0 Puede agregar f\u00e1cilmente los pasos a sus pipelines para asegurarse de que todos sus proyectos est\u00e1n listos. Incre\u00edble. Caso cerrado.<\/p>\n<p>S\u00f3lo abra los 100 proyectos.<\/p>\n<p>Simplemente edite 100 diferentes pipelines de liberaci\u00f3n.<\/p>\n<p>Manualmente.<\/p>\n<p>No suena muy divertido, \u00bfverdad?<\/p>\n<p>No se preocupe, los decoradores de pipelines est\u00e1n aqu\u00ed para simplificar su vida.<\/p>\n<p><strong>Decoradores de pipelines<\/strong><\/p>\n<p>Los decoradores de pipelines le permiten definir un conjunto b\u00e1sico de pasos y ejecutarlos para cada proyecto de su organizaci\u00f3n. Cada pipeline de Azure DevOps es solo una serie de comandos que se ejecutan cuando se produce una compilaci\u00f3n o una liberaci\u00f3n. Estos comandos constan de una serie de secciones YAML, que definen qu\u00e9 extensi\u00f3n llamar y cualquier variable\/par\u00e1metro que se debe establecer. Estos comandos de manera conjunta forman el archivo YAML que define el pipeline.<\/p>\n<p>Los decoradores de pipelines son esencialmente una secci\u00f3n del archivo YAML que se ejecutar\u00e1 para cada pipeline. El paquete del decorador contiene un archivo YAML, que describe qu\u00e9 pasos se van a procesar. Este paquete se registra como una <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/extend\/get-started\/node?view=azure-devops\"><strong>extensi\u00f3n personalizada,<\/strong><\/a> con un objetivo espec\u00edfico (tipo de configuraci\u00f3n de extensi\u00f3n) que indica a Azure DevOps que es una definici\u00f3n de decorador de pipeline.<\/p>\n<p><strong>Creaci\u00f3n de un decorador<\/strong><\/p>\n<p>Para empezar a utilizar decoradores de pipelines, primero debe crear una extensi\u00f3n. Aqu\u00ed hay un enlace para guiarlo a trav\u00e9s del proceso.<\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/extend\/develop\/add-pipeline-decorator?view=azure-devops\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Utilice un decorador para inyectar pasos en un pipeline <\/strong><\/a><\/p>\n<p>Para resumir:<\/p>\n<p>Cree un archivo de extensi\u00f3n. Esto define el tipo de extensi\u00f3n, as\u00ed como los archivos empaquetados.<\/p>\n<p>Cree un archivo YAML. Este archivo contiene los pasos que desea ejecutar para cada pipeline.<\/p>\n<p>Cree un archivo HTML. Esto se mostrar\u00e1 cuando un usuario vea su extensi\u00f3n en Marketplace.<\/p>\n<p>Empaquete la extensi\u00f3n. Esto crea un archivo . VSIX que utilizar\u00e1 para registrar su extensi\u00f3n.<\/p>\n<p>Registre su extensi\u00f3n. Esto implica cargar el archivo en el Marketplace de Azure DevOps y ponerlo a disposici\u00f3n de la organizaci\u00f3n de Azure DevOps.<\/p>\n<p>Agregue la extensi\u00f3n a su organizaci\u00f3n. Esto permite que la extensi\u00f3n se aplique a sus pipelines.<\/p>\n<p><strong>Pasos de Pipelines<\/strong><\/p>\n<p>Una vez que cree la extensi\u00f3n inicial, estar\u00e1 listo para agregar los pasos personalizados. Dado que estos pasos se definen como YAML, me result\u00f3 m\u00e1s f\u00e1cil editar el pipeline de compilaci\u00f3n de Azure DevOps con los pasos a trav\u00e9s del portal y, a continuaci\u00f3n, copiar ese c\u00f3digo en el archivo YAML del decorador.<\/p>\n<p>Aqu\u00ed est\u00e1 mi pipeline de compilaci\u00f3n b\u00e1sica.<\/p>\n<p><img decoding=\"async\" width=\"1858\" height=\"1768\" class=\"wp-image-38267\" src=\"http:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-social-media-post-description-a.png\" alt=\"A screenshot of a social media post Description automatically generated\" srcset=\"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-social-media-post-description-a.png 1858w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-social-media-post-description-a-300x285.png 300w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-social-media-post-description-a-1024x974.png 1024w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-social-media-post-description-a-768x731.png 768w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-social-media-post-description-a-1536x1462.png 1536w\" sizes=\"(max-width: 1858px) 100vw, 1858px\" \/>\nAgregar\u00e9 un paso de pipeline mediante el editor YAML. Podr\u00eda escribir su YAML desde cero si le gusta ese tipo de cosas. Descubr\u00ed que el uso del editor es mucho m\u00e1s r\u00e1pido y me ayuda a asegurarme de que mi espaciado\/formato es correcto.<\/p>\n<p>En mi caso, quiero agregar un <a href=\"https:\/\/secdevtools.azurewebsites.net\/helpcredscan.html\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>CredScan<\/strong><\/a> a cada pipeline, para asegurarme de que todos los proyectos son seguros.<\/p>\n<p><img decoding=\"async\" width=\"1429\" height=\"942\" class=\"wp-image-38268\" src=\"http:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-map-description-automatically-g.png\" alt=\"A screenshot of a map Description automatically generated\" srcset=\"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-map-description-automatically-g.png 1429w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-map-description-automatically-g-300x198.png 300w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-map-description-automatically-g-1024x675.png 1024w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-map-description-automatically-g-768x506.png 768w\" sizes=\"(max-width: 1429px) 100vw, 1429px\" \/>\nEn mi YAML, puede ver el nuevo paso que agregu\u00e9. Este es el c\u00f3digo que quiero copiar en mi archivo YAML del decorador.<\/p>\n<pre class=\"lang:default decode:true \">- task: CredScan@2\r\ninputs:\r\ntoolMajorVersion: 'V1'<\/pre>\n<p>En mi Decorador YAML, agrego el texto copiado. <strong>Si est\u00e1 siguiendo, aseg\u00farese<\/strong> de mantener su espaciado correcto! YAML es estricto cuando se trata de espaciado y formato, as\u00ed que aseg\u00farese de prestar atenci\u00f3n a su c\u00f3digo.<\/p>\n<p><img decoding=\"async\" width=\"1323\" height=\"774\" class=\"wp-image-38269\" src=\"http:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-screen-with-text-des.png\" alt=\"A screenshot of a cell phone screen with text Description automatically generated\" srcset=\"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-screen-with-text-des.png 1323w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-screen-with-text-des-300x176.png 300w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-screen-with-text-des-1024x599.png 1024w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-screen-with-text-des-768x449.png 768w\" sizes=\"(max-width: 1323px) 100vw, 1323px\" \/><\/p>\n<p>Despu\u00e9s de actualizar mi decorador, empaquet\u00e9 mi extensi\u00f3n y la sub\u00ed al Marketplace de Azure DevOps.<\/p>\n<p><img decoding=\"async\" width=\"1370\" height=\"912\" class=\"wp-image-38270\" src=\"http:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-2.png\" alt=\"A screenshot of a cell phone Description automatically generated\" srcset=\"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-2.png 1370w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-2-300x200.png 300w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-2-1024x682.png 1024w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-2-768x511.png 768w\" sizes=\"(max-width: 1370px) 100vw, 1370px\" \/>\nA continuaci\u00f3n, lo registro en mi organizaci\u00f3n de Azure DevOps.<\/p>\n<p><img decoding=\"async\" width=\"1432\" height=\"928\" class=\"wp-image-38271\" src=\"http:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-3.png\" alt=\"A screenshot of a cell phone Description automatically generated\" srcset=\"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-3.png 1432w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-3-300x194.png 300w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-3-1024x664.png 1024w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-3-768x498.png 768w\" sizes=\"(max-width: 1432px) 100vw, 1432px\" \/><\/p>\n<p><strong>Pruebas<\/strong><\/p>\n<p>Con mi extensi\u00f3n registrada, estoy listo para probar mis pasos. En mi <strong>pipeline de compilaci\u00f3n<\/strong>, creo una nueva compilaci\u00f3n. Cuando se completa la compilaci\u00f3n, desproteger\u00e9 los registros para asegurarme de ver mis pasos personalizados. Aqu\u00ed puede ver d\u00f3nde se agreg\u00f3 el paso <strong>CredScan<\/strong> despu\u00e9s de los otros pasos del pipeline.<\/p>\n<p><img decoding=\"async\" width=\"1837\" height=\"1387\" class=\"wp-image-38272\" src=\"http:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge.png\" alt=\"A screenshot of text Description automatically generated\" srcset=\"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge.png 1837w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge-300x227.png 300w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge-1024x773.png 1024w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge-768x580.png 768w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge-1536x1160.png 1536w\" sizes=\"(max-width: 1837px) 100vw, 1837px\" \/><\/p>\n<p><strong>Nota<\/strong><\/p>\n<p><strong>CredScan<\/strong> aparece despu\u00e9s del paso <strong>VSTest.<\/strong> Este es el \u00faltimo paso en la definici\u00f3n del pipeline y eleg\u00ed una definici\u00f3n de decorador de pipeline<strong> posterior.<\/strong> Los decoradores se pueden ejecutar antes o despu\u00e9s de los pasos de su pipeline.<\/p>\n<p><strong>\u00a1Hag\u00e1moslo m\u00e1s fresco!<\/strong><\/p>\n<p>Dado que los decoradores se basan en YAML, puede usar pr\u00e1cticamente cualquier c\u00f3digo YAML v\u00e1lido que desee. Esto significa que puede agregar varios pasos, condiciones y usar variables dentro de las extensiones del decorador. Los decoradores tambi\u00e9n tienen acceso a informaci\u00f3n contextual, como el nombre del repositorio, los detalles de los trabajos y otros. Esto le permite hacer sus decoradores mucho m\u00e1s flexibles, lo que le permite determinar cu\u00e1ndo y c\u00f3mo funcionan sus decoradores. Esto es especialmente \u00fatil si tiene algunos pipelines que no necesitan ejecutar los pasos del decorador.<\/p>\n<p>En mi YAML, agrego c\u00f3digo para comprobar una nueva variable que usar\u00e9 para permitir que el decorador no se ejecute. Si se establece, permitir\u00e1 omitir los pasos del decorador.<\/p>\n<pre class=\"lang:default decode:true \">steps:\r\n-\u00a0${{\u00a0if\u00a0ne(variables['skipDecoratorExecution'],\u00a0'true')\u00a0}}:\r\n\u00a0\u00a0\u00a0\u00a0-\u00a0task:\u00a0CredScan@2\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0inputs:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0toolMajorVersion:\u00a0'V1'<\/pre>\n<p><strong>Nota<\/strong><\/p>\n<p>Aseg\u00farese de revisar los <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/extend\/develop\/pipeline-decorator-context?view=azure-devops\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>datos disponibles aqu\u00ed<\/strong><\/a>.<\/p>\n<p>Para m\u00e1s diversi\u00f3n, puede agregar varios pasos a su decorador. En mi archivo YAML, agrego otra acci\u00f3n, espec\u00edficamente para archivar mis archivos como parte del pipeline.<\/p>\n<pre class=\"lang:default decode:true \">steps:\r\n- ${{ if ne(variables['skipDecoratorExecution'], 'true') }}:\r\n- task: CredScan@2\r\ninputs:\r\ntoolMajorVersion: 'V1'\r\n- task: ArchiveFiles@2\r\ninputs:\r\nrootFolderOrFile: '$(Build.BinariesDirectory)'\r\nincludeRootFolder: true\r\narchiveType: 'zip'\r\narchiveFile: '$(Build.ArtifactStagingDirectory)\/$(Build.BuildId).zip'\r\nreplaceExistingArchive: true<\/pre>\n<p>Los decoradores pueden contener cualquier n\u00famero de pasos que necesite. Esto le permite definir acciones comunes que cada pipeline requiere en una \u00fanica ubicaci\u00f3n y hacer que se inyecten para cada compilaci\u00f3n.<\/p>\n<p>Debido a que he modificado mi YAML, necesito actualizar y volver a empaquetar mi decorador. Para ello, ejecuto el comando<strong> tfx extension create <\/strong> con el atributo <strong>\u2013rev-version. <\/strong> Esto incrementa la versi\u00f3n y crea un archivo para la actualizaci\u00f3n.<\/p>\n<p><strong>tfx extensi\u00f3n create &#8211;rev-version<\/strong><\/p>\n<p>En el Marketplace de Azure DevOps, cargo el nuevo paquete de extensi\u00f3n.<\/p>\n<p><strong>\u00a1M\u00e1s pruebas!<\/strong><\/p>\n<p>Una vez actualizado, estoy listo para probar mi pipeline. Primero, ejecuto la compilaci\u00f3n, como antes. Cuando se complete, confirmo que el decorador fue ejecutado. Tenga en cuenta que hay varios pasos definidos porque el decorador ahora contiene varias acciones.<\/p>\n<p><img decoding=\"async\" width=\"1890\" height=\"1584\" class=\"wp-image-38273\" src=\"http:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge-1.png\" alt=\"A screenshot of text Description automatically generated\" srcset=\"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge-1.png 1890w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge-1-300x251.png 300w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge-1-1024x858.png 1024w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge-1-768x644.png 768w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-text-description-automatically-ge-1-1536x1287.png 1536w\" sizes=\"(max-width: 1890px) 100vw, 1890px\" \/><\/p>\n<p>A continuaci\u00f3n, ejecuto el pipeline de nuevo, pero esta vez agregando una variable para omitir la ejecuci\u00f3n del decorador. En mi canalizaci\u00f3n YAML, agregue la variable <strong>skipDecoratorExecution.<\/strong><\/p>\n<p><img decoding=\"async\" width=\"1389\" height=\"1145\" class=\"wp-image-38274\" src=\"http:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-4.png\" alt=\"A screenshot of a cell phone Description automatically generated\" srcset=\"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-4.png 1389w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-4-300x247.png 300w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-4-1024x844.png 1024w, https:\/\/devblogs.microsoft.com\/premier-developer\/wp-content\/uploads\/sites\/31\/2020\/01\/a-screenshot-of-a-cell-phone-description-automati-4-768x633.png 768w\" sizes=\"(max-width: 1389px) 100vw, 1389px\" \/><\/p>\n<p>Ahora, cuando se ejecuta el pipeline, omite las tareas del decorador, porque la variable <strong>skipDecoratorExecution<\/strong> est\u00e1 establecida en true.<\/p>\n<p><strong>Pr\u00f3ximos pasos<\/strong><\/p>\n<p>Bastante impresionante, \u00bfverdad? Los decoradores de pipelines le permiten definir acciones comunes y aplicarlas en todos los proyectos. Esto puede permitir aplicar pol\u00edticas de seguridad y calidad para cada proyecto, mientras se administra desde una ubicaci\u00f3n central. Mediante el uso de condiciones y variables de YAML, puede personalizar cu\u00e1ndo y c\u00f3mo se inyectan los pasos del decorador. Esto significa que puede asegurarse de que todos sus proyectos est\u00e1n bloqueados y funcionando sin problemas. \u00a1Buena suerte!<\/p>\n<p>Puede ver mi c\u00f3digo de <a href=\"https:\/\/github.com\/BryanSoltis\/AzureDevOpsSamplePipelineDecorator\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>decorador completo en GitHub.<\/strong><\/a><\/p>\n<p>(<a class=\"x-hidden-focus\" href=\"https:\/\/devblogs.microsoft.com\/premier-developer\/simplifying-azure-devops-pipelines-with-decorators\/\">Link to English version of this article<\/a>)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cuando se trata de DevOps, no faltan la cantidad de personalizaciones que las empresas necesitan. Desde entornos especializados hasta comprobaciones de calidad, cada empresa tiene su propia manera para determinar c\u00f3mo es una implementaci\u00f3n exitosa.<\/p>\n","protected":false},"author":582,"featured_media":38275,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[22],"tags":[24,2571,1036,3],"class_list":["post-38266","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-azure","tag-azure-devops","tag-region_latam","tag-team"],"acf":[],"blog_post_summary":"<p>Cuando se trata de DevOps, no faltan la cantidad de personalizaciones que las empresas necesitan. Desde entornos especializados hasta comprobaciones de calidad, cada empresa tiene su propia manera para determinar c\u00f3mo es una implementaci\u00f3n exitosa.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/posts\/38266","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/users\/582"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/comments?post=38266"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/posts\/38266\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/media\/38275"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/media?parent=38266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/categories?post=38266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/premier-developer\/wp-json\/wp\/v2\/tags?post=38266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}