Skip to content

Build and Release AppBundles - NG #59

Build and Release AppBundles - NG

Build and Release AppBundles - NG #59

Workflow file for this run

name: Build and Release AppBundles - NG
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 --userns=host --device /dev/fuse
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
export CGO_ENABLED="0" GO_LDFLAGS="-buildmode=static-pie" GOFLAGS="-ldflags=-static-pie -ldflags=-s -ldflags=-w"
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: Upload appstream-helper as artifact
uses: actions/upload-artifact@v4
with:
name: appstream-helper
path: ${{ env.GOBIN }}/appstream-helper
- 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: Set executable permissions for AppBundles
run: |
chmod +x ${{ env.OUT_DIR }}/*.AppBundle
- name: Upload app bundle artifacts
uses: actions/upload-artifact@v4
with:
name: app-bundles
path: ${{ env.OUT_DIR }}/*.AppBundle
publish_appbundles:
name: Publish AppBundles
runs-on: ubuntu-latest
needs: build
permissions: write-all
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 }}/*.AppBundle
- name: Download appstream-helper artifact
uses: actions/download-artifact@v4
with:
name: appstream-helper
path: ${{ github.workspace }}/.local/bin
- name: Generate metadata
run: |
set -x
wget "https://huggingface.co/datasets/pkgforge/pkgcache/resolve/main/FLATPAK_APPSTREAM.xml"
chmod +x ${{ github.workspace }}/.local/bin/appstream-helper
${{ github.workspace }}/.local/bin/appstream-helper --components-xml ./FLATPAK_APPSTREAM.xml --input-dir "${{ github.workspace }}" --output-dir "${{ github.workspace }}/APPBUNDLES_META" --output-file "${{ github.workspace }}/APPBUNDLES_META/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 metadata artifact
uses: actions/upload-artifact@v4
with:
name: metadata
path: ${{ github.workspace }}/APPBUNDLES_META/*
- name: Manage Tags
if: ${{ github.event.inputs.release == 'true' }}
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
if: ${{ github.event.inputs.release == 'true' }}
run: |
TAG_NAME="v$(date +'%Y%m%d%H%M%S')"
git tag "$TAG_NAME"
git push origin "$TAG_NAME"
echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV
- 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
if: ${{ github.event.inputs.release == 'true' }}
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 }}/APPBUNDLES_META/metadata.json
continue-on-error: true
publish_metadata:
name: Publish Metadata
runs-on: ubuntu-latest
needs: publish_appbundles
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: |
ls -FA
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
draft: false
prerelease: true
make_latest: false