@@ -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,144 @@ 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+           sed -i 's/github_token = ""/github_token = "${{ secrets.PHP_VERSION_BENCHMARK_GITHUB_TOKEN }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars 
106+        - name : Setup PHP config - baseline PHP version 
107+         if : github.repository == 'kocsismate/php-src' && github.event_name != 'workflow_dispatch' 
108+         run : | 
109+           set -e 
110+ 
111+           BASELINE_SHORT_SHA="$(echo "${{ env.BASELINE_COMMIT }}" | cut -c1-4)" 
112+ 
113+           cat << EOF > ./php-version-benchmarks/config/php/baseline.ini 
114+             PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA" 
115+             PHP_ID=php_baseline 
116+ 
117+             PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git 
118+             PHP_BRANCH=${{ env.BRANCH }} 
119+             PHP_COMMIT=${{ env.BASELINE_COMMIT }} 
120+ 
121+             PHP_OPCACHE=2 
122+             PHP_JIT=0 
123+           EOF 
124+        - name : Setup PHP config - baseline PHP version with JIT (manual only) 
125+         if : github.repository == 'kocsismate/php-src' && github.event_name == 'workflow_dispatch' && inputs.jit == '1' 
126+         run : | 
127+           set -e 
128+ 
129+           BASELINE_SHORT_SHA="$(echo "${{ env.BASELINE_COMMIT }}" | cut -c1-4)" 
130+            
131+           cat << EOF > ./php-version-benchmarks/config/php/baseline.ini 
132+             PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA (JIT)" 
133+             PHP_ID=php_baseline_jit 
134+ 
135+             PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git 
136+             PHP_BRANCH=${{ env.BRANCH }} 
137+             PHP_COMMIT=${{ env.BASELINE_COMMIT }} 
138+ 
139+             PHP_OPCACHE=2 
140+             PHP_JIT=${{ env.JIT }} 
141+           EOF 
142+ 
143+           git clone ./php-version-benchmarks/tmp/php_baseline/ ./php-version-benchmarks/tmp/php_baseline_jit 
144+        - name : Setup PHP config - previous PHP version (scheduled only) 
145+         if : github.repository == 'kocsismate/php-src' && github.event_name != 'workflow_dispatch' 
146+         run : | 
147+           set -e 
62148
63149          YEAR="$(date '+%Y')" 
64150          DATABASE="./php-version-benchmarks/docs/results/$YEAR/database.tsv" 
65151          if [ -f "$DATABASE" ]; then 
66152            LAST_RESULT_SHA="$(tail -n 2 "$DATABASE" | head -n 1 | cut -f 6)" 
67153          else 
68154            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')" 
155+             LAST_RESULT_SHA="$(cd ./php-version-benchmarks/tmp/php_${{ env.ID }} / && git --no-pager log --until="$YESTERDAY" -n 1 --pretty='%H')" 
70156          fi 
71157
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 
158+           cat << EOF > ./php-version-benchmarks/config/php/previous.ini 
159+             PHP_NAME="PHP - previous ${{ env.BRANCH }}" 
160+             PHP_ID=php_previous 
161+ 
162+             PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git 
163+             PHP_BRANCH=${{ env.BRANCH }} 
164+             PHP_COMMIT=$LAST_RESULT_SHA 
165+ 
166+             PHP_OPCACHE=1 
167+             PHP_JIT=0 
168+           EOF 
169+        - name : Setup PHP config - benchmarked PHP version 
170+         run : | 
171+           set -e 
172+ 
173+           cat << EOF > ./php-version-benchmarks/config/php/this.ini 
174+             PHP_NAME="PHP - ${{ env.BRANCH }}" 
175+             PHP_ID=php_${{ env.ID }} 
176+ 
177+             PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git 
178+             PHP_BRANCH=${{ env.BRANCH }} 
179+             PHP_COMMIT=${{ env.COMMIT }} 
180+ 
181+             PHP_OPCACHE=1 
182+             PHP_JIT=0 
183+           EOF 
184+        - name : Setup PHP config - benchmarked PHP version with JIT 
185+         if : env.JIT == '1' 
186+         run : | 
187+           set -e 
188+ 
189+           cat << EOF > ./php-version-benchmarks/config/php/this_jit.ini 
190+             PHP_NAME="PHP - ${{ env.BRANCH }} (JIT)" 
191+             PHP_ID=php_${{ env.ID }}_jit 
192+ 
193+             PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git 
194+             PHP_BRANCH=${{ env.BRANCH }} 
195+             PHP_COMMIT=${{ env.COMMIT }} 
196+ 
197+             PHP_OPCACHE=1 
198+             PHP_JIT=${{ env.JIT }} 
199+           EOF 
200+ 
201+           git clone ./php-version-benchmarks/tmp/php_${{ env.ID }}/ ./php-version-benchmarks/tmp/php_${{ env.ID }}_jit 
202+        - name : Setup test config 
203+         run : | 
204+           set -e 
205+ 
99206          cp ./php-version-benchmarks/config/test/1_laravel.ini.dist ./php-version-benchmarks/config/test/1_laravel.ini 
100207          cp ./php-version-benchmarks/config/test/2_symfony_main.ini.dist ./php-version-benchmarks/config/test/2_symfony_main.ini 
101208          cp ./php-version-benchmarks/config/test/4_wordpress.ini.dist ./php-version-benchmarks/config/test/4_wordpress.ini 
@@ -104,6 +211,7 @@ jobs:
104211       - name : Run benchmark 
105212        run : ./php-version-benchmarks/benchmark.sh run aws 
106213      - name : Store results 
214+         if : github.repository == 'kocsismate/php-src' && github.event_name != 'workflow_dispatch' 
107215        run : | 
108216          set -ex 
109217
@@ -119,6 +227,17 @@ jobs:
119227          fi 
120228          git commit -m "Add result for ${{ github.repository }}@${{ github.sha }}" 
121229          git push 
230+        - name : Comment results 
231+         if : github.repository != 'php/php-src' && github.event_name == 'workflow_dispatch' 
232+         env :
233+           GH_TOKEN : ${{ secrets.GITHUB_TOKEN }} 
234+         run : | 
235+           PR_NUMBER=$(gh pr list --head "${{ inputs.branch }}" --state open --json number --jq '.[0].number') 
236+           if [ ! -z "$PR_NUMBER" ]; then 
237+             YEAR="$(date '+%Y')" 
238+             NEWEST_RESULT_DIRECTORY=$(ls -td ./php-version-benchmarks/docs/results/$YEAR/*/ | head -1) 
239+             gh pr comment $PR_NUMBER --body-file "$NEWEST_RESULT_DIRECTORY/result.md" 
240+           fi 
122241       - name : Cleanup 
123242        if : always() 
124243        run : | 
0 commit comments