1
0
mirror of synced 2026-01-04 18:06:26 -05:00

Purge old deployment environments (#40027)

This commit is contained in:
Peter Bengtsson
2023-07-31 11:10:34 -04:00
committed by GitHub
parent ba45ae3382
commit f1163733aa
2 changed files with 108 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
#!/usr/bin/env node
import assert from 'node:assert/strict'
import { getOctokit } from '@actions/github'
main()
async function main() {
const DRY_RUN = Boolean(JSON.parse(process.env.DRY_RUN || 'false'))
const MAX_DELETIONS = parseInt(JSON.parse(process.env.MAX_DELETIONS || '10'))
const MIN_AGE_DAYS = parseInt(process.env.MIN_AGE_DAYS || '90', 10)
const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/')
if (!owner || !repo) {
throw new Error('GITHUB_REPOSITORY environment variable not set')
}
const token = process.env.GITHUB_TOKEN
if (!token) {
throw new Error(`GITHUB_TOKEN environment variable not set`)
}
const github = getOctokit(token)
// The sort order is not explicitly listed for this API endpoint.
// In practice it appears to list those that are oldest first.
// But to guarantee that it reaches the oldest, we paginate over
// all of them.
const environments = await github.paginate('GET /repos/{owner}/{repo}/environments', {
owner,
repo,
})
let countDeletions = 0
for (const environment of environments) {
const ageDays = (Date.now() - Date.parse(environment.created_at)) / 1000 / 60 / 60 / 24
if (ageDays > MIN_AGE_DAYS) {
console.log(
`Deleting environment ${environment.name} created ${Math.ceil(ageDays)} days ago`,
DRY_RUN ? '(DRY RUN)' : '',
)
if (!DRY_RUN) {
const { status } = await github.request(
'DELETE /repos/{owner}/{repo}/environments/{name}',
{
owner,
repo,
name: environment.name,
},
)
assert(status === 204, `Expected status 204, got ${status}`)
}
countDeletions++
if (MAX_DELETIONS && countDeletions >= MAX_DELETIONS) {
console.log(`Reached max number of deletions: ${MAX_DELETIONS}`)
break
}
} else {
console.log(
`Environment ${environment.name} (${environment.id}) created ${Math.ceil(
ageDays,
)} days ago, is *not* old enough`,
)
}
}
console.log(`Deleted ${countDeletions} environments`, DRY_RUN ? '(DRY RUN)' : '')
}