Skip to content

.github/workflows/01-make-dist.yml: PoC with LouisBrunner/checks-acti… #55

.github/workflows/01-make-dist.yml: PoC with LouisBrunner/checks-acti…

.github/workflows/01-make-dist.yml: PoC with LouisBrunner/checks-acti… #55

Workflow file for this run

# Adapted from NUT codeql.yml with inspiration taken from
# https://javahelps.com/manage-github-artifact-storage-quota
# regarding uploads of artifacts and clearing the way for them.
# See also:
# https://github.com/actions/upload-artifact
# https://docs.github.com/en/actions/reference/workflows-and-actions/variables
# https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax
name: "GHA-01: Make dist and docs tarballs, see workflow page for links"
on:
push:
branches: [ "master", "FTY", "fightwarn", "FTY-obs" ]
tags:
- v*
pull_request_target:
# The branches below must be a subset of the branches above
# Note that for PRs this runs the copy of workflow in the
# target branch (and only then gets some of the permissions
# listed below), and identification/naming of PR source vs.
# a pushed branch (e.g. master updated by a PR merge) is
# tricky.
branches: [ "master", "FTY", "fightwarn", "FTY-obs" ]
schedule:
- cron: '15 12 * * 0'
workflow_dispatch:
# Allow manually running the action, e.g. if disabled after some quietness in the source
permissions:
checks: write
contents: write
issues: write
pull-requests: write
jobs:
make-dist-tarballs:
name: Make Dist and Docs Tarballs
# FIXME: Prepare/maintain a container image with pre-installed
# NUT build/tooling prereqs (save about 3 minutes per run!)
# Maybe https://aschmelyun.com/blog/using-docker-run-inside-of-github-actions/
# => https://github.com/addnab/docker-run-action can help
runs-on: ubuntu-latest
strategy:
fail-fast: false
steps:
# PoC, see https://github.com/LouisBrunner/checks-action
# and https://powgs.freetls.fastly.net/mirror/misskey/-/blob/develop/.github/workflows/pr-preview-deploy.yml
# and e.g. https://api.github.com/repos/networkupstools/nut/commits/973fb587ebcf904bcfff869c3577e91cbb03e708/check-runs
- uses: actions/github-script@v6.3.3
id: job-check-id
env:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
### This probably can be retrieved using something like "${{ github.jobs[github.job].name }}" but seems too complex for this linear workflow
job: "Make Dist and Docs Tarballs"
### This gives "make-dist-tarballs":
job_id: ${{ github.job }}
run_id: ${{ github.run_id }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
result-encoding: string
script: |
const ref = process.env.ref;
const { data: checks } = await github.rest.checks.listForRef({
...context.repo,
ref
});
const check = checks.check_runs.filter(c => c.name === process.env.job);
return check[0].id;
- name: "GHA-01: Change this GH Check report"
uses: LouisBrunner/checks-action@v2.0.0
if: always()
#continue-on-error: true
env:
check_id: ${{ steps.job-check-id.outputs.result }}
with:
token: ${{ secrets.GITHUB_TOKEN }}
check_id: ${{ env.check_id }}
#check_id: ${{ github.run_id }}
#name: "GHA-01: Make dist and docs tarballs, see workflow page for links"
#status: "in_progress"
conclusion: ${{ job.status }}
details_url: http://localhost
output: '{ "text_description": "Dist and Docs tarballs will be linked here after the `make dist` job completes", "summary": "in_progress"}'
# Post early so this would be about the top comment in the PR trail
# (easy to see, contents replaced later)
- name: "GHA-01: Make dist and docs tarballs - report download URL (placeholder) as a first-ever PR comment"
uses: marocchino/sticky-pull-request-comment@v2
if: startsWith(github.ref, 'refs/pull/') || github.event.pull_request.number > 0
continue-on-error: true
with:
header: latest-tarball-sticky
only_create: true
message: Sticky note -- Dist and Docs tarballs will be linked here after the "make dist" job completes.
- name: Checkout repository
uses: actions/checkout@v5
with:
fetch-depth: 0
fetch-tags: true
# https://github.com/marketplace/actions/substitute-string
# See also examples in https://github.com/dhimmel/dump-actions-context/
# Note it warns about "unexpected input(s)" with replacement tokens below,
# as they are by design not predefined, as far as actions API is concened.
# They still work for substitutions though.
- uses: bluwy/substitute-string-action@v3
id: subst-github-ref-name
with:
_input-text: "${{ github.event.pull_request.number > 0 && format('PR-{0}', github.event.pull_request.number) || github.head_ref || github.ref_name }}"
" ": _
"/": _
- name: Debug PR/branch identification
run: |
echo "steps.subst-github-ref-name.outputs.result='${{ steps.subst-github-ref-name.outputs.result }}'" || true
echo "github.event.pull_request.number='${{ github.event.pull_request.number }}'" || true
echo "format('PR-{0}', github.event.pull_request.number)='${{ format('PR-{0}', github.event.pull_request.number) }}'" || true
echo "github.head_ref='${{ github.head_ref }}'" || true
echo "github.ref='${{ github.ref }}'" || true
echo "github.ref_name='${{ github.ref_name }}'" || true
# Make build identification more useful (so we use no fallbacks in script)
- name: Try to get more Git metadata
run: |
git describe || {
git remote -v || true
git branch -a || true
for R in `git remote` ; do git fetch $R master ; done || true
git fetch --tags
pwd ; ls -la
echo "=== Known commits in history:"
git log --oneline | wc -l
echo "=== Recent commits in history:"
git log -2 || true
echo "=== Known tags:"
git tag || true
echo "=== Try to ensure 'git describe' works:"
git describe || {
git fetch --all && for R in `git remote` ; do for T in `git tag` ; do git fetch $R $T ; done ; done
git describe || {
TEST_REF="`git symbolic-ref --short HEAD 2>/dev/null || cat .git/HEAD`" && [ -n "${TEST_REF}" ] && git checkout master && git pull --all && git checkout "${TEST_REF}"
git describe || true
}
}
}
# Using hints from https://askubuntu.com/questions/272248/processing-triggers-for-man-db
# and our own docs/config-prereqs.txt
# NOTE: Currently installing the MAX prerequisite footprint,
# which for building just the docs may be a bit of an overkill.
- name: NUT CI Prerequisite packages (Ubuntu, GCC)
run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
sudo apt update
sudo apt install \
gcc g++ clang \
ccache time \
git perl curl \
make autoconf automake libltdl-dev libtool binutils \
valgrind \
cppcheck \
pkg-config \
libtool-bin \
python3 gettext python3-pyqt6 pyqt6-dev-tools \
aspell aspell-en \
asciidoc source-highlight python3-pygments dblatex \
libgd-dev \
systemd-dev \
libsystemd-dev \
libcppunit-dev \
libssl-dev libnss3-dev \
augeas-tools libaugeas-dev augeas-lenses \
libusb-dev libusb-1.0-0-dev \
libi2c-dev \
libmodbus-dev \
libsnmp-dev \
libpowerman0-dev \
libfreeipmi-dev libipmimonitoring-dev \
libavahi-common-dev libavahi-core-dev libavahi-client-dev \
libgpiod-dev \
bash dash ksh busybox \
libneon27-gnutls-dev \
build-essential git-core libi2c-dev i2c-tools lm-sensors \
|| exit
date > .timestamp-init
- name: Prepare ccache
# Based on https://docs.github.com/en/actions/reference/workflows-and-actions/dependency-caching#example-using-the-cache-action example
id: cache-ccache
uses: actions/cache@v4
env:
compiler: 'CC=gcc CXX=g++'
cache-name: cache-ccache-${{ env.compiler }}
with:
path: |
~/.ccache
~/.cache/ccache
~/.config/ccache/ccache.conf
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/.timestamp-init') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: CCache stats before build
run: |
ccache -sv || ccache -s || echo "FAILED to read ccache info, oh well"
rm -f .timestamp-init
- name: Debug gitlog2version processing
run: bash -x ./tools/gitlog2version.sh || true
- name: NUT CI Build Configuration
env:
compiler: 'CC=gcc CXX=g++'
run: |
PATH="/usr/lib/ccache:$PATH" ; export PATH
CCACHE_COMPRESS=true; export CCACHE_COMPRESS
ccache --version || true
( ${{env.compiler}} ; echo "=== CC: $CC => `command -v $CC` =>" ; $CC --version ; echo "=== CXX: $CXX => `command -v $CXX` =>" ; $CXX --version ) || true
./autogen.sh && \
./configure --enable-warnings --enable-Werror --enable-Wcolor --with-all --with-dev --with-docs --enable-docs-changelog ${{env.compiler}}
# NOTE: In this scenario we do not build actually NUT in the main
# checkout directory, at least not explicitly (recipe may generate
# some files like man pages to fulfill the "dist" requirements;
# for now this may generate some libs to figure out their IDs).
# We do `make docs` to provide them as a separate tarball just
# in case, later.
# DO NOT `make dist-files` here as it includes `dist-sig` and
# needs a GPG keychain with maintainers' secrets deployed locally.
- name: NUT CI Build to create "dist" tarball and related files
env:
compiler: 'CC=gcc CXX=g++'
run: |
PATH="/usr/lib/ccache:$PATH" ; export PATH
CCACHE_COMPRESS=true; export CCACHE_COMPRESS
ccache --version || true
( ${{env.compiler}} ; echo "=== CC: $CC => `command -v $CC` =>" ; $CC --version ; echo "=== CXX: $CXX => `command -v $CXX` =>" ; $CXX --version ) || true
make -s -j 8 dist dist-hash
- name: NUT CI Build to verify "dist" tarball build
env:
compiler: 'CC=gcc CXX=g++'
run: |
PATH="/usr/lib/ccache:$PATH" ; export PATH
CCACHE_COMPRESS=true; export CCACHE_COMPRESS
ccache --version || true
( ${{env.compiler}} ; echo "=== CC: $CC => `command -v $CC` =>" ; $CC --version ; echo "=== CXX: $CXX => `command -v $CXX` =>" ; $CXX --version ) || true
make -s -j 8 distcheck
- name: NUT CI Build to verify "dist" tarball build self-reproducibility
env:
compiler: 'CC=gcc CXX=g++'
run: |
PATH="/usr/lib/ccache:$PATH" ; export PATH
CCACHE_COMPRESS=true; export CCACHE_COMPRESS
ccache --version || true
( ${{env.compiler}} ; echo "=== CC: $CC => `command -v $CC` =>" ; $CC --version ; echo "=== CXX: $CXX => `command -v $CXX` =>" ; $CXX --version ) || true
make -s -j 8 distcheck-completeness
- name: CCache stats after distcheck
run: ccache -sv || ccache -s || echo "FAILED to read ccache info, oh well"
- name: NUT CI Build to package complex docs (not part of dist tarball)
run: |
make -s -j 8 dist-docs
# Inspired by https://javahelps.com/manage-github-artifact-storage-quota
# Note that the code below wipes everything matched by the filter!
# We may want another script block (after this cleanup of obsolete data)
# to iterate clearing the way build by build until there's X MB available
# (at least 12MB as of Nov 2025).
- if: env.GITHUB_REF_TYPE != 'tag' && steps.subst-github-ref-name.outputs.result != 'master'
name: Delete Old Artifacts for this feature branch/PR
uses: actions/github-script@v6
id: delete_old_artifact_for_pr
continue-on-error: true
with:
script: |
const res = await github.rest.actions.listArtifactsForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
})
res.data.artifacts
.filter(({ name }) => name === 'NUT-tarballs-${{ steps.subst-github-ref-name.outputs.result }}')
.forEach(({ id }) => {
github.rest.actions.deleteArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: id,
})
})
- name: Upload tarball and its checksum artifacts
uses: actions/upload-artifact@v4
id: upload_artifact
with:
name: NUT-tarballs-${{ steps.subst-github-ref-name.outputs.result }}
path: |
nut-*.tar*
compression-level: 0
overwrite: true
# FIXME: Something that adds/updates Github Checks would be better
# as it would be seen in the list attached to a status icon of any
# build (e.g. history of master branch)
# https://github.com/marocchino/sticky-pull-request-comment
- name: "GHA-01: Make dist and docs tarballs - report download URL as a PR comment"
uses: marocchino/sticky-pull-request-comment@v2
if: startsWith(github.ref, 'refs/pull/') || github.event.pull_request.number > 0
continue-on-error: true
with:
header: latest-tarball-sticky
message: Dist and Docs [NUT-tarballs-${{ steps.subst-github-ref-name.outputs.result }}.zip](${{ steps.upload_artifact.outputs.artifact-url }}) are available for commit ${{ github.event.pull_request.head.sha || github.sha }}
# https://github.com/marketplace/actions/commit-comment
- name: "GHA-01: Make dist and docs tarballs - report download URL as a commit comment"
uses: peter-evans/commit-comment@v4
continue-on-error: true
with:
body: Dist and Docs [NUT-tarballs-${{ steps.subst-github-ref-name.outputs.result }}.zip](${{ steps.upload_artifact.outputs.artifact-url }}) are available for commit ${{ github.event.pull_request.head.sha || github.sha }}