Skip to content

Commit a2ad1f7

Browse files
committed
Add support for manually runnung the real-time benchmark on PRs
1 parent e48099a commit a2ad1f7

File tree

1 file changed

+190
-39
lines changed

1 file changed

+190
-39
lines changed

.github/workflows/real-time-benchmark.yml

Lines changed: 190 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,80 @@ name: Real-time Benchmark
22
on:
33
schedule:
44
- cron: "30 0 * * *"
5+
workflow_dispatch:
6+
inputs:
7+
pull_request:
8+
description: 'PR number that is going to be benchmarked (e.g. "1234")'
9+
required: true
10+
type: number
11+
opcache:
12+
description: 'Whether opcache should be enabled for the benchmarked code'
13+
required: true
14+
default: "1"
15+
type: choice
16+
options:
17+
- "0"
18+
- "1"
19+
- "2"
20+
baseline_opcache:
21+
description: 'Whether opcache should be enabled for the baseline'
22+
required: true
23+
default: "1"
24+
type: choice
25+
options:
26+
- "0"
27+
- "1"
28+
- "2"
29+
jit:
30+
description: 'Whether JIT is benchmarked'
31+
required: false
32+
type: choice
33+
options:
34+
- "0"
35+
- "1"
536
permissions:
637
contents: read
738
jobs:
839
REAL_TIME_BENCHMARK:
940
name: REAL_TIME_BENCHMARK
10-
if: github.repository == 'php/php-src'
41+
if: github.repository == 'kocsismate/php-src' || github.event_name == 'workflow_dispatch'
1142
runs-on: ubuntu-22.04
43+
env:
44+
REPOSITORY: ${{ github.repository }}
45+
BRANCH: "master"
46+
COMMIT: ${{ github.sha }}
47+
BASELINE_COMMIT: "d5f6e56610c729710073350af318c4ea1b292cfe"
48+
ID: "master"
49+
OPCACHE: ${{ inputs.opcache || '1' }}
50+
BASELINE_OPCACHE: ${{ inputs.baseline_opcache || '2' }}
51+
JIT: ${{ inputs.jit || '1' }}
52+
YEAR: ""
1253
steps:
54+
- name: Setup benchmark environment
55+
env:
56+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
57+
run: |
58+
YEAR="$(date '+%Y')"
59+
echo "YEAR=$YEAR" >> $GITHUB_ENV
60+
61+
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
62+
PR_INFO=$(gh pr view ${{ inputs.pull_request }} --json headRepositoryOwner,headRepository,headRefName,headRefOid,baseRefOid --repo ${{ github.repository }} | jq -r '.headRepositoryOwner.login, .headRepository.name, .headRefName, .headRefOid, .baseRefOid')
63+
64+
REPOSITORY="$(echo "$PR_INFO" | sed -n '1p')/$(echo "$PR_INFO" | sed -n '2p')"
65+
echo "REPOSITORY=$REPOSITORY" >> $GITHUB_ENV
66+
67+
BRANCH=$(echo "$PR_INFO" | sed -n '3p')
68+
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
69+
70+
COMMIT=$(echo "$PR_INFO" | sed -n '4p')
71+
echo "COMMIT=$COMMIT" >> $GITHUB_ENV
72+
73+
BASELINE_COMMIT=$(echo "$PR_INFO" | sed -n '5p')
74+
echo "BASELINE_COMMIT=$BASELINE_COMMIT" >> $GITHUB_ENV
75+
76+
echo "ID=benchmarked" >> $GITHUB_ENV
77+
fi
78+
1379
- name: Install dependencies
1480
run: |
1581
set -ex
@@ -29,81 +95,151 @@ jobs:
2995
ref: 'main'
3096
fetch-depth: 1
3197
path: 'php-version-benchmarks'
32-
- name: Checkout php-src
98+
- name: Checkout php-src (benchmarked version)
99+
uses: actions/checkout@v4
100+
with:
101+
repository: '${{ env.REPOSITORY }}'
102+
ref: '${{ env.COMMIT }}'
103+
fetch-depth: 100
104+
path: 'php-version-benchmarks/tmp/php_${{ env.ID }}'
105+
- name: Checkout php-src (baseline version)
33106
uses: actions/checkout@v4
34107
with:
35-
repository: 'php/php-src'
36-
ref: '${{ github.sha }}'
108+
repository: '${{ env.REPOSITORY }}'
109+
ref: '${{ env.BASELINE_COMMIT }}'
37110
fetch-depth: 100
38-
path: 'php-version-benchmarks/tmp/php_master'
111+
path: 'php-version-benchmarks/tmp/php_baseline'
39112
- name: Setup benchmark results
40113
run: |
41114
git config --global user.name "Benchmark"
42115
git config --global user.email "[email protected]"
43-
116+
44117
rm -rf ./php-version-benchmarks/docs/results
45118
- name: Checkout benchmark data
119+
if: github.repository == 'kocsismate/php-src' && github.event_name != 'workflow_dispatch'
46120
uses: actions/checkout@v4
47121
with:
48122
repository: php/real-time-benchmark-data
49123
ssh-key: ${{ secrets.PHP_VERSION_BENCHMARK_RESULTS_DEPLOY_KEY }}
50124
path: 'php-version-benchmarks/docs/results'
51-
- name: Set benchmark config
125+
- name: Setup infra config
52126
run: |
53127
set -e
54128
55-
# Set infrastructure config
56129
cp ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini.dist ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
57130
ESCAPED_DOCKER_REGISTRY=$(printf '%s\n' "${{ secrets.PHP_VERSION_BENCHMARK_DOCKER_REGISTRY }}" | sed -e 's/[\/&]/\\&/g')
58131
sed -i "s/INFRA_DOCKER_REGISTRY=public.ecr.aws\/abcdefgh/INFRA_DOCKER_REGISTRY=$ESCAPED_DOCKER_REGISTRY/g" ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
59132
cp ./php-version-benchmarks/build/infrastructure/config/aws.tfvars.dist ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
60133
sed -i 's/access_key = ""/access_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_ACCESS_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
61134
sed -i 's/secret_key = ""/secret_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_SECRET_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
135+
sed -i 's/github_token = ""/github_token = "${{ secrets.PHP_VERSION_BENCHMARK_GITHUB_TOKEN }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
136+
- name: Setup PHP config - baseline PHP version
137+
run: |
138+
set -e
62139
63-
YEAR="$(date '+%Y')"
64-
DATABASE="./php-version-benchmarks/docs/results/$YEAR/database.tsv"
140+
BASELINE_SHORT_SHA="$(echo "${{ env.BASELINE_COMMIT }}" | cut -c1-4)"
141+
142+
cat << EOF > ./php-version-benchmarks/config/php/baseline.ini
143+
PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA"
144+
PHP_ID=php_baseline
145+
146+
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
147+
PHP_BRANCH=${{ env.BRANCH }}
148+
PHP_COMMIT=${{ env.BASELINE_COMMIT }}
149+
150+
PHP_OPCACHE=${{ env.BASELINE_OPCACHE }}
151+
PHP_JIT=0
152+
EOF
153+
- name: Setup PHP config - baseline PHP version with JIT (manual only)
154+
if: github.repository == 'kocsismate/php-src' && github.event_name == 'workflow_dispatch' && inputs.jit == '1'
155+
run: |
156+
set -e
157+
158+
BASELINE_SHORT_SHA="$(echo "${{ env.BASELINE_COMMIT }}" | cut -c1-4)"
159+
160+
cat << EOF > ./php-version-benchmarks/config/php/baseline.ini
161+
PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA (JIT)"
162+
PHP_ID=php_baseline_jit
163+
164+
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
165+
PHP_BRANCH=${{ env.BRANCH }}
166+
PHP_COMMIT=${{ env.BASELINE_COMMIT }}
167+
168+
PHP_OPCACHE=${{ env.BASELINE_OPCACHE }}
169+
PHP_JIT=${{ env.JIT }}
170+
EOF
171+
172+
git clone ./php-version-benchmarks/tmp/php_baseline/ ./php-version-benchmarks/tmp/php_baseline_jit
173+
- name: Setup PHP config - previous PHP version (scheduled only)
174+
if: github.repository == 'kocsismate/php-src' && github.event_name != 'workflow_dispatch'
175+
run: |
176+
set -e
177+
178+
DATABASE="./php-version-benchmarks/docs/results/${{ env.YEAR }}/database.tsv"
65179
if [ -f "$DATABASE" ]; then
66180
LAST_RESULT_SHA="$(tail -n 2 "$DATABASE" | head -n 1 | cut -f 6)"
67181
else
68182
YESTERDAY="$(date -d "-2 day 23:59:59" '+%Y-%m-%d %H:%M:%S')"
69-
LAST_RESULT_SHA="$(cd ./php-version-benchmarks/tmp/php_master/ && git --no-pager log --until="$YESTERDAY" -n 1 --pretty='%H')"
183+
LAST_RESULT_SHA="$(cd ./php-version-benchmarks/tmp/php_${{ env.ID }}/ && git --no-pager log --until="$YESTERDAY" -n 1 --pretty='%H')"
70184
fi
71185
72-
BASELINE_SHA="d5f6e56610c729710073350af318c4ea1b292cfe"
73-
BASELINE_SHORT_SHA="$(echo "$BASELINE_SHA" | cut -c1-4)"
74-
75-
# Set config for the baseline PHP version
76-
cp ./php-version-benchmarks/config/php/master.ini.dist ./php-version-benchmarks/config/php/master_baseline.ini
77-
sed -i 's/PHP_NAME="PHP - master"/PHP_NAME="PHP - baseline@'"$BASELINE_SHORT_SHA"'"/g' ./php-version-benchmarks/config/php/master_baseline.ini
78-
sed -i "s/PHP_ID=php_master/PHP_ID=php_master_baseline/g" ./php-version-benchmarks/config/php/master_baseline.ini
79-
sed -i "s/PHP_COMMIT=/PHP_COMMIT=$BASELINE_SHA/g" ./php-version-benchmarks/config/php/master_baseline.ini
80-
sed -i "s/PHP_OPCACHE=1/PHP_OPCACHE=2/g" ./php-version-benchmarks/config/php/master_baseline.ini
81-
82-
# Set config for the previous PHP version
83-
cp ./php-version-benchmarks/config/php/master.ini.dist ./php-version-benchmarks/config/php/master_last.ini
84-
sed -i 's/PHP_NAME="PHP - master"/PHP_NAME="PHP - previous master"/g' ./php-version-benchmarks/config/php/master_last.ini
85-
sed -i "s/PHP_ID=php_master/PHP_ID=php_master_previous/g" ./php-version-benchmarks/config/php/master_last.ini
86-
sed -i "s/PHP_COMMIT=/PHP_COMMIT=$LAST_RESULT_SHA/g" ./php-version-benchmarks/config/php/master_last.ini
87-
sed -i "s/PHP_OPCACHE=1/PHP_OPCACHE=2/g" ./php-version-benchmarks/config/php/master_last.ini
88-
89-
# Set config for the current PHP version
90-
cp ./php-version-benchmarks/config/php/master.ini.dist ./php-version-benchmarks/config/php/master_now.ini
91-
sed -i "s/PHP_COMMIT=/PHP_COMMIT=${{ github.sha }}/g" ./php-version-benchmarks/config/php/master_now.ini
92-
93-
# Set config for current PHP version with JIT
94-
git clone ./php-version-benchmarks/tmp/php_master/ ./php-version-benchmarks/tmp/php_master_jit
95-
cp ./php-version-benchmarks/config/php/master_jit.ini.dist ./php-version-benchmarks/config/php/master_now_jit.ini
96-
sed -i "s/PHP_COMMIT=/PHP_COMMIT=${{ github.sha }}/g" ./php-version-benchmarks/config/php/master_now_jit.ini
97-
98-
# Set test configs
186+
cat << EOF > ./php-version-benchmarks/config/php/previous.ini
187+
PHP_NAME="PHP - previous ${{ env.BRANCH }}"
188+
PHP_ID=php_previous
189+
190+
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
191+
PHP_BRANCH=${{ env.BRANCH }}
192+
PHP_COMMIT=$LAST_RESULT_SHA
193+
194+
PHP_OPCACHE=1
195+
PHP_JIT=0
196+
EOF
197+
- name: Setup PHP config - benchmarked PHP version
198+
run: |
199+
set -e
200+
201+
cat << EOF > ./php-version-benchmarks/config/php/this.ini
202+
PHP_NAME="PHP - ${{ env.BRANCH }}"
203+
PHP_ID=php_${{ env.ID }}
204+
205+
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
206+
PHP_BRANCH=${{ env.BRANCH }}
207+
PHP_COMMIT=${{ env.COMMIT }}
208+
209+
PHP_OPCACHE=${{ env.OPCACHE }}
210+
PHP_JIT=0
211+
EOF
212+
- name: Setup PHP config - benchmarked PHP version with JIT
213+
if: env.JIT == '1'
214+
run: |
215+
set -e
216+
217+
cat << EOF > ./php-version-benchmarks/config/php/this_jit.ini
218+
PHP_NAME="PHP - ${{ env.BRANCH }} (JIT)"
219+
PHP_ID=php_${{ env.ID }}_jit
220+
221+
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
222+
PHP_BRANCH=${{ env.BRANCH }}
223+
PHP_COMMIT=${{ env.COMMIT }}
224+
225+
PHP_OPCACHE=${{ env.OPCACHE }}
226+
PHP_JIT=${{ env.JIT }}
227+
EOF
228+
229+
git clone ./php-version-benchmarks/tmp/php_${{ env.ID }}/ ./php-version-benchmarks/tmp/php_${{ env.ID }}_jit
230+
- name: Setup test config
231+
run: |
232+
set -e
233+
99234
cp ./php-version-benchmarks/config/test/1_laravel.ini.dist ./php-version-benchmarks/config/test/1_laravel.ini
100235
cp ./php-version-benchmarks/config/test/2_symfony_main.ini.dist ./php-version-benchmarks/config/test/2_symfony_main.ini
101236
cp ./php-version-benchmarks/config/test/4_wordpress.ini.dist ./php-version-benchmarks/config/test/4_wordpress.ini
102237
cp ./php-version-benchmarks/config/test/5_bench.php.ini.dist ./php-version-benchmarks/config/test/5_bench.php.ini
103238
cp ./php-version-benchmarks/config/test/6_micro_bench.php.ini.dist ./php-version-benchmarks/config/test/6_micro_bench.php.ini
104239
- name: Run benchmark
105240
run: ./php-version-benchmarks/benchmark.sh run aws
106-
- name: Store results
241+
- name: Store results (scheduled only)
242+
if: github.repository == 'kocsismate/php-src' && github.event_name != 'workflow_dispatch'
107243
run: |
108244
set -ex
109245
@@ -119,6 +255,21 @@ jobs:
119255
fi
120256
git commit -m "Add result for ${{ github.repository }}@${{ github.sha }}"
121257
git push
258+
- name: Upload artifact (manual only)
259+
if: github.event_name == 'workflow_dispatch'
260+
uses: actions/upload-artifact@v4
261+
with:
262+
name: results
263+
path: ./php-version-benchmarks/docs/results/${{ env.YEAR }}
264+
retention-days: 30
265+
- name: Comment results (manual only)
266+
if: github.event_name == 'workflow_dispatch'
267+
env:
268+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
269+
run: |
270+
cd ./php-version-benchmarks/tmp/php_${{ env.ID }}
271+
NEWEST_RESULT_DIRECTORY=$(ls -td ${{ github.workspace }}/php-version-benchmarks/docs/results/${{ env.YEAR }}/*/ | head -1)
272+
gh pr comment ${{ inputs.pull_request }} --body-file "${NEWEST_RESULT_DIRECTORY}result.md" --repo ${{ env.REPOSITORY }}
122273
- name: Cleanup
123274
if: always()
124275
run: |

0 commit comments

Comments
 (0)