Repository navigation
build(deps-dev): bump @playwright/test from 1.62.1 to 1.63.0 #396
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Tests | |
| # `push: branches: ["main"]` saía daqui, e sair é o conserto. | |
| # | |
| # Este workflow e o `cloudflare-pages-deploy.yml` disparavam os DOIS em push | |
| # para a `main`, em paralelo, sem um único `needs` entre eles. Medido no push do | |
| # merge do #44: o deploy terminou às 03:13:17 e a suíte só às 03:17:37. São | |
| # 4m20 em que a página quebrada já estava no ar e o Playwright ainda estava | |
| # rodando. E não havia rede embaixo: `branches/main/protection` responde | |
| # "Branch not protected". | |
| # | |
| # Quem testa a `main` agora é o job `test` do `cloudflare-pages-deploy.yml`, | |
| # entre o `build` e o `deploy`, contra o MESMO artefato que vai ao ar. Aqui | |
| # ficou o portão do Pull Request, que constrói por conta própria: PR de fork não | |
| # recebe artefato, e o preview do revisor não deve esperar a suíte para aparecer. | |
| on: | |
| workflow_dispatch: | |
| pull_request: | |
| branches: ["main"] | |
| permissions: {} | |
| # PRs de forks/colaboradores externos exigem aprovação de um admin para rodar | |
| # (configuração de Actions do repositório). Este workflow não usa segredos. | |
| jobs: | |
| e2e: | |
| runs-on: ubuntu-latest | |
| name: Playwright (navegação e links) | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 | |
| with: | |
| persist-credentials: false | |
| # Histórico completo. Num clone raso o `git log <caminho>` não falha, | |
| # ele devolve a data do HEAD para todo mundo — e este job CONSTRÓI, | |
| # então qualquer data derivada do histórico (o `lastmod` do sitemap) | |
| # sairia igual nas 40 URLs, sem sinal nenhum de que está errada. | |
| fetch-depth: 0 | |
| - name: Setup Node | |
| uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7 | |
| with: | |
| node-version: "22" | |
| cache: npm | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Install Playwright (chromium) | |
| run: npx playwright install --with-deps chromium | |
| - name: Build (SSG) | |
| run: npm run build | |
| - name: Run tests | |
| run: npm test | |
| - name: Upload report on failure | |
| if: failure() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 | |
| with: | |
| name: playwright-report | |
| path: playwright-report/ | |
| retention-days: 5 | |
| # Os guardas em Python existiam no repositório e não rodavam em lugar nenhum: | |
| # `grep -rn guarda .github/ package.json` devolvia zero, e não há `.husky/`. | |
| # O `guarda-idioma.py` é NORMATIVO no `content/visualizers/README.md` §0, e a | |
| # única defesa contra a aula traduzida por engano era alguém lembrar de rodar | |
| # um script à mão. | |
| # | |
| # Job separado de propósito: são segundos, roda em paralelo com a suíte e não | |
| # entra no caminho crítico do PR. | |
| guardas: | |
| runs-on: ubuntu-latest | |
| name: Guardas (lint, idioma na tela e âncoras no artigo) | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 | |
| with: | |
| persist-credentials: false | |
| # Obrigatório aqui, não é preferência: o guarda de idioma compara | |
| # DUAS versões do mesmo arquivo, e o lado de lá é a base do PR. Num | |
| # clone raso o `git archive <base>` nem encontra o objeto. | |
| fetch-depth: 0 | |
| - name: Setup Node | |
| uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7 | |
| with: | |
| node-version: "22" | |
| cache: npm | |
| # O motor do guarda (`scripts/extrai-textos-tsx.mjs`) importa `typescript`, | |
| # que já é devDependency do projeto. | |
| - name: Install dependencies | |
| run: npm ci | |
| # PORTÃO. Reprova por ERRO; aviso aparece no log e não reprova. A | |
| # calibragem por regra, com o passivo medido, está no `eslint.config.mjs`. | |
| - name: ESLint | |
| run: npm run lint | |
| # PORTÃO. Reprova o PR se a suíte do próprio guarda reprovar. | |
| # | |
| # O arquivo chega no PR #45, que reescreveu o guarda inteiro (fachada | |
| # Python + analisador Node com a AST do TypeScript) e trouxe 11 fixtures. | |
| # Enquanto ele não mergear, este passo AVISA que não olhou nada, em vez de | |
| # passar calado — guarda que parece varredura e é opt-in silencioso já | |
| # custou caro neste repositório. | |
| - name: Suíte do próprio guarda de idioma | |
| run: | | |
| if [ ! -f scripts/testa-guarda-idioma.py ]; then | |
| echo "::warning title=guarda de idioma::scripts/testa-guarda-idioma.py não existe nesta ref. A suíte do guarda entra sozinha quando o PR #45 mergear. Até lá, este passo NÃO olhou nada." | |
| echo "⚠️ Suíte do guarda de idioma: **não rodou** (o arquivo chega no PR #45)." >> "$GITHUB_STEP_SUMMARY" | |
| exit 0 | |
| fi | |
| python3 scripts/testa-guarda-idioma.py | |
| # PORTÃO. O artigo é autocontido: nenhuma prosa em `content/topics/*.mdx` | |
| # pode exigir ter assistido à gravação («no encontro apareceu», «o Fulano | |
| # perguntou»). O link e o embed do vídeo continuam permitidos — eles são o | |
| # reforço que a regra promete, e nem moram no `.mdx`. | |
| # | |
| # Portão, e não relatório, porque aqui a resposta certa é sempre a mesma: | |
| # o corpus limpo. O guarda também sai 2 se uma exceção declarada parou de | |
| # casar qualquer linha, que é o jeito de uma exceção morta virar barulho | |
| # em vez de buraco. | |
| - name: Âncoras na gravação nos artigos | |
| run: npm run guarda:ancoras | |
| # RELATÓRIO, não portão — e a distinção é o ponto. | |
| # | |
| # O guarda responde "o texto de tela mudou entre estas duas versões?". Num | |
| # PR de conteúdo a resposta "mudou" é legítima metade das vezes, então sair | |
| # 1 aqui NÃO pode reprovar: um portão que acusa o trabalho normal é | |
| # desligado na semana seguinte. O que ele entrega é a lista do que entrou e | |
| # do que saiu da TELA, no resumo do job, que é justamente o que ninguém | |
| # consegue extrair de um diff de 4 mil linhas a olho. | |
| # | |
| # Sai 2 quando o próprio guarda não conseguiu rodar; isso aparece no log | |
| # como aviso, e continua sem reprovar. | |
| # Roda em PR e em `workflow_dispatch`: no PR o lado de lá é a base do PR, | |
| # no dispatch é o ponto em que a branch saiu da `main`. Dá para um | |
| # mantenedor disparar isto em qualquer branch e ver o que mexeu na tela. | |
| - name: O que mudou na tela dos visualizadores (relatório) | |
| env: | |
| BASE_SHA: ${{ github.event.pull_request.base.sha }} | |
| run: | | |
| # O guarda desta ref (3ª versão, a de regex) só aceita ARQUIVO dos | |
| # dois lados: apontar um diretório para ele estoura em | |
| # `IsADirectoryError` e sai 1, que é o mesmo código de "o texto | |
| # mudou". Ler traceback como achado é pior que não relatar, então o | |
| # relatório por diretório só liga com o guarda do #45, que tem esse | |
| # modo e o motor Node ao lado. | |
| if [ ! -f scripts/extrai-textos-tsx.mjs ]; then | |
| echo "::warning title=guarda de idioma::o relatório de texto de tela exige o guarda por diretório do PR #45. Nesta ref ele NÃO rodou." | |
| echo "⚠️ Relatório de texto de tela: **não rodou** (depende do guarda por diretório do PR #45)." >> "$GITHUB_STEP_SUMMARY" | |
| exit 0 | |
| fi | |
| base="${BASE_SHA:-$(git merge-base origin/main HEAD)}" | |
| echo "comparando com $base" | |
| rm -rf /tmp/antes && mkdir -p /tmp/antes | |
| git archive "$base" content/visualizers | tar -x -C /tmp/antes | |
| set +e | |
| saida=$(python3 scripts/guarda-idioma.py /tmp/antes/content/visualizers content/visualizers 2>&1) | |
| codigo=$? | |
| set -e | |
| echo "$saida" | |
| { | |
| echo "### Texto de tela dos visualizadores (guarda de idioma, informativo)" | |
| echo | |
| case "$codigo" in | |
| 0) echo "Nada mudou na tela. Se este PR renomeou identificador, é exatamente o resultado esperado." ;; | |
| 1) echo "Texto de tela **mudou**. Isso é legítimo em PR de conteúdo; num PR de _rename_ é defeito." ;; | |
| *) echo "O guarda **não conseguiu rodar** (código $codigo). Não reprova, mas também não olhou nada." ;; | |
| esac | |
| echo | |
| echo '```' | |
| echo "$saida" | |
| echo '```' | |
| } >> "$GITHUB_STEP_SUMMARY" |