Skip to content

Build and Release AppBundles - ng #6

Build and Release AppBundles - ng

Build and Release AppBundles - ng #6

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 and Release Packages
runs-on: ubuntu-latest
permissions: write-all
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: 'stable'
- name: Prepare environment
run: |
GOBIN="$HOME/.local/bin"
mkdir -p "$GOBIN"
git clone --depth 1 --branch dev https://github.com/xplshn/pelf
cp ./pelf/pelf* "$GOBIN"
cp ./pelf/cmd/misc/* "$GOBIN"
echo "GOBIN=$GOBIN" >> $GITHUB_ENV
- name: Build pelfd and lib4bin
run: |
cd pelf/cmd/pelfd
go build -o "$GOBIN/pelfd"
cd ../dynexec/lib4bin
go build -o "$GOBIN/lib4bin"
- name: Install tools
run: |
DBIN_PGRS="dwarfs-tools bwrap-patched sharun yq jq eget2"
wget -qO- "https://raw.githubusercontent.com/xplshn/dbin/master/stubdl" | sh -s -- --install "$GOBIN/dbin" add $DBIN_PGRS
PATH="$GOBIN:$PATH"
ln -sfT "$GOBIN/dwarfs-tools" "$GOBIN/mkdwarfs"
ln -sfT "$GOBIN/dwarfs-tools" "$GOBIN/dwarfs"
ln -sfT "$GOBIN/bwrap-patched" "$GOBIN/bwrap"
echo "PATH=$PATH" >> $GITHUB_ENV
- name: Download Alpine RootFS
id: rootfs
run: |
ROOTFS_URL="$(curl -qsL https://dl-cdn.alpinelinux.org/alpine/edge/releases/x86_64/latest-releases.yaml | yq '.[0].file')"
ROOTFS_URL="https://dl-cdn.alpinelinux.org/alpine/edge/releases/$(uname -m)/${ROOTFS_URL}"
echo "ROOTFS_URL=$ROOTFS_URL" >> $GITHUB_ENV
- name: Create pelf environment
run: |
pelfCreator -m xplshn -n devEnv -p "fuse3 build-base go git" -z -c
- name: Set OUT_DIR environment variable
run: |
OUT_DIR="${{ github.workspace }}/APPBUNDLES"
mkdir -p "$OUT_DIR"
echo "OUT_DIR=${OUT_DIR}" >> $GITHUB_ENV
- name: List available scripts
run: |
echo "Listing available scripts in recipes:"
ls -l "${{ github.workspace }}/recipes/"
- name: Run selected build scripts
run: |
SCRIPT_PATTERN="${{ github.event.inputs.script_pattern }}"
if [ -z "$SCRIPT_PATTERN" ]; then
echo "No script pattern provided, running all scripts."
PATTERN=".*" # Match all scripts
else
echo "Pattern provided: $SCRIPT_PATTERN"
PATTERN="$SCRIPT_PATTERN"
fi
for script in "${{ github.workspace }}/recipes/"*/*.*sh; do
if echo "$script" | grep -E "$PATTERN"; then
echo "Running $script"
chmod +x "$script"
${{ github.workspace }}/devEnv*/AppRun "$script" "$OUT_DIR"
else
echo "Skipping $script (does not match pattern)"
fi
done
- name: Verify generated artifacts
run: |
echo "Verifying generated files in $OUT_DIR"
if [ ! "$(ls -A $OUT_DIR)" ]; then
echo "Error: No artifacts found in $OUT_DIR!"
exit 1
fi
- name: Archive output
run: |
echo "Archiving output from $OUT_DIR"
ls "$OUT_DIR"
- name: Upload build artifacts
if: ${{ github.event.inputs.release == 'false' }} # Only upload artifacts if no release
uses: actions/upload-artifact@v3
with:
name: app-bundles
path: ${{ env.OUT_DIR }}
- name: Manage Tags
if: ${{ github.event.inputs.release == 'true' }} # Only manage tags for releases
run: |
git fetch --tags
TAGS=$(git tag | 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
echo "Deleting tag: $TAG"
git tag -d "$TAG"
git push origin --delete "$TAG"
done
else
echo "Tag count is $TAG_COUNT, no tags to delete."
fi
- name: Create Release
if: ${{ github.event.inputs.release == 'true' }} # Conditional release
uses: softprops/[email protected]
with:
name: "Weekly Release - ${{ env.UTC_TIME }}"
tag_name: "${{ env.UTC_TIME }}"
prerelease: false
draft: false
generate_release_notes: false
make_latest: true
files: |
${{ env.OUT_DIR }}/*.AppBundle