diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 7520acf..b355f43 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -5,10 +5,10 @@ name: CI # precisa ser reconstruída; rodar nos dois repetiria a mesma suíte no mesmo commit. on: pull_request: - paths-ignore: ['**.md', 'LICENSE', '.claude/**', '.superset/**'] + paths-ignore: ['**.md', 'LICENSE', '.claude/**', '.superset/**', '.wolf/**', 'scripts/release-notes.sh'] push: branches-ignore: [main] - paths-ignore: ['**.md', 'LICENSE', '.claude/**', '.superset/**'] + paths-ignore: ['**.md', 'LICENSE', '.claude/**', '.superset/**', '.wolf/**', 'scripts/release-notes.sh'] workflow_call: permissions: diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index d2e99b8..44d15a8 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -36,7 +36,7 @@ jobs: REPO: ${{ gitea.repository }} run: | inputs=$(git ls-tree -r HEAD \ - | awk -F'\t' '$2 !~ /^(\.gitea|\.github|\.claude|\.superset|docs)\// && $2 !~ /^(README.*|CLAUDE\.md|DESIGN\.md|LICENSE|\.gitignore)$/' \ + | awk -F'\t' '$2 !~ /^(\.gitea|\.github|\.claude|\.superset|docs)\// && $2 !~ /^(README.*|CLAUDE\.md|DESIGN\.md|LICENSE|\.gitignore|CHANGELOG\.md|scripts\/release-notes\.sh)$/' \ | sha256sum | cut -c1-16) ns="${REPO,,}" token=$(curl -fsS "https://$REGISTRY/v2/token?service=container_registry&scope=repository:$ns:pull" | jq -r .token) @@ -108,3 +108,30 @@ jobs: run: | tags=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< '${{ steps.meta.outputs.json }}') docker buildx imagetools create $tags "${{ needs.plano.outputs.image }}:inputs-${{ needs.plano.outputs.inputs }}" + + # Cria a entrada em "Releases" quando a execução é de uma tag v*. Roda depois + # de publicar a imagem, com as notas da seção do CHANGELOG.md. + release: + name: Cria a release no Gitea + needs: [plano, publicar] + # Explícito, como o publicar: o ci acima é pulado quando a imagem é + # reaproveitada, e o success() implícito pularia este job também. + if: ${{ !cancelled() && needs.publicar.result == 'success' && startsWith(gitea.ref, 'refs/tags/v') }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Release + env: + TAG: ${{ gitea.ref_name }} + TOKEN: ${{ gitea.token }} + API: ${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }} + IMAGE: ${{ needs.plano.outputs.image }} + run: | + scripts/release-notes.sh "$TAG" "$IMAGE" > notes.md + pre=false; case "$TAG" in *-*) pre=true ;; esac + jq -n --arg tag "$TAG" --arg name "ESPDocs ${TAG#v}" --rawfile body notes.md --argjson pre "$pre" \ + '{tag_name:$tag, name:$name, body:$body, prerelease:$pre}' > release.json + curl -fsS -X POST "$API/releases" -H "Authorization: token $TOKEN" \ + -H 'Content-Type: application/json' -d @release.json diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..311a7ad --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,64 @@ +# Registro de mudanças + +Tudo o que muda de relevante no ESPDocs está aqui. O formato segue o +[Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/) e o projeto segue o +[Versionamento Semântico](https://semver.org/lang/pt-BR/). + +## [Não lançado] + +## [1.0.0] - 2026-10-30 + +A primeira versão com tag. O trabalho anterior nunca foi tagueado, então esta +entrada resume tudo desde o primeiro commit, em 2025-10-21, até a imagem Docker. + +### Conteúdo + +- Documentação não oficial do ecossistema ESP32 em português: uma página por + série de chips, com especificações, conexões e consumo, e a página de comparação + lado a lado. +- Diagramas interativos de conexões e componentes, com o esquema de dados de + conexões padronizado. +- Frameworks documentados: ESP-IDF, Arduino, MicroPython, ESP-RainMaker e + ESP-Matter. +- Glossário técnico, página "Sobre" e chamadas para o catálogo. +- Catálogo de placas de desenvolvimento a partir de uma planilha do Google + (`/api/placas`), com filtros e cache de 10 minutos. +- Ferramenta de seleção: perguntas sobre o projeto (Ethernet, tela e outras) e + recomendação da série mais adequada. +- Novos modelos, incluindo o ESP32-H4, e a contagem de componentes e de drivers + (interface, conectividade e áudio) ampliada. + +### Interface e acessibilidade + +- Tema escuro e redesenho das páginas internas no novo sistema de design, com + contraste AAA e auditoria automática de temas e de páginas (`npm run check`). +- Identidade nova: logo, ícones, `manifest` e imagens Open Graph. +- SEO: mapa do site, dados estruturados, trilhas de navegação e favicons. +- Exportação do conteúdo em PDF CMYK e dos slides de treinamento em PDF 16:9, + gerados com Puppeteer (scripts locais). + +### Dados corrigidos + +- Revisão dos dados das séries contra os datasheets oficiais da Espressif: + consumo, temperatura, ADC, PSRAM, memória LP, CAN FD, frequências e versões de + Secure Boot do ESP32, S2, S3, C2, C3, C5, C6, C61, H2, H4, P4 e S31. + +### Implantação + +- Imagem Docker (`node:22-alpine`, build `standalone`, usuário sem privilégio, + `HEALTHCHECK`), pronta para o servidor Oracle, publicada para `linux/arm64` em + `git.lucasrguerra.dev.br/lucasrguerra/espdocs`. A variável `NEXT_OUTPUT=standalone` + liga o empacotamento só dentro da imagem; fora dela o build continua o mesmo + para o `pm2` (`start.config.js`, porta 3001). +- O código passou para o Gitea, com CI em `.gitea/workflows`: lint, auditorias, + Trivy no repositório e na imagem, e teste de que a imagem sobe e responde. O + Release reaproveita a imagem quando nada do que a compõe mudou. + +### Segurança + +- `next` 15.5.28, que corrige a execução remota de código sem autenticação na + otimização de imagens (GHSA-2464-fhr4-w9xw), e `postcss` fixado acima da cópia + embutida no `next`. + +[Não lançado]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/compare/v1.0.0...HEAD +[1.0.0]: https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs/releases/tag/v1.0.0 diff --git a/README.md b/README.md index 048252a..50c2b99 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Documentação não oficial completa do ecossistema ESP32 em português brasilei ```bash # Clone o repositório -git clone https://github.com/lucasrguerra/ESPDocs.git +git clone https://git.lucasrguerra.dev.br/lucasrguerra/ESPDocs.git # Entre no diretório cd ESPDocs @@ -121,7 +121,7 @@ Este é um projeto de documentação não oficial e independente. Não possui ne **Lucas Rayan Guerra** - Website: [Ciência Embarcada](https://cienciaembarcada.com.br) -- GitHub: [@lucasrguerra](https://github.com/lucasrguerra) +- Gitea: [@lucasrguerra](https://git.lucasrguerra.dev.br/lucasrguerra) ## 🤝 Contribuindo diff --git a/scripts/release-notes.sh b/scripts/release-notes.sh new file mode 100755 index 0000000..fec8a71 --- /dev/null +++ b/scripts/release-notes.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# Imprime as notas de uma release: a imagem publicada e a seção do CHANGELOG.md +# daquela versão (ou o log de commits desde a tag anterior, se não houver seção). +# +# scripts/release-notes.sh v1.2.3 git.exemplo.com/dono/projeto +set -euo pipefail + +tag=${1:?uso: release-notes.sh } +image=${2:?uso: release-notes.sh } +version=${tag#v} + +echo "## Imagem" +echo +echo '```' +echo "$image:$version" +echo '```' +echo + +section="" +if [ -f CHANGELOG.md ]; then + section=$(awk -v head="## [$version]" ' + index($0, head) == 1 { found = 1; next } + found && /^## \[/ { exit } + found && /^\[[^]]+\]: / { next } + found { print } + ' CHANGELOG.md) +fi + +if [ -n "$(printf '%s' "$section" | tr -d '[:space:]')" ]; then + printf '%s\n' "$section" +else + previous=$(git describe --tags --abbrev=0 "$tag^" 2>/dev/null || true) + echo "## Mudanças${previous:+ desde $previous}" + echo + git log --no-merges --format='- %s (%h)' "${previous:+$previous..}$tag" +fi