Build and Release AppBundles - NG #59
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 | |
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 |