From 6943a88e662f191026d7da9d7dcd2df385b9d490 Mon Sep 17 00:00:00 2001 From: esdrasrenan Date: Tue, 16 Dec 2025 22:57:57 -0300 Subject: [PATCH] fix(ci): solucao definitiva para erro de permissao no rsync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O problema: Docker cria arquivos como root durante o build, e em deploys subsequentes o rsync falha com "Permission denied" porque o usuario runner nao consegue sobrescrever arquivos de root. A solucao anterior (chown do destino) falhava silenciosamente porque alguns arquivos ja tinham permissoes de root de deploys anteriores. Nova abordagem: - Antes do rsync, limpar completamente o destino usando Docker Alpine - Docker Alpine roda como root e consegue remover qualquer arquivo - O .env eh preservado (backup/restore) - rsync copia para diretorio limpo, sem conflitos de permissao 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .forgejo/workflows/ci-cd-web-desktop.yml | 33 ++++++++++++++++-------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/.forgejo/workflows/ci-cd-web-desktop.yml b/.forgejo/workflows/ci-cd-web-desktop.yml index 783e8a3..5c74103 100644 --- a/.forgejo/workflows/ci-cd-web-desktop.yml +++ b/.forgejo/workflows/ci-cd-web-desktop.yml @@ -193,22 +193,33 @@ jobs: run: | set -e DEST="$HOME/apps/sistema" - mkdir -p "$DEST" - mkdir -p "$DEST/.next/static" - # Corrigir permissoes do destino (arquivos de deploys anteriores) + + # SOLUCAO DEFINITIVA: Limpar completamente o destino usando Docker (root) + # Isso evita erros de permissao de arquivos criados por Docker em deploys anteriores if [ -d "$DEST" ]; then + echo "Limpando diretorio destino: $DEST" + # Preservar apenas o .env (configuracoes de producao) + if [ -f "$DEST/.env" ]; then + cp "$DEST/.env" /tmp/.env.backup + fi + # Remover tudo usando Docker Alpine como root docker run --rm -v "$DEST":/target alpine:3 \ - chown -R 1000:1000 /target 2>/dev/null || true + sh -c 'rm -rf /target/* /target/.[!.]* /target/..?* 2>/dev/null || true' + # Restaurar .env + if [ -f /tmp/.env.backup ]; then + cp /tmp/.env.backup "$DEST/.env" + rm /tmp/.env.backup + fi + echo "Diretorio limpo" fi - # rsync com --no-owner --no-group para nao preservar UID do container Docker - if [ -d "$EFFECTIVE_APP_DIR/.next/static" ]; then - rsync -a --no-owner --no-group \ - "$EFFECTIVE_APP_DIR/.next/static/" "$DEST/.next/static/" - fi - rsync -a --delete --no-owner --no-group \ + + mkdir -p "$DEST" + + # Copiar build completo (sem conflitos de permissao agora) + rsync -a --no-owner --no-group \ --exclude '.pnpm-store' --exclude '.pnpm-store/**' \ - --exclude '.next/static' \ "$EFFECTIVE_APP_DIR"/ "$DEST"/ + echo "Published build to: $DEST" - name: Swarm deploy (stack.yml)