Repository navigation
feat(eco): short spoken eco-driving advice #119
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: Unstable | |
| # Unstable / pre-release channel: one rolling pre-release rebuilt on every push to master. | |
| # These builds check this pre-release at start and download a newer APK for the tester, but | |
| # they install nothing: EVChargePilot declares no install capability in any channel, so the | |
| # archive lands in the download folder and installing it stays a manual tap. Stable contains | |
| # no updater code at all. The asset name below is the contract that check reads — the tag is | |
| # always "unstable", so the version has to live in the file name. | |
| on: | |
| push: | |
| branches: [master] | |
| workflow_dispatch: | |
| # One rolling pre-release means one publisher. Two pushes in quick succession raced on | |
| # deleting and recreating the "unstable" tag, and the loser failed at the publish step | |
| # with its APK already built — a red run that said nothing about the code. The older run | |
| # is cancelled instead, so the newest commit is always the one that gets published. | |
| concurrency: | |
| group: unstable-${{ github.ref }} | |
| cancel-in-progress: true | |
| permissions: | |
| contents: write | |
| jobs: | |
| build: | |
| name: Build and publish unstable APK | |
| runs-on: ubuntu-latest | |
| env: | |
| EV_KEYSTORE_BASE64: ${{ secrets.EV_KEYSTORE_BASE64 }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| fetch-depth: 1 | |
| - 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: | | |
| printf '%s' "$EV_KEYSTORE_BASE64" | tr -d '[:space:]' | base64 -d > "$RUNNER_TEMP/platform.keystore" | |
| 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 | |
| run: | | |
| chmod +x gradlew | |
| bash .github/security/check-permissions.sh | |
| ./gradlew :evhardware:testDebugUnitTest testUnstableDebugUnitTest lintUnstableDebug --no-daemon | |
| - name: Resolve unstable version | |
| id: version | |
| run: | | |
| v=$(./gradlew -q printUnstableVersion -PunstableBuild=${{ github.run_number }} --no-daemon | tail -1) | |
| echo "value=$v" >> "$GITHUB_OUTPUT" | |
| - name: Build unstable 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: | | |
| test -n "${EV_KEYSTORE:-}" | |
| ./gradlew assembleUnstableRelease -PunstableBuild=${{ github.run_number }} --no-daemon | |
| - name: Collect APK | |
| run: | | |
| mkdir -p dist | |
| # The release tag is the fixed string "unstable", so the version lives in the asset | |
| # name — it is the only place a reader can tell two rolling builds apart. | |
| find app/build/outputs/apk/unstable/release -name "*.apk" \ | |
| -exec cp {} "dist/EVChargePilot-unstable-${{ steps.version.outputs.value }}.apk" \; | |
| ls -la dist/ | |
| - name: Build timestamp | |
| id: date | |
| run: echo "value=$(date -u +'%Y-%m-%d %H:%M UTC')" >> "$GITHUB_OUTPUT" | |
| - name: Extract changelog | |
| id: changelog | |
| run: | | |
| { | |
| echo 'notes<<CHANGELOG_EOF' | |
| ./release-notes.sh --latest | |
| echo 'CHANGELOG_EOF' | |
| } >> "$GITHUB_OUTPUT" | |
| # One rolling pre-release: drop the previous release and its tag so the new one is | |
| # published at this commit instead of leaving the tag behind on the old sha. | |
| - name: Reset rolling unstable release | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: gh release delete unstable --cleanup-tag --yes || true | |
| - name: Publish pre-release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: unstable | |
| name: Unstable | |
| prerelease: true | |
| files: dist/*.apk | |
| body: | | |
| ## Unstable build ${{ steps.date.outputs.value }} | |
| Version `${{ steps.version.outputs.value }}` (run ${{ github.run_number }}). | |
| Automated build from `master`. **Not tested on a vehicle.** | |
| This channel does not self-update: EVChargePilot declares no network permission | |
| in any channel, so a newer build is always a manual install, parked. | |
| The unstable id is `com.evsuite.chargepilot.unstable`, so it installs beside a | |
| stable build and keeps its own trip history. | |
| ### Changelog | |
| ${{ steps.changelog.outputs.notes }} | |
| Commit: ${{ github.sha }} |