Skip to content

do-github-release

do-github-release #448

on:
schedule:
- cron: "0 20 * * *"
workflow_dispatch:
name: do-github-release
jobs:
check-app-changes:
runs-on: ubuntu-latest
outputs:
app_changed: ${{ steps.check_app_changes.outputs.app_changed }}
steps:
- name: Checkout repo
uses: actions/checkout@v2
with:
token: ${{secrets.ACTIONS_PAT}}
fetch-depth: 0
- name: Check if app directory changed
id: check_app_changes
run: |
LAST_RELEASE_TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
echo "LAST_RELEASE_TAG was $LAST_RELEASE_TAG"
LAST_RELEASE_COMMIT=$(git rev-list -n 1 $LAST_RELEASE_TAG)
echo "LAST_RELEASE_COMMIT was $LAST_RELEASE_COMMIT"
changed_files=$(git diff-tree --no-commit-id --name-only $LAST_RELEASE_COMMIT $GITHUB_SHA | grep '^app' || echo "none")
echo "Changed app files: $changed_files"
if [ "$changed_files" != "none" ]; then
echo "App directory has changed since the last release."
echo "app_changed=true" >> "$GITHUB_OUTPUT"
else
echo "App directory hasn't changed since the last release."
echo "app_changed=false" >> "$GITHUB_OUTPUT"
fi
build-and-release:
runs-on: ubuntu-latest
needs: check-app-changes
if: ${{ needs.check-app-changes.outputs.app_changed == 'true' }}
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
token: ${{secrets.ACTIONS_PAT}}
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Install Build Tools 29.0.3
run: sdkmanager "build-tools;29.0.3"
# Uses semantic commits to automate version bumping.
# No scope or "fix:" = PATCH, "feat:" or "minor:" = MINOR, "BREAKING CHANGE:", "major:", or fix/feat with appended "!" = MAJOR
# Additional details: https://www.conventionalcommits.org/en/v1.0.0/
- name: Increment version
run: |
#!/bin/bash
COMMIT_MSG=$(git log -1 --pretty=format:"%b" || git log -1 --pretty=format:"%B")
source version.properties
BUMP_TYPE="patchVersion"
if [[ $COMMIT_MSG == *"BREAKING CHANGE"* || $COMMIT_MSG == *"!"* || $COMMIT_MSG == *"major:"* ]]; then
majorVersion=$((majorVersion + 1))
minorVersion=0
patchVersion=0
BUMP_TYPE="majorVersion"
elif [[ $COMMIT_MSG == *"feat:"* || $COMMIT_MSG == *"minor:"* ]]; then
minorVersion=$((minorVersion + 1))
patchVersion=0
BUMP_TYPE="minorVersion"
else
patchVersion=$((patchVersion + 1))
fi
echo "majorVersion=$majorVersion" > version.properties
echo "minorVersion=$minorVersion" >> version.properties
echo "patchVersion=$patchVersion" >> version.properties
VERSION=$majorVersion.$minorVersion.$patchVersion
RELEASE=$majorVersion.$minorVersion
echo "COMMIT_MSG=$COMMIT_MSG" >> $GITHUB_ENV
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "RELEASE=$RELEASE" >> $GITHUB_ENV
echo "BUMP_TYPE=$BUMP_TYPE" >> $GITHUB_ENV
- name: Commit version changes
uses: EndBug/add-and-commit@v7
with:
add: 'version.properties'
message: Bump ${{ env.BUMP_TYPE }}
author_email: git-action-bot@example.com
author_name: Git Action Bot
- name: Push changes
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ github.ref }}
- name: Make gradlew executable
run: chmod +x ./gradlew
- name: Build APK
run: ./gradlew app:assembleRelease
- name: Sign APK
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: app/build/outputs/apk/release
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
- name: Upload built APK
uses: actions/upload-artifact@v4
with:
name: Signed APK
path: app/build/outputs/
- name: Get matching release
uses: cardinalby/git-get-release-action@1.2.4
id: matching_release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
releaseName: v${{ env.RELEASE }}
doNotFailIfNotFound: 'true'
- name: Delete matching release if exists
if: steps.matching_release.outputs.id != ''
run: |
curl -X DELETE -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" "https://api.github.com/repos/${{ github.repository }}/releases/${{ steps.matching_release.outputs.id}}"
# Updates the latest release if just a new patch, drafts a new prerelease if major or minor version has changed
- name: Make github release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
release_name: v${{ env.RELEASE }}
tag: ${{ env.VERSION }}
file: app/build/outputs/apk/release/app-release-unsigned-signed.apk
asset_name: Field-Book-v${{ env.RELEASE }}.apk
overwrite: ${{ env.BUMP_TYPE == 'patchVersion' }}
prerelease: ${{ env.BUMP_TYPE != 'patchVersion' }}
body: |
${{ steps.matching_release.outputs.body }}
${{ env.COMMIT_MSG }}
- name: Release APK to Play Store
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
packageName: com.fieldbook.tracker
releaseFiles: app/build/outputs/apk/release/app-release-unsigned-signed.apk
track: alpha