Skip to content

Commit

Permalink
Adds support for a full CI/CD pipeline using GitHub Actions to includ…
Browse files Browse the repository at this point in the history
…e creating a GH Release and uploading to Google Play
  • Loading branch information
christianrowlands committed Oct 26, 2023
1 parent 29a0664 commit da9fabd
Show file tree
Hide file tree
Showing 5 changed files with 157 additions and 106 deletions.
182 changes: 143 additions & 39 deletions .github/workflows/android-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,35 @@ on:
workflow_dispatch:

jobs:
test:
name: Run Tests
runs-on: macos-latest

strategy:
matrix:
api-level: [ 26, 31 ]
target: [ default, google_apis ]

steps:
- name: Checkout the code
uses: actions/checkout@v1

- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: 11
distribution: 'adopt'

- name: Cache dependencies
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-${{ hashFiles('**/*.gradle*') }}-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}-${{ hashFiles('**/buildSrc/**/*.kt') }}

- name: Unit Tests
run: ./gradlew test --stacktrace
# test:
# name: Run Tests
# runs-on: macos-latest
#
# strategy:
# matrix:
# api-level: [ 26, 31 ]
# target: [ default, google_apis ]
#
# steps:
# - name: Checkout the code
# uses: actions/checkout@v1
#
# - name: Set up JDK 11
# uses: actions/setup-java@v2
# with:
# java-version: 11
# distribution: 'adopt'
#
# - name: Cache dependencies
# uses: actions/cache@v2
# with:
# path: |
# ~/.gradle/caches
# ~/.gradle/wrapper
# key: ${{ runner.os }}-${{ hashFiles('**/*.gradle*') }}-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}-${{ hashFiles('**/buildSrc/**/*.kt') }}
#
# - name: Unit Tests
# run: ./gradlew test --stacktrace

# Need to work through a permissions error to get these working
# - name: Instrumentation Tests
Expand All @@ -50,20 +50,68 @@ jobs:
# script: ./gradlew test check connectedCheck -x lint --stacktrace

# Only upload the reports on failure
- name: Upload Reports
uses: actions/upload-artifact@v2
# - name: Upload Reports
# uses: actions/upload-artifact@v2
# with:
# name: Test-Reports
# path: networksurvey/build/reports
# if: failure()

bumpVersion:
# needs: test
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
name: Test-Reports
path: networksurvey/build/reports
if: failure()

buildReleaseApk:
needs: test
fetch-depth: 0
ref: github-actions-play-publish

- name: Extract version from tag
uses: damienaicheh/[email protected]

- name: Extract existing version code
run: |
# Set new version name from tag
if [[ -z "${{ env.PATCH }}" ]]; then
version_name=${{ env.MAJOR }}.${{ env.MINOR }}
else
version_name=${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.PATCH }}
fi
# Get existing version code from build.gradle
version_code=$(grep "versionCode" networksurvey/build.gradle | awk '{print $2}' | tr -d '\n')
# Increment existing version code by 1
version_code=$((version_code + 1))
# Set environment variable for later use
echo "VERSION_NAME=$version_name" >> $GITHUB_ENV
echo "VERSION_CODE=$version_code" >> $GITHUB_ENV
- name: Increase version code and change version name
run: |
# Update build.gradle with new version code and name
echo "${{ env.VERSION_CODE }} - ${{ env.VERSION_NAME }}"
sed -i "s/versionCode [0-9]\+/versionCode ${{ env.VERSION_CODE }}/g" networksurvey/build.gradle
sed -i "s/versionName \"[^\"]*\"/versionName \"${{ env.VERSION_NAME }}\"/g" networksurvey/build.gradle
- name: Commit and push changes
run: |
git config user.email "[email protected]"
git config user.name "Github Actions"
git add .
git commit -am "Bump version code and change version name to ${{ env.VERSION_NAME }}"
git push origin github-actions-play-publish
buildRelease:
needs: bumpVersion
runs-on: ubuntu-latest

steps:
- name: Checkout the code
uses: actions/checkout@v2
uses: actions/checkout@v4

- name: Cache dependencies
uses: actions/cache@v2
Expand All @@ -84,6 +132,11 @@ jobs:
KEYSTORE_FILE: ${{ secrets.KEYSTORE_FILE }}
run: echo $KEYSTORE_FILE | base64 -d > my.keystore

- name: Save google-services.json
env:
GOOGLE_SERVICES: ${{ secrets.GOOGLE_SERVICES }}
run: echo "$GOOGLE_SERVICES" > networksurvey/google-services.json

- name: Build Regular Release APK
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
Expand All @@ -95,7 +148,7 @@ jobs:
-Pandroid.injected.signing.key.alias=$KEY_ALIAS
-Pandroid.injected.signing.key.password=$KEY_PASSWORD

- name: Get APK name
- name: Get base name
run: echo "base_name=`./gradlew :networksurvey:properties -q | grep 'archivesBaseName:' | awk '{print $2}'`" >> $GITHUB_ENV

- name: Upload Regular APK
Expand All @@ -120,3 +173,54 @@ jobs:
with:
name: Network Survey CDR Release APK
path: networksurvey/build/outputs/apk/cdr/release/${{ env.base_name }}-cdr-release.apk

- name: Build Regular Release Bundle
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: ./gradlew bundleRelease
-Pandroid.injected.signing.store.file=$(pwd)/my.keystore
-Pandroid.injected.signing.store.password=$KEYSTORE_PASSWORD
-Pandroid.injected.signing.key.alias=$KEY_ALIAS
-Pandroid.injected.signing.key.password=$KEY_PASSWORD

- name: Upload Regular Bundle
uses: actions/upload-artifact@v3
with:
name: regular-appbundle
path: networksurvey/build/outputs/bundle/regularRelease/${{ env.base_name }}-regular-release.aab

- name: Create a Release in GitHub
uses: ncipollo/release-action@v1
with:
artifacts: "networksurvey/build/outputs/apk/cdr/release/*.apk,networksurvey/build/outputs/apk/regular/release/*.apk"
token: ${{ secrets.GH_TOKEN }}
tag: ${{ steps.version.outputs.content }}
commit: ${{ github.sha }}
body: "The regular-release apk is the same as what can be found on the Google Play Store. The cdr-release apk is the same as the regular-release apk, but with the full CDR support (See README.md for more details) and it also does not contain any tracking libraries such as Google Analytics."
generateReleaseNotes: true


release:
name: Release app to internal track
needs: [ buildRelease ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Get appbundle from artifacts
uses: actions/download-artifact@v2
with:
name: regular-appbundle

- name: Get base name
run: echo "base_name=`./gradlew :networksurvey:properties -q | grep 'archivesBaseName:' | awk '{print $2}'`" >> $GITHUB_ENV

- name: Release app to internal track
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.PLAYSTORE_ACCOUNT_KEY }}
packageName: com.craxiom.networksurvey
releaseFiles: ${{ env.base_name }}-regular-release.aab
track: internal
status: draft
2 changes: 1 addition & 1 deletion .github/workflows/android.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ jobs:
uses: actions/upload-artifact@v3
with:
name: Network Survey CDR Debug APK
path: networksurvey/build/outputs/apk/cdr/debug/${{ env.base_name }}-cdr-debug.apk
path: networksurvey/build/outputs/apk/cdr/debug/${{ env.base_name }}-cdr-no-tracking-debug.apk


test:
Expand Down
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
ext.kotlin_version = '1.7.10'
ext.kotlin_version = '1.8.20'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
//classpath 'com.google.gms:google-services:4.3.15'
//classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.6'
classpath 'com.google.gms:google-services:4.3.15'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.6'
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.5.3"
}
}
Expand Down
55 changes: 0 additions & 55 deletions cloudbuild.yaml

This file was deleted.

18 changes: 10 additions & 8 deletions networksurvey/build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
apply plugin: 'com.android.application'
apply plugin: "androidx.navigation.safeargs"
//apply plugin: "com.google.gms.google-services"
//apply plugin: "com.google.firebase.crashlytics"
apply plugin: "com.google.gms.google-services"
apply plugin: "com.google.firebase.crashlytics"
apply plugin: 'kotlin-android'


Expand All @@ -17,8 +17,8 @@ android {
applicationId "com.craxiom.networksurvey"
minSdkVersion 26
targetSdkVersion 31
versionCode 50
versionName "1.13"
versionCode 49
versionName "1.14-SNAPSHOT"
setProperty("archivesBaseName", "$applicationName-$versionName")
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
testInstrumentationRunnerArguments clearPackageData: 'true'
Expand Down Expand Up @@ -56,10 +56,12 @@ android {

flavorDimensions "version"
productFlavors {
// Regular is for Google Play that contains Firebase tracking features such as crashlytics
regular {
versionNameSuffix ""
}

// Has the extra CDR features and does not contain any tracking
cdr {
versionNameSuffix "-cdr"
}
Expand Down Expand Up @@ -107,10 +109,10 @@ dependencies {
implementation 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'

// Import the Firebase BoM
//implementation platform('com.google.firebase:firebase-bom:31.2.3')
//implementation 'com.google.firebase:firebase-analytics'
//implementation 'com.google.firebase:firebase-crashlytics'
// Only include firebase in the google play build
regularImplementation platform('com.google.firebase:firebase-bom:31.2.3')
regularImplementation 'com.google.firebase:firebase-analytics'
regularImplementation 'com.google.firebase:firebase-crashlytics'

testImplementation 'junit:junit:4.13.2'
implementation 'androidx.annotation:annotation:1.6.0'
Expand Down

0 comments on commit da9fabd

Please sign in to comment.