From 29ef231f04673d6f85a817e7b31a11cc8a33c9b0 Mon Sep 17 00:00:00 2001 From: Kai Norman Clasen Date: Mon, 1 Jul 2024 20:21:33 +0200 Subject: [PATCH] Update release logic --- .github/workflows/build_and_release.yml | 116 +++------ auto_scripts/README.md | 22 -- auto_scripts/run_auto.sh | 6 - auto_scripts/semvertool.sh | 283 ---------------------- auto_scripts/update_package_versioning.sh | 33 --- 5 files changed, 33 insertions(+), 427 deletions(-) delete mode 100644 auto_scripts/README.md delete mode 100644 auto_scripts/run_auto.sh delete mode 100644 auto_scripts/semvertool.sh delete mode 100644 auto_scripts/update_package_versioning.sh diff --git a/.github/workflows/build_and_release.yml b/.github/workflows/build_and_release.yml index fd5ee1c..03d687f 100644 --- a/.github/workflows/build_and_release.yml +++ b/.github/workflows/build_and_release.yml @@ -3,95 +3,45 @@ name: Build and Release # Controls when the action will run. Triggers the workflow on push or pull request # events but only for the master branch on: - push: - paths: - - "**.tex" - - "**.yml" - - "**.sty" - - "**.nix" - branches: [ master ] - pull_request: - paths: - - "**.tex" - - "**.yml" - - "**.sty" - - "**.nix" - branches: [ master ] + - push + - pull_request # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: build: name: Build all files runs-on: ubuntu-latest - container: - image: ghcr.io/xu-cheng/texlive-small:latest - defaults: - run: - shell: sh steps: - - name: Set up repo - uses: actions/checkout@v2 - - name: Install missing packages - run: | - tlmgr update --self && tlmgr install --force --reinstall silence appendixnumberbeamer fira fontaxes mwe noto csquotes fontspec babel luatexja haranoaji haranoaji-extra --repository http://ftp.fau.de/ctan/systems/texlive/tlnet/ - - name: Build minimal examples with pdfLaTeX - working-directory: minimal_examples/ - run: | - ln -sf ../*.sty ./ - ln -sf ../logos ./ - latexmk -pdf -file-line-error -interaction=nonstopmode *.tex - - name: Remove pdfLaTeX results if compilation succeeds - working-directory: minimal_examples/ - run: rm *.pdf - - name: Build minimal examples with LuaLaTeX - working-directory: minimal_examples/ - run: | - ln -sf ../*.sty ./ - ln -sf ../logos ./ - latexmk -lualatex -file-line-error -interaction=nonstopmode *.tex - - name: Build multi-language examples with LuaLaTeX - working-directory: multi_lang_examples/ - run: | - ln -sf ../*.sty ./ - ln -sf ../logos ./ - latexmk -lualatex -file-line-error -interaction=nonstopmode *.tex - - name: Build compare examples - working-directory: compare_examples/ - run: | - ln -sf ../*.sty ./ - ln -sf ../logos ./ - latexmk -pdf -file-line-error -interaction=nonstopmode *example*.tex - - name: Build demo document - run: | - latexmk -pdf -file-line-error -interaction=nonstopmode beamertheme-pure-minimalistic-demo.tex - - name: PDFs to PNGs - uses: docker://frapsoft/fish:latest - with: - args: fish ./.github/workflows/convert_pdf_to_png.fish - if: github.event_name == 'push' - # HERE: Use simple cli logic, maybe script, to push documentation artifacts to external repo with access token - - name: Sync docs - uses: kai-tub/external-repo-sync-action@v1 - with: - source-directory: "./" - include-patterns: "beamertheme-pure-minimalistic-demo.pdf *.png" - exclude-patterns: "*.tmp.png logos" - commit-message: "Updating LaTeX documentation files" - env: - GH_ACCESS_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }} - if: github.event_name == 'push' - release: - name: Release new version - runs-on: ubuntu-latest + - uses: actions/checkout@v4 + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - name: Run tests + run: nix flake check -L + publish: + name: Publish needs: build - if: github.event_name == 'push' + runs-on: ubuntu-latest + permissions: + contents: write + if: startsWith(github.ref, 'refs/tags/') steps: - - name: Set up Git - uses: actions/checkout@v2 - - name: Prepare repository - run: git fetch --unshallow --tags - - name: Run release script - run: bash auto_scripts/run_auto.sh - env: - # To be able to trigger next event - GITHUB_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }} + # only execute if a new release is created + - uses: actions/checkout@v4 + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - run: nix build .#documentation-artifacts + - uses: actions/checkout@v4 + with: + repository: kai-tub/latex-beamer-pure-minimalistic.wiki.git + path: wiki + - run: | + echo "Copy documentation results to wiki" + cp -r ./result wiki/ + cd wiki + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add . + git commit -m "update wiki" + echo "annotate release if release triggered the workflow" + git tag --annotate --message "Release" ${{ github.ref_name }} + git push diff --git a/auto_scripts/README.md b/auto_scripts/README.md deleted file mode 100644 index aad3fa3..0000000 --- a/auto_scripts/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Auto scripts - -These scripts are used to build the release automatically. -The [auto](https://intuit.github.io/auto/) tool bumps the tag version -and publishes the release on GitHub. The configuration file is the -[.autorc](../.autorc) file in the root project folder. During the -release process, auto will trigger the [update_package_versioning](update_package_versioning.sh) -script. This script replaces the version specification in the `.sty` files with the -newest release. The previous version is ignored and replaced with the currently published version. - -If the version `v1.1.2` is currently being published, it will change - -```latex -\ProvidesPackage{pureminimalistic}[XXX] -``` -to -```latex -\ProvidesPackage{pureminimalistic}[v1.1.2] -``` - -It will not check what was written between the square brackets. -This aggressive replace feature makes it robust against accidental manual changes. diff --git a/auto_scripts/run_auto.sh b/auto_scripts/run_auto.sh deleted file mode 100644 index ecddf02..0000000 --- a/auto_scripts/run_auto.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -# Download and run the `auto` tool -> With the provided .autorc file, -# it will trigger a call to update_package_versioning.sh -curl -kL -o - https://github.com/intuit/auto/releases/latest/download/auto-linux.gz | gunzip > ~/auto -chmod a+x ~/auto -~/auto shipit diff --git a/auto_scripts/semvertool.sh b/auto_scripts/semvertool.sh deleted file mode 100644 index b6d2be3..0000000 --- a/auto_scripts/semvertool.sh +++ /dev/null @@ -1,283 +0,0 @@ -#!/usr/bin/env bash - -# https://github.com/fsaintjacques/semver-tool -# Copyright (c) 2014-2015 François Saint-Jacques -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 3, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along with -# this program. If not, see . - -set -o errexit -o nounset -o pipefail - -NAT='0|[1-9][0-9]*' -ALPHANUM='[0-9]*[A-Za-z-][0-9A-Za-z-]*' -IDENT="$NAT|$ALPHANUM" -FIELD='[0-9A-Za-z-]+' - -SEMVER_REGEX="\ -^[vV]?\ -($NAT)\\.($NAT)\\.($NAT)\ -(\\-(${IDENT})(\\.(${IDENT}))*)?\ -(\\+${FIELD}(\\.${FIELD})*)?$" - -PROG=semver -PROG_VERSION="3.0.0" - -USAGE="\ -Usage: - $PROG bump (major|minor|patch|release|prerel |build ) - $PROG compare - $PROG get (major|minor|patch|release|prerel|build) - $PROG --help - $PROG --version -Arguments: - A version must match the following regular expression: - \"${SEMVER_REGEX}\" - In English: - -- The version must match X.Y.Z[-PRERELEASE][+BUILD] - where X, Y and Z are non-negative integers. - -- PRERELEASE is a dot separated sequence of non-negative integers and/or - identifiers composed of alphanumeric characters and hyphens (with - at least one non-digit). Numeric identifiers must not have leading - zeros. A hyphen (\"-\") introduces this optional part. - -- BUILD is a dot separated sequence of identifiers composed of alphanumeric - characters and hyphens. A plus (\"+\") introduces this optional part. - See definition. - A string as defined by PRERELEASE above. - A string as defined by BUILD above. -Options: - -v, --version Print the version of this tool. - -h, --help Print this help message. -Commands: - bump Bump by one of major, minor, patch; zeroing or removing - subsequent parts. \"bump prerel\" sets the PRERELEASE part and - removes any BUILD part. \"bump build\" sets the BUILD part. - \"bump release\" removes any PRERELEASE or BUILD parts. - The bumped version is written to stdout. - compare Compare with , output to stdout the - following values: -1 if is newer, 0 if equal, 1 if - older. The BUILD part is not used in comparisons. - get Extract given part of , where part is one of major, minor, - patch, prerel, build, or release. -See also: - https://semver.org -- Semantic Versioning 2.0.0" - -function error { - echo -e "$1" >&2 - exit 1 -} - -function usage-help { - error "$USAGE" -} - -function usage-version { - echo -e "${PROG}: $PROG_VERSION" - exit 0 -} - -function validate-version { - local version=$1 - if [[ "$version" =~ $SEMVER_REGEX ]]; then - # if a second argument is passed, store the result in var named by $2 - if [ "$#" -eq "2" ]; then - local major=${BASH_REMATCH[1]} - local minor=${BASH_REMATCH[2]} - local patch=${BASH_REMATCH[3]} - local prere=${BASH_REMATCH[4]} - local build=${BASH_REMATCH[8]} - eval "$2=(\"$major\" \"$minor\" \"$patch\" \"$prere\" \"$build\")" - else - echo "$version" - fi - else - error "version $version does not match the semver scheme 'X.Y.Z(-PRERELEASE)(+BUILD)'. See help for more information." - fi -} - -function is-nat { - [[ "$1" =~ ^($NAT)$ ]] -} - -function is-null { - [ -z "$1" ] -} - -function order-nat { - [ "$1" -lt "$2" ] && { echo -1 ; return ; } - [ "$1" -gt "$2" ] && { echo 1 ; return ; } - echo 0 -} - -function order-string { - [[ $1 < $2 ]] && { echo -1 ; return ; } - [[ $1 > $2 ]] && { echo 1 ; return ; } - echo 0 -} - -# given two (named) arrays containing NAT and/or ALPHANUM fields, compare them -# one by one according to semver 2.0.0 spec. Return -1, 0, 1 if left array ($1) -# is less-than, equal, or greater-than the right array ($2). The longer array -# is considered greater-than the shorter if the shorter is a prefix of the longer. -# -function compare-fields { - local l="$1[@]" - local r="$2[@]" - local leftfield=( "${!l}" ) - local rightfield=( "${!r}" ) - local left - local right - - local i=$(( -1 )) - local order=$(( 0 )) - - while true - do - [ $order -ne 0 ] && { echo $order ; return ; } - - : $(( i++ )) - left="${leftfield[$i]}" - right="${rightfield[$i]}" - - is-null "$left" && is-null "$right" && { echo 0 ; return ; } - is-null "$left" && { echo -1 ; return ; } - is-null "$right" && { echo 1 ; return ; } - - is-nat "$left" && is-nat "$right" && { order=$(order-nat "$left" "$right") ; continue ; } - is-nat "$left" && { echo -1 ; return ; } - is-nat "$right" && { echo 1 ; return ; } - { order=$(order-string "$left" "$right") ; continue ; } - done -} - -# shellcheck disable=SC2206 # checked by "validate"; ok to expand prerel id's into array -function compare-version { - local order - validate-version "$1" V - validate-version "$2" V_ - - # compare major, minor, patch - - local left=( "${V[0]}" "${V[1]}" "${V[2]}" ) - local right=( "${V_[0]}" "${V_[1]}" "${V_[2]}" ) - - order=$(compare-fields left right) - [ "$order" -ne 0 ] && { echo "$order" ; return ; } - - # compare pre-release ids when M.m.p are equal - - local prerel="${V[3]:1}" - local prerel_="${V_[3]:1}" - local left=( ${prerel//./ } ) - local right=( ${prerel_//./ } ) - - # if left and right have no pre-release part, then left equals right - # if only one of left/right has pre-release part, that one is less than simple M.m.p - - [ -z "$prerel" ] && [ -z "$prerel_" ] && { echo 0 ; return ; } - [ -z "$prerel" ] && { echo 1 ; return ; } - [ -z "$prerel_" ] && { echo -1 ; return ; } - - # otherwise, compare the pre-release id's - - compare-fields left right -} - -function command-bump { - local new; local version; local sub_version; local command; - - case $# in - 2) case $1 in - major|minor|patch|release) command=$1; version=$2;; - *) usage-help;; - esac ;; - 3) case $1 in - prerel|build) command=$1; sub_version=$2 version=$3 ;; - *) usage-help;; - esac ;; - *) usage-help;; - esac - - validate-version "$version" parts - # shellcheck disable=SC2154 - local major="${parts[0]}" - local minor="${parts[1]}" - local patch="${parts[2]}" - local prere="${parts[3]}" - local build="${parts[4]}" - - case "$command" in - major) new="$((major + 1)).0.0";; - minor) new="${major}.$((minor + 1)).0";; - patch) new="${major}.${minor}.$((patch + 1))";; - release) new="${major}.${minor}.${patch}";; - prerel) new=$(validate-version "${major}.${minor}.${patch}-${sub_version}");; - build) new=$(validate-version "${major}.${minor}.${patch}${prere}+${sub_version}");; - *) usage-help ;; - esac - - echo "$new" - exit 0 -} - -function command-compare { - local v; local v_; - - case $# in - 2) v=$(validate-version "$1"); v_=$(validate-version "$2") ;; - *) usage-help ;; - esac - - set +u # need unset array element to evaluate to null - compare-version "$v" "$v_" - exit 0 -} - - -# shellcheck disable=SC2034 -function command-get { - local part version - - if [[ "$#" -ne "2" ]] || [[ -z "$1" ]] || [[ -z "$2" ]]; then - usage-help - exit 0 - fi - - part="$1" - version="$2" - - validate-version "$version" parts - local major="${parts[0]}" - local minor="${parts[1]}" - local patch="${parts[2]}" - local prerel="${parts[3]:1}" - local build="${parts[4]:1}" - local release="${major}.${minor}.${patch}" - - case "$part" in - major|minor|patch|release|prerel|build) echo "${!part}" ;; - *) usage-help ;; - esac - - exit 0 -} - -case $# in - 0) echo "Unknown command: $*"; usage-help;; -esac - -case $1 in - --help|-h) echo -e "$USAGE"; exit 0;; - --version|-v) usage-version ;; - bump) shift; command-bump "$@";; - get) shift; command-get "$@";; - compare) shift; command-compare "$@";; - *) echo "Unknown arguments: $*"; usage-help;; -esac \ No newline at end of file diff --git a/auto_scripts/update_package_versioning.sh b/auto_scripts/update_package_versioning.sh deleted file mode 100644 index 24794d3..0000000 --- a/auto_scripts/update_package_versioning.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -# Script is triggered by `auto` BeforeChangelog -# Assumes current dir is the project root - -set -e - -# Print on stderr to not pollute function return echo -function error { - echo "::error::$1" >& 2 - exit 1 -} - -# https://stackoverflow.com/questions/59895/how-to-get-the-source-directory-of-a-bash-script-from-within-the-script-itself -scriptFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -bumpType=$(echo "$ARG_0" | jq -r '.bump') -currentVersion=$( echo "$ARG_0" | jq -r '.currentVersion' ) - -echo "currentVersion: $currentVersion" -echo "bump type: $bumpType" - - -if [[ -z "$currentVersion" ]]; then - error "auto provided empty ENV json!" -fi - -# bump version -newVersion=$( bash "${scriptFolder}/semvertool.sh" bump "$bumpType" "$currentVersion" ) -newVersionWithV="v$newVersion" - -sed -r -i "s/(\\ProvidesPackage\{\w+\})\[.*\]/\1\[${newVersionWithV}\]/g" -- *.sty -# Files will be commited via `auto` tool -git add .