Descrição do Problema / Contexto
Atualmente, os scripts locais de release (release.sh, release-installer.sh, etc.) realizam a exclusão de tags e releases antigas da mesma série (gestor-vX.Y.*) antes de criar e publicar a nova versão:
# Comportamento antigo no release.sh
OLD_TAGS=$(git tag --list "$OLD_TAG_PATTERN")
if [ -n "$OLD_TAGS" ]; then
for tag in $OLD_TAGS; do
git tag -d "$tag"
git push --delete origin "$tag"
gh release delete "$tag" --yes
done
fiProblemas identificados:
-
Falta de Segurança / Atomicidade (Fail-Safe): Se a compilação local, o empacotamento ou os testes automatizados do CI falharem no meio do caminho, a release anterior já foi excluída, deixando o repositório sem uma release válida para consumo e download.
-
Race Conditions e Throttling no GitHub: Deletar tags remotas via API milissegundos antes de enviar um novo push de tag com o mesmo prefixo faz com que a fila de eventos de webhooks do GitHub descarte ou atrase o disparo do GitHub Actions.
A arquitetura correta e resiliente consiste em:
-
No ambiente local: Apenas incrementar a versão, compilar recursos, comitar e enviar a nova tag de forma atômica (
git push origin main "gestor-v$NEW_VERSION"). -
No GitHub Actions: Executar a limpeza de releases e tags intermediárias da mesma série como uma etapa final da esteira, protegida pela condição
if: success()(executada apenas após a nova release ser compilada, testada e publicada com 100% de sucesso).
Escopo Detalhado das Alterações
1. Limpeza dos Scripts Shell Locais
Remover o bloco de pré-exclusão de tags/releases antigas nos seguintes arquivos:
-
ai-workspace/en/scripts/releases/release.sh -
ai-workspace/pt-br/scripts/releases/release.sh -
ai-workspace/en/scripts/releases/release-installer.sh -
ai-workspace/pt-br/scripts/releases/release-instalador.sh -
dev-plugins/templates/environment/scripts/releases/release.sh
Garantir que o push local envie a branch e a nova tag de forma unificada e atômica.
2. Adição da Etapa de Faxina Pós-Sucesso no GitHub Actions
Adicionar o step Clean up older tags and releases in the same series com if: success() nos seguintes workflows:
-
.github/workflows/release-gestor.yml(logo após o stepCreate Release) -
.github/workflows/release-instalador.yml(logo após o stepCreate Release)
Lógica do Step:
- name: Clean up older tags and releases in the same series
if: success()
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
CURRENT_TAG="${{ steps.tag.outputs.TAG_NAME }}"
SERIES=$(echo "$CURRENT_TAG" | grep -o '^[a-z]\+-v[0-9]\+\.[0-9]\+')
echo "Cleaning up older releases and tags in series $SERIES (preserving $CURRENT_TAG)..."
# Lista todas as tags da mesma série, exceto a tag recém-publicada
OLD_TAGS=$(git tag --list "${SERIES}.*" | grep -v "^${CURRENT_TAG}$" || true)
for tag in $OLD_TAGS; do
if [ -n "$tag" ]; then
echo "Removing older release and tag: $tag"
gh release delete "$tag" --yes 2>/dev/null || true
git push origin --delete "$tag" 2>/dev/null || true
fi
doneCritérios de Aceite e Validação
-
bash -nlimpo em todos os scripts shell (release.sh,release-installer.sh, etc.). -
Sintaxe YAML dos workflows validada.
-
Se um release falhar nos testes no GitHub Actions, nenhuma tag ou release anterior é removida.
-
Se o release for bem-sucedido, as versões intermediárias anteriores da mesma série são limpas automaticamente pela esteira de CI.