mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-31 20:32:20 +03:00
Pacote 2+3-ci do plano mestre testes+CI (aprovado 2026-07-04). O CI pesado rodava a suite unit 4x por sync da release-PR (95 jobs, 208 min-maquina) e o ciclo v3.8.44 disparou 123 desses runs (88 cancelados, 0 uteis) porque a release-PR viva fica aberta o ciclo inteiro. - D2: matrizes Node 24/26 (build + 8 jobs de teste, ~28% do custo por run) saem do per-sync e viram .github/workflows/nightly-compat.yml (diario, fail-fast off, resolve a release ativa como o nightly-release-green, abre issue de tracking em falha). ci.yml/ci-summary limpos das referencias. - D3: a matrix Coverage Shard x8 (~18% do custo) e eliminada — o job test-unit roda os MESMOS shards sob c8/NODE_V8_COVERAGE e sobe os artifacts coverage-shard-N; o job de merge (test-coverage) so repontou needs (padrao do CI do nodejs/node). timeout test-unit 15->25min pelo overhead de instrumentacao. - D4: a matrix i18n de ~40 jobs de <1min (saturava sozinha os 20 slots de concorrencia da conta Free) vira 1 job que itera os idiomas com ::group:: por idioma e artifact unico com resultados nomeados por idioma (antes 40 result.txt colidiam no merge-multiple do ci-summary). - P3: jobs pesados pulam pull_requests DRAFT (predicado em 10 jobs-raiz; o resto pula pela cadeia de needs; ci-summary segue rodando como sinal unico) — a skill /generate-release ja abre a release-PR viva como draft e flipa ready no 0a.0a (commit eb04fc5 no repo .agents/skills). - C5 (CodeQL schedule) NAO incluido: bloqueado na acao do dono Settings -> CodeQL Default->Advanced (documentado no proprio codeql.yml). Validacao: js-yaml parse ok; check:workflows zizmor 156 < baseline 159 (ratchet verde); validacao de execucao = workflow_dispatch deste ci.yml neste branch ate package-artifact + electron-package-smoke verdes (registrada no PR).
127 lines
4.4 KiB
YAML
127 lines
4.4 KiB
YAML
name: Nightly Node Compat
|
||
|
||
# Plano mestre testes+CI (Eixo D2, aprovado 2026-07-04): as matrizes de compatibilidade
|
||
# Node 24/26 custavam ~28% de CADA run do CI pesado (2 execuções completas da suíte por
|
||
# sync da release-PR) para pegar uma classe de quebra que raramente nasce num PR típico.
|
||
# Elas rodam aqui 1×/dia contra o tip da release ativa (mesmo alvo do nightly-release-green)
|
||
# e continuam obrigatórias no gate de release via workflow_dispatch do ci.yml se preciso.
|
||
# fail-fast desligado: numa quebra queremos saber TODAS as versões afetadas de uma vez.
|
||
|
||
on:
|
||
schedule:
|
||
- cron: "47 6 * * *" # 06:47 UTC diário — slot distinto dos demais nightlies
|
||
workflow_dispatch:
|
||
inputs:
|
||
branch:
|
||
description: "Branch to validate (default: highest release/vX.Y.Z)"
|
||
required: false
|
||
type: string
|
||
|
||
permissions:
|
||
contents: read
|
||
issues: write
|
||
|
||
concurrency:
|
||
group: nightly-compat
|
||
cancel-in-progress: true
|
||
|
||
jobs:
|
||
resolve-branch:
|
||
name: Resolve active release branch
|
||
runs-on: ubuntu-latest
|
||
outputs:
|
||
target: ${{ steps.branch.outputs.target }}
|
||
steps:
|
||
- uses: actions/checkout@v7
|
||
with:
|
||
fetch-depth: 0
|
||
persist-credentials: false
|
||
- name: Resolve active release branch
|
||
id: branch
|
||
env:
|
||
INPUT_BRANCH: ${{ github.event.inputs.branch }}
|
||
run: |
|
||
set -euo pipefail
|
||
if [ -n "${INPUT_BRANCH:-}" ]; then
|
||
TARGET="$INPUT_BRANCH"
|
||
else
|
||
TARGET=$(git for-each-ref --format='%(refname:short)' 'refs/remotes/origin/release/v*' \
|
||
| sed 's#origin/##' \
|
||
| sort -t/ -k2 -V \
|
||
| tail -1)
|
||
fi
|
||
case "$TARGET" in
|
||
release/v[0-9]*.[0-9]*.[0-9]*) ;;
|
||
*) echo "Refusing non-canonical branch name: $TARGET"; exit 1 ;;
|
||
esac
|
||
echo "target=$TARGET" >> "$GITHUB_OUTPUT"
|
||
|
||
compat-build-26:
|
||
name: Node 26 Compatibility Build
|
||
runs-on: ubuntu-latest
|
||
timeout-minutes: 25
|
||
needs: resolve-branch
|
||
steps:
|
||
- uses: actions/checkout@v7
|
||
with:
|
||
ref: ${{ needs.resolve-branch.outputs.target }}
|
||
persist-credentials: false
|
||
- uses: actions/setup-node@v6
|
||
with:
|
||
node-version: "26"
|
||
cache: npm
|
||
- uses: ./.github/actions/npm-ci-retry
|
||
- run: npm run build
|
||
|
||
compat-tests:
|
||
name: Node ${{ matrix.node }} Compat Tests (${{ matrix.shard }}/4)
|
||
runs-on: ubuntu-latest
|
||
timeout-minutes: 25
|
||
needs: resolve-branch
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
node: [24, 26]
|
||
shard: [1, 2, 3, 4]
|
||
env:
|
||
JWT_SECRET: ci-nightly-secret-with-sufficient-length-for-validation
|
||
API_KEY_SECRET: ci-nightly-api-key-secret-long
|
||
DISABLE_SQLITE_AUTO_BACKUP: "true"
|
||
TEST_SHARD: ${{ matrix.shard }}/4
|
||
steps:
|
||
- uses: actions/checkout@v7
|
||
with:
|
||
ref: ${{ needs.resolve-branch.outputs.target }}
|
||
persist-credentials: false
|
||
- uses: actions/setup-node@v6
|
||
with:
|
||
node-version: ${{ matrix.node }}
|
||
cache: npm
|
||
- uses: ./.github/actions/npm-ci-retry
|
||
- run: npm run check:node-runtime
|
||
- run: npm run test:unit:ci:shard
|
||
|
||
report:
|
||
name: Open / update tracking issue on failure
|
||
runs-on: ubuntu-latest
|
||
if: ${{ !cancelled() && (needs.compat-tests.result == 'failure' || needs.compat-build-26.result == 'failure') }}
|
||
needs: [resolve-branch, compat-build-26, compat-tests]
|
||
permissions:
|
||
issues: write
|
||
steps:
|
||
- name: Open or update issue
|
||
env:
|
||
GH_TOKEN: ${{ github.token }}
|
||
TARGET: ${{ needs.resolve-branch.outputs.target }}
|
||
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||
run: |
|
||
set -euo pipefail
|
||
TITLE="🌙 nightly-compat: Node 24/26 failures on $TARGET"
|
||
EXISTING=$(gh issue list --repo "$GITHUB_REPOSITORY" --state open --search "$TITLE in:title" --json number --jq '.[0].number')
|
||
BODY="Nightly Node-compat run failed on \`$TARGET\`: $RUN_URL — triage which Node version/shard broke (fail-fast off, all versions reported)."
|
||
if [ -n "$EXISTING" ]; then
|
||
gh issue comment "$EXISTING" --repo "$GITHUB_REPOSITORY" --body "$BODY"
|
||
else
|
||
gh issue create --repo "$GITHUB_REPOSITORY" --title "$TITLE" --body "$BODY"
|
||
fi
|