name: Showcase Release on: workflow_dispatch: inputs: version: description: 'Release version (e.g., 0.1.0)' required: true type: string build_desktop: description: 'Build desktop (Electron) artifacts' required: false type: boolean default: true build_mobile: description: 'Build mobile (Android APK) artifact' required: false type: boolean default: true concurrency: group: showcase-release cancel-in-progress: false jobs: # ─── Desktop Linux Build ─────────────────────────────────────── desktop-linux: if: inputs.build_desktop runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm - name: Install dependencies run: npm ci - name: Build design system packages run: npx turbo run build --filter='@dangerousthings/tokens' --filter='@dangerousthings/web' - name: Build desktop showcase working-directory: packages/showcase/desktop run: npm run build - name: Package desktop (Linux) working-directory: packages/showcase/desktop run: npx electron-builder --linux env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload desktop artifacts uses: actions/upload-artifact@v4 with: name: desktop-linux path: | packages/showcase/desktop/release/*.AppImage packages/showcase/desktop/release/*.deb retention-days: 30 # ─── Desktop Windows Build ────────────────────────────────────── desktop-windows: if: inputs.build_desktop runs-on: windows-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm - name: Install dependencies run: npm ci - name: Build design system packages run: npx turbo run build --filter='@dangerousthings/tokens' --filter='@dangerousthings/web' - name: Build desktop showcase working-directory: packages/showcase/desktop run: npm run build - name: Package desktop (Windows) working-directory: packages/showcase/desktop run: npx electron-builder --win env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload desktop artifacts uses: actions/upload-artifact@v4 with: name: desktop-windows path: | packages/showcase/desktop/release/*.exe retention-days: 30 # ─── Desktop macOS Build ──────────────────────────────────────── desktop-macos: if: inputs.build_desktop runs-on: macos-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm - name: Install dependencies run: npm ci - name: Build design system packages run: npx turbo run build --filter='@dangerousthings/tokens' --filter='@dangerousthings/web' - name: Build desktop showcase working-directory: packages/showcase/desktop run: npm run build - name: Package desktop (macOS) working-directory: packages/showcase/desktop run: npx electron-builder --mac --x64 --arm64 env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # No CSC_LINK / CSC_KEY_PASSWORD = unsigned build # Users will need to right-click > Open to bypass Gatekeeper - name: Upload desktop artifacts uses: actions/upload-artifact@v4 with: name: desktop-macos path: | packages/showcase/desktop/release/*.dmg packages/showcase/desktop/release/*.zip retention-days: 30 # ─── Mobile Android Build ────────────────────────────────────── mobile-android: if: inputs.build_mobile runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm - uses: actions/setup-java@v4 with: distribution: temurin java-version: '17' - name: Setup Android SDK uses: android-actions/setup-android@v3 - name: Install dependencies run: npm ci - name: Build design system packages run: npx turbo run build --filter='@dangerousthings/tokens' - name: Expo prebuild working-directory: packages/showcase/mobile run: npx expo prebuild --clean --platform android - name: Cache Gradle uses: actions/cache@v4 with: path: | ~/.gradle/caches ~/.gradle/wrapper key: gradle-${{ hashFiles('packages/showcase/mobile/android/**/*.gradle*', 'packages/showcase/mobile/android/gradle/wrapper/gradle-wrapper.properties') }} restore-keys: gradle- - name: Build release APK working-directory: packages/showcase/mobile/android run: ./gradlew assembleRelease - name: Upload APK artifact uses: actions/upload-artifact@v4 with: name: mobile-android path: packages/showcase/mobile/android/app/build/outputs/apk/release/app-release.apk retention-days: 30 # ─── Create GitHub Release ───────────────────────────────────── create-release: needs: [desktop-linux, desktop-windows, desktop-macos, mobile-android] if: always() && (needs.desktop-linux.result == 'success' || needs.desktop-windows.result == 'success' || needs.desktop-macos.result == 'success' || needs.mobile-android.result == 'success') runs-on: ubuntu-latest permissions: contents: write steps: - uses: actions/checkout@v4 - name: Download all artifacts uses: actions/download-artifact@v4 with: path: release-artifacts - name: Rename artifacts with version env: RELEASE_VERSION: ${{ inputs.version }} run: | mkdir -p final-artifacts # Desktop Linux artifacts if [ -d release-artifacts/desktop-linux ]; then for f in release-artifacts/desktop-linux/*; do filename=$(basename "$f") newname=$(echo "$filename" | sed "s/0\.0\.0/${RELEASE_VERSION}/g") cp "$f" "final-artifacts/$newname" done fi # Desktop Windows artifacts if [ -d release-artifacts/desktop-windows ]; then for f in release-artifacts/desktop-windows/*; do filename=$(basename "$f") newname=$(echo "$filename" | sed "s/0\.0\.0/${RELEASE_VERSION}/g") cp "$f" "final-artifacts/$newname" done fi # Desktop macOS artifacts if [ -d release-artifacts/desktop-macos ]; then for f in release-artifacts/desktop-macos/*; do filename=$(basename "$f") newname=$(echo "$filename" | sed "s/0\.0\.0/${RELEASE_VERSION}/g") cp "$f" "final-artifacts/$newname" done fi # Mobile APK if [ -f release-artifacts/mobile-android/app-release.apk ]; then cp release-artifacts/mobile-android/app-release.apk \ "final-artifacts/dt-showcase-mobile-${RELEASE_VERSION}.apk" fi echo "Release artifacts:" ls -lh final-artifacts/ - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: showcase-v${{ inputs.version }} name: Showcase v${{ inputs.version }} body: | ## DT Design System Showcase v${{ inputs.version }} ### Desktop (Electron) - **AppImage** (Linux, portable) — download and `chmod +x` to run - **deb** (Debian/Ubuntu) — install with `sudo dpkg -i .deb` - **exe** (Windows) — NSIS installer + portable exe - **dmg** (macOS) — unsigned, right-click > Open to bypass Gatekeeper - **zip** (macOS) — portable archive ### Mobile (Android) - **APK** — sideload on any Android device (Settings > Install unknown apps) --- Built from commit ${{ github.sha }} files: final-artifacts/* draft: false prerelease: false