Skip to content

Build and Publish All Samples #12

Build and Publish All Samples

Build and Publish All Samples #12

name: Build and Publish All Samples
on:
release:
types: [ published ]
workflow_dispatch:
inputs:
tag:
description: "Release tag name to build and publish all samples for (e.g. 1.1.2)"
required: true
permissions:
contents: write
env:
TAG: ${{ github.event.inputs.tag || github.event.release.tag_name }}
REPO: ${{ github.repository }}
jobs:
# -------------------------------------------------------------
# 🤖 ANDROID APK
# -------------------------------------------------------------
publish-apk:
name: 🤖 Build & Upload Android APK
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ env.TAG }}
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@v3
- name: Build Android sample APK
run: ./gradlew :samples:android:assembleDebug
- name: Rename APK
run: |
mv samples/android/build/outputs/apk/debug/android-debug.apk \
samples/android/build/outputs/apk/debug/android-sample-${{ env.TAG }}.apk
- name: Upload APK to GitHub Release
uses: softprops/action-gh-release@v2
with:
files: samples/android/build/outputs/apk/debug/android-sample-${{ env.TAG }}.apk
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# -------------------------------------------------------------
# 🌐 WEB (WASM)
# -------------------------------------------------------------
publish-wasm:
name: 🌐 Build & Publish Web (Wasm) Demo
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ env.TAG }}
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@v3
- name: Upgrade Yarn lock (for Wasm)
run: ./gradlew kotlinWasmUpgradeYarnLock
- name: Build Wasm production executable
run: ./gradlew :samples:wasm:wasmJsBrowserDistribution
- name: Deploy Wasm demo for this release
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: samples/wasm/build/dist/wasmJs/productionExecutable
destination_dir: wasm-demo/${{ env.TAG }}
keep_files: true
commit_message: "Deploy Wasm demo for release ${{ env.TAG }}"
# -------------------------------------------------------------
# 💻 DESKTOP (JVM)
# -------------------------------------------------------------
publish-jvm:
name: 🖥️ Build & Upload Desktop JARs (macOS / Windows / Linux)
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: macos-latest
suffix: macos
- os: ubuntu-latest
suffix: linux
- os: windows-latest
suffix: windows
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ env.TAG }}
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@v3
- name: Build desktop JAR for current OS
run: ./gradlew :samples:jvm:packageReleaseUberJarForCurrentOS
- name: Rename JAR with OS suffix
shell: bash
run: |
mkdir -p samples/jvm/build/outputs/jar
JAR_SRC=$(find samples/jvm/build/compose/jars -name "*.jar" | head -n 1)
JAR_DST="samples/jvm/build/outputs/jar/desktop-sample-${{ env.TAG }}-${{ matrix.suffix }}.jar"
cp "$JAR_SRC" "$JAR_DST"
echo "Built $JAR_DST"
- name: Upload JAR to GitHub Release
uses: softprops/action-gh-release@v2
with:
files: samples/jvm/build/outputs/jar/desktop-sample-${{ env.TAG }}-${{ matrix.suffix }}.jar
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# -------------------------------------------------------------
# 📝 DOCUMENTATION
# -------------------------------------------------------------
document-apk:
name: 🤖 Write release notes for Android Demo
runs-on: ubuntu-latest
needs: [ publish-apk ]
steps:
- name: Append Android Demo section to release notes
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
DOWNLOAD_PREFIX="https://github.com/pingpongboss/compose-exploded-layers/releases/download/${TAG}"
APK_FILE="android-sample-${TAG}.apk"
SECTION=$'\n\n## 🤖️ Android Demo\n'
SECTION+=$'Download and install directly on your phone, or using **adb** on your computer:\n'
SECTION+=$'\n'
SECTION+=$'```bash\n'
SECTION+="curl -L -O DOWNLOAD_PREFIX/APK_FILE"$'\n'
SECTION+="adb install APK_FILE"$'\n'
SECTION+=$'```\n'
API_URL="https://api.github.com/repos/${REPO}/releases/tags/${TAG}"
RELEASE_ID=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" "$API_URL" | jq -r .id)
[ "$RELEASE_ID" = "null" ] && exit 1
BODY=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" "$API_URL" | jq -r .body)
if ! grep -q "Desktop Demos" <<< "$BODY"; then
NEW_BODY="${BODY}${SECTION}"
jq -n --arg body "$NEW_BODY" '{body: $body}' |
curl -s -X PATCH \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Content-Type: application/json" \
-d @- \
"https://api.github.com/repos/${REPO}/releases/${RELEASE_ID}"
echo "✅ Appended Desktop Demo instructions."
else
echo "ℹ️ Desktop section already present. Skipping."
fi
document-wasm:
name: 🌐 Write release notes for Web Demo
runs-on: ubuntu-latest
needs: [ publish-wasm, document-apk ]
if: needs.publish-wasm.result == 'success' && always()
steps:
- name: Append Web Demo section to release notes
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
DEMO_URL="https://pingpongboss.github.io/compose-exploded-layers/wasm-demo/${TAG}/"
LINK_TEXT="wasm-demo-${TAG}"
SECTION=$'\n\n## 🌐 Web Demo\nTry this release directly in your browser (no install needed):\n\n'"[**Open ${LINK_TEXT} →**](${DEMO_URL})"
API_URL="https://api.github.com/repos/${REPO}/releases/tags/${TAG}"
RELEASE_ID=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" "$API_URL" | jq -r .id)
[ "$RELEASE_ID" = "null" ] && exit 1
BODY=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" "$API_URL" | jq -r .body)
if ! grep -q "$DEMO_URL" <<< "$BODY"; then
NEW_BODY="${BODY}${SECTION}"
jq -n --arg body "$NEW_BODY" '{body: $body}' |
curl -s -X PATCH \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Content-Type: application/json" \
-d @- \
"https://api.github.com/repos/${REPO}/releases/${RELEASE_ID}"
echo "✅ Appended Web Demo link."
else
echo "ℹ️ Web Demo link already present. Skipping."
fi
document-jvm:
name: 🖥️ Write release notes for Desktop (JVM) Demo
runs-on: ubuntu-latest
needs: [ publish-jvm, document-wasm ]
if: needs.publish-jvm.result == 'success' && always()
steps:
- name: Append Desktop (JVM) Demo section to release notes
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
DOWNLOAD_PREFIX="https://github.com/pingpongboss/compose-exploded-layers/releases/download/${TAG}"
MACOS_FILE="desktop-sample-${TAG}-macos.jar"
LINUX_FILE="desktop-sample-${TAG}-linux.jar"
WINDOWS_FILE="desktop-sample-${TAG}-windows.jar"
SECTION=$'\n\n## 🖥️ Desktop (JVM) Demo\n'
SECTION+=$'Download and run locally (requires **Java 17+**):\n'
SECTION+=$'\n'
SECTION+=$'```bash\n'
SECTION+=$'# macOS\n'
SECTION+="curl -L -O DOWNLOAD_PREFIX/$MACOS_FILE"$'\n'
SECTION+="java -jar $MACOS_FILE"$'\n'
SECTION+=$'\n'
SECTION+=$'# Linux\n'
SECTION+="curl -L -O DOWNLOAD_PREFIX/$LINUX_FILE"$'\n'
SECTION+="java -jar $LINUX_FILE"$'\n'
SECTION+=$'\n'
SECTION+=$'# Windows\n'
SECTION+="curl -L -O DOWNLOAD_PREFIX/$WINDOWS_FILE"$'\n'
SECTION+="java -jar $WINDOWS_FILE"$'\n'
SECTION+=$'```\n'
API_URL="https://api.github.com/repos/${REPO}/releases/tags/${TAG}"
RELEASE_ID=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" "$API_URL" | jq -r .id)
[ "$RELEASE_ID" = "null" ] && exit 1
BODY=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" "$API_URL" | jq -r .body)
if ! grep -q "Desktop Demos" <<< "$BODY"; then
NEW_BODY="${BODY}${SECTION}"
jq -n --arg body "$NEW_BODY" '{body: $body}' |
curl -s -X PATCH \
-H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Content-Type: application/json" \
-d @- \
"https://api.github.com/repos/${REPO}/releases/${RELEASE_ID}"
echo "✅ Appended Desktop Demo instructions."
else
echo "ℹ️ Desktop section already present. Skipping."
fi