1
0
mirror of synced 2026-02-01 12:01:41 -05:00

Merge pull request #27172 from github/repo-sync

Repo sync
This commit is contained in:
docs-bot
2023-07-31 08:33:48 -07:00
committed by GitHub
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)' : '')
}

View File

@@ -0,0 +1,43 @@
name: Purge old deployment environments
# **What it does**:
# Deletes old deployment environments. A deployment environment exists
# for the sake of a Azure Preview environment. Those Azure Preview environments
# and cleaned up by a separate process.
# **Why we have it**: To keep things neat and tidy.
# **Who does it impact**: Docs engineering.
on:
workflow_dispatch:
schedule:
- cron: '20 16 * * *' # Run every day at 16:20 UTC / 8:20 PST
permissions:
contents: write
jobs:
purge-old-deployment-environments:
if: ${{ github.repository == 'github/docs-internal' || github.repository == 'github/docs' }}
runs-on: ubuntu-latest
steps:
- name: Checkout out repo
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab
- uses: ./.github/actions/node-npm-setup
- name: Run purge script
if: ${{ env.FREEZE != 'true' }}
env:
GITHUB_REPOSITORY: ${{ github.repository }}
# Necessary to be able to delete deployment environments
GITHUB_TOKEN: ${{ secrets.DOCS_BOT_PAT_WORKFLOW_READORG }}
run: .github/actions-scripts/purge-old-deployment-environments.js
- name: Send Slack notification if workflow fails
uses: someimportantcompany/github-actions-slack-message@1d367080235edfa53df415bd8e0bbab480f29bad
if: ${{ failure() && env.FREEZE != 'true' }}
with:
channel: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }}
bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }}
color: failure
text: The last "Purge old deployment environments" run for ${{github.repository}} failed. See https://github.com/${{github.repository}}/actions/workflows/purge-old-deployment-environments.yml