testing release job #52
Workflow file for this run
This file contains 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
# GitHub Action to build a self-contained binary of the Denon AVR Python driver | |
--- | |
name: "Build & Release" | |
on: | |
push: | |
# branches: [ main ] | |
# tags: | |
# - v[0-9]+.[0-9]+.[0-9]+* | |
pull_request: | |
types: [ opened, synchronize, reopened ] | |
env: | |
INTG_NAME: denonavr | |
HASH_FILENAME: uc-intg-denonavr.hash | |
# Python version to use in the builder image. See https://hub.docker.com/r/arm64v8/python for possible versions. | |
PYTHON_VER: 3.11.6-0.2.0 | |
BUILD_CHANGELOG: build-changelog.md | |
jobs: | |
build: | |
runs-on: ubuntu-24.04 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
# History of 200 should be more than enough to calculate commit count since last release tag. | |
fetch-depth: 200 | |
- name: Fetch all tags to determine version | |
run: | | |
git fetch origin +refs/tags/*:refs/tags/* | |
echo "VERSION=$(git describe --match "v[0-9]*" --tags HEAD --always)" >> $GITHUB_ENV | |
- name: Verify driver.json version for release build | |
if: contains(github.ref, 'tags/v') | |
run: | | |
DRIVER_VERSION="v$(jq .version -r driver.json)" | |
if [ "${{ env.VERSION }}" != "$DRIVER_VERSION" ]; then | |
echo "Version in driver.json ($DRIVER_VERSION) doesn't match git version tag (${{ env.VERSION }})!" | |
exit 1 | |
fi | |
- name: Prepare | |
run: | | |
sudo apt-get update && sudo apt-get install -y qemu binfmt-support qemu-user-static | |
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes | |
echo "Running pyinstaller" | |
docker run --rm --name builder \ | |
--platform=aarch64 \ | |
--user=$(id -u):$(id -g) \ | |
-v ${GITHUB_WORKSPACE}:/workspace \ | |
docker.io/unfoldedcircle/r2-pyinstaller:${PYTHON_VER} \ | |
bash -c \ | |
"cd /workspace && \ | |
python -m pip install -r requirements.txt && \ | |
pyinstaller --clean --onedir --name intg-denonavr intg-denonavr/driver.py" | |
- name: Add version | |
run: | | |
mkdir -p artifacts | |
cd artifacts | |
echo ${{ env.VERSION }} > version.txt | |
- name: Prepare artifacts | |
shell: bash | |
run: | | |
mv dist/intg-denonavr artifacts/ | |
mv artifacts/intg-denonavr artifacts/bin | |
mv artifacts/bin/intg-denonavr artifacts/bin/driver | |
cp driver.json artifacts/ | |
echo "ARTIFACT_NAME=uc-intg-${{ env.INTG_NAME }}-${{ env.VERSION }}-aarch64" >> $GITHUB_ENV | |
- name: Create upload artifact | |
shell: bash | |
run: | | |
tar czvf ${{ env.ARTIFACT_NAME }}.tar.gz -C ${GITHUB_WORKSPACE}/artifacts . | |
ls -lah | |
- uses: actions/upload-artifact@v4 | |
id: upload_artifact | |
with: | |
name: ${{ env.ARTIFACT_NAME }} | |
path: ${{ env.ARTIFACT_NAME }}.tar.gz | |
if-no-files-found: error | |
retention-days: 3 | |
- name: Setup Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: "lts/*" | |
- name: "Create Changelog" | |
run: | | |
npm install -g conventional-changelog-cli | |
conventional-changelog -p conventionalcommits -u -o ${{ env.BUILD_CHANGELOG }} | |
cat ${{ env.BUILD_CHANGELOG }} | |
- name: Upload changelog | |
uses: actions/upload-artifact@v4 | |
with: | |
name: changelog | |
path: ${{ env.BUILD_CHANGELOG }} | |
if-no-files-found: error | |
retention-days: 3 | |
release: | |
name: Create Release | |
# TODO just for testing PR | |
# if: github.ref == 'refs/heads/main' || contains(github.ref, 'tags/v') | |
runs-on: ubuntu-24.04 | |
needs: [ build ] | |
steps: | |
- name: Download build artifacts | |
uses: actions/download-artifact@v4 | |
- name: Extract build archives from downloaded files | |
run: | | |
ls -R | |
# extract tar.gz build archives from downloaded artifacts | |
# (wrapped in tar from actions/upload-artifact, then extracted into a directory by actions/download-artifact) | |
for D in * | |
do if [ -d "${D}" ]; then | |
mv $D/* ./ | |
fi | |
done; | |
# Use a common timestamp for all matrix build artifacts | |
- name: Get timestamp | |
run: | | |
echo "TIMESTAMP=$(date +"%Y%m%d_%H%M%S")" >> $GITHUB_ENV | |
# Checkout is required for the next `gh release delete` step | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
path: main | |
# We have to delete the "latest" release, otherwise `softprops/action-gh-release` will only append the new artifact. | |
# This simulates the old marvinpinto/action-automatic-releases action. | |
- name: Remove previous pre-release | |
run: | | |
cd main | |
gh release delete latest --cleanup-tag -y || true | |
env: | |
GH_TOKEN: ${{ github.token }} | |
# Add timestamp to development builds | |
- name: Create GitHub development build archives | |
if: "!contains(github.ref, 'tags/v')" | |
run: | | |
# append timestamp | |
for filename in *.tar.gz; do mv $filename "$(basename $filename .tar.gz)-${{ env.TIMESTAMP }}.tar.gz"; done; | |
for filename in *.tar.gz; do echo "sha256 `sha256sum $filename`" >> ${{ env.HASH_FILENAME }}; done; | |
# Use conventional commit changelog, and append the GitHub generated changelog | |
- name: Create Pre-Release | |
uses: softprops/action-gh-release@v2 | |
if: "!contains(github.ref, 'tags/v')" | |
with: | |
prerelease: true | |
tag_name: latest | |
body_path: ${{ env.BUILD_CHANGELOG }} | |
generate_release_notes: true | |
name: "Development Build" | |
files: | | |
*.tar.gz | |
${{ env.HASH_FILENAME }} | |
- name: Create GitHub release archives | |
if: "contains(github.ref, 'tags/v')" | |
run: | | |
for filename in *.tar.gz; do echo "sha256 `sha256sum $filename`" >> ${{ env.HASH_FILENAME }}; done; | |
- name: Create Release | |
uses: softprops/action-gh-release@v2 | |
if: "contains(github.ref, 'tags/v')" | |
with: | |
prerelease: false | |
generate_release_notes: true | |
files: | | |
*.tar.gz | |
${{ env.HASH_FILENAME }} |