Skip to content

Commit ada1074

Browse files
authored
Add support for manually running the real-time benchmark on PRs (#19265)
[skip-ci]
1 parent 15990de commit ada1074

File tree

1 file changed

+190
-38
lines changed

1 file changed

+190
-38
lines changed

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

Lines changed: 190 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,81 @@ 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+
jit:
12+
description: 'Whether JIT is benchmarked'
13+
required: false
14+
type: choice
15+
options:
16+
- "0"
17+
- "1"
18+
opcache:
19+
description: 'Whether opcache is enabled for the benchmarked commit'
20+
required: true
21+
default: "1"
22+
type: choice
23+
options:
24+
- "0"
25+
- "1"
26+
- "2"
27+
baseline_opcache:
28+
description: 'Whether opcache is enabled for the baseline commit'
29+
required: true
30+
default: "1"
31+
type: choice
32+
options:
33+
- "0"
34+
- "1"
35+
- "2"
536
permissions:
637
contents: read
38+
pull-requests: write
739
jobs:
840
REAL_TIME_BENCHMARK:
941
name: REAL_TIME_BENCHMARK
10-
if: github.repository == 'php/php-src'
42+
if: github.repository == 'php/php-src' || github.event_name == 'workflow_dispatch'
1143
runs-on: ubuntu-22.04
44+
env:
45+
REPOSITORY: ${{ github.repository }}
46+
BRANCH: "master"
47+
COMMIT: ${{ github.sha }}
48+
BASELINE_COMMIT: "d5f6e56610c729710073350af318c4ea1b292cfe"
49+
ID: "master"
50+
OPCACHE: ${{ inputs.opcache || '1' }}
51+
BASELINE_OPCACHE: ${{ inputs.baseline_opcache || '2' }}
52+
JIT: ${{ inputs.jit || '1' }}
53+
YEAR: ""
1254
steps:
55+
- name: Setup benchmark environment
56+
env:
57+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
58+
run: |
59+
YEAR="$(date '+%Y')"
60+
echo "YEAR=$YEAR" >> $GITHUB_ENV
61+
62+
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
63+
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')
64+
65+
REPOSITORY="$(echo "$PR_INFO" | sed -n '1p')/$(echo "$PR_INFO" | sed -n '2p')"
66+
echo "REPOSITORY=$REPOSITORY" >> $GITHUB_ENV
67+
68+
BRANCH=$(echo "$PR_INFO" | sed -n '3p')
69+
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
70+
71+
COMMIT=$(echo "$PR_INFO" | sed -n '4p')
72+
echo "COMMIT=$COMMIT" >> $GITHUB_ENV
73+
74+
BASELINE_COMMIT=$(echo "$PR_INFO" | sed -n '5p')
75+
echo "BASELINE_COMMIT=$BASELINE_COMMIT" >> $GITHUB_ENV
76+
77+
echo "ID=benchmarked" >> $GITHUB_ENV
78+
fi
79+
1380
- name: Install dependencies
1481
run: |
1582
set -ex
@@ -29,73 +96,142 @@ jobs:
2996
ref: 'main'
3097
fetch-depth: 1
3198
path: 'php-version-benchmarks'
32-
- name: Checkout php-src
99+
- name: Checkout php-src (benchmarked version)
100+
uses: actions/checkout@v4
101+
with:
102+
repository: '${{ env.REPOSITORY }}'
103+
ref: '${{ env.COMMIT }}'
104+
fetch-depth: 100
105+
path: 'php-version-benchmarks/tmp/php_${{ env.ID }}'
106+
- name: Checkout php-src (baseline version)
33107
uses: actions/checkout@v4
34108
with:
35-
repository: 'php/php-src'
36-
ref: '${{ github.sha }}'
109+
repository: '${{ env.REPOSITORY }}'
110+
ref: '${{ env.BASELINE_COMMIT }}'
37111
fetch-depth: 100
38-
path: 'php-version-benchmarks/tmp/php_master'
112+
path: 'php-version-benchmarks/tmp/php_baseline'
39113
- name: Setup benchmark results
40114
run: |
41115
git config --global user.name "Benchmark"
42116
git config --global user.email "benchmark@php.net"
43-
117+
44118
rm -rf ./php-version-benchmarks/docs/results
45119
- name: Checkout benchmark data
120+
if: github.event_name != 'workflow_dispatch'
46121
uses: actions/checkout@v4
47122
with:
48123
repository: php/real-time-benchmark-data
49124
ssh-key: ${{ secrets.PHP_VERSION_BENCHMARK_RESULTS_DEPLOY_KEY }}
50125
path: 'php-version-benchmarks/docs/results'
51-
- name: Set benchmark config
126+
- name: Setup infra config
52127
run: |
53128
set -e
54129
55-
# Set infrastructure config
56130
cp ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini.dist ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
57131
ESCAPED_DOCKER_REGISTRY=$(printf '%s\n' "${{ secrets.PHP_VERSION_BENCHMARK_DOCKER_REGISTRY }}" | sed -e 's/[\/&]/\\&/g')
58132
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
59133
cp ./php-version-benchmarks/build/infrastructure/config/aws.tfvars.dist ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
60134
sed -i 's/access_key = ""/access_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_ACCESS_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
61135
sed -i 's/secret_key = ""/secret_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_SECRET_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
136+
sed -i 's/github_token = ""/github_token = "${{ secrets.GITHUB_TOKEN }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
137+
- name: Setup PHP config - baseline PHP version
138+
run: |
139+
set -e
62140
63-
YEAR="$(date '+%Y')"
64-
DATABASE="./php-version-benchmarks/docs/results/$YEAR/database.tsv"
141+
BASELINE_SHORT_SHA="$(echo "${{ env.BASELINE_COMMIT }}" | cut -c1-4)"
142+
143+
cat << EOF > ./php-version-benchmarks/config/php/baseline.ini
144+
PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA"
145+
PHP_ID=php_baseline
146+
147+
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
148+
PHP_BRANCH=${{ env.BRANCH }}
149+
PHP_COMMIT=${{ env.BASELINE_COMMIT }}
150+
151+
PHP_OPCACHE=${{ env.BASELINE_OPCACHE }}
152+
PHP_JIT=0
153+
EOF
154+
- name: Setup PHP config - baseline PHP version with JIT
155+
if: github.event_name == 'workflow_dispatch' && inputs.jit == '1'
156+
run: |
157+
set -e
158+
159+
BASELINE_SHORT_SHA="$(echo "${{ env.BASELINE_COMMIT }}" | cut -c1-4)"
160+
161+
cat << EOF > ./php-version-benchmarks/config/php/baseline_jit.ini
162+
PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA (JIT)"
163+
PHP_ID=php_baseline_jit
164+
165+
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
166+
PHP_BRANCH=${{ env.BRANCH }}
167+
PHP_COMMIT=${{ env.BASELINE_COMMIT }}
168+
169+
PHP_OPCACHE=${{ env.BASELINE_OPCACHE }}
170+
PHP_JIT=${{ env.JIT }}
171+
EOF
172+
173+
git clone ./php-version-benchmarks/tmp/php_baseline/ ./php-version-benchmarks/tmp/php_baseline_jit
174+
- name: Setup PHP config - previous PHP version
175+
if: github.event_name != 'workflow_dispatch'
176+
run: |
177+
set -e
178+
179+
DATABASE="./php-version-benchmarks/docs/results/${{ env.YEAR }}/database.tsv"
65180
if [ -f "$DATABASE" ]; then
66181
LAST_RESULT_SHA="$(tail -n 2 "$DATABASE" | head -n 1 | cut -f 6)"
67182
else
68183
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')"
184+
LAST_RESULT_SHA="$(cd ./php-version-benchmarks/tmp/php_${{ env.ID }}/ && git --no-pager log --until="$YESTERDAY" -n 1 --pretty='%H')"
70185
fi
71186
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
187+
cat << EOF > ./php-version-benchmarks/config/php/previous.ini
188+
PHP_NAME="PHP - previous ${{ env.BRANCH }}"
189+
PHP_ID=php_previous
190+
191+
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
192+
PHP_BRANCH=${{ env.BRANCH }}
193+
PHP_COMMIT=$LAST_RESULT_SHA
194+
195+
PHP_OPCACHE=1
196+
PHP_JIT=0
197+
EOF
198+
- name: Setup PHP config - benchmarked PHP version
199+
run: |
200+
set -e
201+
202+
cat << EOF > ./php-version-benchmarks/config/php/this.ini
203+
PHP_NAME="PHP - ${{ env.BRANCH }}"
204+
PHP_ID=php_${{ env.ID }}
205+
206+
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
207+
PHP_BRANCH=${{ env.BRANCH }}
208+
PHP_COMMIT=${{ env.COMMIT }}
209+
210+
PHP_OPCACHE=${{ env.OPCACHE }}
211+
PHP_JIT=0
212+
EOF
213+
- name: Setup PHP config - benchmarked PHP version with JIT
214+
if: env.JIT == '1'
215+
run: |
216+
set -e
217+
218+
cat << EOF > ./php-version-benchmarks/config/php/this_jit.ini
219+
PHP_NAME="PHP - ${{ env.BRANCH }} (JIT)"
220+
PHP_ID=php_${{ env.ID }}_jit
221+
222+
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
223+
PHP_BRANCH=${{ env.BRANCH }}
224+
PHP_COMMIT=${{ env.COMMIT }}
225+
226+
PHP_OPCACHE=${{ env.OPCACHE }}
227+
PHP_JIT=${{ env.JIT }}
228+
EOF
229+
230+
git clone ./php-version-benchmarks/tmp/php_${{ env.ID }}/ ./php-version-benchmarks/tmp/php_${{ env.ID }}_jit
231+
- name: Setup test config
232+
run: |
233+
set -e
234+
99235
cp ./php-version-benchmarks/config/test/1_laravel.ini.dist ./php-version-benchmarks/config/test/1_laravel.ini
100236
cp ./php-version-benchmarks/config/test/2_symfony_main.ini.dist ./php-version-benchmarks/config/test/2_symfony_main.ini
101237
cp ./php-version-benchmarks/config/test/4_wordpress.ini.dist ./php-version-benchmarks/config/test/4_wordpress.ini
@@ -104,6 +240,7 @@ jobs:
104240
- name: Run benchmark
105241
run: ./php-version-benchmarks/benchmark.sh run aws
106242
- name: Store results
243+
if: github.repository == 'php/php-src' && github.event_name != 'workflow_dispatch'
107244
run: |
108245
set -ex
109246
@@ -119,6 +256,21 @@ jobs:
119256
fi
120257
git commit -m "Add result for ${{ github.repository }}@${{ github.sha }}"
121258
git push
259+
- name: Upload artifact
260+
if: github.event_name == 'workflow_dispatch'
261+
uses: actions/upload-artifact@v4
262+
with:
263+
name: results
264+
path: ./php-version-benchmarks/docs/results/${{ env.YEAR }}
265+
retention-days: 30
266+
- name: Comment results
267+
if: github.event_name == 'workflow_dispatch'
268+
env:
269+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
270+
run: |
271+
cd ./php-version-benchmarks/tmp/php_${{ env.ID }}
272+
NEWEST_RESULT_DIRECTORY=$(ls -td ${{ github.workspace }}/php-version-benchmarks/docs/results/${{ env.YEAR }}/*/ | head -1)
273+
gh pr comment ${{ inputs.pull_request }} --body-file "${NEWEST_RESULT_DIRECTORY}result.md" --repo ${{ env.REPOSITORY }}
122274
- name: Cleanup
123275
if: always()
124276
run: |

0 commit comments

Comments
 (0)