@@ -2,13 +2,49 @@ name: Real-time Benchmark
22on :
33 schedule :
44 - cron : " 30 0 * * *"
5+ workflow_dispatch :
6+ inputs :
7+ repository :
8+ description : ' Repository name that is going to be benchmarked (e.g. "johndoe/php-src")'
9+ required : true
10+ type : string
11+ branch :
12+ description : ' Branch name that is going to be benchmarked (e.g. "my-branch")'
13+ required : true
14+ type : string
15+ commit :
16+ description : ' Full commit SHA that is going to be benchmarked (e.g. "123456789a...")'
17+ required : true
18+ type : string
19+ baseline_commit :
20+ description : ' Full commit SHA that is compared against the one provided by the "commit" input (e.g. "abcdef123456...")'
21+ required : true
22+ type : string
23+ id :
24+ description : ' ID of the benchmarked code. It should be a valid identifier (e.g. "master", "php_85").'
25+ required : true
26+ type : string
27+ jit :
28+ description : ' Whether JIT is benchmarked'
29+ required : false
30+ type : choice
31+ options :
32+ - " 0"
33+ - " 1"
534permissions :
635 contents : read
736jobs :
837 REAL_TIME_BENCHMARK :
938 name : REAL_TIME_BENCHMARK
10- if : github.repository == 'php /php-src'
39+ if : github.repository == 'kocsismate /php-src' || github.event_name == 'workflow_dispatch '
1140 runs-on : ubuntu-22.04
41+ env :
42+ REPOSITORY : ${{ inputs.repository || 'php/php-src' }}
43+ BRANCH : ${{ inputs.branch || 'master' }}
44+ COMMIT : ${{ inputs.commit || github.sha }}
45+ BASELINE_COMMIT : ${{ inputs.baseline_commit || 'd5f6e56610c729710073350af318c4ea1b292cfe' }}
46+ ID : ${{ inputs.id || 'master' }}
47+ JIT : ${{ inputs.jit || '1' }}
1248 steps :
1349 - name : Install dependencies
1450 run : |
@@ -29,73 +65,143 @@ jobs:
2965 ref : ' main'
3066 fetch-depth : 1
3167 path : ' php-version-benchmarks'
32- - name : Checkout php-src
68+ - name : Checkout php-src (benchmarked version)
3369 uses : actions/checkout@v4
3470 with :
35- repository : ' php/php-src '
36- ref : ' ${{ github.sha }}'
71+ repository : ' ${{ env.REPOSITORY }} '
72+ ref : ' ${{ env.COMMIT }}'
3773 fetch-depth : 100
38- path : ' php-version-benchmarks/tmp/php_master'
74+ path : ' php-version-benchmarks/tmp/php_${{ env.ID }}'
75+ - name : Checkout php-src (baseline version)
76+ uses : actions/checkout@v4
77+ with :
78+ repository : ' ${{ env.REPOSITORY }}'
79+ ref : ' ${{ env.BASELINE_COMMIT }}'
80+ fetch-depth : 100
81+ path : ' php-version-benchmarks/tmp/php_baseline'
3982 - name : Setup benchmark results
4083 run : |
4184 git config --global user.name "Benchmark"
4285 git config --global user.email "[email protected] " 43-
86+
4487 rm -rf ./php-version-benchmarks/docs/results
4588 - name : Checkout benchmark data
89+ if : github.repository == 'kocsismate/php-src' && github.event_name != 'workflow_dispatch'
4690 uses : actions/checkout@v4
4791 with :
4892 repository : php/real-time-benchmark-data
4993 ssh-key : ${{ secrets.PHP_VERSION_BENCHMARK_RESULTS_DEPLOY_KEY }}
5094 path : ' php-version-benchmarks/docs/results'
51- - name : Set benchmark config
95+ - name : Setup infra config
5296 run : |
5397 set -e
5498
55- # Set infrastructure config
5699 cp ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini.dist ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
57100 ESCAPED_DOCKER_REGISTRY=$(printf '%s\n' "${{ secrets.PHP_VERSION_BENCHMARK_DOCKER_REGISTRY }}" | sed -e 's/[\/&]/\\&/g')
58101 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
59102 cp ./php-version-benchmarks/build/infrastructure/config/aws.tfvars.dist ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
60103 sed -i 's/access_key = ""/access_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_ACCESS_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
61104 sed -i 's/secret_key = ""/secret_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_SECRET_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
105+ - name : Setup PHP config - baseline PHP version
106+ if : github.repository == 'kocsismate/php-src' && github.event_name != 'workflow_dispatch'
107+ run : |
108+ set -e
109+
110+ BASELINE_SHORT_SHA="$(echo "${{ env.BASELINE_COMMIT }}" | cut -c1-4)"
111+
112+ cat << EOF > ./php-version-benchmarks/config/php/baseline.ini
113+ PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA"
114+ PHP_ID=php_baseline
115+
116+ PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
117+ PHP_BRANCH=${{ env.BRANCH }}
118+ PHP_COMMIT=${{ env.BASELINE_COMMIT }}
119+
120+ PHP_OPCACHE=2
121+ PHP_JIT=0
122+ EOF
123+ - name : Setup PHP config - baseline PHP version with JIT (manual only)
124+ if : github.repository == 'kocsismate/php-src' && github.event_name == 'workflow_dispatch' && inputs.jit == '1'
125+ run : |
126+ set -e
127+
128+ BASELINE_SHORT_SHA="$(echo "${{ env.BASELINE_COMMIT }}" | cut -c1-4)"
129+
130+ cat << EOF > ./php-version-benchmarks/config/php/baseline.ini
131+ PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA (JIT)"
132+ PHP_ID=php_baseline_jit
133+
134+ PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
135+ PHP_BRANCH=${{ env.BRANCH }}
136+ PHP_COMMIT=${{ env.BASELINE_COMMIT }}
137+
138+ PHP_OPCACHE=2
139+ PHP_JIT=${{ env.JIT }}
140+ EOF
141+
142+ git clone ./php-version-benchmarks/tmp/php_baseline/ ./php-version-benchmarks/tmp/php_baseline_jit
143+ - name : Setup PHP config - previous PHP version (scheduled only)
144+ if : github.repository == 'kocsismate/php-src' && github.event_name != 'workflow_dispatch'
145+ run : |
146+ set -e
62147
63148 YEAR="$(date '+%Y')"
64149 DATABASE="./php-version-benchmarks/docs/results/$YEAR/database.tsv"
65150 if [ -f "$DATABASE" ]; then
66151 LAST_RESULT_SHA="$(tail -n 2 "$DATABASE" | head -n 1 | cut -f 6)"
67152 else
68153 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')"
154+ LAST_RESULT_SHA="$(cd ./php-version-benchmarks/tmp/php_${{ env.ID }} / && git --no-pager log --until="$YESTERDAY" -n 1 --pretty='%H')"
70155 fi
71156
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
157+ cat << EOF > ./php-version-benchmarks/config/php/previous.ini
158+ PHP_NAME="PHP - previous ${{ env.BRANCH }}"
159+ PHP_ID=php_previous
160+
161+ PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
162+ PHP_BRANCH=${{ env.BRANCH }}
163+ PHP_COMMIT=$LAST_RESULT_SHA
164+
165+ PHP_OPCACHE=1
166+ PHP_JIT=0
167+ EOF
168+ - name : Setup PHP config - benchmarked PHP version
169+ run : |
170+ set -e
171+
172+ cat << EOF > ./php-version-benchmarks/config/php/this.ini
173+ PHP_NAME="PHP - ${{ env.BRANCH }}"
174+ PHP_ID=php_${{ env.ID }}
175+
176+ PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
177+ PHP_BRANCH=${{ env.BRANCH }}
178+ PHP_COMMIT=${{ env.COMMIT }}
179+
180+ PHP_OPCACHE=1
181+ PHP_JIT=0
182+ EOF
183+ - name : Setup PHP config - benchmarked PHP version with JIT
184+ if : env.JIT == '1'
185+ run : |
186+ set -e
187+
188+ cat << EOF > ./php-version-benchmarks/config/php/this_jit.ini
189+ PHP_NAME="PHP - ${{ env.BRANCH }} (JIT)"
190+ PHP_ID=php_${{ env.ID }}_jit
191+
192+ PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
193+ PHP_BRANCH=${{ env.BRANCH }}
194+ PHP_COMMIT=${{ env.COMMIT }}
195+
196+ PHP_OPCACHE=1
197+ PHP_JIT=${{ env.JIT }}
198+ EOF
199+
200+ git clone ./php-version-benchmarks/tmp/php_${{ env.ID }}/ ./php-version-benchmarks/tmp/php_${{ env.ID }}_jit
201+ - name : Setup test config
202+ run : |
203+ set -e
204+
99205 cp ./php-version-benchmarks/config/test/1_laravel.ini.dist ./php-version-benchmarks/config/test/1_laravel.ini
100206 cp ./php-version-benchmarks/config/test/2_symfony_main.ini.dist ./php-version-benchmarks/config/test/2_symfony_main.ini
101207 cp ./php-version-benchmarks/config/test/4_wordpress.ini.dist ./php-version-benchmarks/config/test/4_wordpress.ini
@@ -104,6 +210,7 @@ jobs:
104210 - name : Run benchmark
105211 run : ./php-version-benchmarks/benchmark.sh run aws
106212 - name : Store results
213+ if : github.repository == 'kocsismate/php-src' && github.event_name != 'workflow_dispatch'
107214 run : |
108215 set -ex
109216
@@ -119,6 +226,17 @@ jobs:
119226 fi
120227 git commit -m "Add result for ${{ github.repository }}@${{ github.sha }}"
121228 git push
229+ - name : Comment results
230+ if : github.repository != 'php/php-src' && github.event_name == 'workflow_dispatch'
231+ env :
232+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
233+ run : |
234+ PR_NUMBER=$(gh pr list --head "${{ inputs.branch }}" --state open --json number --jq '.[0].number')
235+ if [ ! -z "$PR_NUMBER" ]; then
236+ YEAR="$(date '+%Y')"
237+ NEWEST_RESULT_DIRECTORY=$(ls -td ./php-version-benchmarks/docs/results/$YEAR/*/ | head -1)
238+ gh pr comment $PR_NUMBER --body-file "$NEWEST_RESULT_DIRECTORY/result.md"
239+ fi
122240 - name : Cleanup
123241 if : always()
124242 run : |
0 commit comments