[Dúvida] GitHub Actions
Olá a todos!
Estou atualmente explorando o uso de scripts em Shell (sh) para automatizar processos, especialmente aqueles relacionados à gestão de ambientes no GitHub. O objetivo é agilizar e tornar mais eficiente a criação de ambientes, como o "prod", e a configuração de variáveis dentro desses ambientes.
Estou com os seguintes problemas:
Dificuldade na criação da Environment "prod" via script: O script atual enfrenta dificuldades ao tentar criar automaticamente a Environment "prod". No entanto, se eu criar manualmente a Environment e, em seguida, executar o script, ele consegue adicionar com sucesso as variáveis, conforme especificado na lista de segredos ("teste:1", "var:2").
Limitação na criação de variáveis não secretas: Além disso, tentei de algumas formas fazer com que o script realize a adição de variáveis não secretas, possibilitando a inclusão de variáveis públicas ou não sensíveis. Porém não consegui encontrar um meio para adicionar elas.
Esses problemas representam obstáculos para a automação eficiente do processo de configuração de ambientes no GitHub. Vou continuar a explorar e aprimorar o código para superar essas limitações e tornar a automação mais robusta e versátil.
Se alguém tiver alguma sugestão ou experiência semelhante para compartilhar, seria muito bem-vinda!
#!/bin/bash
REPO_OWNER="REPO_OWNER"
REPO_NAME="REPO_NAME"
TOKEN="TOKEN"
base64_encode() {
echo -n "$1" | base64
}
create_environment_if_not_exists() {
local environments_url="https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/environments"
local response=$(curl -s -H "Authorization: token $TOKEN" "$environments_url")
if ! echo "$response" | grep -q "id"; then
echo "Não existem ambientes definidos para este repositório. Criando o ambiente 'prod'..."
response=$(curl -X POST \
-H "Authorization: token $TOKEN" \
-H "Accept: application/vnd.github.antiope-preview+json" \
-H "Content-Type: application/json" \
-d '{"name": "prod"}' \
"$environments_url")
if ! echo "$response" | grep -q "id"; then
local message=$(echo "$response" | jq -r '.message')
echo "Erro ao criar a environment 'prod': $message"
exit 1
fi
echo "Ambiente 'prod' criado com sucesso."
else
echo "Ambientes já existem para este repositório."
fi
}
add_secret_to_environment() {
local name=$1
local value=$2
echo "Adicionando a secret '$name' com valor '$value' ao ambiente 'prod'..."
local encoded_value=$(base64_encode "$value")
local key_id=$(curl -s -X GET \
-H "Authorization: token $TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/actions/secrets/public-key" | jq -r '.key_id')
local response=$(curl -X PUT \
-H "Authorization: token $TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
-d "{\"encrypted_value\": \"$encoded_value\", \"key_id\": \"$key_id\"}" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/environments/prod/secrets/$name")
local status=$(echo "$response" | jq -r '.status')
if [ "$status" != "204" ]; then
local message=$(echo "$response" | jq -r '.message')
echo "Erro ao adicionar a secret '$name': $message"
exit 1
fi
echo "$encoded_value"
}
add_public_to_environment() {
local name=$1
local value=$2
echo "Adicionando a secret '$name' com valor '$value' ao ambiente 'prod'..."
local encoded_value=$(base64_encode "$value")
local key_id=$(curl -s -X GET \
-H "Authorization: token $TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/actions/secrets/public-key" | jq -r '.key_id')
local response=$(curl -X PUT \
-H "Authorization: token $TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
-d "{\"encrypted_value\": \"$encoded_value\", \"key_id\": \"$key_id\"}" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/environments/prod/secrets/$name")
local status=$(echo "$response" | jq -r '.status')
if [ "$status" != "204" ]; then
local message=$(echo "$response" | jq -r '.message')
echo "Erro ao adicionar a secret '$name': $message"
exit 1
fi
echo "$encoded_value"
}
secrets=("teste:1" "var:2")
for secret in "${secrets[@]}"; do
echo "Processando secret: $secret"
IFS=':' read -r name value <<< "$secret"
echo "Nome: $name"
echo "Valor (antes de adicionar): $value"
value=$(add_secret_to_environment "$name" "$value")
echo "Valor (após adicionar): $value"
done