Skip to content

Commit a61be6f

Browse files
ci: ベンチマーク用GitHub Actions設定を追加
1 parent 1e0b4e2 commit a61be6f

2 files changed

Lines changed: 164 additions & 2 deletions

File tree

.github/workflows/benchmark.yml

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
name: Query Optimizer Benchmark
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
benchmark:
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- name: Checkout
15+
uses: actions/checkout@v4
16+
17+
- name: Setup Go
18+
uses: actions/setup-go@v5
19+
with:
20+
go-version: "1.23.5"
21+
22+
- name: Cache Go modules
23+
uses: actions/cache@v4
24+
with:
25+
path: ~/go/pkg/mod
26+
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
27+
restore-keys: |
28+
${{ runner.os }}-go-
29+
30+
- name: Download dependencies
31+
run: go mod download
32+
33+
- name: Run Query Optimizer Benchmark
34+
env:
35+
CI: true
36+
run: |
37+
echo "🚀 クエリオプティマイザーベンチマーク実行中..."
38+
go test -v ./benchmark -run TestQueryOptimizerBenchmark -timeout 10m | tee benchmark_output.txt
39+
echo "✅ ベンチマーク完了"
40+
41+
- name: Parse benchmark results
42+
if: always()
43+
run: |
44+
echo "📊 ベンチマーク結果解析中..."
45+
46+
# benchmark-results.jsonが存在するかチェック
47+
if [ -f "benchmark-results.json" ]; then
48+
echo "JSON結果ファイルが見つかりました"
49+
echo "BENCHMARK_JSON_EXISTS=true" >> $GITHUB_ENV
50+
else
51+
echo "JSON結果ファイルが見つかりません"
52+
echo "BENCHMARK_JSON_EXISTS=false" >> $GITHUB_ENV
53+
fi
54+
55+
# テキスト出力から主要統計を抽出
56+
if [ -f "benchmark_output.txt" ]; then
57+
echo "## 📈 クエリオプティマイザー ベンチマーク結果" > benchmark_summary.md
58+
echo "" >> benchmark_summary.md
59+
60+
# 成功率抽出
61+
SUCCESS_RATE=$(grep -o "実行成功率: [0-9/]* ([0-9.]*%)" benchmark_output.txt || echo "成功率情報なし")
62+
if [ "$SUCCESS_RATE" != "成功率情報なし" ]; then
63+
echo "✅ **$SUCCESS_RATE**" >> benchmark_summary.md
64+
echo "" >> benchmark_summary.md
65+
fi
66+
67+
# 改善度抽出
68+
AVG_IMPROVEMENT=$(grep -o "平均実行時間改善: [0-9.]*x" benchmark_output.txt || echo "")
69+
MAX_IMPROVEMENT=$(grep -o "最大実行時間改善: [0-9.]*x" benchmark_output.txt || echo "")
70+
71+
if [ -n "$AVG_IMPROVEMENT" ] || [ -n "$MAX_IMPROVEMENT" ]; then
72+
echo "### 🎯 パフォーマンス改善度" >> benchmark_summary.md
73+
if [ -n "$AVG_IMPROVEMENT" ]; then
74+
echo "- ⚡ $AVG_IMPROVEMENT" >> benchmark_summary.md
75+
fi
76+
if [ -n "$MAX_IMPROVEMENT" ]; then
77+
echo "- 🚀 $MAX_IMPROVEMENT" >> benchmark_summary.md
78+
fi
79+
echo "" >> benchmark_summary.md
80+
fi
81+
82+
# 詳細なテーブル結果を抽出
83+
echo "### 📋 詳細結果" >> benchmark_summary.md
84+
echo '```' >> benchmark_summary.md
85+
# Query結果のセクションを抽出
86+
sed -n '/📋Query/,/📈全体統計/p' benchmark_output.txt | head -n -2 >> benchmark_summary.md
87+
echo '```' >> benchmark_summary.md
88+
echo "" >> benchmark_summary.md
89+
90+
echo "Generated benchmark summary:"
91+
cat benchmark_summary.md
92+
fi
93+
94+
- name: Upload benchmark results
95+
if: always()
96+
uses: actions/upload-artifact@v4
97+
with:
98+
name: benchmark-results
99+
path: |
100+
benchmark_output.txt
101+
benchmark-results.json
102+
benchmark_summary.md
103+
retention-days: 30
104+
105+
- name: Comment benchmark results on PR
106+
if: github.event_name == 'pull_request' && always()
107+
uses: actions/github-script@v7
108+
with:
109+
script: |
110+
const fs = require('fs');
111+
112+
let comment = '## 🚀 クエリオプティマイザー ベンチマーク結果\n\n';
113+
114+
try {
115+
// benchmark_summary.mdを読み込み
116+
if (fs.existsSync('benchmark_summary.md')) {
117+
const summary = fs.readFileSync('benchmark_summary.md', 'utf8');
118+
comment += summary;
119+
} else {
120+
comment += '❌ ベンチマーク結果の解析に失敗しました。\n\n';
121+
comment += '詳細は [Actions ログ](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) を確認してください。';
122+
}
123+
124+
comment += '\n\n---\n';
125+
comment += `🔗 [完全な実行ログを確認](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})\n`;
126+
comment += `📊 実行日時: ${new Date().toLocaleString('ja-JP', { timeZone: 'Asia/Tokyo' })}`;
127+
128+
} catch (error) {
129+
comment += `❌ エラーが発生しました: ${error.message}\n\n`;
130+
comment += '詳細は Actions ログを確認してください。';
131+
}
132+
133+
// PRにコメント
134+
await github.rest.issues.createComment({
135+
issue_number: context.issue.number,
136+
owner: context.repo.owner,
137+
repo: context.repo.repo,
138+
body: comment
139+
});
140+
141+
- name: Post benchmark summary to commit
142+
if: github.event_name == 'push' && always()
143+
uses: actions/github-script@v7
144+
with:
145+
script: |
146+
const fs = require('fs');
147+
148+
let summary = '🚀 クエリオプティマイザー ベンチマーク完了\n\n';
149+
150+
try {
151+
if (fs.existsSync('benchmark_summary.md')) {
152+
const content = fs.readFileSync('benchmark_summary.md', 'utf8');
153+
// Markdown形式からプレーンテキスト形式に変換(コミット用)
154+
summary += content.replace(/###? /g, '').replace(/\*\*/g, '').replace(/```[\s\S]*?```/g, '[詳細はActionログを確認]');
155+
} else {
156+
summary += '❌ ベンチマーク解析失敗';
157+
}
158+
} catch (error) {
159+
summary += `❌ エラー: ${error.message}`;
160+
}
161+
162+
console.log('Benchmark Summary:', summary);

.github/workflows/go-test.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
- name: setup
1414
uses: actions/setup-go@v5
1515
with:
16-
go-version: '1.23.5'
16+
go-version: "1.23.5"
1717

1818
- name: cache
1919
uses: actions/cache@v4
@@ -27,4 +27,4 @@ jobs:
2727
run: go mod download
2828

2929
- name: test
30-
run: go test -v ./...
30+
run: go test -v $(go list ./... | grep -v '/benchmark')

0 commit comments

Comments
 (0)