Skip to content

Build Community Editions #1

Build Community Editions

Build Community Editions #1

name: Build Community Editions
on:
schedule:
- cron: '0 6 * * 1' # weekly Monday 6am UTC
workflow_dispatch:
permissions:
contents: read
concurrency:
group: build-community-${{ github.sha }}
cancel-in-progress: false
jobs:
build:
strategy:
fail-fast: false
max-parallel: 2
matrix:
edition:
- slug: gnome
repo: spivanatalie64/acreetionos-gnome
desktop: GNOME
display: Wayland
arch: x86_64
- slug: plasma
repo: spivanatalie64/acreetionos-plasma
desktop: KDE Plasma
display: Wayland
arch: x86_64
- slug: xfce
repo: spivanatalie64/acreetionos-xfce
desktop: XFCE
display: XLibre
arch: x86_64
- slug: i3
repo: spivanatalie64/acreetionos-i3
desktop: i3
display: X11
arch: x86_64
- slug: sway
repo: spivanatalie64/acreetionos-sway
desktop: Sway
display: Wayland
arch: x86_64
- slug: mate
repo: spivanatalie64/acreetionos-mate
desktop: MATE
display: XLibre
arch: x86_64
- slug: openbox
repo: spivanatalie64/acreetionos-openbox
desktop: Openbox
display: XLibre
arch: x86_64
- slug: hyprland
repo: spivanatalie64/acreetionos-hyprland
desktop: Hyprland
display: Wayland
arch: x86_64
- slug: 32bit
repo: spivanatalie64/acreetionos32
desktop: Cinnamon
display: XLibre
arch: i686
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Checkout edition repo
uses: actions/checkout@v4
with:
repository: ${{ matrix.edition.repo }}
path: src
- name: Apply branding
run: |
sed -i 's/sudo //g' src/build.sh 2>/dev/null || true
sed -i 's/iso_label=.*/iso_label="AcreetionOS ${{ matrix.edition.desktop }}"/' src/profiledef.sh 2>/dev/null || true
sed -i 's/iso_publisher=.*/iso_publisher="AcreetionOS Project <https:\/\/acreetionos.org>"/' src/profiledef.sh 2>/dev/null || true
sed -i 's/iso_application=.*/iso_application="AcreetionOS Linux Distribution"/' src/profiledef.sh 2>/dev/null || true
- name: Emit build metadata
id: meta
run: |
echo "slug=${{ matrix.edition.slug }}" >> $GITHUB_OUTPUT
echo "date_tag=$(date +%Y%m%d)" >> $GITHUB_OUTPUT
echo "iso_name=${{ matrix.edition.slug }}-$(date +%Y%m%d).iso" >> $GITHUB_OUTPUT
- name: Write building status to R2
env:
CF_ACCOUNT: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
CF_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
run: |
STATUS='{
"edition":"${{ matrix.edition.desktop }}",
"slug":"${{ steps.meta.outputs.slug }}",
"status":"building",
"started":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
"run_url":"https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}",
"iso_name":"${{ steps.meta.outputs.iso_name }}",
"desktop":"${{ matrix.edition.desktop }}",
"display":"${{ matrix.edition.display }}",
"arch":"${{ matrix.edition.arch }}"
}'
echo "$STATUS" > /tmp/status.json
if [ -n "${CF_TOKEN:-}" ]; then
curl -s -X PUT \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT/r2/buckets/build-status/objects/${{ steps.meta.outputs.slug }}-status.json" \
-H "Authorization: Bearer $CF_TOKEN" \
--data-binary @/tmp/status.json \
-H "Content-Type: application/json" || true
fi
- name: Build ISO in Docker
id: build
run: |
mkdir -p /tmp/iso
docker run --privileged --rm \
-v $PWD/src:/workspace \
archlinux@sha256:fb47d15e0fd28369c700edcfa46dd44e234d8ab6fee9627ee5f1ead5f1fc6c21 \
bash -c '
pacman -Syu --noconfirm archiso grub && \
cd /workspace && \
chmod +x *.sh 2>/dev/null; \
bash build.sh 2>&1 || { echo "BUILD_FAILED"; exit 1; }
' 2>&1 | tee /tmp/build.log
ls -la src/out/ 2>/dev/null && cp src/out/*.iso /tmp/iso/ 2>/dev/null || true
if [ -z "$(ls /tmp/iso/*.iso 2>/dev/null)" ]; then
echo "build_ok=false" >> $GITHUB_OUTPUT
else
echo "build_ok=true" >> $GITHUB_OUTPUT
fi
- name: Upload build log
if: always()
env:
CF_ACCOUNT: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
CF_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
run: |
if [ -n "${CF_TOKEN:-}" ] && [ -f /tmp/build.log ]; then
curl -s -X PUT \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT/r2/buckets/build-status/objects/${{ steps.meta.outputs.slug }}-build.log" \
-H "Authorization: Bearer $CF_TOKEN" \
--data-binary @/tmp/build.log \
-H "Content-Type: text/plain" || true
fi
- name: Prepare ISO for upload
id: iso
if: steps.build.outputs.build_ok == 'true'
run: |
ISO=$(ls /tmp/iso/*.iso 2>/dev/null | head -1)
if [ -n "$ISO" ]; then
cp "$ISO" "/tmp/${{ steps.meta.outputs.iso_name }}"
echo "iso_path=/tmp/${{ steps.meta.outputs.iso_name }}" >> $GITHUB_OUTPUT
echo "iso_name=${{ steps.meta.outputs.iso_name }}" >> $GITHUB_OUTPUT
echo "ok=true" >> $GITHUB_OUTPUT
else
echo "ok=false" >> $GITHUB_OUTPUT
fi
- name: Upload ISO to mirrors
if: steps.iso.outputs.ok == 'true'
env:
CF_ACCOUNT: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
CF_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
run: |
bash scripts/upload-iso.sh \
"${{ steps.iso.outputs.iso_path }}" \
"${{ steps.meta.outputs.slug }}" \
"${{ steps.meta.outputs.date_tag }}"
- name: Update build status
if: always()
env:
CF_ACCOUNT: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
CF_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
run: |
if [ "${{ steps.iso.outputs.ok }}" = "true" ]; then
STATUS='{
"edition":"${{ matrix.edition.desktop }}",
"slug":"${{ steps.meta.outputs.slug }}",
"status":"success",
"finished":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
"run_url":"https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}",
"iso_name":"${{ steps.meta.outputs.iso_name }}",
"download_url":"https://pub-173a1f638a3b4c95b5f58b09c0b968aa.r2.dev/${{ steps.meta.outputs.iso_name }}"
}'
else
STATUS='{
"edition":"${{ matrix.edition.desktop }}",
"slug":"${{ steps.meta.outputs.slug }}",
"status":"failed",
"finished":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
"run_url":"https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}",
"desktop":"${{ matrix.edition.desktop }}",
"display":"${{ matrix.edition.display }}",
"arch":"${{ matrix.edition.arch }}"
}'
fi
echo "$STATUS" > /tmp/status.json
if [ -n "${CF_TOKEN:-}" ]; then
curl -s -X PUT \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT/r2/buckets/build-status/objects/${{ steps.meta.outputs.slug }}-status.json" \
-H "Authorization: Bearer $CF_TOKEN" \
--data-binary @/tmp/status.json \
-H "Content-Type: application/json" || true
fi
cleanup:
needs: build
runs-on: ubuntu-latest
if: always()
steps:
- name: Delete ISOs older than 30 days
env:
CF_ACCOUNT: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
CF_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
run: |
if [ -z "${CF_TOKEN:-}" ]; then exit 0; fi
CUTOFF=$(date -d "30 days ago" +%s)
for obj in $(curl -s "https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT/r2/buckets/acreetionos-builds/objects" \
-H "Authorization: Bearer $CF_TOKEN" | \
python3 -c "import sys,json;[print(o['key']) for o in json.load(sys.stdin).get('result',{}).get('objects',[])]" 2>/dev/null); do
D=$(echo "$obj" | grep -oP '\d{8}') || continue
TS=$(date -d "$D" +%s 2>/dev/null) || continue
if [ "$TS" -lt "$CUTOFF" ]; then
curl -s -X DELETE \
"https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT/r2/buckets/acreetionos-builds/objects/$obj" \
-H "Authorization: Bearer $CF_TOKEN" && echo "Deleted $obj"
fi
done