Repository navigation
chore: release 2.5.0 #14
Workflow file for this run
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 | |
| # Tag push only — publishing the APK that becomes the car's home screen is a human decision. | |
| # | |
| # Signed with the SAME platform key as the rest of the EVSuite. The launcher needs no | |
| # privileged permission of its own; the shared key is what makes the suite one installable | |
| # set, and it is what the manual suite downloader compares incoming APKs against. | |
| on: | |
| push: | |
| tags: | |
| - "v*" | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| jobs: | |
| build: | |
| name: Build and publish APK | |
| runs-on: ubuntu-latest | |
| env: | |
| EV_KEYSTORE_BASE64: ${{ secrets.EV_KEYSTORE_BASE64 }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "17" | |
| - name: Setup Gradle | |
| uses: gradle/actions/setup-gradle@v4 | |
| - name: Decode platform keystore | |
| if: ${{ env.EV_KEYSTORE_BASE64 != '' }} | |
| run: | | |
| # Tolerate newlines/spaces in the secret; printf avoids a stray trailing newline. | |
| printf '%s' "$EV_KEYSTORE_BASE64" | tr -d '[:space:]' | base64 -d > "$RUNNER_TEMP/platform.keystore" | |
| # A PKCS12/JKS keystore starts with 0x30 (DER SEQUENCE); anything else is corrupt. | |
| if [ "$(head -c1 "$RUNNER_TEMP/platform.keystore" | od -An -tx1 | tr -d ' ')" != "30" ]; then | |
| echo "::error::EV_KEYSTORE_BASE64 is invalid. Recreate the secret with: base64 -w0 platform.keystore" | |
| exit 1 | |
| fi | |
| echo "EV_KEYSTORE=$RUNNER_TEMP/platform.keystore" >> "$GITHUB_ENV" | |
| - name: Run checks before publishing | |
| run: | | |
| chmod +x gradlew | |
| bash .github/security/check-permissions.sh | |
| ./gradlew testStableDebugUnitTest lintStableDebug --no-daemon | |
| - name: Build release APK | |
| env: | |
| EV_KEYSTORE_PASSWORD: ${{ secrets.EV_KEYSTORE_PASSWORD }} | |
| EV_KEY_ALIAS: ${{ secrets.EV_KEY_ALIAS }} | |
| EV_KEY_PASSWORD: ${{ secrets.EV_KEY_PASSWORD }} | |
| run: ./gradlew assembleStableRelease --no-daemon | |
| - name: Collect APK | |
| run: | | |
| mkdir -p dist | |
| ver=$(grep -oE 'versionName = "[^"]+"' app/build.gradle.kts | head -1 | sed -E 's/.*"([^"]+)"/\1/') | |
| find app/build/outputs/apk -name "app-stable-release.apk" -exec cp {} "dist/EVLauncher-stable-${ver}.apk" \; | |
| ls -la dist/ | |
| - uses: actions/upload-artifact@v4 | |
| with: | |
| name: evlauncher-apk | |
| path: dist/*.apk | |
| - name: Extract changelog | |
| id: changelog | |
| run: | | |
| { | |
| echo 'notes<<CHANGELOG_EOF' | |
| ./release-notes.sh "${{ github.ref_name }}" || ./release-notes.sh --latest | |
| echo 'CHANGELOG_EOF' | |
| } >> "$GITHUB_OUTPUT" | |
| - name: Publish GitHub Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ github.ref_name }} | |
| name: ${{ github.ref_name }} | |
| prerelease: false | |
| files: dist/*.apk | |
| body: | | |
| ## EVLauncher ${{ github.ref_name }} | |
| This build has **no auto-updater** and no silent installer. The EVSuite screen | |
| checks allowlisted GitHub releases only after the user opens it, shows the | |
| changelog, and exports verified APKs for manual installation. | |
| ### Install | |
| Copy the APK to a USB stick, open the car's Files app and tap it. Then set it | |
| as the default home from Android settings. | |
| ### Note | |
| Signed with the EVSuite platform key. If you are coming from a build signed | |
| with the old author key, uninstall the previous version first — Android refuses | |
| an in-place update across a key change. | |
| ### Changelog | |
| ${{ steps.changelog.outputs.notes }} |