-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feature/IVYPORTAL-17377-Create-pipeline-to-run-Lighthouse-report
- Loading branch information
1 parent
0a3dbf3
commit cfd80c5
Showing
1 changed file
with
177 additions
and
41 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,87 +1,223 @@ | ||
name: lighthouse-report | ||
run-name: Create Lighthouse Audit | ||
|
||
on: | ||
push: | ||
branches: [feature/IVYPORTAL-17377-Create-pipeline-to-run-Lighthouse-report] | ||
branches: | ||
- feature/IVYPORTAL-17377-Create-pipeline-to-run-Lighthouse-report | ||
pull_request: | ||
branches: [master] | ||
branches: | ||
- master | ||
|
||
env: | ||
ENGINE_DIR: $GITHUB_WORKSPACE/ivy/engine/nightly | ||
ENGINE_URL: https://developer.axonivy.com/permalink/nightly/axonivy-engine.zip | ||
WAIT_TIME: 180 | ||
SERVER_URL: http://localhost:8080 | ||
REPORT_PATH: $GITHUB_WORKSPACE/lighthouse-report | ||
REPORT_DIR: $GITHUB_WORKSPACE/lighthouse-reports | ||
|
||
jobs: | ||
setup: | ||
runs-on: ubuntu-latest | ||
outputs: | ||
engine_dir: ${{ env.ENGINE_DIR }} | ||
steps: | ||
- uses: actions/checkout@v3 | ||
- uses: actions/setup-java@v3 | ||
- name: Checkout Code | ||
uses: actions/checkout@v3 | ||
|
||
- name: Set Up Java | ||
uses: actions/setup-java@v3 | ||
with: | ||
distribution: 'temurin' | ||
java-version: '21' | ||
- uses: stCarolas/setup-maven@v5 | ||
|
||
- name: Set up Maven | ||
uses: stCarolas/setup-maven@v5 | ||
with: | ||
maven-version: 3.9.8 | ||
- name: Setup Engine | ||
|
||
- name: Export Environment Variables | ||
run: | | ||
echo "export IVY_JAVA_HOME=$JAVA_HOME" >> $GITHUB_ENV | ||
echo "export JAVA_HOME=$JAVA_HOME" >> $GITHUB_ENV | ||
echo "export PATH=$JAVA_HOME/bin:$PATH" >> $GITHUB_ENV | ||
- name: Set Up and Verify Directories | ||
run: | | ||
ENGINE_DIR="${GITHUB_WORKSPACE}/ivy/engine/nightly" | ||
mkdir -p $ENGINE_DIR | ||
sudo chown -R $USER:$USER $ENGINE_DIR | ||
ls -la $ENGINE_DIR | ||
echo "ENGINE_DIR=$ENGINE_DIR" >> $GITHUB_ENV | ||
- name: Download Engine | ||
run: | | ||
cd $ENGINE_DIR | ||
wget $ENGINE_URL -O engine.zip | ||
unzip -o engine.zip | ||
chmod +x bin/AxonIvyEngine | ||
wget $ENGINE_URL -O axonivy-engine.zip | ||
unzip -o axonivy-engine.zip -d . | ||
rm axonivy-engine.zip | ||
ls -la | ||
- name: Verify Engine Directory | ||
run: | | ||
if [ ! -d "$ENGINE_DIR" ]; then | ||
echo "Engine directory does not exist" | ||
exit 1 | ||
fi | ||
ls -la $ENGINE_DIR | ||
ls -la $ENGINE_DIR/bin || true | ||
build: | ||
needs: setup | ||
runs-on: ubuntu-latest | ||
needs: setup | ||
steps: | ||
- name: Build Modules | ||
- name: Start Axon Ivy Engine | ||
run: | | ||
cd "${ENGINE_DIR}/bin" | ||
chmod +x ./AxonIvyEngine | ||
nohup ./AxonIvyEngine > engine.log 2>&1 & | ||
echo $! > engine.pid | ||
MAX_ATTEMPTS=180 | ||
ATTEMPT=0 | ||
echo "Waiting for engine to start..." | ||
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do | ||
if curl -s http://localhost:8080/favicon.ico > /dev/null; then | ||
echo "Engine started successfully" | ||
cat engine.log | ||
break | ||
fi | ||
ATTEMPT=$((ATTEMPT+1)) | ||
sleep 1 | ||
done | ||
if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then | ||
echo "Engine failed to start" | ||
cat engine.log | ||
exit 1 | ||
fi | ||
env: | ||
IVY_JAVA_HOME: ${{ env.JAVA_HOME }} | ||
JAVA_HOME: ${{ env.JAVA_HOME }} | ||
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${{ env.JAVA_HOME }}/bin:$PATH | ||
|
||
- name: Build Portal Modules | ||
run: | | ||
modules=( | ||
"AxonIvyPortal/portal-components" | ||
"AxonIvyPortal/portal" | ||
"AxonIvyPortal/PortalKitTestHelper" | ||
"Showcase/portal-user-examples" | ||
"Showcase/portal-developer-examples" | ||
"Showcase/InternalSupport" | ||
"Showcase/portal-components-examples" | ||
"AxonIvyPortal/PortalApp" | ||
"Showcase/portal-demo-app" | ||
) | ||
for module in "${modules[@]}"; do | ||
echo "Building $module..." | ||
mvn clean install -f $module/pom.xml -Divy.engine.directory=$ENGINE_DIR | ||
done | ||
- name: Deploy Portal Modules | ||
run: | | ||
DEPLOYMENT=$ENGINE_DIR/system/demo-applications/demo-portal | ||
rm -rf $DEPLOYMENT/* | ||
cp Showcase/portal-demo-app/target/*.zip $DEPLOYMENT | ||
cp Showcase/portal-developer-examples/target/*.iar $DEPLOYMENT | ||
cp Showcase/portal-components-examples/target/*.iar $DEPLOYMENT | ||
- name: Wait for Server Health Check | ||
run: | | ||
for module in {portal-components,portal,PortalKitTestHelper}; do | ||
mvn -f AxonIvyPortal/$module/pom.xml clean install | ||
echo "Waiting for server to be ready..." | ||
for ((i=1; i<=${{ env.WAIT_TIME }}; i++)); do | ||
if curl -s -f http://localhost:8080 > /dev/null; then | ||
echo "Server is running" | ||
exit 0 | ||
fi | ||
echo "Attempt $i of ${{ env.WAIT_TIME }}" | ||
sleep 1 | ||
done | ||
echo "Server check failed" | ||
cat engine.log | ||
exit 1 | ||
lighthouse: | ||
needs: [setup, build] | ||
audit: | ||
runs-on: ubuntu-latest | ||
needs: build | ||
steps: | ||
- name: Setup Chrome | ||
- name: Install Chrome Dependencies | ||
run: | | ||
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - | ||
sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' | ||
sudo apt-get update | ||
sudo apt-get install -y google-chrome-stable xvfb | ||
sudo apt-get install -y google-chrome-stable xvfb x11-xserver-utils | ||
- name: Install Node.js | ||
uses: actions/setup-node@v3 | ||
with: | ||
node-version: '18' | ||
|
||
- name: Install Dependencies | ||
run: | | ||
sudo apt-get update | ||
sudo apt-get install -y x11-utils | ||
npm init -y | ||
npm install lighthouse @actions/core | ||
- name: Create Report Directory | ||
run: | | ||
mkdir -p lighthouse-reports | ||
echo "REPORT_DIR=$(pwd)/lighthouse-reports" >> $GITHUB_ENV | ||
echo "REPORT_PATH=$(pwd)/lighthouse-reports/report.html" >> $GITHUB_ENV | ||
- name: Set Up Virtual Display | ||
run: | | ||
Xvfb :99 -screen 0 1920x1080x24 -ac & | ||
sleep 3 | ||
export DISPLAY=:99 | ||
xdpyinfo || true | ||
- name: Run Audit | ||
- name: Run Lighthouse Audit | ||
run: | | ||
mkdir -p reports | ||
xvfb-run --server-args="-screen 0 1920x1080x24" \ | ||
mkdir -p ${{ env.REPORT_DIR }} | ||
cd ${{ env.REPORT_DIR }} | ||
npx lighthouse ${{ env.SERVER_URL }} \ | ||
--chrome-flags="--headless --no-sandbox --disable-gpu" \ | ||
--output=json,html \ | ||
--output-path=./reports/report | ||
--output=json \ | ||
--output=html \ | ||
--output-path="./report" | ||
ls -la | ||
env: | ||
DISPLAY: ':99' | ||
|
||
- name: Upload Reports | ||
id: upload | ||
- name: Upload Report | ||
id: upload-artifact | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: lighthouse-reports | ||
path: reports/* | ||
name: lighthouse-report | ||
path: ${{ env.REPORT_DIR }} | ||
|
||
- name: Generate Summary | ||
- name: Generate HTML Summary | ||
run: | | ||
cd reports | ||
if [ -f "report.json" ]; then | ||
{ | ||
echo "# π¦ Lighthouse Results" | ||
echo "Generated: $(date)" | ||
echo "## Performance Scores" | ||
jq -r '.categories[] | "### \(.title)\nπ Score: \(.score * 100 | floor)%"' report.json | ||
echo "---" | ||
echo "π [View Report](https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID/artifacts/${{ steps.upload.outputs.artifact-id }})" | ||
} >> $GITHUB_STEP_SUMMARY | ||
fi | ||
node -e " | ||
const core = require('@actions/core'); | ||
const fs = require('fs'); | ||
const path = require('path'); | ||
const htmlReport = fs.readFileSync(path.join('${{ env.REPORT_DIR }}', 'report.html'), 'utf8'); | ||
const jsonReport = JSON.parse(fs.readFileSync(path.join('${{ env.REPORT_DIR }}', 'report.json'), 'utf8')); | ||
const summary = core.summary | ||
.addHeading('π¦ Lighthouse Audit Results') | ||
.addRaw(htmlReport) | ||
.addHeading('Performance Scores', 2); | ||
// Add scores from JSON | ||
Object.entries(jsonReport.categories).forEach(([key, value]) => { | ||
summary.addRaw(`### ${value.title}\nπ Score: ${Math.floor(value.score * 100)}%\n`); | ||
}); | ||
summary.addSeparator() | ||
.addLink('π Download Full Report', | ||
`https://github.com/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}/artifacts/${process.env.ARTIFACT_ID}`) | ||
.write(); | ||
" | ||
env: | ||
ARTIFACT_ID: ${{ steps.upload-artifact.outputs.artifact-id }} |