Skip to content

versioning tasks

versioning tasks #1

Workflow file for this run

name: versioning
run-name: versioning tasks
on:
pull_request:
branches:
- main
push:
branches:
- main
permissions:
contents: write
jobs:
pull-request:
# only run on template itself, not user instance of template
if: |
github.repository == 'greenelab/lab-website-template' &&
github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
# for debugging
- uses: crazy-max/ghaction-dump-context@v2
- if: runner.debug == '1'
uses: mxschmitt/action-tmate@v3
- name: Checkout base branch contents
uses: actions/checkout@v4
with:
ref: main
path: base
- name: Checkout pr branch contents
uses: actions/checkout@v4
with:
path: pr
- name: Install packages
run: npm install yaml semver
- name: Check version, date, changelog
uses: actions/github-script@v7
with:
script: |
const { readFileSync } = require("fs");
const { lte, valid } = require("semver");
const { parse } = require("yaml");
// load and parse file contents
const { version: oldVersion, "date-released": oldDate } = parse(
readFileSync("base/CITATION.cff").toString()
);
const { version: newVersion, "date-released": newDate } = parse(
readFileSync("pr/CITATION.cff").toString()
);
const changelog = readFileSync("pr/CHANGELOG.md")
.toString()
.split(/^## /m)
.map((section) => {
const [heading, ...body] = section.split("\n");
return [heading.trim(), body.join("\n").trim()];
});
// check version
if (!valid(newVersion)) throw Error("Version not valid");
if (lte(newVersion, oldVersion)) throw Error("Version not updated");
// check date
if (new Date(newDate).toISOString().split("T")[0] !== newDate)
throw Error("Date not valid");
if (new Date(newDate) <= new Date(oldDate)) throw Error("Date not updated");
// check changelog
const newSection = changelog.find(
([heading, body]) =>
heading.includes(newVersion) && heading.includes(newDate) && body
);
if (!newSection) throw Error("Changelog not updated or not valid");
push:
# only run on template itself, not user instance of template
if: |
github.repository == 'greenelab/lab-website-template' &&
github.event_name == 'push'
runs-on: ubuntu-latest
steps:
# for debugging
- uses: crazy-max/ghaction-dump-context@v2
- name: Checkout branch contents
uses: actions/checkout@v4
- name: Install packages
run: npm install yaml semver
# for debugging
- if: runner.debug == '1'
uses: mxschmitt/action-tmate@v3
- name: Get version and body
id: version
uses: actions/github-script@v7
with:
script: |
const { readFileSync } = require("fs");
const { parse } = require("yaml");
// load and parse file contents
const { version, "date-released": date } = parse(
readFileSync("CITATION.cff").toString()
);
const changelog = readFileSync("CHANGELOG.md")
.toString()
.split(/^## /m)
.map((section) => {
const [heading, ...body] = section.split("\n");
return [heading.trim(), body.join("\n").trim()];
});
// find changelog body for version
const [, body = ""] =
changelog.find(
([heading]) => heading.includes(version) && heading.includes(date)
) || [];
return { version, body };
- name: Create GitHub release
uses: ncipollo/[email protected]
with:
commit: ${{ github.ref }}
tag: v${{ fromJson(steps.version.outputs.result).version }}
name: v${{ fromJson(steps.version.outputs.result).version }}
body: ${{ fromJson(steps.version.outputs.result).body }}