-
Notifications
You must be signed in to change notification settings - Fork 200
128 lines (112 loc) · 3.87 KB
/
Copy pathperformance-tests.yml
File metadata and controls
128 lines (112 loc) · 3.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
name: Performance Tests
on:
push:
branches: [ main, master ]
paths:
# Only run on code changes that could affect performance
- 'src/**'
- 'tests/src/e2e/performance/**'
- 'tests/src/e2e/utilities/performance.py'
- '.github/workflows/performance-tests.yml'
pull_request:
branches: [ master ]
paths:
- 'src/**'
- 'tests/src/e2e/performance/**'
- 'tests/src/e2e/utilities/performance.py'
- '.github/workflows/performance-tests.yml'
workflow_dispatch:
# Run weekly to catch performance regressions
schedule:
- cron: '0 6 * * 1' # Every Monday at 6 AM UTC
permissions:
contents: read
env:
PYTHON_VERSION: "3.13"
UV_CACHE_DIR: /tmp/.uv-cache
# renovate: datasource=docker depName=ghcr.io/home-assistant/home-assistant
HA_IMAGE_GHCR: "ghcr.io/home-assistant/home-assistant:2026.4.1"
jobs:
performance-tests:
name: Performance Tests
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v6
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
with:
cache-binary: true
- name: Cache HA Docker image
id: cache-ha-image
uses: actions/cache@v5
with:
path: /tmp/ha-image.tar
key: ha-image-${{ env.HA_IMAGE_GHCR }}-${{ runner.arch }}
- name: Load cached HA image
if: steps.cache-ha-image.outputs.cache-hit == 'true'
run: docker load -i /tmp/ha-image.tar
- name: Pull HA image (GHCR → Docker Hub fallback)
if: steps.cache-ha-image.outputs.cache-hit != 'true'
run: |
HA_VERSION="${HA_IMAGE_GHCR##*:}"
HA_IMAGE_DOCKERHUB="homeassistant/home-assistant:${HA_VERSION}"
for registry in "$HA_IMAGE_GHCR" "$HA_IMAGE_DOCKERHUB"; do
echo "Trying $registry..."
if docker pull "$registry"; then
if [ "$registry" != "$HA_IMAGE_GHCR" ]; then
docker tag "$registry" "$HA_IMAGE_GHCR"
fi
docker save "$HA_IMAGE_GHCR" -o /tmp/ha-image.tar
echo "Pulled and cached from $registry"
exit 0
fi
done
echo "Failed to pull from any registry"
exit 1
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
version: "latest"
- name: Set up Python
run: uv python install ${{ env.PYTHON_VERSION }}
- name: Install dependencies
run: uv sync --all-extras --dev
- name: Run performance tests
id: perf_tests
run: |
echo "Running performance tests..."
uv run pytest tests/src/e2e/performance/ \
-v \
--tb=short \
-m performance \
--log-cli-level=INFO \
2>&1 | tee performance_output.txt
# Capture exit code
exit_code=${PIPESTATUS[0]}
echo "exit_code=$exit_code" >> $GITHUB_OUTPUT
exit $exit_code
env:
HAMCP_ENV_FILE: "tests/.env.test"
- name: Upload performance results
if: always()
uses: actions/upload-artifact@v7
with:
name: performance-results
path: performance_output.txt
retention-days: 30
- name: Performance summary
if: always()
run: |
echo "## Performance Test Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [ "${{ steps.perf_tests.outputs.exit_code }}" = "0" ]; then
echo ":white_check_mark: **All performance tests passed**" >> $GITHUB_STEP_SUMMARY
else
echo ":x: **Some performance tests failed**" >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Timing Results" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
grep -E "(avg=|p95=|SLOW|target)" performance_output.txt | head -30 >> $GITHUB_STEP_SUMMARY || echo "No timing data found" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY