diff --git a/.github/workflows/_prepare.yml b/.github/workflows/_prepare.yml
new file mode 100644
index 0000000..37f1498
--- /dev/null
+++ b/.github/workflows/_prepare.yml
@@ -0,0 +1,46 @@
+name: Preparation
+on:
+ workflow_call: # workflow_call means it will be invoked by another workflow and can't be executed on its own
+ name:
+ description: "Preparation"
+ default: "Preparations for all our builds"
+
+jobs:
+ build:
+ runs-on: [ self-hosted, macOS ] # we host on our own mac mini, it's twice as fast as hosting on github
+ permissions:
+ packages: read
+ contents: read
+
+ steps:
+ - name: Checking out branch
+ uses: actions/checkout@v3
+
+ - name: Setup Java
+ uses: actions/setup-java@v3
+ with:
+ distribution: "corretto"
+ java-version: "21" # keep the same as your Android Studio version
+ cache: "gradle"
+
+ - name: Setup Android SDK
+ uses: android-actions/setup-android@v2.0.10
+
+ - name: Update version code # we increase the version code with each build
+ uses: chkfung/android-version-actions@v1.1
+ with:
+ gradlePath: app/build.gradle
+ versionCode: ${{ github.run_number }}
+
+ # This will decode the keystore from base 64 text representation that we have stored in secrets
+ # and generates and keystore file and gets stored in /android-app path
+ - name: Decode Keystore
+ env:
+ ENCODED_STRING: ${{ secrets.KEYSTORE_BASE_64 }}
+ RELEASE_KEYSTORE_PASSWORD: ${{ secrets.RELEASE_KEYSTORE_PASSWORD }}
+ RELEASE_KEYSTORE_ALIAS: ${{ secrets.RELEASE_KEYSTORE_ALIAS }}
+ RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }}
+
+ run: |
+ echo $ENCODED_STRING > keystore-b64.txt
+ base64 -d keystore-b64.txt > upload_keystore.jks
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
deleted file mode 100644
index 162b7e5..0000000
--- a/.github/workflows/pr.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-name: Unit-Test Pull Request
-
-on:
- workflow_dispatch:
- pull_request:
-
-jobs:
- build-dev-pr:
- runs-on: ubuntu-latest
- permissions:
- packages: read
- contents: read
- steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-java@v3
- with:
- distribution: "corretto" # See 'Supported distributions' for available options
- java-version: "17"
- cache: "gradle"
- - name: Update version code
- uses: chkfung/android-version-actions@v1.2.1
- with:
- gradlePath: app/build.gradle
- versionCode: ${{ github.run_number }}
- - name: Set up ruby env
- uses: ruby/setup-ruby@v1
- with:
- ruby-version: 2.7.2
- bundler-cache: true
- - name: Clean
- run: bundle exec fastlane android clean
- - name: Run tests
- run: bundle exec fastlane android test
- - name: Build Debug APK
- run: bundle exec fastlane android assembleDevDebug
- - name: Build Release APK
- run: bundle exec fastlane android assembleDevRelease
- - name: Upload APKs To Github
- uses: actions/upload-artifact@v3
- with:
- name: template_android_${{ github.run_number }}_apks
- path: |
- ${{ github.workspace }}/app/build/outputs/apk/
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..722451f
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,41 @@
+name: Release Build
+# Preparation steps that can be used in other steps and workflows.
+on:
+ workflow_dispatch:
+ inputs:
+ name:
+ description: "Release-Build"
+ default: "Generate release build"
+
+jobs:
+ uses: ./.github/workflows/_prepare.yml
+ build:
+ runs-on: [ self-hosted, macOS ] # we host on our own mac mini, it's twice as fast
+
+ steps:
+ - name: Build Release bundle
+ env:
+ RELEASE_KEYSTORE_PASSWORD: ${{ secrets.RELEASE_KEYSTORE_PASSWORD }}
+ RELEASE_KEYSTORE_ALIAS: ${{ secrets.RELEASE_KEYSTORE_ALIAS }}
+ RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }}
+ run: ./gradlew bundleRelease --stacktrace
+
+ - name: Get release file aab path
+ id: releaseAab
+ run: echo "aabfile=$(find app/build/outputs/bundle/release/*.aab)" >> $GITHUB_OUTPUT
+
+ - name: Get release file apk path
+ id: releaseApk
+ run: echo "apkfile=$(find app/build/outputs/apk/release/*.apk)" >> $GITHUB_OUTPUT
+
+ - name: Upload Release Build to Artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: release-artifacts
+ path: ${{ steps.releaseApk.outputs.apkfile }}
+
+ - name: Upload Release Build to Artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: release-artifacts
+ path: ${{ steps.releaseApk.outputs.aabfile }}
diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml
new file mode 100644
index 0000000..e69de29
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
new file mode 100644
index 0000000..b268ef3
--- /dev/null
+++ b/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/other.xml b/.idea/other.xml
new file mode 100644
index 0000000..0d3a1fb
--- /dev/null
+++ b/.idea/other.xml
@@ -0,0 +1,263 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
deleted file mode 100644
index 7a118b4..0000000
--- a/Gemfile
+++ /dev/null
@@ -1,3 +0,0 @@
-source "https://rubygems.org"
-
-gem "fastlane"
diff --git a/Gemfile.lock b/Gemfile.lock
deleted file mode 100644
index f1f87f0..0000000
--- a/Gemfile.lock
+++ /dev/null
@@ -1,222 +0,0 @@
-GEM
- remote: https://rubygems.org/
- specs:
- CFPropertyList (3.0.6)
- rexml
- addressable (2.8.5)
- public_suffix (>= 2.0.2, < 6.0)
- artifactory (3.0.15)
- atomos (0.1.3)
- aws-eventstream (1.2.0)
- aws-partitions (1.802.0)
- aws-sdk-core (3.180.3)
- aws-eventstream (~> 1, >= 1.0.2)
- aws-partitions (~> 1, >= 1.651.0)
- aws-sigv4 (~> 1.5)
- jmespath (~> 1, >= 1.6.1)
- aws-sdk-kms (1.71.0)
- aws-sdk-core (~> 3, >= 3.177.0)
- aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.132.1)
- aws-sdk-core (~> 3, >= 3.179.0)
- aws-sdk-kms (~> 1)
- aws-sigv4 (~> 1.6)
- aws-sigv4 (1.6.0)
- aws-eventstream (~> 1, >= 1.0.2)
- babosa (1.0.4)
- claide (1.1.0)
- colored (1.2)
- colored2 (3.1.2)
- commander (4.6.0)
- highline (~> 2.0.0)
- declarative (0.0.20)
- digest-crc (0.6.5)
- rake (>= 12.0.0, < 14.0.0)
- domain_name (0.5.20190701)
- unf (>= 0.0.5, < 1.0.0)
- dotenv (2.8.1)
- emoji_regex (3.2.3)
- excon (0.100.0)
- faraday (1.10.3)
- faraday-em_http (~> 1.0)
- faraday-em_synchrony (~> 1.0)
- faraday-excon (~> 1.1)
- faraday-httpclient (~> 1.0)
- faraday-multipart (~> 1.0)
- faraday-net_http (~> 1.0)
- faraday-net_http_persistent (~> 1.0)
- faraday-patron (~> 1.0)
- faraday-rack (~> 1.0)
- faraday-retry (~> 1.0)
- ruby2_keywords (>= 0.0.4)
- faraday-cookie_jar (0.0.7)
- faraday (>= 0.8.0)
- http-cookie (~> 1.0.0)
- faraday-em_http (1.0.0)
- faraday-em_synchrony (1.0.0)
- faraday-excon (1.1.0)
- faraday-httpclient (1.0.1)
- faraday-multipart (1.0.4)
- multipart-post (~> 2)
- faraday-net_http (1.0.1)
- faraday-net_http_persistent (1.2.0)
- faraday-patron (1.0.0)
- faraday-rack (1.0.0)
- faraday-retry (1.0.3)
- faraday_middleware (1.2.0)
- faraday (~> 1.0)
- fastimage (2.2.7)
- fastlane (2.214.0)
- CFPropertyList (>= 2.3, < 4.0.0)
- addressable (>= 2.8, < 3.0.0)
- artifactory (~> 3.0)
- aws-sdk-s3 (~> 1.0)
- babosa (>= 1.0.3, < 2.0.0)
- bundler (>= 1.12.0, < 3.0.0)
- colored
- commander (~> 4.6)
- dotenv (>= 2.1.1, < 3.0.0)
- emoji_regex (>= 0.1, < 4.0)
- excon (>= 0.71.0, < 1.0.0)
- faraday (~> 1.0)
- faraday-cookie_jar (~> 0.0.6)
- faraday_middleware (~> 1.0)
- fastimage (>= 2.1.0, < 3.0.0)
- gh_inspector (>= 1.1.2, < 2.0.0)
- google-apis-androidpublisher_v3 (~> 0.3)
- google-apis-playcustomapp_v1 (~> 0.1)
- google-cloud-storage (~> 1.31)
- highline (~> 2.0)
- json (< 3.0.0)
- jwt (>= 2.1.0, < 3)
- mini_magick (>= 4.9.4, < 5.0.0)
- multipart-post (>= 2.0.0, < 3.0.0)
- naturally (~> 2.2)
- optparse (~> 0.1.1)
- plist (>= 3.1.0, < 4.0.0)
- rubyzip (>= 2.0.0, < 3.0.0)
- security (= 0.1.3)
- simctl (~> 1.6.3)
- terminal-notifier (>= 2.0.0, < 3.0.0)
- terminal-table (>= 1.4.5, < 2.0.0)
- tty-screen (>= 0.6.3, < 1.0.0)
- tty-spinner (>= 0.8.0, < 1.0.0)
- word_wrap (~> 1.0.0)
- xcodeproj (>= 1.13.0, < 2.0.0)
- xcpretty (~> 0.3.0)
- xcpretty-travis-formatter (>= 0.0.3)
- gh_inspector (1.1.3)
- google-apis-androidpublisher_v3 (0.47.0)
- google-apis-core (>= 0.11.0, < 2.a)
- google-apis-core (0.11.1)
- addressable (~> 2.5, >= 2.5.1)
- googleauth (>= 0.16.2, < 2.a)
- httpclient (>= 2.8.1, < 3.a)
- mini_mime (~> 1.0)
- representable (~> 3.0)
- retriable (>= 2.0, < 4.a)
- rexml
- webrick
- google-apis-iamcredentials_v1 (0.17.0)
- google-apis-core (>= 0.11.0, < 2.a)
- google-apis-playcustomapp_v1 (0.13.0)
- google-apis-core (>= 0.11.0, < 2.a)
- google-apis-storage_v1 (0.19.0)
- google-apis-core (>= 0.9.0, < 2.a)
- google-cloud-core (1.6.0)
- google-cloud-env (~> 1.0)
- google-cloud-errors (~> 1.0)
- google-cloud-env (1.6.0)
- faraday (>= 0.17.3, < 3.0)
- google-cloud-errors (1.3.1)
- google-cloud-storage (1.44.0)
- addressable (~> 2.8)
- digest-crc (~> 0.4)
- google-apis-iamcredentials_v1 (~> 0.1)
- google-apis-storage_v1 (~> 0.19.0)
- google-cloud-core (~> 1.6)
- googleauth (>= 0.16.2, < 2.a)
- mini_mime (~> 1.0)
- googleauth (1.7.0)
- faraday (>= 0.17.3, < 3.a)
- jwt (>= 1.4, < 3.0)
- memoist (~> 0.16)
- multi_json (~> 1.11)
- os (>= 0.9, < 2.0)
- signet (>= 0.16, < 2.a)
- highline (2.0.3)
- http-cookie (1.0.5)
- domain_name (~> 0.5)
- httpclient (2.8.3)
- jmespath (1.6.2)
- json (2.6.3)
- jwt (2.7.1)
- memoist (0.16.2)
- mini_magick (4.12.0)
- mini_mime (1.1.5)
- multi_json (1.15.0)
- multipart-post (2.3.0)
- nanaimo (0.3.0)
- naturally (2.2.1)
- optparse (0.1.1)
- os (1.1.4)
- plist (3.7.0)
- public_suffix (5.0.3)
- rake (13.0.6)
- representable (3.2.0)
- declarative (< 0.1.0)
- trailblazer-option (>= 0.1.1, < 0.2.0)
- uber (< 0.2.0)
- retriable (3.1.2)
- rexml (3.2.8)
- strscan (>= 3.0.9)
- rouge (2.0.7)
- ruby2_keywords (0.0.5)
- rubyzip (2.3.2)
- security (0.1.3)
- signet (0.17.0)
- addressable (~> 2.8)
- faraday (>= 0.17.5, < 3.a)
- jwt (>= 1.5, < 3.0)
- multi_json (~> 1.10)
- simctl (1.6.10)
- CFPropertyList
- naturally
- strscan (3.1.0)
- terminal-notifier (2.0.0)
- terminal-table (1.8.0)
- unicode-display_width (~> 1.1, >= 1.1.1)
- trailblazer-option (0.1.2)
- tty-cursor (0.7.1)
- tty-screen (0.8.1)
- tty-spinner (0.9.3)
- tty-cursor (~> 0.7)
- uber (0.1.0)
- unf (0.1.4)
- unf_ext
- unf_ext (0.0.8.2)
- unicode-display_width (1.8.0)
- webrick (1.8.1)
- word_wrap (1.0.0)
- xcodeproj (1.22.0)
- CFPropertyList (>= 2.3.3, < 4.0)
- atomos (~> 0.1.3)
- claide (>= 1.0.2, < 2.0)
- colored2 (~> 3.1)
- nanaimo (~> 0.3.0)
- rexml (~> 3.2.4)
- xcpretty (0.3.0)
- rouge (~> 2.0.7)
- xcpretty-travis-formatter (1.0.1)
- xcpretty (~> 0.2, >= 0.0.7)
-
-PLATFORMS
- arm64-darwin-22
- x86_64-darwin-22
- x86_64-linux
-
-DEPENDENCIES
- fastlane
-
-BUNDLED WITH
- 2.4.10
diff --git a/README.MD b/README.MD
index f575bec..c7f6792 100644
--- a/README.MD
+++ b/README.MD
@@ -9,7 +9,8 @@ A template for creating Android projects at Q42.
Github Actions only, that's a much simpler setup. Make sure to also demonstrate / implement CI
singing keys in this setup.
- Switch build files to KTS (Frank), also build some custom plugins (Frank).
-- Optionally: Setup proper Typography in AppTheme, using custom (non-material) Typography keys, because that is what we have in 90%+ of our projects.
+- Optionally: Setup proper Typography in AppTheme, using custom (non-material) Typography keys,
+ because that is what we have in 90%+ of our projects.
- Optionally: Add compose events from VM to
View (https://github.com/leonard-palm/compose-state-events) and showcase with snackbar or toast.
- Optionally: Switch from retrofit to ktor (because Ktor is multiplatform)
@@ -30,23 +31,23 @@ Only basic features that almost all projects use, were added in this template:
## Project Setup
-### CI
+### Signing Builds
+
+If you need local signing of release builds, copy the upload keystore into the root of your project,
+and call it 'upload-keystore.jks'. Note that you probably don't need to use local signing. The CI
+build setup builds and signs your app for
+you.
-This project uses Github Actions + fastlane for CI. There is a nice upgrade path to automatically
-deploy builds to Firebase App Distribution and Play Store.
+### CI
-#### Installing fastlane
+This project uses Github Actions for CI.
-A big advantage of fastlane is that the ci and publishing steps can run locally.
-Use `brew install fastlane` and then `fastlane test` to verify this installation.
+TODO: add instructions for uploading an app specific signing key to Github secrets.
-#### Removing Github Actions + fastlane
+#### Removing Github Actions
Using Bitrise instead? Then you can delete:
-- `./fastlane`
-- `./GemFile`
-- `./Gemfile.lock`
- `./.github/workflows`
## Using this template
diff --git a/app/build.gradle b/app/build.gradle
index 0007773..a4a0440 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -12,7 +12,7 @@ android {
namespace = "nl.q42.template"
defaultConfig {
- versionCode = 1
+ versionCode = 1 // version code is set by CI
versionName = "1.0"
}
@@ -20,6 +20,15 @@ android {
buildConfig = true
}
+ signingConfigs {
+ upload {
+ keyAlias System.getenv("BOEDELBAK_UPLOAD_KEY_ALIAS")
+ keyPassword System.getenv("BOEDELBAK_UPLOAD_KEY_PW")
+ storeFile file("../upload-keystore.jks")
+ storePassword System.getenv("BOEDELBAK_UPLOAD_KEY_STORE_PW")
+ }
+ }
+
buildTypes {
debug {
buildConfigField 'boolean', 'config_log_http_calls', "true"
@@ -27,6 +36,7 @@ android {
}
release {
minifyEnabled true
+ signingConfig signingConfigs.upload
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
buildConfigField 'boolean', 'config_log_http_calls', "false"
}
diff --git a/fastlane/Appfile b/fastlane/Appfile
deleted file mode 100644
index 3275f34..0000000
--- a/fastlane/Appfile
+++ /dev/null
@@ -1,2 +0,0 @@
-json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one
-package_name("nl.q42.template") # e.g. com.krausefx.app
diff --git a/fastlane/Fastfile b/fastlane/Fastfile
deleted file mode 100644
index c6d682a..0000000
--- a/fastlane/Fastfile
+++ /dev/null
@@ -1,47 +0,0 @@
-# This file contains the fastlane.tools configuration
-# You can find the documentation at https://docs.fastlane.tools
-#
-# For a list of all available actions, check out
-#
-# https://docs.fastlane.tools/actions
-#
-# For a list of all available plugins, check out
-#
-# https://docs.fastlane.tools/plugins/available-plugins
-#
-
-# Uncomment the line if you want fastlane to automatically update itself
-# update_fastlane
-
-default_platform(:android)
-
-platform :android do
- desc "Runs all the tests"
- lane :clean do
- gradle(task: "clean")
- end
- lane :test do
- gradle(task: "testDebugUnitTest")
- end
- lane :assembleDevDebug do
- gradle(task: "assembleDevDebug")
- end
- lane :assembleDevRelease do
- gradle(task: "assembleDevRelease")
- end
-
- desc "Submit a new Beta Build to Crashlytics Beta"
- lane :beta do
- gradle(task: "clean assembleRelease")
- crashlytics
-
- # sh "your_script.sh"
- # You can also use other beta testing services here
- end
-
- desc "Deploy a new version to the Google Play"
- lane :deploy do
- gradle(task: "clean assembleRelease")
- upload_to_play_store
- end
-end
diff --git a/fastlane/README.md b/fastlane/README.md
deleted file mode 100644
index 3491dd9..0000000
--- a/fastlane/README.md
+++ /dev/null
@@ -1,72 +0,0 @@
-fastlane documentation
-----
-
-# Installation
-
-Make sure you have the latest version of the Xcode command line tools installed:
-
-```sh
-xcode-select --install
-```
-
-For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)
-
-# Available Actions
-
-## Android
-
-### android clean
-
-```sh
-[bundle exec] fastlane android clean
-```
-
-Runs all the tests
-
-### android test
-
-```sh
-[bundle exec] fastlane android test
-```
-
-
-
-### android assembleDevDebug
-
-```sh
-[bundle exec] fastlane android assembleDevDebug
-```
-
-
-
-### android assembleDevRelease
-
-```sh
-[bundle exec] fastlane android assembleDevRelease
-```
-
-
-
-### android beta
-
-```sh
-[bundle exec] fastlane android beta
-```
-
-Submit a new Beta Build to Crashlytics Beta
-
-### android deploy
-
-```sh
-[bundle exec] fastlane android deploy
-```
-
-Deploy a new version to the Google Play
-
-----
-
-This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
-
-More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).
-
-The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).