BLOG

Automação no Azure DevOps com Python: Guia Completo para Manipular Variáveis na Library

O Azure DevOps é uma poderosa plataforma de DevOps que oferece uma série de funcionalidades para CI/CD e gestão de código. Uma das funcionalidades mais úteis no desenvolvimento e automação de pipelines é a possibilidade de definir variáveis. Essas variáveis podem ser usadas para armazenar configurações, dados de ambiente ou informações dinâmicas que variam de um estágio para outro.

Hoje, vamos aprender a:

1. Ler variáveis do Azure DevOps em Python;

2. Escrever (ou atualizar) variáveis diretamente no Azure DevOps.

Pré-requisitos

  • Python 3 instalado;
  • Biblioteca requests, que pode ser instalada com:
pip install requests
  • Um Personal Access Token (PAT) do Azure DevOps para autenticação na API;
  • O nome do projeto, nome da organização e o ID do pipeline no Azure DevOps onde estão as variáveis.

Parte 1: Como Ler Variáveis do Azure DevOps com Python

Para acessar as variáveis, precisamos fazer uma requisição GET para a API do Azure DevOps.

Segue um exemplo básico de código para realizar a leitura:

import requests
from requests.auth import HTTPBasicAuth

# Configurações do Azure DevOps
organization = "<NOME_DA_ORGANIZACAO>"
project = "<NOME_DO_PROJETO>"
library_id = "<ID_DA_BIBLIOTECA>"  # ID da Biblioteca onde estão as variáveis
pat_token = "<SEU_PERSONAL_ACCESS_TOKEN>"

# URL da API para acessar as variáveis da biblioteca
url = f"https://dev.azure.com/{organization}/{project}/_apis/distributedtask/variablegroups/{library_id}?api-version=7.1-preview.2"

# Realiza a requisição GET para ler as variáveis
response = requests.get(url, auth=HTTPBasicAuth('', pat_token))

if response.status_code == 200:
    variables = response.json().get("variables", {})
    for var_name, var_info in variables.items():
        print(f"Variável: {var_name}, Valor: {var_info.get('value')}")
else:
    print(f"Erro ao obter as variáveis: {response.status_code} - {response.text}")

Explicação do Código

  • Variáveis: A resposta JSON contém um dicionário com as variáveis (variables), onde cada entrada tem o nome da variável e seu valor;
  • URL da API: A URL inclui o organization, project, e o library_id, além do api-version;
  • HTTPBasicAuth: Autenticação usando o PAT;

O retorno é esse de cima, onde você vai conseguir ver todas as variáveis disponíveis naquele grupo de variáveis do ADO.

Parte 2: Como Escrever (Atualizar) Variáveis no Azure DevOps com Python

Para atualizar variáveis, precisamos fazer uma requisição PUT para a API do Azure DevOps:

import requests
from requests.auth import HTTPBasicAuth

# Configurações do Azure DevOps
organization = "<NOME_DA_SUA_ORGANIZACAO>"
project_name = "<NOME_DO_SEU_PROJETO>"
library_id = "<ID_ADO_LIBRARY>"  # ID da Biblioteca onde estão as variáveis
pat_token = "<SEU_PAT_TOKEN_AQUI>"

# Variável que você deseja definir/atualizar
nome_variavel = "DEBUG"
valor_variavel = "DEPOIS DA MUDANÇA"

# Obter o ID do projeto a partir do nome do projeto
project_url = f"https://dev.azure.com/{organization}/_apis/projects/{project_name}?api-version=6.0"
project_response = requests.get(project_url, auth=HTTPBasicAuth('', pat_token))

print(f"Project Status Code: {project_response.status_code}")
print(f"Project Response Text: {project_response.text}")

if project_response.status_code == 200:
    project_data = project_response.json()
    project_id = project_data['id']
else:
    print(f"Erro ao obter o ID do projeto: {project_response.status_code} - {project_response.text}")
    exit()

# URL da API para atualizar o grupo de variáveis (inclui o nome do projeto)
url = f"https://dev.azure.com/{organization}/{project_name}/_apis/distributedtask/variablegroups/{library_id}?api-version=7.1-preview.2"

# Requisição atual para obter as variáveis existentes
response = requests.get(url, auth=HTTPBasicAuth('', pat_token))

print(f"Status Code: {response.status_code}")
print(f"Response Text: {response.text}")

if response.status_code == 200:
    # Obter os dados atuais do grupo de variáveis
    library_data = response.json()
    print(f"Library Data: {library_data}")

    variables = library_data.get("variables", {})

    # Atualizar ou adicionar a nova variável
    variables[nome_variavel] = {"value": valor_variavel}

    # Atualizar os dados do grupo de variáveis
    library_data['variables'] = variables

    # Atualizar o campo variableGroupProjectReferences com o ID do projeto
    library_data['variableGroupProjectReferences'] = [
        {
            "projectReference": {
                "id": project_id
            },
            "name": library_data["name"]
        }
    ]

    # Enviar a atualização
    update_response = requests.put(
        url,
        auth=HTTPBasicAuth('', pat_token),
        json=library_data
    )

    print(f"Update Status Code: {update_response.status_code}")
    print(f"Update Response Text: {update_response.text}")

    if update_response.status_code == 200:
        print(f"Variável '{nome_variavel}' atualizada com sucesso.")
    else:
        print(f"Erro ao atualizar a variável: {update_response.status_code} - {update_response.text}")
else:
    print(f"Erro ao obter a biblioteca: {response.status_code} - {response.text}")

Temos aqui:

  • Obter as Variáveis Existentes: Fazemos uma requisição GET para obter as variáveis atuais na biblioteca;
  • Adicionar ou Atualizar Variáveis: Atualizamos o dicionário variables com a nova variável (ou atualizamos o valor de uma existente);
  • Enviar Atualização: Enviamos uma requisição PUT com as variáveis atualizadas.

Como exemplo, temos:

O código todo está disponível em https://github.com/toolbox-playground/python-azure-devops-exemplos.

Boas Práticas e Dicas

  • Segurança: Nunca expor diretamente o token no código. É recomendável usar variáveis de ambiente ou um gerenciador de segredos;
  • PAT: PAT token talvez não seja a forma mais segura para se autenticar no Azure Devops, mas de fato é a mais fácil de ser utilizada;
  • Timeout e Retry: Configure tempo limite e tentativas para melhorar a resiliência em ambientes instáveis. Isso pode ser feito com timeout e bibliotecas como tenacity para retry;
  • Logs e Monitoramento: Em produção, use logs e monitoramento para capturar e analisar falhas.

Conclusão

Neste artigo, você aprendeu como ler e escrever variáveis no Azure DevOps usando Python e a biblioteca requests. Essa abordagem é muito útil para automações e otimizações de pipelines em Azure DevOps.

Com este conhecimento, você já está apto a manipular variáveis do Azure DevOps diretamente via API e a utilizar esses dados em automações, scripts de auditoria e relatórios personalizados.

Se gostou, não deixe de comentar! 😉

Foto de João Heytor

João Heytor

DevOps por escolha e colaborador por natureza! Prazer!

Esta gostando do conteúdo ? Compartilhe!