App redeploya em loop a cada tick do cron

Sintoma

O runner fetch reporta a app como disponível para sempre, mesmo logo depois de um deploy bem-sucedido, e o cron fetch --deploy redeploya a cada tick (rebuild da imagem + restart do container, de 5 em 5 minutos na configuração padrão):

↑ │ minha-app │ dist │ v0.2.1 │ 9b1c562 │ v0.2.1 │ - │ disponível

Repare que REPO VER e DEPLOYED são a mesma versão — é o commit que está diferente, não a versão. No deploy aparece o aviso:

WARN phase_8: nenhum GitHub token disponível para "minha-app";
     pulando push de .runner/secrets.enc.

Causa

Com source: { type: dist }, o Runner commita .deploy.yml + .runner/secrets.enc na branch dist ao fim do deploy e dá push. Sem token do GitHub o commit fica só local: o pull/ passa a ter um commit a mais que o remoto, o fetch compara os dois e conclui "tem coisa nova", e o deploy seguinte cria outro commit local — o ciclo nunca fecha.

É comum em app registrada sem --token que só depois passou a usar source: type: dist.

Diagnóstico

# state x remoto: local_commit diferente de remote_commit com a versão igual
grep -E "local_commit|remote_commit|status" /opt/runner/state/<app>.yml

# o commit extra é do próprio Runner
git -C /data/apps/<app>/pull log --oneline -2
# 36db3ef chore: update encrypted secrets   <- local, sem push
# 9b1c562 release: v0.2.1

runner tokens test <app>    # "no token" confirma a causa

Correção

# 1. registrar o token (PAT com escopo repo)
runner edit <app> --token ghp_xxx
runner tokens test <app>          # valida via API do GitHub

# 2. publicar o commit pendente
runner secrets push <app>

# 3. alinhar state e remoto
runner fetch <app> -F             # deve voltar a "atualizado"

Confirme que fechou olhando o deploy_count ficar parado por mais de um tick do cron:

grep -E "deploy_count|status" /opt/runner/state/<app>.yml

Estancar antes de ter o token

Se o token não estiver à mão, pause a app para o cron parar de redeployar. Deploy manual continua funcionando normalmente:

runner pause <app>
# ... quando tiver o token e rodar a correção acima:
runner unpause <app>

Prevenção

Registre a app já com token quando ela for usar source: type: dist:

runner add --repo usuario/minha-app --token ghp_xxx --ckey "..."

Ver runner edit e pause/unpause.

By Borlot.com.br on 29/07/2026