From 0df74433791facc60c385a35f1e262f5c31b6452 Mon Sep 17 00:00:00 2001 From: Rafael Lopes Date: Mon, 20 Jul 2026 15:39:23 -0300 Subject: [PATCH] CI: Deploy roda como desenvolvimento ao inves de root MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O runner (gitea-runner) roda como root e é compartilhado com outras automações deste servidor, então não dá pra trocar o usuário dele globalmente. O rsync que lê o checkout continua como root (é a única forma de ler, o workspace do runner é privado dele), mas logo depois do sync a posse dos arquivos passa pro 'desenvolvimento', e dali em diante (npm ci, node --check, pm2 startOrRestart/save/list) tudo roda via sudo -u desenvolvimento - resolve o processo órfão de root que duplicava o cron ao lado do PM2 do desenvolvimento. --- .gitea/workflows/deploy-production.yml | 81 +++++++++++++------------- 1 file changed, 39 insertions(+), 42 deletions(-) diff --git a/.gitea/workflows/deploy-production.yml b/.gitea/workflows/deploy-production.yml index bad558c..100609f 100644 --- a/.gitea/workflows/deploy-production.yml +++ b/.gitea/workflows/deploy-production.yml @@ -61,71 +61,68 @@ jobs: run: | set -euo pipefail - # O runner roda como root (compartilhado com outras automacoes deste servidor), mas o - # app deve rodar como 'desenvolvimento' - e o dono do PM2/logs/.env.production hoje. - # Em vez de mudar o usuario do runner (afetaria outras automacoes), so essa etapa troca - # de usuario via sudo -u, escrevendo o script num arquivo temporario pra evitar qualquer - # ambiguidade de escaping de aspas dentro do 'run:' do workflow. + # O checkout do runner (~/.cache/act/.../hostexecutor) so e legivel pelo root - o + # 'desenvolvimento' nem consegue entrar la. Por isso o rsync (que le de la e escreve em + # $DEPLOY_PATH) roda como root, igual sempre rodou. So DEPOIS de copiado a posse passa + # pro 'desenvolvimento' (chown), e dali em diante (npm ci, node --check, pm2) roda como + # 'desenvolvimento' via sudo -u - sem mudar o usuario do runner nem mexer em /opt em si + # (evita afetar outras automacoes deste servidor). DEPLOY_PATH="${PROD_DEPLOY_PATH:-/opt/sn-glpi-sync-new}" LOCK_FILE="/tmp/sn-glpi-sync-new.deploy.lock" - DEPLOY_SCRIPT="/tmp/sn-glpi-sync-new.deploy.sh" + POST_SCRIPT="/tmp/sn-glpi-sync-new.deploy-post.sh" mkdir -p "$DEPLOY_PATH" - - # "$DEPLOY_PATH.previous" e uma pasta nova, irma de $DEPLOY_PATH, direto dentro de /opt - - # o 'desenvolvimento' nao tem permissao de criar entradas novas ali (nem deveria, /opt e - # compartilhado com outras automacoes). O root pre-cria e ja entrega a posse antes de - # trocar de usuario, sem precisar abrir permissao de /opt em si. mkdir -p "$DEPLOY_PATH.previous" chown desenvolvimento:desenvolvimento "$DEPLOY_PATH.previous" - cat > "$DEPLOY_SCRIPT" <<'DEPLOY_EOF' + cat > "$POST_SCRIPT" <<'POST_EOF' #!/usr/bin/env bash set -euo pipefail - - if [ -d "$DEPLOY_PATH" ] && [ -n "$(ls -A "$DEPLOY_PATH" 2>/dev/null)" ]; then - rsync -a --delete "$DEPLOY_PATH"/ "$DEPLOY_PATH.previous"/ - fi - - rsync -az --delete \ - --exclude='.git/' \ - --exclude='.gitea/' \ - --exclude='.env*' \ - --exclude='node_modules/' \ - --exclude='logs/' \ - "$SRC_DIR"/ "$DEPLOY_PATH"/ - cd "$DEPLOY_PATH" - - test -f .env.production || { - echo "Missing $DEPLOY_PATH/.env.production" - exit 1 - } - - grep -q '^SERVICENOW_CAOA_TI_GROUP_ID=.\+' .env.production || { - echo "SERVICENOW_CAOA_TI_GROUP_ID must be set in $DEPLOY_PATH/.env.production" - exit 1 - } - npm ci --omit=dev - find . -path ./node_modules -prune -o -name '*.js' -print | xargs -n1 node --check - pm2 startOrRestart ecosystem.config.js --env production pm2 save pm2 list - DEPLOY_EOF - chmod +x "$DEPLOY_SCRIPT" + POST_EOF + chmod +x "$POST_SCRIPT" ( flock -n 9 || { echo "Another deploy is already running." exit 1 } - sudo -u desenvolvimento -H DEPLOY_PATH="$DEPLOY_PATH" SRC_DIR="$PWD" bash "$DEPLOY_SCRIPT" + + if [ -d "$DEPLOY_PATH" ] && [ -n "$(ls -A "$DEPLOY_PATH" 2>/dev/null)" ]; then + rsync -a --delete "$DEPLOY_PATH"/ "$DEPLOY_PATH.previous"/ + fi + + rsync -az --delete \ + --exclude='.git/' \ + --exclude='.gitea/' \ + --exclude='.env*' \ + --exclude='node_modules/' \ + --exclude='logs/' \ + ./ "$DEPLOY_PATH"/ + + chown -R desenvolvimento:desenvolvimento "$DEPLOY_PATH" + + cd "$DEPLOY_PATH" + + test -f .env.production || { + echo "Missing $DEPLOY_PATH/.env.production" + exit 1 + } + + grep -q '^SERVICENOW_CAOA_TI_GROUP_ID=.\+' .env.production || { + echo "SERVICENOW_CAOA_TI_GROUP_ID must be set in $DEPLOY_PATH/.env.production" + exit 1 + } + + sudo -u desenvolvimento -H DEPLOY_PATH="$DEPLOY_PATH" bash "$POST_SCRIPT" ) 9>"$LOCK_FILE" - rm -f "$DEPLOY_SCRIPT" + rm -f "$POST_SCRIPT" - name: Show sync logs if: always() -- 2.43.0