Skip to content

Release

Release #99

Workflow file for this run

name: Build and Release
on:
push:
tags:
- 'v*'
permissions:
contents: write
jobs:
apk:
name: Generate APK
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Set execution flag for gradlew
run: chmod +x gradlew
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Install Android Build Tools
run: sdkmanager "build-tools;29.0.3"
- name: Run unit tests
run: bash ./gradlew :common:testDebugUnitTest :common:desktopTest --stacktrace
- name: Build APK
run: bash ./gradlew assembleRelease --stacktrace
- name: Sign APK
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: android/build/outputs/apk/release
signingKeyBase64: ${{ secrets.KEYSTORE_B64 }}
alias: ${{ secrets.KEY_ALIAS }}
keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}
keyPassword: ${{ secrets.KEYSTORE_PASSWORD }}
- name: Upload APK Artifact
uses: actions/upload-artifact@v4
with:
name: signed-apk
path: android/build/outputs/apk/release/android-release-unsigned-signed.apk
cli-linux:
name: Build CLI (Linux)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Set execution flag for gradlew
run: chmod +x gradlew
- name: Build Linux CLI binaries
run: ./gradlew :cli:linkReleaseExecutableLinuxX64 :cli:linkReleaseExecutableLinuxArm64 --stacktrace
- name: Package Linux x64 CLI
run: |
mkdir -p cli-linux-x64
cp cli/build/bin/linuxX64/releaseExecutable/lcl.kexe cli-linux-x64/lcl
chmod +x cli-linux-x64/lcl
cd cli-linux-x64 && zip -r ../cli-linux-x64.zip lcl
- name: Package Linux arm64 CLI
run: |
mkdir -p cli-linux-arm64
cp cli/build/bin/linuxArm64/releaseExecutable/lcl.kexe cli-linux-arm64/lcl
chmod +x cli-linux-arm64/lcl
cd cli-linux-arm64 && zip -r ../cli-linux-arm64.zip lcl
- name: Upload Linux x64 CLI Artifact
uses: actions/upload-artifact@v4
with:
name: cli-linux-x64
path: cli-linux-x64.zip
- name: Upload Linux arm64 CLI Artifact
uses: actions/upload-artifact@v4
with:
name: cli-linux-arm64
path: cli-linux-arm64.zip
cli-macos:
name: Build CLI (macOS)
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Set execution flag for gradlew
run: chmod +x gradlew
- name: Build macOS CLI binaries
run: ./gradlew :cli:linkReleaseExecutableMacosX64 :cli:linkReleaseExecutableMacosArm64 --stacktrace
- name: Package macOS x64 CLI
run: |
mkdir -p cli-macos-x64
cp cli/build/bin/macosX64/releaseExecutable/lcl.kexe cli-macos-x64/lcl
chmod +x cli-macos-x64/lcl
cd cli-macos-x64 && zip -r ../cli-macos-x64.zip lcl
- name: Package macOS arm64 CLI
run: |
mkdir -p cli-macos-arm64
cp cli/build/bin/macosArm64/releaseExecutable/lcl.kexe cli-macos-arm64/lcl
chmod +x cli-macos-arm64/lcl
cd cli-macos-arm64 && zip -r ../cli-macos-arm64.zip lcl
- name: Upload macOS x64 CLI Artifact
uses: actions/upload-artifact@v4
with:
name: cli-macos-x64
path: cli-macos-x64.zip
- name: Upload macOS arm64 CLI Artifact
uses: actions/upload-artifact@v4
with:
name: cli-macos-arm64
path: cli-macos-arm64.zip
cli-windows:
name: Build CLI (Windows)
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Build Windows CLI binary
run: ./gradlew :cli:linkReleaseExecutableMingwX64 --stacktrace
- name: Package Windows CLI
run: |
mkdir cli-windows-x64
copy cli\build\bin\mingwX64\releaseExecutable\lcl.exe cli-windows-x64\lcl.exe
Compress-Archive -Path cli-windows-x64\lcl.exe -DestinationPath cli-windows-x64.zip
shell: pwsh
- name: Upload Windows CLI Artifact
uses: actions/upload-artifact@v4
with:
name: cli-windows-x64
path: cli-windows-x64.zip
dmg:
name: Generate DMG
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Set execution flag for gradlew
run: chmod +x gradlew
- name: Build DMG
run: bash ./gradlew :desktopApp:packageDmg --stacktrace
- name: Upload DMG Artifact
uses: actions/upload-artifact@v4
with:
name: dmg-package
path: desktopApp/build/compose/binaries/main/dmg/*.dmg
msi:
name: Generate MSI
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Build MSI
run: ./gradlew :desktopApp:packageMsi --stacktrace
- name: Upload MSI Artifact
uses: actions/upload-artifact@v4
with:
name: msi-package
path: desktopApp/build/compose/binaries/main/msi/*.msi
deb:
name: Generate DEB
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Set execution flag for gradlew
run: chmod +x gradlew
- name: Build DEB
run: ./gradlew :desktopApp:packageDeb --stacktrace
- name: Upload DEB Artifact
uses: actions/upload-artifact@v4
with:
name: deb-package
path: desktopApp/build/compose/binaries/main/deb/*.deb
rpm:
name: Generate RPM
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Set execution flag for gradlew
run: chmod +x gradlew
- name: Install RPM build tools
run: sudo apt-get update && sudo apt-get install -y rpm
- name: Build RPM
run: ./gradlew :desktopApp:packageRpm --stacktrace
- name: Upload RPM Artifact
uses: actions/upload-artifact@v4
with:
name: rpm-package
path: desktopApp/build/compose/binaries/main/rpm/*.rpm
appimage:
name: Generate AppImage
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Set execution flag for gradlew
run: chmod +x gradlew
- name: Install AppImage tools
run: |
sudo apt-get update
sudo apt-get install -y libfuse2 file
wget -q https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
chmod +x appimagetool-x86_64.AppImage
- name: Build application distribution
run: ./gradlew :desktopApp:createDistributable --stacktrace
- name: Create AppDir structure
run: |
mkdir -p AppDir/usr/bin
mkdir -p AppDir/usr/lib
mkdir -p AppDir/usr/share/applications
mkdir -p AppDir/usr/share/icons/hicolor/256x256/apps
# Copy distributable contents
cp -r desktopApp/build/compose/binaries/main/app/LinuxCommandLibrary/* AppDir/usr/lib/
# Copy icon
cp desktopApp/icon.png AppDir/usr/share/icons/hicolor/256x256/apps/linuxcommandlibrary.png
cp desktopApp/icon.png AppDir/linuxcommandlibrary.png
# Create desktop file
cat > AppDir/linuxcommandlibrary.desktop << 'EOF'
[Desktop Entry]
Name=Linux Command Library
Comment=Linux Command Reference
Exec=linuxcommandlibrary
Icon=linuxcommandlibrary
Type=Application
Categories=Utility;
Terminal=false
EOF
cp AppDir/linuxcommandlibrary.desktop AppDir/usr/share/applications/
# Create AppRun
cat > AppDir/AppRun << 'EOF'
#!/bin/bash
SELF=$(readlink -f "$0")
HERE=${SELF%/*}
export PATH="${HERE}/usr/lib/bin:${PATH}"
export LD_LIBRARY_PATH="${HERE}/usr/lib/lib/runtime/lib:${LD_LIBRARY_PATH}"
exec "${HERE}/usr/lib/bin/LinuxCommandLibrary" "$@"
EOF
chmod +x AppDir/AppRun
- name: Build AppImage
run: |
ARCH=x86_64 ./appimagetool-x86_64.AppImage --appimage-extract-and-run AppDir LinuxCommandLibrary-x86_64.AppImage
- name: Upload AppImage Artifact
uses: actions/upload-artifact@v4
with:
name: appimage-package
path: LinuxCommandLibrary-*.AppImage
release:
name: Release All Platforms
needs: [apk, cli-linux, cli-macos, cli-windows, dmg, msi, deb, rpm, appimage]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download APK Artifact
uses: actions/download-artifact@v4.1.7
with:
name: signed-apk
- name: Download CLI Linux x64 Artifact
uses: actions/download-artifact@v4.1.7
with:
name: cli-linux-x64
- name: Download CLI Linux arm64 Artifact
uses: actions/download-artifact@v4.1.7
with:
name: cli-linux-arm64
- name: Download CLI macOS x64 Artifact
uses: actions/download-artifact@v4.1.7
with:
name: cli-macos-x64
- name: Download CLI macOS arm64 Artifact
uses: actions/download-artifact@v4.1.7
with:
name: cli-macos-arm64
- name: Download CLI Windows x64 Artifact
uses: actions/download-artifact@v4.1.7
with:
name: cli-windows-x64
- name: Download DMG Artifact
uses: actions/download-artifact@v4.1.7
with:
name: dmg-package
- name: Download MSI Artifact
uses: actions/download-artifact@v4.1.7
with:
name: msi-package
- name: Download DEB Artifact
uses: actions/download-artifact@v4.1.7
with:
name: deb-package
- name: Download RPM Artifact
uses: actions/download-artifact@v4.1.7
with:
name: rpm-package
- name: Download AppImage Artifact
uses: actions/download-artifact@v4.1.7
with:
name: appimage-package
- name: List downloaded files (for debugging)
run: ls -la
- name: Get DMG filename
id: dmg
run: echo "file=$(ls *.dmg | head -n1)" >> $GITHUB_OUTPUT
- name: Get MSI filename
id: msi
run: echo "file=$(ls *.msi | head -n1)" >> $GITHUB_OUTPUT
- name: Get DEB filename
id: deb
run: echo "file=$(ls *.deb | head -n1)" >> $GITHUB_OUTPUT
- name: Get RPM filename
id: rpm
run: echo "file=$(ls *.rpm | head -n1)" >> $GITHUB_OUTPUT
- name: Get AppImage filename
id: appimage
run: echo "file=$(ls *.AppImage | head -n1)" >> $GITHUB_OUTPUT
- name: Get version
id: get_version
run: echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
- name: Create Github Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
- name: Upload APK to Github Release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: android-release-unsigned-signed.apk
asset_name: LinuxCommandLibrary-${{ steps.get_version.outputs.version }}-android.apk
asset_content_type: application/zip
- name: Upload CLI Linux x64 to Github Release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: cli-linux-x64.zip
asset_name: LinuxCommandLibrary-${{ steps.get_version.outputs.version }}-cli-linux-x64.zip
asset_content_type: application/zip
- name: Upload CLI Linux arm64 to Github Release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: cli-linux-arm64.zip
asset_name: LinuxCommandLibrary-${{ steps.get_version.outputs.version }}-cli-linux-arm64.zip
asset_content_type: application/zip
- name: Upload CLI macOS x64 to Github Release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: cli-macos-x64.zip
asset_name: LinuxCommandLibrary-${{ steps.get_version.outputs.version }}-cli-macos-x64.zip
asset_content_type: application/zip
- name: Upload CLI macOS arm64 to Github Release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: cli-macos-arm64.zip
asset_name: LinuxCommandLibrary-${{ steps.get_version.outputs.version }}-cli-macos-arm64.zip
asset_content_type: application/zip
- name: Upload CLI Windows x64 to Github Release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: cli-windows-x64.zip
asset_name: LinuxCommandLibrary-${{ steps.get_version.outputs.version }}-cli-windows-x64.zip
asset_content_type: application/zip
- name: Upload DMG to Github Release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ${{ steps.dmg.outputs.file }}
asset_name: LinuxCommandLibrary-${{ steps.get_version.outputs.version }}-macos.dmg
asset_content_type: application/octet-stream
- name: Upload MSI to Github Release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ${{ steps.msi.outputs.file }}
asset_name: LinuxCommandLibrary-${{ steps.get_version.outputs.version }}-windows.msi
asset_content_type: application/octet-stream
- name: Upload DEB to Github Release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ${{ steps.deb.outputs.file }}
asset_name: LinuxCommandLibrary-${{ steps.get_version.outputs.version }}-linux.deb
asset_content_type: application/octet-stream
- name: Upload RPM to Github Release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ${{ steps.rpm.outputs.file }}
asset_name: LinuxCommandLibrary-${{ steps.get_version.outputs.version }}-linux.rpm
asset_content_type: application/octet-stream
- name: Upload AppImage to Github Release
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ${{ steps.appimage.outputs.file }}
asset_name: LinuxCommandLibrary-${{ steps.get_version.outputs.version }}-linux.AppImage
asset_content_type: application/octet-stream