From cfd80c52629fafb7b20db2d303f545ccb88eb39c Mon Sep 17 00:00:00 2001 From: nhthinh-axonivy Date: Fri, 27 Dec 2024 10:51:05 +0700 Subject: [PATCH] feature/IVYPORTAL-17377-Create-pipeline-to-run-Lighthouse-report --- .github/workflows/lighthouse-report.yml | 218 +++++++++++++++++++----- 1 file changed, 177 insertions(+), 41 deletions(-) diff --git a/.github/workflows/lighthouse-report.yml b/.github/workflows/lighthouse-report.yml index a96aca98ed..52d7beb023 100644 --- a/.github/workflows/lighthouse-report.yml +++ b/.github/workflows/lighthouse-report.yml @@ -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 \ No newline at end of file + 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 }} \ No newline at end of file