[blog] Top Albums 2025 #45
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: blog-post-release | |
| on: | |
| pull_request: | |
| branches: [ main ] | |
| types: [ opened, edited, closed, reopened ] | |
| jobs: | |
| announce: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20.x' | |
| - run: npm install js-yaml | |
| - uses: actions/github-script@v8 | |
| with: | |
| github-token: ${{secrets.GITHUB_TOKEN}} | |
| script: | | |
| const yaml = require("js-yaml"); | |
| const pr = context.payload.pull_request; | |
| if (pr.state !== "open" && pr.merged_at === null) { | |
| console.log("pr was not merged, skipping"); | |
| return; | |
| } | |
| let urlBase = "https://kylemtravis.com/blog"; | |
| if (pr.state === "open") | |
| urlBase = `https://deploy-preview-${pr.number}--kylemtravis.netlify.app/blog`; | |
| const result = await github.rest.pulls.listFiles({ | |
| pull_number: pr.number, | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| }); | |
| const added = result.data.filter(f => f.status === "added"); | |
| const newBlogPosts = added.filter(f => f.filename.match(/src\/blog\//) !== null); | |
| if (newBlogPosts.length < 1) | |
| return; | |
| const [_div, metaString, _rest] = newBlogPosts[0].patch.split('---', 3); | |
| const meta = yaml.load(metaString); | |
| const releaseName = meta['name']; | |
| const slug = meta['slug'] || releaseName.toLowerCase().replace(/\s+/g, "-").replace(/[^a-zA-Z0-9\-]/g, ""); | |
| const rel = { | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| tag_name: `blog-pr-${pr.number}`, | |
| target_commitish: pr.head.sha, | |
| name: `[Blog Post] ${releaseName}`, | |
| body: `New blog post, read it [here](${urlBase}/${slug})!`, | |
| draft: pr.state === "open", | |
| }; | |
| const rels = await github.rest.repos.listReleases({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| }); | |
| const found = rels.data.filter(r => r.draft && r.tag_name == rel.tag_name); | |
| await (found.length > 1 ? | |
| github.rest.repos.updateRelease({ | |
| release_id: found[0].id, | |
| ...rel | |
| }) : | |
| github.rest.repos.createRelease(rel) | |
| ); | |