@@ -148,6 +148,8 @@ jobs:
148148 rm -f "${benchmark_jar}"
149149
150150 - name : Capture benchmark environment
151+ id : benchmark-environment
152+ continue-on-error : true
151153 run : |
152154 node <<'NODE'
153155 const childProcess = require('child_process');
@@ -192,7 +194,30 @@ jobs:
192194 );
193195 NODE
194196
197+ - name : Create fallback benchmark environment
198+ if : steps.benchmark-environment.outcome == 'failure'
199+ run : |
200+ node <<'NODE'
201+ const fs = require('fs');
202+
203+ const environment = {
204+ version: process.env.BENCHMARK_VERSION,
205+ versionPath: process.env.BENCHMARK_VERSION_PATH,
206+ ref: process.env.BENCHMARK_REF,
207+ commit: process.env.BENCHMARK_COMMIT,
208+ runDate: new Date().toISOString(),
209+ workflowRunUrl: `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`,
210+ benchmarkPattern: process.env.JMH_PATTERN,
211+ jmhArgs: process.env.JMH_ARGS,
212+ environmentCaptureError: true
213+ };
214+
215+ fs.mkdirSync('target/benchmarks', { recursive: true });
216+ fs.writeFileSync('target/benchmarks/environment.json', `${JSON.stringify(environment, null, 2)}\n`);
217+ NODE
218+
195219 - name : Upload benchmark artifacts
220+ continue-on-error : true
196221 uses : actions/upload-artifact@v7
197222 with :
198223 name : benchmarks-${{ env.BENCHMARK_VERSION_PATH }}
@@ -220,7 +245,7 @@ jobs:
220245 MAVEN_GPG_PASSPHRASE : ${{ secrets.MAVEN_GPG_PASSPHRASE }}
221246
222247 - name : Release rollback on failure
223- if : always() && steps.release.outcome != 'success' && hashFiles('release.properties') != ''
248+ if : always() && (failure() || steps.release.outcome != 'success') && hashFiles('release.properties') != ''
224249 run : mvn -B -U -Prelease release:rollback
225250
226251 - name : Create GitHub Release
@@ -266,17 +291,21 @@ jobs:
266291 const indexPath = path.join(siteRoot, 'benchmarks', 'index.json');
267292
268293 function getText(url) {
269- return new Promise(resolve => {
294+ return new Promise(( resolve, reject) => {
270295 const client = url.protocol === 'http:' ? http : https;
271296 const request = client.get(url, response => {
272297 if (response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) {
273298 response.resume();
274- resolve( getText(new URL(response.headers.location, url)));
299+ getText(new URL(response.headers.location, url)).then(resolve, reject );
275300 return;
276301 }
277302 if (response.statusCode < 200 || response.statusCode >= 300) {
278303 response.resume();
279- resolve(null);
304+ if (response.statusCode === 404) {
305+ resolve(null);
306+ return;
307+ }
308+ reject(new Error(`HTTP ${response.statusCode} while fetching ${url.href}`));
280309 return;
281310 }
282311 response.setEncoding('utf8');
@@ -286,10 +315,9 @@ jobs:
286315 });
287316 response.on('end', () => resolve(data));
288317 });
289- request.on('error', () => resolve(null) );
318+ request.on('error', reject );
290319 request.setTimeout(15000, () => {
291- request.destroy();
292- resolve(null);
320+ request.destroy(new Error(`Timeout while fetching ${url.href}`));
293321 });
294322 });
295323 }
@@ -328,15 +356,16 @@ jobs:
328356 try {
329357 index = JSON.parse(indexText);
330358 } catch (error) {
331- return ;
359+ throw new Error(`Published benchmark index is not valid JSON: ${error.message}`) ;
332360 }
333361
334362 for (const release of index.releases || []) {
335363 await restoreFile(release.jmh);
336364 await restoreFile(release.environment);
337365 }
338366 })().catch(error => {
339- console.log(`Benchmark history restore failed: ${error.message}`);
367+ console.error(`Benchmark history restore failed: ${error.message}`);
368+ process.exit(1);
340369 });
341370 NODE
342371
0 commit comments