@@ -2,14 +2,80 @@ name: Real-time Benchmark
22on :
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"
536permissions :
637 contents : read
738jobs :
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