feat: implement auto-update feature with version checking, downloadin… #12
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release | |
| on: | |
| push: | |
| branches: | |
| - 'v[0-9]+*' | |
| - 'release/**' | |
| workflow_dispatch: | |
| concurrency: | |
| group: release-${{ github.ref }} | |
| cancel-in-progress: false | |
| permissions: | |
| contents: write | |
| jobs: | |
| build-and-release: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout Repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| cache: 'npm' | |
| cache-dependency-path: web/package-lock.json | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Setup Gradle | |
| uses: gradle/actions/setup-gradle@v3 | |
| - name: Decode Keystore | |
| run: | | |
| echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > lenscast-release.jks | |
| - name: Calculate Release Version | |
| id: version | |
| run: | | |
| BRANCH_NAME="${{ github.ref_name }}" | |
| BASE_VERSION=$(echo "$BRANCH_NAME" | grep -oE '(?:^|/)[v]?([0-9]+\.[0-9]+(\.[0-9]+)?)' | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?' | head -n 1) | |
| if [ -z "$BASE_VERSION" ]; then BASE_VERSION="1.0.0"; fi | |
| IFS='.' read -r major minor patch <<< "$BASE_VERSION" | |
| minor=${minor:-0} | |
| patch=${patch:-0} | |
| BASE_PREFIX="v${major}.${minor}" | |
| latest_tag=$(git tag -l "${BASE_PREFIX}.*" | sort -V | tail -n 1) | |
| if [ -n "$latest_tag" ]; then | |
| latest_patch=${latest_tag##*.} | |
| new_patch=$((latest_patch + 1)) | |
| NEW_TAG="${BASE_PREFIX}.${new_patch}" | |
| NEW_APK_VERSION="${major}.${minor}.${new_patch}" | |
| else | |
| NEW_TAG="${BASE_PREFIX}.${patch}" | |
| NEW_APK_VERSION="${major}.${minor}.${patch}" | |
| fi | |
| echo "Next tag computing to: $NEW_TAG" | |
| echo "Next APK version: $NEW_APK_VERSION" | |
| echo "tag=$NEW_TAG" >> $GITHUB_OUTPUT | |
| echo "apk_version=$NEW_APK_VERSION" >> $GITHUB_OUTPUT | |
| - name: Build Android App (Release) | |
| env: | |
| KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} | |
| KEY_ALIAS: ${{ secrets.KEY_ALIAS }} | |
| KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} | |
| run: ./gradlew assembleRelease -PversionName="${{ steps.version.outputs.apk_version }}" | |
| - name: Rename APK Outputs | |
| run: | | |
| shopt -s nullglob | |
| apks=(app/build/outputs/apk/release/*.apk) | |
| if [ ${#apks[@]} -eq 0 ]; then | |
| echo "ERROR: No APK files found" | |
| exit 1 | |
| fi | |
| for apk in "${apks[@]}"; do | |
| filename=$(basename "$apk") | |
| new_filename="lenscast-${filename#app-}" | |
| mv "$apk" "$new_filename" | |
| done | |
| - name: Publish to GitHub Releases | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: "${{ steps.version.outputs.tag }}" | |
| name: "Release ${{ steps.version.outputs.tag }}" | |
| files: lenscast-*.apk | |
| generate_release_notes: true |