Configuración para deshabilitar la creación de repositorios de TFVC

Con esta actualización, presentamos una nueva configuración para deshabilitar la creación de repositorios tfVC. Este cambio se centra en los nuevos proyectos, a la vez que garantiza que los repositorios de TFVC existentes no se vean afectados.

Además, nos complace anunciar que en Azure Pipelines hay disponible un nuevo punto de conexión de API REST para solicitar tokens de OIDC. Esto permite a los desarrolladores de tareas generar idTokens para la autenticación de Id. entra, lo que mejora la seguridad y la facilidad de uso.

Por último, en Azure Boards, las rutas de acceso de área e iteración solo se pueden eliminar si ya no están asociadas a ningún elemento de trabajo. Esta mejora evita interrupciones y garantiza que los equipos conserven el acceso a sus paneles y trabajos pendientes.

Consulte las notas de la versión para obtener más información.

GitHub Advanced Security para Azure DevOps

Azure Boards:

Azure Repos

Azure Pipelines

Azure Test Plans:

GitHub Advanced Security para Azure DevOps

Documentación de api de información general de seguridad ya disponible

La documentación de la API que alimenta la pestaña De riesgo de información general de Advanced Security ya está disponible. Use el punto de conexión /{organization}/_apis/reporting/summary/alerts para ver un resumen de la importancia de las alertas en todos los repositorios habilitados para Advanced Security. Asegúrese de que el PAT de ADO tiene el vso.advsec permiso , que concede la capacidad de leer alertas, instancias de resultado y instancias de resultado de análisis.

Azure Boards

Cambio para eliminar rutas de acceso de área e iteración

La eliminación de un área o ruta de acceso de iteración puede ser perjudicial. Puede mover elementos de trabajo a una nueva ruta de acceso y puede hacer que los equipos pierdan acceso a sus paneles y trabajos pendientes. A pesar de las advertencias y las indicaciones, las rutas de acceso a veces se eliminan sin comprender completamente las consecuencias. Para solucionar esto, hemos cambiado el comportamiento: las rutas de acceso de área e iteración ahora solo se pueden eliminar si ya no las usan los elementos de trabajo.

Capturas de pantalla del área de eliminación.

Azure Repos

Nueva configuración para deshabilitar la creación de repositorios tfVC

En los últimos años, no se agregaron nuevas características a Control de versiones de Team Foundation (TFVC) porque Git se ha convertido en el sistema de control de versiones preferido en Azure Repos. Todas las mejoras recientes en seguridad, rendimiento y accesibilidad se han realizado exclusivamente en repositorios de Git, lo que provoca un descenso continuo del uso de TFVC. Aunque algunos siguen confiando en TFVC y no pretendemos quitar este conjunto de características, planeamos eliminar gradualmente TFVC para nuevos proyectos y organizaciones, así como para proyectos que actualmente no usan TFVC.

Como parte de esta transición, vamos a introducir una nueva configuración en "Deshabilitar la creación de repositorios tfVC", que solo afectará a la creación de nuevos repositorios tfVC y no afectará a las existentes.

Gif para demostración Deshabilitar la creación de repositorios TFVC.

Azure Pipelines

Acceso a Azure Service Bus desde canalizaciones mediante la autenticación de Microsoft Entra ID

Ahora puede usar la autenticación de Id. de Entra de Microsoft para acceder a Azure Service Bus desde Azure Pipelines. Esto le permite aprovechar la federación de identidades de carga de trabajo para quitar la administración de secretos y RBAC de Azure para el control de acceso específico.

Las identidades que acceden a Azure Service Bus deben concederse uno de los roles integrados de Azure para Azure Service Bus en el service Bus al que se accede.

tarea de PublishToAzureServiceBus@2

Las nuevas tareas de PublishToAzureServiceBus@2 se pueden configurar mediante una conexión de servicio de Azure. Cree una conexión de servicio de Azure y rellene las serviceBusQueueName propiedades y serviceBusNamespace de la nueva tarea:

- task: PublishToAzureServiceBus@2
  inputs:
    azureSubscription: my-azure-service-connection
    serviceBusQueueName: my-service-bus-queue
    serviceBusNamespace: my-service-bus-namespace
    useDataContractSerializer: false
    messageBody: |
      {
        "foo": "bar"
      }
Tareas del servidor

Las tareas de servidor personalizado (sin agente) que usan ServiceBus la ejecución pueden especificar una conexión de servicio de Azure como EndpointId y omitir ConnectionString. Consulte Creación de tareas de servidor.

Canalizaciones y tareas rellenan variables para personalizar la autenticación de federación de identidad de carga de trabajo

El punto de conexión de la API REST para solicitar tokens OIDC ahora está disponible en la variable de System.OidcRequestUri canalización. Los desarrolladores de tareas pueden aprovechar esta variable para generar un idToken para la autenticación con Entra ID.

Si usa tareas de Marketplace o tareas personalizadas para implementar en Azure, tenga en cuenta que es posible que estas tareas aún no admitan la federación de identidades de carga de trabajo. Se recomienda a los desarrolladores de tareas habilitar la federación de identidades de carga de trabajo para mejorar las medidas de seguridad.

Captura de pantalla de la colaboración oidc.

Las tareas que toman una connectedService:AzureRM entrada en task.json se pueden actualizar para admitir la federación de identidades de carga de trabajo siguiendo estos pasos:

  • Use la API REST de Oidctoken para solicitar un idToken (flecha 1 en el diagrama anterior).
  • Intercambiar idToken para un token de acceso mediante el flujo de credenciales federadas de la API de OAuth, especificando idToken como client_assertion (flechas 2 y 4 en el diagrama anterior);
    O bien
  • En el caso de las tareas que actúan como contenedor alrededor de una herramienta que realiza la autenticación propiamente dicha, use el método de autenticación de las herramientas para especificar el token federado.

Las tareas de nodo pueden usar el paquete npm azure-pipelines-tasks-artifacts-common para obtener el idToken. Consulte el ejemplo de código para obtener detalles de implementación.

Solicitud de un idToken nuevo

La System.OidcRequestUri variable de canalización y AZURESUBSCRIPTION_SERVICE_CONNECTION_ID la variable de entorno expuestas en las tareas y AzurePowerShell@5 permiten a los AzureCLI@2 autores de canalizaciones autenticarse desde su propio script:

Az de PowerShell
- task: AzurePowerShell@5
  inputs:
    azureSubscription: 'my-azure-subscription'
    scriptType: inlineScript
    inline: |        
      # Request fresh idToken
      Invoke-RestMethod -Headers @{
                        Authorization  = "Bearer $(System.AccessToken)"
                        'Content-Type' = 'application/json'
                      } `
                      -Uri "${env:SYSTEM_OIDCREQUESTURI}?api-version=7.1&serviceConnectionId=${env:AZURESUBSCRIPTION_SERVICE_CONNECTION_ID}" `
                      -Method Post `
                      | Select-Object -ExpandProperty oidcToken
                      | Set-Variable idToken

    # Fetch current context
    $azContext = Get-AzContext

    # Start new Az session
    Connect-AzAccount -ApplicationId $azContext.Account.Id `
                      -TenantId $azContext.Tenant.Id `
                      -SubscriptionId $azContext.Subscription.Id `
                      -FederatedToken $idToken
CLI de Azure
- task: AzureCLI@2
  inputs:
    addSpnToEnvironment: true
    azureSubscription: 'my-azure-subscription'
    scriptType: bash
    scriptLocation: inlineScript
    inlineScript: |
      # Request fresh idToken
      OIDC_REQUEST_URL="${SYSTEM_OIDCREQUESTURI}?api-version=7.1&serviceConnectionId=${AZURESUBSCRIPTION_SERVICE_CONNECTION_ID}"
      ARM_OIDC_TOKEN=$(curl -s -H "Content-Length: 0" -H "Content-Type: application/json" -H "Authorization: Bearer $(System.AccessToken)" -X POST $OIDC_REQUEST_URL | jq -r '.oidcToken')

      # Save subscription context
      ARM_SUBSCRIPTION_ID=$(az account show --query id -o tsv)

      # New az-cli session
      az login --service-principal -u $servicePrincipalId --tenant $tenantId --allow-no-subscriptions --federated-token $ARM_OIDC_TOKEN
      az account set --subscription $ARM_SUBSCRIPTION_ID

Reintentos para tareas de servidor

Las tareas de servidor que llaman a sistemas externos, como AzureFunction o InvokeRESTAPI, pueden producir errores ocasionales debido a errores transitorios, como el agotamiento de recursos de proceso. Anteriormente, estos errores provocarían un error en todo el trabajo y, posiblemente, en la canalización.

Para mejorar la resistencia frente a errores transitorios, hemos introducido compatibilidad con la propiedad en las tareas del retryCountOnTaskFailure servidor. Supongamos que tiene el siguiente código YAML en la canalización:

- stage: deploy
  jobs:
  - job:
    pool: server
    steps:
    - task: AzureFunction@1
      retryCountOnTaskFailure: 2
      inputs:
        function: 'https://api.fabrikamfiber.com'
        key: $(functionKey)
        method: 'POST'
        waitForCompletion: 'false'

Si https://api.fabrikamfiber.com experimenta un error transitorio, Azure Pipelines reintentará la solicitud hasta tres veces (el intento inicial más dos reintentos especificados por retryCountOnTaskFailure). Cada reintento incluye un período de espera creciente. El número máximo de reintentos permitidos es 10.

retryCountOnTaskFailure no está disponible para la ManualValidation tarea y otras tareas que no implican llamadas al sistema externo.

Tareas que usan una versión final del ejecutor de Node para ejecutar advertencias

Las tareas de canalización que dependen de una versión de Node ya no se mantienen comenzarán a recibir advertencias:

La versión <version> de la tarea TaskName depende de una versión de Nodo (10) que sea de fin de ciclo de vida. Póngase en contacto con el propietario de la extensión para obtener una versión actualizada de la tarea. Los mantenedores de tareas deben revisar la guía de actualización del nodo: https://aka.ms/node-runner-guidance

Para suprimir estas advertencias, puede establecer un entorno o una variable de canalización en el nivel de canalización (trabajo) o tarea. Por ejemplo:

variables:
  AZP_AGENT_CHECK_IF_TASK_NODE_RUNNER_IS_DEPRECATED: false

DockerCompose@0 usa Docker Compose v2 en modo de compatibilidad v1

Docker Compose v1 llegará a su fin de ciclo de vida y se quitará de los agentes hospedados de julio de 24 de 2024. Hemos actualizado la tarea de DockerCompose@0 para usar Docker Compose v2 en modo de compatibilidad v1 si Docker Compose v1 no está disponible en el agente.

Sin embargo, el modo de compatibilidad no aborda todos los problemas de compatibilidad. Consulte Migración a Compose V2. Algunos usuarios necesitarán más tiempo para actualizar sus proyectos de Docker Compose para la compatibilidad con Docker Compose v2. En esos casos, siga estas instrucciones para usar la tarea DockerComposeV0 con docker-compose v1.

NOTA: Esta guía se basa en la documentación independiente de Install Compose

Uso de docker-compose v1 en Windows

Agregue el paso de PowerShell a la canalización para descargar docker-Compose v1.29.2 y úselo con la tarea DockerComposeV0 en Windows:

variables:
    dockerComposePath: C:\docker-compose

steps:
- powershell: |
    mkdir -f $(dockerComposePath)
    # GitHub now requires TLS1.2. In PowerShell, run the following
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Start-BitsTransfer -Source "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-windows-x86_64.exe" -Destination $(dockerComposePath)\docker-compose.exe
  displayName: Download docker-compose
- task: DockerCompose@0
  inputs:
    containerregistrytype: 'Azure Container Registry'
    dockerComposeFile: '**/docker-compose.yml'
    action: 'Run a Docker Compose command'
    dockerComposeCommand: 'run'
    dockerComposePath: $(dockerComposePath)\docker-compose.exe

Uso de docker-compose v1 en Linux

Agregue el paso bash a la canalización para descargar Docker-Compose v1.29.2 y úselo con la tarea DockerComposeV0 en Linux:

variables:
    dockerComposePath: /tmp/docker-compose

steps:
- bash: |
    sudo mkdir $(dockerComposePath)
    sudo curl -SL https://github.com/docker/compose/releases/download/1.29.2/docker-compose-linux-x86_64 -o $(dockerComposePath)/docker-compose
    sudo chmod 755 $(dockerComposePath)/docker-compose
  displayName: Download docker-compose
- task: DockerCompose@0
  inputs:
    containerregistrytype: 'Azure Container Registry'
    dockerComposeFile: $(Build.SourcesDirectory)/DockerComposeV0/docker-compose.yml
    action: 'Run a Docker Compose command'
    dockerComposeCommand: 'run'
    dockerComposePath: $(dockerComposePath)/docker-compose

Azure Test Plans

Extensión de prueba y comentarios en el manifiesto V3

Nos complace anunciar una nueva actualización de la extensión Prueba y comentarios de Azure DevOps. Esta actualización realiza la transición de nuestra implementación del manifiesto versión 2 a la versión 3, que se alinea con la programación de desuso de Google para el manifiesto V2.

Aunque las características principales de la extensión permanecen sin cambios, esta actualización mejora la seguridad y el rendimiento. La extensión actualizada se implementará gradualmente en los exploradores Chrome y Edge durante las próximas semanas. Supervisaremos el rendimiento y los comentarios para garantizar una transición fluida antes de expandir el lanzamiento en función de los resultados.

Para obtener más información, consulte nuestra entrada de blog reciente sobre esta actualización. Extensión de prueba y comentarios en el manifiesto V3

Pasos siguientes

Nota:

Estas características se implementarán en las próximas dos a tres semanas.

Vaya a Azure DevOps y eche un vistazo.

Cómo enviar sus comentarios

Nos encantaría escuchar lo que piensas sobre estas características. Use el menú de ayuda para notificar un problema o proporcionar una sugerencia.

Hacer una sugerencia

También puede obtener consejos y sus preguntas respondidas por la comunidad en Stack Overflow.

Gracias,

Silviu Andrica