Skip to content

Release Build

Release Build #3

Workflow file for this run

# thinRoot Release build
# yamllint disable rule:truthy
---
name: Release Build
on:
workflow_dispatch:
inputs:
release_date:
description: 'Release date override (YYYYMMDD)'
required: true
default: "YYYYMMDD"
skip_build:
description: 'Skip build (for testing workflow)?'
required: true
default: "true"
# default read-only permission
permissions:
contents: read
jobs:
release_draft:
permissions:
contents: write # ncipollo/release-action
name: Release draft
runs-on: ubuntu-22.04
outputs:
upload_url: ${{ steps.release_drafter.outputs.upload_url }}
version: ${{ steps.env.outputs.version }}
date: ${{ steps.env.outputs.date }}
tag: ${{ steps.env.outputs.tag }}
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Environment
id: env
shell: bash
run: |
if [[ "${{ github.event.inputs.release_date }}" == "YYYYMMDD" ]]; then
BUILD_DATE=$(date +%Y%m%d)
else
BUILD_DATE=${{ github.event.inputs.release_date }}
fi
echo "version=${BUILD_DATE}" >> $GITHUB_OUTPUT
echo "date=${BUILD_DATE}" >> $GITHUB_OUTPUT
if [[ "${{ github.event.inputs.skip_build }}" == "true" ]]; then
echo "tag=${BUILD_DATE}-draft" >> $GITHUB_OUTPUT
else
echo "tag=${BUILD_DATE}" >> $GITHUB_OUTPUT
fi
- name: Get previous tag
id: previoustag
uses: WyriHaximus/[email protected]
- name: Generate changelog
id: changelog
uses: metcalfc/[email protected]
with:
myToken: ${{ secrets.GITHUB_TOKEN }}
- name: Generate release notes
shell: bash
run: |
FILTER="(snapshot bump \[|Merge branch '|Update .*\.md$|Bump .* from .* to .*)"
export CHANGELOG="$(cat <<'EOF' | egrep -v "${FILTER}"
${{ steps.changelog.outputs.changelog }}
EOF
)"
export VERSION=${{ steps.env.outputs.version }}
export PREVIOUS_TAG=${{ steps.previoustag.outputs.tag }}
envsubst <.github/release-template.md >/tmp/release-template.md
- name: Create release draft
id: release_drafter
uses: ncipollo/[email protected]
with:
tag: ${{ steps.env.outputs.tag }}
name: 'thinRoot ${{ steps.env.outputs.version }}'
bodyFile: /tmp/release-template.md
draft: true
prerelease: false
allowUpdates: true
token: ${{ secrets.GITHUB_TOKEN }}
- name: Upload release-template.md artifact
uses: actions/upload-artifact@v4
with:
path: /tmp/release-template.md
name: release-template.md
build:
permissions:
contents: write # shogo82148/actions-upload-release-asset
name: Release build [${{ matrix.platform }}]
if: github.repository == 'jens-maus/thinRoot'
runs-on: self-hosted
timeout-minutes: 300
needs: release_draft
outputs:
build_datetime: ${{ steps.env.outputs.build_datetime }}
strategy:
fail-fast: false
matrix:
platform: [intelnuc]
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Install Dependencies
run: |
if ! dpkg-query -l wget bc cpio rsync zip python3 file >/dev/null 2>&1; then
apt update
apt install -y --no-install-recommends wget bc cpio rsync zip python3 file
fi
if ! getent group | grep -q ^builder:; then groupadd -g 48 builder; fi
if ! getent passwd | grep -q ^builder:; then useradd -m -u 1003 -g 48 -G sudo builder; fi
if ! grep -q ^builder; then echo "builder ALL=(ALL:ALL) NOPASSWD: ALL" >>/etc/sudoers; fi
chown -R builder:builder /home/builder
- name: Setup Environment
id: env
run: |
JLEVEL=0
if [[ -f /sys/fs/cgroup/cpu.max ]]; then # cgroups v2
CPU_QUOTA=$(cut -d ' ' -f1 /sys/fs/cgroup/cpu.max)
if [[ "${CPU_QUOTA}" != "max" ]]; then
CPU_PERIOD=$(cut -d ' ' -f2 /sys/fs/cgroup/cpu.max)
JLEVEL=$((CPU_QUOTA / CPU_PERIOD + 1))
fi
elif [[ -f /sys/fs/cgroup/cpu/cpu.cfs_quota_us ]]; then # cgroups v1
CPU_QUOTA=$(cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us)
if [[ "${CPU_QUOTA}" != "-1" ]]; then
CPU_PERIOD=$(cat /sys/fs/cgroup/cpu/cpu.cfs_period_us)
JLEVEL=$((CPU_QUOTA / CPU_PERIOD + 1))
fi
fi
echo "JLEVEL=${JLEVEL}" >> $GITHUB_ENV
echo "FAKE_BUILD=${{ github.event.inputs.skip_build }}" >> $GITHUB_ENV
echo "build_datetime=$(date +'%Y-%m-%d %H:%M:%S')" >> $GITHUB_OUTPUT
# - name: remote debug tmate session
# uses: mxschmitt/action-tmate@v1
# if: matrix.platform == 'intelnuc'
# major build step
- name: Build
timeout-minutes: 300
run: |
rm -rf release/thinroot-* buildroot-????.*
sudo -H -E -u builder nice -n 19 make DATE=${{ needs.release_draft.outputs.date }} BR2_DL_DIR=/mnt/download BR2_CCACHE_DIR=/mnt/ccache/${{ matrix.platform }} BR2_JLEVEL=${{ env.JLEVEL }} clean-all ${{ matrix.platform }}-release
#######################
# release uploads
- name: Upload release snapshot [intelnuc]
uses: shogo82148/actions-upload-release-asset@v1
with:
upload_url: ${{ needs.release_draft.outputs.upload_url }}
asset_path: release/thinroot-${{ needs.release_draft.outputs.version }}-${{ matrix.platform }}.img
asset_content_type: application/octet-stream
- name: Upload build release checksum [intelnuc]
uses: shogo82148/actions-upload-release-asset@v1
with:
upload_url: ${{ needs.release_draft.outputs.upload_url }}
asset_path: release/thinroot-${{ needs.release_draft.outputs.version }}-${{ matrix.platform }}.img.sha256
asset_content_type: text/plain
#######################
# manifest file artifact upload
- name: Upload manifest artifact
uses: actions/upload-artifact@v4
with:
path: release/thinroot-${{ needs.release_draft.outputs.version }}-${{ matrix.platform }}.mf
name: thinroot-${{ needs.release_draft.outputs.version }}-${{ matrix.platform }}.mf
# cleanup
- name: Cleanup
run: |
make clean-all
rm -rf release/thinroot-* buildroot-????.*
##########################################
# Update checksums in release draft
update-checksums:
permissions:
contents: write # ncipollo/release-action
name: Update checksums
runs-on: ubuntu-22.04
needs: [release_draft, build]
steps:
- uses: actions/checkout@v4
# download all artifact files
- name: Download all workflow artifacts
uses: actions/download-artifact@v4
- name: Patch release draft
shell: bash
run: |
for f in */*.mf; do
while read -r line; do
NEEDLE=$(echo "${line}" | awk '{print $3}' | sed 's/.*-\(.*\..*\)$/\1/')
SHACKS=$(echo "${line}" | awk '{print $2}')
sed -i "s/XSHA${NEEDLE}X/${SHACKS}/" release-template.md/release-template.md
done < <(cat ${f})
done
- name: Update release draft
uses: ncipollo/[email protected]
with:
tag: ${{ needs.release_draft.outputs.tag }}
bodyFile: release-template.md/release-template.md
allowUpdates: true
draft: true
prerelease: false
omitNameDuringUpdate: true
omitPrereleaseDuringUpdate: true
token: ${{ secrets.GITHUB_TOKEN }}