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! 😉