@@ -2,14 +2,81 @@ name: Real-time Benchmark
2
2
on :
3
3
schedule :
4
4
- 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"
5
36
permissions :
6
37
contents : read
38
+ pull-requests : write
7
39
jobs :
8
40
REAL_TIME_BENCHMARK :
9
41
name : REAL_TIME_BENCHMARK
10
- if : github.repository == 'php/php-src'
42
+ if : github.repository == 'php/php-src' || github.event_name == 'workflow_dispatch'
11
43
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 : " "
12
54
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
+
13
80
- name : Install dependencies
14
81
run : |
15
82
set -ex
@@ -29,73 +96,142 @@ jobs:
29
96
ref : ' main'
30
97
fetch-depth : 1
31
98
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)
33
107
uses : actions/checkout@v4
34
108
with :
35
- repository : ' php/php-src '
36
- ref : ' ${{ github.sha }}'
109
+ repository : ' ${{ env.REPOSITORY }} '
110
+ ref : ' ${{ env.BASELINE_COMMIT }}'
37
111
fetch-depth : 100
38
- path : ' php-version-benchmarks/tmp/php_master '
112
+ path : ' php-version-benchmarks/tmp/php_baseline '
39
113
- name : Setup benchmark results
40
114
run : |
41
115
git config --global user.name "Benchmark"
42
116
git config --global user.email "benchmark@php.net"
43
-
117
+
44
118
rm -rf ./php-version-benchmarks/docs/results
45
119
- name : Checkout benchmark data
120
+ if : github.event_name != 'workflow_dispatch'
46
121
uses : actions/checkout@v4
47
122
with :
48
123
repository : php/real-time-benchmark-data
49
124
ssh-key : ${{ secrets.PHP_VERSION_BENCHMARK_RESULTS_DEPLOY_KEY }}
50
125
path : ' php-version-benchmarks/docs/results'
51
- - name : Set benchmark config
126
+ - name : Setup infra config
52
127
run : |
53
128
set -e
54
129
55
- # Set infrastructure config
56
130
cp ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini.dist ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
57
131
ESCAPED_DOCKER_REGISTRY=$(printf '%s\n' "${{ secrets.PHP_VERSION_BENCHMARK_DOCKER_REGISTRY }}" | sed -e 's/[\/&]/\\&/g')
58
132
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
59
133
cp ./php-version-benchmarks/build/infrastructure/config/aws.tfvars.dist ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
60
134
sed -i 's/access_key = ""/access_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_ACCESS_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
61
135
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
62
140
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"
65
180
if [ -f "$DATABASE" ]; then
66
181
LAST_RESULT_SHA="$(tail -n 2 "$DATABASE" | head -n 1 | cut -f 6)"
67
182
else
68
183
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')"
70
185
fi
71
186
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
+
99
235
cp ./php-version-benchmarks/config/test/1_laravel.ini.dist ./php-version-benchmarks/config/test/1_laravel.ini
100
236
cp ./php-version-benchmarks/config/test/2_symfony_main.ini.dist ./php-version-benchmarks/config/test/2_symfony_main.ini
101
237
cp ./php-version-benchmarks/config/test/4_wordpress.ini.dist ./php-version-benchmarks/config/test/4_wordpress.ini
@@ -104,6 +240,7 @@ jobs:
104
240
- name : Run benchmark
105
241
run : ./php-version-benchmarks/benchmark.sh run aws
106
242
- name : Store results
243
+ if : github.repository == 'php/php-src' && github.event_name != 'workflow_dispatch'
107
244
run : |
108
245
set -ex
109
246
@@ -119,6 +256,21 @@ jobs:
119
256
fi
120
257
git commit -m "Add result for ${{ github.repository }}@${{ github.sha }}"
121
258
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 }}
122
274
- name : Cleanup
123
275
if : always()
124
276
run : |
0 commit comments