Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
192 changes: 132 additions & 60 deletions .github/workflows/develop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,168 +8,240 @@ on:
branches:
- develop

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
# ----------------------------------------------------------------
# Job 1 — Tests unitaires et intégration (Vitest jsdom)
# Job 1 — Lint (ESLint, non destructif)
# ----------------------------------------------------------------
unit-and-integration:
name: Tests Vitest (jsdom) — Node 24
lint:
name: Lint — Node 24
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7

- name: Setup Node 24
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: '24'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Run tests
run: NODE_ENV=test npm test
- name: Lint check
run: npm run lint:check

# ----------------------------------------------------------------
# Job 2 — Tests web components en browser mode (Vitest + Playwright)
# Job 2 — TypeScript strict
# ----------------------------------------------------------------
web-components:
name: Web components (browser mode) — Node 24
typecheck:
name: TypeScript strict — Node 24
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7

- name: Setup Node 24
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: '24'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Install Playwright chromium
run: npx playwright install chromium --with-deps

- name: Run web component tests
run: npm run test:components
- name: TypeScript strict check
run: npx tsc --noEmit

# ----------------------------------------------------------------
# Job 3 — Tests E2E Playwright
# Job 3 — Vite build (production)
# ----------------------------------------------------------------
e2e:
name: E2E Playwright — Node 24
build-check:
name: Vite build — Node 24
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7

- name: Setup Node 24
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: '24'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Install Playwright chromium
run: npx playwright install chromium --with-deps

- name: Run E2E tests
run: npm run test:e2e
- name: Build (production)
run: npm run build

# ----------------------------------------------------------------
# Job 4 — Coverage
# Job 4 — Coverage (jsdom + browser + merge) : seul job qui lance les
# suites Vitest. Remplace les anciens jobs unit-and-integration et
# web-components pour ne plus exécuter chaque suite 2× par run (étape 16).
# ----------------------------------------------------------------
coverage:
name: Coverage check — Node 24
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7

- name: Setup Node 24
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: '24'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Install Playwright chromium
run: npx playwright install chromium --with-deps
- name: Get Playwright version
id: playwright-version
run: echo "version=$(node -p "require('./package-lock.json').packages['node_modules/@playwright/test'].version")" >> "$GITHUB_OUTPUT"

- name: Cache Playwright browsers
id: playwright-cache
uses: actions/cache@v6
with:
path: ~/.cache/ms-playwright
key: playwright-${{ runner.os }}-${{ steps.playwright-version.outputs.version }}

- name: Install Playwright chromium (cold)
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: npx playwright install --with-deps chromium

- name: Install Playwright OS dependencies (cache hit)
if: steps.playwright-cache.outputs.cache-hit == 'true'
run: npx playwright install-deps chromium

- name: Run coverage (thresholds enforced in vitest.config.ts)
- name: Run coverage (jsdom + browser + merge — thresholds enforced in vitest.config.ts)
run: NODE_ENV=test npm run coverage

# ----------------------------------------------------------------
# Job 5 — Vite build (production)
# Job 5 — Tests E2E Playwright
# ----------------------------------------------------------------
build-check:
name: Vite build — Node 24
e2e:
name: E2E Playwright — Node 24
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7

- name: Setup Node 24
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: '24'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Build (production)
run: npm run build
- name: Get Playwright version
id: playwright-version
run: echo "version=$(node -p "require('./package-lock.json').packages['node_modules/@playwright/test'].version")" >> "$GITHUB_OUTPUT"

- name: Cache Playwright browsers
id: playwright-cache
uses: actions/cache@v6
with:
path: ~/.cache/ms-playwright
key: playwright-${{ runner.os }}-${{ steps.playwright-version.outputs.version }}

- name: Install Playwright chromium (cold)
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: npx playwright install --with-deps chromium

- name: Install Playwright OS dependencies (cache hit)
if: steps.playwright-cache.outputs.cache-hit == 'true'
run: npx playwright install-deps chromium

- name: Run E2E tests
run: npm run test:e2e

# ----------------------------------------------------------------
# Job 6 — TypeScript strict
# Job 6 — Smoke test du serveur Express
# ----------------------------------------------------------------
typecheck:
name: TypeScript strict — Node 24
server-smoke:
name: Server smoke test — Node 24
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7

- name: Setup Node 24
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: '24'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: TypeScript strict check
run: npx tsc --noEmit
- name: Start server in background
run: npm run smoke:server &

- name: Wait for server on port 3001
run: npx wait-on tcp:3001 --timeout 30000

- name: Check server responds (socket.io handshake)
run: |
status=$(curl -s -o /tmp/smoke.out -w '%{http_code}' http://localhost:3001/socket.io/)
echo "HTTP status: $status"
cat /tmp/smoke.out
echo
if [ "$status" != "400" ] || ! grep -q "Transport unknown" /tmp/smoke.out; then
echo "::error::Réponse inattendue de /socket.io/ (status=$status) — le serveur ne répond pas correctement"
exit 1
fi

# ----------------------------------------------------------------
# Job 7 — Smoke test du serveur Express
# Job 7 — Déploiement de la documentation VitePress (GitHub Pages)
# Uniquement sur push develop, et seulement si toute la CI est verte.
# ----------------------------------------------------------------
server-smoke:
name: Server smoke test — Node 24
docs-deploy:
name: Deploy docs — GitHub Pages
if: github.event_name == 'push' && github.ref == 'refs/heads/develop'
needs: [lint, typecheck, build-check, coverage, e2e, server-smoke]
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: read
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7

- name: Setup Node 24
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: '24'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Start server in background
run: npm run smoke:server &
- name: Build docs (API reference + VitePress)
run: npm run docs:build

- name: Wait for server on port 3001
run: npx wait-on tcp:3001 --timeout 30000
- name: Configure GitHub Pages
uses: actions/configure-pages@v6

- name: Check server responds
run: curl -sf http://localhost:3001/ || curl -sf http://localhost:3001/socket.io/ || true
- name: Upload docs artifact
uses: actions/upload-pages-artifact@v5
with:
path: docs-dist

- name: Server started successfully
run: echo "Server smoke test passed — port 3001 is open"
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v5
76 changes: 76 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: Release

on:
push:
tags:
- 'v*'

permissions:
contents: read

jobs:
# ----------------------------------------------------------------
# Job 1 — Build + test avant toute release (pas de tag cassé)
# ----------------------------------------------------------------
build-and-test:
name: Build + test — Node 24
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v7

- name: Setup Node 24
uses: actions/setup-node@v6
with:
node-version: '24'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: TypeScript strict check
run: npx tsc --noEmit

- name: Lint check
run: npm run lint:check

- name: Run tests
run: NODE_ENV=test npm test

- name: Build (production)
run: npm run build

# ----------------------------------------------------------------
# Job 2 — Release GitHub avec notes tirées du CHANGELOG (pas de publish npm,
# le projet n'est pas une lib — cf. étape 02)
# ----------------------------------------------------------------
release:
name: Create GitHub release
needs: build-and-test
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: write
steps:
- uses: actions/checkout@v7

- name: Extract CHANGELOG section for this tag
id: changelog
run: |
version="${GITHUB_REF_NAME#v}"
awk -v ver="$version" '
$0 ~ "^## \\[" ver "\\]" { found=1; next }
found && $0 ~ "^## \\[" { exit }
found { print }
' CHANGELOG.md > /tmp/release-notes.md
echo "notes_found=$([ -s /tmp/release-notes.md ] && echo true || echo false)" >> "$GITHUB_OUTPUT"

- name: Create release
env:
GH_TOKEN: ${{ github.token }}
run: |
if [ "${{ steps.changelog.outputs.notes_found }}" = "true" ]; then
gh release create "$GITHUB_REF_NAME" --title "$GITHUB_REF_NAME" --notes-file /tmp/release-notes.md
else
gh release create "$GITHUB_REF_NAME" --title "$GITHUB_REF_NAME" --generate-notes
fi
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ showcase/resources/tc-component/

# Documentation
docs-dist
docs-sources/developers/code/parts/
docs-sources/developers/code/
docs-sources/.vitepress/cache/

# Jetbrains
Expand Down
Loading