From 335ce3a89f28ee9e68f1ebf23dbc98c7fe930c7c Mon Sep 17 00:00:00 2001 From: David Sanders Date: Wed, 10 Apr 2024 14:11:31 -0700 Subject: [PATCH] ci: audit to watch for changes to Chromium schedule (#40) --- .../audit-chromium-schedule-dates.yml | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 .github/workflows/audit-chromium-schedule-dates.yml diff --git a/.github/workflows/audit-chromium-schedule-dates.yml b/.github/workflows/audit-chromium-schedule-dates.yml new file mode 100644 index 0000000..8de3a71 --- /dev/null +++ b/.github/workflows/audit-chromium-schedule-dates.yml @@ -0,0 +1,121 @@ +name: Audit Chromium Schedule Dates + +on: + workflow_dispatch: + schedule: + - cron: '0 18 * * *' + +permissions: + actions: read + +jobs: + audit_chromium_schdule_dates: + name: Audit Chromium Schedule Dates + runs-on: ubuntu-latest + steps: + - name: Restore previous run data + uses: dawidd6/action-download-artifact@71072fbb1229e1317f1a8de6b04206afb461bd67 # v3.1.2 + with: + name: data + if_no_artifact_found: ignore + workflow_conclusion: 'completed' + search_artifacts: true + - run: npm install @electron/fiddle-core + - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const fs = require('node:fs/promises'); + + const { ElectronVersions } = require('@electron/fiddle-core'); + + const PRETTY_NAMES = { + 'earliest_beta': 'Earliest Beta', + 'latest_beta': 'Latest Beta', + 'final_beta': 'Final Beta', + 'stable_date': 'Stable Date', + }; + + const filename = 'milestone-data.json'; + let prevData = null; + + try { + prevData = JSON.parse(await fs.readFile(filename)); + } catch (err) { + if (err.code !== 'ENOENT') { + throw err; + } else { + core.debug('Previous data not found'); + } + } + + const checkMilestone = async (milestone) => { + let changesFound = false; + + const res = await fetch(`https://chromiumdash.appspot.com/fetch_milestone_schedule?mstone=${milestone}`); + const keys = ['earliest_beta', 'latest_beta', 'final_beta', 'stable_date']; + const { earliest_beta, latest_beta, final_beta, stable_date } = (await res.json()).mstones[0]; + const data = { earliest_beta, latest_beta, final_beta, stable_date }; + + core.summary.addHeading(`M${milestone}`, 2); + + const headers = [{ data: 'Name', header: true }]; + + if (prevData !== null && milestone in prevData && keys.some((key) => data[key] !== prevData[milestone][key])) { + process.exitCode = 1; + + core.summary.addEOL(); + core.summary.addRaw('> [!WARNING]\n> Changes to milestone dates detected', true); + + headers.push({ data: 'Old Date', header: true }), + headers.push({ data: 'New Date', header: true }), + core.summary.addTable([ + headers, + ...keys.map((key) => { + const oldDate = prevData[milestone][key].split('T')[0]; + const newDate = data[key].split('T')[0]; + return [PRETTY_NAMES[key], oldDate, newDate !== oldDate ? newDate : '']; + }), + ]); + } else { + headers.push({ data: 'Date', header: true }), + core.summary.addTable([ + headers, + ...keys.map((key) => [PRETTY_NAMES[key], data[key].split('T')[0]]), + ]); + } + + return data; + }; + + const versions = await ElectronVersions.create(undefined, { ignoreCache: true }); + const release = versions.getReleaseInfo(versions.latest); + + const milestone = parseInt(release.chrome.match(/(\d+)\.\d+\.\d+\.\d+/)[1]); + + core.summary.addHeading('📅 Chromium Milestone Dates'); + + // Run these in order rather than parallel so that the output is in order + const milestoneData = {}; + milestoneData[milestone] = await checkMilestone(milestone); + milestoneData[milestone +1] = await checkMilestone(milestone + 1); + + // Write to file to upload as artifact + await fs.writeFile(filename, JSON.stringify(milestoneData)); + + await core.summary.write(); + - name: Send Slack message if dates changed + if: failure() + uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 + with: + payload: | + { + "link": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" + } + env: + SLACK_WEBHOOK_URL: ${{ secrets.CHROMIUM_DATES_SLACK_WEBHOOK_URL }} + - name: Persist data + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + if: ${{ !cancelled() }} + with: + name: data + path: milestone-data.json