feat(ci): add automated Lighthouse audit pipeline #2
@@ -1,2 +1,4 @@
|
||||
NODE_VERSION=24
|
||||
CADDY_VERSION=2.10.2
|
||||
CADDY_VERSION=2.10.2
|
||||
LHCI_VERSION=0.15.x
|
||||
ZENIKA_VERSION=124-with-node
|
||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -5,6 +5,7 @@ dist/
|
||||
|
||||
# dependencies
|
||||
node_modules/
|
||||
.pnpm-store/
|
||||
|
||||
# logs
|
||||
npm-debug.log*
|
||||
@@ -22,3 +23,9 @@ pnpm-debug.log*
|
||||
|
||||
# jetbrains setting folder
|
||||
.idea/
|
||||
|
||||
# vscode
|
||||
.vscode/
|
||||
|
||||
# Lighthouse CI reports
|
||||
.lighthouseci/
|
||||
|
||||
23
.lighthouserc.cjs
Normal file
23
.lighthouserc.cjs
Normal file
@@ -0,0 +1,23 @@
|
||||
module.exports = {
|
||||
ci: {
|
||||
collect: {
|
||||
staticDistDir: '/app/dist',
|
||||
settings: {
|
||||
chromeFlags: '--no-sandbox --disable-setuid-sandbox --headless=new --disable-gpu --disable-dev-shm-usage',
|
||||
},
|
||||
numberOfRuns: 1
|
||||
},
|
||||
assert: {
|
||||
assertions: {
|
||||
'categories:performance': ['error', {minScore: 0.9}],
|
||||
'categories:accessibility': ['error', {minScore: 0.9}],
|
||||
'categories:best-practices': ['error', {minScore: 0.9}],
|
||||
'categories:seo': ['error', {minScore: 0.9}],
|
||||
},
|
||||
},
|
||||
upload: {
|
||||
target: 'filesystem',
|
||||
outputDir: './.lighthouseci', // C'est ici que Jenkins ira chercher les fichiers
|
||||
},
|
||||
},
|
||||
};
|
||||
4
.vscode/extensions.json
vendored
4
.vscode/extensions.json
vendored
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"recommendations": ["astro-build.astro-vscode", "unifiedjs.vscode-mdx"],
|
||||
"unwantedRecommendations": []
|
||||
}
|
||||
11
.vscode/launch.json
vendored
11
.vscode/launch.json
vendored
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"command": "./node_modules/.bin/astro dev",
|
||||
"name": "Development server",
|
||||
"request": "launch",
|
||||
"type": "node-terminal"
|
||||
}
|
||||
]
|
||||
}
|
||||
43
Jenkinsfile
vendored
43
Jenkinsfile
vendored
@@ -2,6 +2,7 @@ pipeline {
|
||||
agent any
|
||||
environment {
|
||||
DOCKER_HOST = "unix:///var/run/docker.sock"
|
||||
APP_VERSION = "${env.BRANCH_NAME}-${env.BUILD_NUMBER}"
|
||||
}
|
||||
stages {
|
||||
stage('Build') {
|
||||
@@ -9,12 +10,41 @@ pipeline {
|
||||
// Get Caddy version
|
||||
sh "cp .env.dist .env"
|
||||
// Push portfolio version
|
||||
sh "echo '\nPORTFOLIO_VERSION=${env.BRANCH_NAME}-${env.BUILD_NUMBER}' >> .env"
|
||||
sh "echo '\nPORTFOLIO_VERSION=${env.APP_VERSION}' >> .env"
|
||||
|
||||
echo "Building new portfolio version..."
|
||||
sh "docker compose build"
|
||||
}
|
||||
}
|
||||
stage('Lighthouse Audit') {
|
||||
steps {
|
||||
|
||||
// Create volumes but no run with safety
|
||||
sh "docker rm -f audit-tmp lighthouse-audit || true"
|
||||
sh "docker compose --profile audit create lighthouse-audit"
|
||||
|
||||
// Extract astro data from image to tmp-dist
|
||||
sh "docker create --name audit-tmp portfolio:${env.APP_VERSION}"
|
||||
sh "mkdir -p ./tmp-dist"
|
||||
sh "docker cp audit-tmp:/usr/share/caddy/. ./tmp-dist"
|
||||
sh "docker rm -f audit-tmp"
|
||||
|
||||
// Inject data from tmp-dist and config to audit container
|
||||
sh "docker cp ./tmp-dist/. lighthouse-audit:/app/dist/"
|
||||
sh "docker cp .lighthouserc.cjs lighthouse-audit:/app/dist/audit-config.cjs"
|
||||
|
||||
// Now run
|
||||
sh "docker compose --profile audit run lighthouse-audit"
|
||||
|
||||
// Get reports
|
||||
sh "mkdir -p ./.lighthouseci"
|
||||
sh "docker cp lighthouse-audit:/app/.lighthouseci/. ./.lighthouseci/"
|
||||
|
||||
// Clean
|
||||
sh "docker rm -f lighthouse-audit"
|
||||
sh "rm -rf ./tmp-dist"
|
||||
}
|
||||
}
|
||||
stage('Deploy') {
|
||||
// Deploy only master branch
|
||||
when {
|
||||
@@ -35,7 +65,16 @@ pipeline {
|
||||
}
|
||||
post {
|
||||
always {
|
||||
echo "Clean unused image..."
|
||||
echo "Publish Lighthouse audit..."
|
||||
publishHTML([
|
||||
allowMissing: true,
|
||||
alwaysLinkToLastBuild: true,
|
||||
keepAll: false,
|
||||
reportDir: '.lighthouseci',
|
||||
reportFiles: '*.html',
|
||||
reportName: 'Lighthouse Report'
|
||||
])
|
||||
echo "Clean unused image"
|
||||
sh "docker image prune -f"
|
||||
}
|
||||
success { echo "Success !" }
|
||||
|
||||
@@ -11,6 +11,24 @@ services:
|
||||
networks:
|
||||
- reverse-proxy
|
||||
|
||||
lighthouse-audit:
|
||||
profiles:
|
||||
- audit
|
||||
image: zenika/alpine-chrome:${ZENIKA_VERSION}
|
||||
container_name: lighthouse-audit
|
||||
user: "0:0"
|
||||
volumes:
|
||||
- audit_dist:/app/dist
|
||||
- audit_reports:/app/.lighthouseci
|
||||
environment:
|
||||
- CHROME_PATH=/usr/bin/chromium-browser
|
||||
working_dir: /app
|
||||
command: npx @lhci/cli@${LHCI_VERSION} collect --config=/app/dist/audit-config.cjs
|
||||
|
||||
volumes:
|
||||
audit_dist:
|
||||
audit_reports:
|
||||
|
||||
networks:
|
||||
reverse-proxy:
|
||||
external: true
|
||||
14
local-lighthouse.sh
Executable file
14
local-lighthouse.sh
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
mkdir -p ./.lighthouseci
|
||||
|
||||
docker run --rm \
|
||||
--user 0:0 \
|
||||
-v ./dist:/app/dist \
|
||||
-v ./.lighthouserc.cjs:/app/.lighthouserc.cjs \
|
||||
-v ./.lighthouseci:/app/.lighthouseci \
|
||||
-w /app \
|
||||
-e CHROME_PATH=/usr/bin/chromium-browser \
|
||||
zenika/alpine-chrome:with-node \
|
||||
npx @lhci/cli@0.15.x collect \
|
||||
--config=/app/.lighthouserc.cjs
|
||||
Reference in New Issue
Block a user