@@ -2,14 +2,81 @@ 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 commit'
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 commit'
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
38+ pull-requests : write
739jobs :
840 REAL_TIME_BENCHMARK :
941 name : REAL_TIME_BENCHMARK
10- if : github.repository == 'php /php-src'
42+ if : github.repository == 'kocsismate /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 "[email protected] " 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.PHP_VERSION_BENCHMARK_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.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