Files
ESPDocs/.gitea/workflows/ci.yml
T
Lucas RayanandClaude Sonnet 5.5 111a81776c
Release / Plano (reaproveitar a imagem?) (push) Successful in 3s
Release / ci (push) Skipped
Release / Publica a imagem (linux/arm64) (push) Successful in 16s
ci: reuse the published image when its sources are unchanged
The release workflow hashes everything that goes into the image build and skips
CI and the build when the registry already has an image for that hash, so a docs
or tooling change, or a version tag, only re-points the tags. ci.yml no longer
runs on main by push: release.yml calls it when a build is needed, and running
both repeated the same suite on the same commit.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-30 12:22:46 -03:00

98 lines
3.4 KiB
YAML

name: CI
# Documentação e configuração de ferramenta não mudam nada que a suíte teste.
# Na main não roda por push: o release.yml é quem a chama, e só quando a imagem
# precisa ser reconstruída; rodar nos dois repetiria a mesma suíte no mesmo commit.
on:
pull_request:
paths-ignore: ['**.md', 'LICENSE', '.claude/**', '.superset/**']
push:
branches-ignore: [main]
paths-ignore: ['**.md', 'LICENSE', '.claude/**', '.superset/**']
workflow_call:
permissions:
contents: read
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
verificar:
name: Lint, design e build
runs-on: ubuntu-latest
timeout-minutes: 15
env:
# O Puppeteer só é usado em scripts locais (slides, capturas); não precisa do Chrome na CI.
PUPPETEER_SKIP_DOWNLOAD: "true"
NEXT_TELEMETRY_DISABLED: "1"
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
# Next.js guarda aqui o resultado da compilação anterior; sem isso, cada
# execução recompila todas as páginas do zero.
- name: Cache de build do Next
uses: actions/cache@v4
with:
path: .next/cache
key: next-${{ runner.arch }}-${{ hashFiles('package-lock.json') }}-${{ hashFiles('app/**', 'components/**', 'lib/**') }}
restore-keys: |
next-${{ runner.arch }}-${{ hashFiles('package-lock.json') }}-
next-${{ runner.arch }}-
- run: npm ci
# eslint + auditoria do design system (tokens, contraste AAA) + auditoria de páginas
- run: npm run check
- run: npm run build
# Trivy roda pela imagem oficial: o trivy-action clona o repositório do Trivy
# do mesmo servidor do workflow, que aqui é o Gitea, e não o GitHub.
# O workspace do job é um volume que o daemon não enxerga, então os arquivos
# entram no container com `docker cp` em vez de `-v`.
seguranca:
name: Trivy (dependências e segredos)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Repositório
run: |
cid=$(docker create --network host -v trivy-cache:/root/.cache/ -w /src aquasec/trivy:0.70.0 \
fs --scanners vuln,secret,misconfig --severity HIGH,CRITICAL --exit-code 1 .)
docker cp . "$cid:/src"
docker start -a "$cid"
status=$(docker inspect -f '{{.State.ExitCode}}' "$cid")
docker rm "$cid" >/dev/null
exit "$status"
imagem:
name: Imagem Docker
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# `docker build` simples: o cache de camadas fica no volume persistente do
# daemon do runner, e o buildx criaria um BuildKit novo a cada job.
- name: Build
run: docker build -t espdocs:ci .
- name: Trivy na imagem
run: |
docker run --rm --network host -v trivy-cache:/root/.cache/ -e DOCKER_HOST=tcp://127.0.0.1:2375 aquasec/trivy:0.70.0 \
image --severity HIGH,CRITICAL --exit-code 1 espdocs:ci
- name: A imagem sobe e responde
run: |
docker run -d --name espdocs-ci --network host -e PORT=3999 espdocs:ci
for i in $(seq 1 30); do
curl -fsS http://127.0.0.1:3999/ >/dev/null && ok=1 && break
sleep 2
done
docker logs espdocs-ci | tail -5
docker rm -f espdocs-ci >/dev/null
test "${ok:-0}" = 1