Lighthouse CI集成实际项目总结

创建项目

bash 复制代码
mkdir esim-lighthouse-ci
cd esim-lighthouse-ci/
npm init -y

安装依赖

bash 复制代码
npm install -g @lhci/cli

创建配置文件

bash 复制代码
touch lighthouserc.js

编写代码

javascript 复制代码
module.exports = {
    ci: {
      collect: {
        url: ['https://esimnum.com/home'],
        numberOfRuns: 3,
        settings: {
          chromeFlags: '--no-sandbox --disable-dev-shm-usage --headless',
          preset: 'desktop',
        },
      },
      assert: {
        assertions: {
          'categories:performance': ['error', { minScore: 0.3 }],
          'categories:accessibility': ['warn', { minScore: 0.3 }],
        },
      },
      upload: {
        target: 'temporary-public-storage',
      },
    },
  };
json 复制代码
{
  "name": "esim-lighthouse-ci",
  "version": "1.0.0",
  "description": "Lighthouse CI tests for esimnum.com",
  "main": "index.js",
  "scripts": {
    "test": "lhci autorun --config=lighthouserc.js",
    "test:ci": "LHCI_BUILD_CONTEXT__CURRENT_HASH=github-actions lhci autorun --config=lighthouserc.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "commonjs",
  "dependencies": {
    "@lhci/cli": "^0.15.1"
  }
}

本地测试

bash 复制代码
lhci autorun --config=lighthouserc.js

执行日志

html报告

关于上传报告Error解决方案

方案1:在Git仓库运行

bash 复制代码
git init
git add .
git commit -m "init"
lhci autorun --config=lighthouserc.js

方案2:绕过Git bash

bash 复制代码
LHCI_BUILD_CONTEXT__CURRENT_HASH=github-actions lhci autorun --config=lighthouserc.js

Github Actions集成

bash 复制代码
mkdir -p .github/workflows && cd .github/workflows
touch lighthouse.yml

lighthouse.yml

yaml 复制代码
name: Lighthouse CI

on:
  push:
    branches: [main]
  pull_request:

jobs:
  lighthouse:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      statuses: write
      checks: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 20

      - name: Install Lighthouse CI
        run: npm install -g @lhci/cli

      - name: Run Lighthouse Collect
        run: |
          LHCI_BUILD_CONTEXT__CURRENT_HASH=github-actions \
          lhci collect --config=lighthouserc.js || true

      - name: Run Lighthouse Upload
        env:
          LHCI_GITHUB_APP_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          LHCI_BUILD_CONTEXT__CURRENT_HASH=github-actions \
          lhci upload --config=lighthouserc.js 2>&1 | tee upload_output.txt || true

      - name: Display Report URL
        run: |
          REPORT_URL=$(grep -oP 'https://storage\.googleapis\.com/[^\s]+\.html' upload_output.txt | head -1)
          
          if [ -n "$REPORT_URL" ]; then
            echo "## 📊 Lighthouse Report" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
            echo "🔗 [View Online Report]($REPORT_URL)" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
            echo "Report includes averages from all runs" >> $GITHUB_STEP_SUMMARY
            echo "✅ Report URL: $REPORT_URL"
          else
            echo "⚠️ No report URL found"
          fi

添加定时任务和飞书通知

yaml 复制代码
name: Lighthouse CI

on:
  push:
    branches: [main]
  pull_request:
  schedule:
    # 每周三 24:00
    - cron: '0 16 * * 3'

jobs:
  lighthouse:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      statuses: write
      checks: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 20

      - name: Install Lighthouse CI
        run: npm install -g @lhci/cli

      - name: Run Lighthouse Collect
        run: |
          LHCI_BUILD_CONTEXT__CURRENT_HASH=github-actions \
          lhci collect --config=lighthouserc.js || true

      - name: Run Lighthouse Upload
        env:
          LHCI_GITHUB_APP_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          LHCI_BUILD_CONTEXT__CURRENT_HASH=github-actions \
          lhci upload --config=lighthouserc.js 2>&1 | tee upload_output.txt || true

      - name: Display Report URL
        id: report
        run: |
          REPORT_URL=$(grep -oP 'https://storage\.googleapis\.com/[^\s]+\.html' upload_output.txt | head -1)
          
          if [ -n "$REPORT_URL" ]; then
            echo "## 📊 Lighthouse Report" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
            echo "🔗 [View Online Report]($REPORT_URL)" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
            echo "Report includes averages from all runs" >> $GITHUB_STEP_SUMMARY
            echo "✅ Report URL: $REPORT_URL"
            echo "report_url=$REPORT_URL" >> $GITHUB_OUTPUT
          else
            echo "⚠️ No report URL found"
            echo "report_url=" >> $GITHUB_OUTPUT
          fi

      - name: Send Feishu Notification
        if: steps.report.outputs.report_url != ''
        continue-on-error: true
        run: |
          FEISHU_WEBHOOK_URL="${{ secrets.FEISHU_WEBHOOK_URL }}"
          REPORT_URL="${{ steps.report.outputs.report_url }}"
          
          if [ -z "$FEISHU_WEBHOOK_URL" ]; then
            echo "⚠️ FEISHU_WEBHOOK_URL not configured, skipping notification"
            exit 0
          fi
          
          # 获取北京时间
          BUILD_TIME=$(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M:%S')
          
          curl -X POST "$FEISHU_WEBHOOK_URL" \
            -H 'Content-Type: application/json' \
            -d "{
              \"msg_type\": \"interactive\",
              \"card\": {
                \"header\": {
                  \"title\": {
                    \"content\": \"📊 eSIM Lighthouse CI 报告\",
                    \"tag\": \"plain_text\"
                  },
                  \"template\": \"blue\"
                },
                \"elements\": [
                  {
                    \"tag\": \"div\",
                    \"text\": {
                      \"content\": \"性能测试已完成,点击下方按钮查看详细报告\",
                      \"tag\": \"plain_text\"
                    }
                  },
                  {
                    \"tag\": \"div\",
                    \"text\": {
                      \"content\": \"⏰ **构建时间**: $BUILD_TIME\",
                      \"tag\": \"lark_md\"
                    }
                  },
                  {
                    \"tag\": \"hr\"
                  },
                  {
                    \"tag\": \"action\",
                    \"actions\": [
                      {
                        \"tag\": \"button\",
                        \"text\": {
                          \"content\": \"🔗 查看详细报告\",
                          \"tag\": \"plain_text\"
                        },
                        \"url\": \"$REPORT_URL\",
                        \"type\": \"primary\"
                      }
                    ]
                  }
                ]
              }
            }"
          
          echo "✅ Feishu notification sent"

配置飞书链接

通知结果

相关推荐
fiveym20 小时前
CI/CD 核心原则 + 制品管理全解析:落地要求 + 存储方案
linux·运维·ci/cd
卓码软件测评1 天前
第三方软件确认测试机构【性能测试中内存泄漏的迹象:如何利用LoadRunner监控和发现 】
测试工具·ci/cd·性能优化·单元测试·测试用例
一念一花一世界1 天前
Arbess项目实战 - 基于GitLab搭建.net项目自动化流水线
ci/cd·gitlab·.net·arbess
techzhi2 天前
Apifox CLI + GitLab CI:接口自动化测试实施记录
java·ci/cd·kubernetes·gitlab·yapi·运维开发·fastapi
萧曵 丶2 天前
CI/CD 流程
git·ci/cd
ICT董老师2 天前
在Ubuntu 22.04上使用GitLab和Jenkins部署CI/CD的完整过程
ubuntu·ci/cd·kubernetes·gitlab·jenkins
一念一花一世界3 天前
Arbess项目实战 - 基于GitLab搭建Node.js项目自动化流水线
ci/cd·node.js·自动化·gitlab·arbess
南村群童欺我老无力.3 天前
Flutter应用鸿蒙迁移实战:性能优化与渐进式迁移指南
javascript·flutter·ci/cd·华为·性能优化·typescript·harmonyos
进击的小菜鸡dd4 天前
互联网大厂Java面试:从Spring Boot到微服务架构的场景化技术问答
java·spring boot·redis·ci/cd·微服务·消息队列·mybatis