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).