Build and Release AppBundles - NG #74
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
name: Build and Release AppBundles - NG | |
env: | |
TAG_NAME: v${{ github.run_number }}-$(date +'%Y%m%d%H%M%S') | |
on: | |
schedule: | |
- cron: '0 0 * * 0' | |
workflow_dispatch: | |
inputs: | |
script_pattern: | |
description: "Pattern to match scripts to build (leave empty to build all)" | |
required: false | |
default: "" | |
release: | |
description: "Create a release (true/false)" | |
required: false | |
default: "true" | |
jobs: | |
build: | |
name: Build AppBundles | |
runs-on: ubuntu-latest | |
permissions: write-all | |
container: | |
image: "docker.io/azathothas/appbundler-alpine:latest" | |
options: --privileged | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Remove non-compliant tools | |
run: | | |
apk del bash findutils gawk grep diffutils coreutils | |
- name: Set up GOBIN and install lib4bin | |
run: | | |
set -x | |
export GOBIN="$GITHUB_WORKSPACE/.local/bin" | |
mkdir -p "$GOBIN" | |
echo "GOBIN=$GOBIN" >> $GITHUB_ENV | |
echo "PATH=$GOBIN:$PATH" >> $GITHUB_ENV | |
git clone --depth 1 --branch dev https://github.com/xplshn/pelf | |
cp ./pelf/* "$GOBIN" || true | |
cd ./pelf/cmd/dynexec/lib4bin | |
go install . | |
cd - | |
cd ./pelf/cmd/misc/appstream_helper | |
go install . | |
- name: Set OUT_DIR environment variable | |
run: | | |
OUT_DIR="$GITHUB_WORKSPACE/APPBUNDLES" | |
META_OUT_DIR="$GITHUB_WORKSPACE/APPBUNDLES_META" | |
mkdir -p "$OUT_DIR" "$META_OUT_DIR" | |
echo "OUT_DIR=${OUT_DIR}" >> $GITHUB_ENV | |
echo "META_OUT_DIR=${META_OUT_DIR}" >> $GITHUB_ENV | |
- name: List available scripts | |
run: | | |
echo "Listing available recipes:" | |
tree "$GITHUB_WORKSPACE/recipes" | |
- name: Run selected build scripts | |
run: | | |
ls "$GITHUB_WORKSPACE/baseSystems" | |
set -x | |
export PATH="$GITHUB_WORKSPACE/baseSystems:$PATH" | |
echo "PATH=$PATH" >> $GITHUB_ENV | |
cd $OUT_DIR | |
SCRIPT_PATTERN="${{ github.event.inputs.script_pattern }}" | |
if [ -z "$SCRIPT_PATTERN" ]; then | |
echo "No script pattern provided, running all scripts." | |
PATTERN=".*" | |
else | |
PATTERN="$SCRIPT_PATTERN" | |
fi | |
for script in "$GITHUB_WORKSPACE/recipes/"*/*.*sh; do | |
if echo "$script" | grep -E "$PATTERN"; then | |
chmod +x "$script" | |
DEBUG=1 "$script" | |
fi | |
done | |
- name: Generate metadata | |
run: | | |
set -x | |
wget "https://huggingface.co/datasets/pkgforge/pkgcache/resolve/main/FLATPAK_APPSTREAM.xml" | |
appstream-helper --components-xml ./FLATPAK_APPSTREAM.xml --input-dir "$OUT_DIR" --output-dir "$META_OUT_DIR" --output-file "$META_OUT_DIR/metadata.json" --download-url-prefix "https://github.com/xplshn/AppBundleHUB/releases/download/${{ env.TAG_NAME }}/" --metadata-prefix "https://github.com/xplshn/AppBundleHUB/releases/download/latest_metadata/" | |
- name: Upload app bundle artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: app-bundles | |
path: ${{ env.OUT_DIR }}/*.AppBundle | |
- name: List generated metadata files | |
run: | | |
ls ${{ env.META_OUT_DIR }}/* | |
- name: Upload metadata artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: metadata | |
path: ${{ env.META_OUT_DIR }}/* | |
release: | |
name: Release AppBundles | |
runs-on: ubuntu-latest | |
needs: build | |
permissions: write-all | |
if: ${{ github.event.inputs.release == 'true' }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Download app bundle artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: app-bundles | |
path: ${{ github.workspace }} | |
- name: Download metadata artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: metadata | |
path: ${{ github.workspace }} | |
- name: Manage Tags | |
run: | | |
git fetch --tags | |
TAGS=$(git tag | grep -v "^latest_metadata$" | sort -V) | |
TAG_COUNT=$(echo "$TAGS" | wc -l) | |
if [ "$TAG_COUNT" -gt 5 ]; then | |
TAGS_TO_DELETE=$(echo "$TAGS" | head -n -1) | |
for TAG in $TAGS_TO_DELETE; do | |
git tag -d "$TAG" | |
git push origin --delete "$TAG" | |
done | |
fi | |
- name: Create Git Tag | |
run: | | |
git tag "${{ env.TAG_NAME }}" | |
git push origin "${{ env.TAG_NAME }}" | |
- name: Determine if pre-release | |
id: determine_prerelease | |
run: | | |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then | |
echo "prerelease=true" >> $GITHUB_ENV | |
else | |
echo "prerelease=false" >> $GITHUB_ENV | |
fi | |
- name: Create Release | |
uses: softprops/[email protected] | |
with: | |
name: "Weekly Release - ${{ env.TAG_NAME }}" | |
tag_name: "${{ env.TAG_NAME }}" | |
prerelease: ${{ env.prerelease }} | |
draft: false | |
generate_release_notes: false | |
make_latest: true | |
files: | | |
${{ github.workspace }}/*.AppBundle | |
${{ github.workspace }}/metadata.json | |
continue-on-error: true | |
publish_metadata: | |
name: Publish Metadata | |
runs-on: ubuntu-latest | |
needs: build | |
if: ${{ github.event.inputs.release == 'true' }} | |
permissions: write-all | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Download metadata artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: metadata | |
path: ${{ github.workspace }} | |
- name: Update latest_metadata tag and create release | |
run: | | |
git fetch --tags | |
if git tag -l | grep -q "^latest_metadata$"; then | |
git tag -d latest_metadata | |
git push origin --delete latest_metadata || true | |
fi | |
git tag latest_metadata | |
git push origin latest_metadata | |
- name: Create Release for Metadata | |
uses: softprops/[email protected] | |
with: | |
name: "Latest Metadata" | |
tag_name: "latest_metadata" | |
files: | | |
${{ github.workspace }}/*.json | |
${{ github.workspace }}/*.png | |
${{ github.workspace }}/*.svg | |
${{ github.workspace }}/*.desktop | |
${{ github.workspace }}/*.xml | |
body: "Latest metadata files" | |
draft: false | |
prerelease: true | |
make_latest: false |