@@ -66,14 +66,15 @@ jobs:
66
66
)
67
67
68
68
const getInstallationAccessToken = require('./get-installation-access-token')
69
- const accessToken = await getInstallationAccessToken(
69
+ const { expiresAt, token: accessToken } = await getInstallationAccessToken(
70
70
console,
71
71
appId,
72
72
privateKey,
73
73
installationId
74
74
)
75
75
76
76
core.setSecret(accessToken)
77
+ core.setOutput('expires-at', expiresAt)
77
78
core.setOutput('token', accessToken)
78
79
79
80
- name : get check run id
@@ -295,6 +296,45 @@ jobs:
295
296
exit 1
296
297
fi
297
298
299
+ - name : refresh installation token (if needed)
300
+ if : env.CREATE_CHECK_RUN != 'false'
301
+ id : refresh
302
+ uses : actions/github-script@v6
303
+ with :
304
+ script : |
305
+ // GitHub Apps' installation access tokens expire after one hour, see:
306
+ // https://docs.github.com/en/developers/apps/building-github-apps/authenticating-with-github-apps#authenticating-as-an-installation
307
+ // let's generate a new one if less than 5 minutes before the expiry date, otherwise reuse it
308
+ if (Date.parse('${{ steps.setup.outputs.expires-at }}') - Date.now() > 5 * 60 * 1000) {
309
+ core.setOutput('expires-at', '${{ steps.setup.outputs.expires-at }}')
310
+ core.setOutput('token', '${{ steps.setup.outputs.token }}')
311
+ core.info('Continuing to use the unexpired installation access token')
312
+ return
313
+ }
314
+ const appId = ${{ secrets.GH_APP_ID }}
315
+ const privateKey = `${{ secrets.GH_APP_PRIVATE_KEY }}`
316
+
317
+ const getAppInstallationId = require('./get-app-installation-id')
318
+ const installationId = await getAppInstallationId(
319
+ console,
320
+ appId,
321
+ privateKey,
322
+ process.env.OWNER,
323
+ process.env.REPO
324
+ )
325
+
326
+ const getInstallationAccessToken = require('./get-installation-access-token')
327
+ const { expiresAt, token: accessToken } = await getInstallationAccessToken(
328
+ console,
329
+ appId,
330
+ privateKey,
331
+ installationId
332
+ )
333
+
334
+ core.setSecret(accessToken)
335
+ core.setOutput('expires-at', expiresAt)
336
+ core.setOutput('token', accessToken)
337
+
298
338
- name : update check-run
299
339
if : env.CREATE_CHECK_RUN != 'false'
300
340
uses : actions/github-script@v6
@@ -303,7 +343,7 @@ jobs:
303
343
const updateCheckRun = require('./update-check-run')
304
344
await updateCheckRun(
305
345
console,
306
- '${{ steps.setup .outputs.token }}',
346
+ '${{ steps.refresh .outputs.token }}',
307
347
process.env.OWNER,
308
348
process.env.REPO,
309
349
'${{ steps.check-run.outputs.id }}',
@@ -347,7 +387,7 @@ jobs:
347
387
const updateCheckRun = require('./update-check-run')
348
388
await updateCheckRun(
349
389
console,
350
- '${{ steps.setup .outputs.token }}',
390
+ '${{ steps.refresh .outputs.token }}',
351
391
process.env.OWNER,
352
392
process.env.REPO,
353
393
'${{ steps.check-run.outputs.id }}',
0 commit comments