Skip to content

Commit

Permalink
chore: setup pipeline for flutter app (#943)
Browse files Browse the repository at this point in the history
  • Loading branch information
adityastic committed Jun 4, 2024
1 parent f66b851 commit 818655a
Show file tree
Hide file tree
Showing 92 changed files with 1,403 additions and 324 deletions.
61 changes: 61 additions & 0 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: Badge Magic PR CI
on:
pull_request:
branches: ["flutter_app"]
jobs:
common:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
cache: true

- name: Fetch Flutter Dependencies
run: flutter pub get

- name: Validate Code Format
run: dart format --output=none --set-exit-if-changed .

- name: Analyze Code
run: flutter analyze

android:
needs: common
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
cache: true

- name: Run tests
run: flutter test

- name: Build Android APK/AAB
run: |
flutter build apk
flutter build appbundle
ios:
needs: common
runs-on: macos-latest
steps:
- uses: actions/checkout@v4

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
cache: true

- name: Run tests
run: flutter test

- name: Build iOS IPA
run: |
flutter build ipa --no-codesign
203 changes: 203 additions & 0 deletions .github/workflows/push.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
name: Badge Magic Push CI
on:
push:
branches: ["flutter_app"]
jobs:
common:
runs-on: ubuntu-latest

outputs:
VERSION_NAME: ${{ steps.flutter-version.outputs.VERSION_NAME }}
VERSION_CODE: ${{ steps.flutter-version.outputs.VERSION_CODE }}

steps:
- uses: actions/checkout@v4

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
cache: true

- name: Fetch Flutter Dependencies
run: flutter pub get

- name: Validate Code Format
run: dart format --output=none --set-exit-if-changed .

- name: Analyze Code
run: flutter analyze

- name: Hydrate and Update Version
id: flutter-version
run: |
git config --global user.name "${{ github.workflow }}"
git config --global user.email "gh-actions@${{ github.repository_owner }}"
git clone --branch=version https://${{ github.repository_owner }}:${{ github.token }}@github.com/${{ github.repository }} version
cd version
# Read and increment version name
IFS='.' read -r major minor patch < versionName.txt
current_patch_version_name="$major.$minor.$patch"
echo "VERSION_NAME=$current_patch_version_name" >> $GITHUB_OUTPUT
next_patch=$((patch + 1))
next_patch_version_name="$major.$minor.$next_patch"
echo "$next_patch_version_name" > versionName.txt
# Read and increment version code
read -r version_code < versionCode.txt
echo "VERSION_CODE=$version_code" >> $GITHUB_OUTPUT
new_version_code=$((version_code + 1))
echo "$new_version_code" > versionCode.txt
# Force push to version branch
git checkout --orphan temporary
git add --all .
git commit -am "[Auto] Update versionName: $next_patch_version_name & versionCode: $new_version_code ($(date +%Y-%m-%d.%H:%M:%S))"
git branch -D version
git branch -m version
git push --force origin version

android:
needs: common
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup Ruby
if: ${{ github.repository == 'fossasia/badgemagic-android' }}
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'
bundler-cache: true

- name: Prepare Bundler
if: ${{ github.repository == 'fossasia/badgemagic-android' }}
run: |
bundle config path vendor/bundle
bundle install --jobs 4 --retry 3
- name: Pre Checks
run: |
bash scripts/check-screenshots.sh
- name: Prepare Build Keys
if: ${{ github.repository == 'fossasia/badgemagic-android' }}
env:
ENCRYPTED_F10B5E0E5262_IV: ${{ secrets.ENCRYPTED_F10B5E0E5262_IV }}
ENCRYPTED_F10B5E0E5262_KEY: ${{ secrets.ENCRYPTED_F10B5E0E5262_KEY }}
run: |
bash scripts/prep-key.sh
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
cache: true

- name: Run tests
run: flutter test

- name: Build Android APK/AAB
env:
STORE_PASS: ${{ secrets.STORE_PASS }}
ALIAS: ${{ secrets.ALIAS }}
KEY_PASS: ${{ secrets.KEY_PASS }}
VERSION_NAME: ${{needs.common.outputs.VERSION_NAME}}
VERSION_CODE: ${{needs.common.outputs.VERSION_CODE}}
run: |
flutter build apk --build-name $VERSION_NAME --build-number $VERSION_CODE
flutter build appbundle --build-name $VERSION_NAME --build-number $VERSION_CODE
- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: APK Generated
path: build/app/outputs/flutter-apk

- name: Upload AAB Release
uses: actions/upload-artifact@v4
with:
name: AAB Generated
path: build/app/outputs/bundle

- name: Upload APK/AAB to apk branch
if: ${{ github.repository == 'fossasia/badgemagic-android' }}
run: |
git config --global user.name "${{ github.workflow }}"
git config --global user.email "gh-actions@${{ github.repository_owner }}"
git clone --branch=apk https://${{ github.repository_owner }}:${{ github.token }}@github.com/${{ github.repository }} apk
cd apk
branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}
echo "Removing previous files from branch"
rm -rf badge-magic-$branch*
ls
echo "Copying new build files"
find ../build/app/outputs/flutter-apk -type f \( -name '*.apk' -o -name '*.aab' \) -exec cp -v {} . \;
find ../build/app/outputs/bundle -type f \( -name '*.apk' -o -name '*.aab' \) -exec cp -v {} . \;
ls
echo "Renaming new build files"
for file in app*; do
mv $file badge-magic-$branch-${file#*-}
done
ls
echo "Pushing to apk branch"
git checkout --orphan temporary
git add --all .
git commit -am "[Auto] Update APK/AAB's from $branch ($(date +%Y-%m-%d.%H:%M:%S))"
git branch -D apk
git branch -m apk
git push --force origin apk
- name: Upload alpha version to playstore
if: ${{ github.repository == 'fossasia/badgemagic-android' }}
run: |
bundle exec fastlane uploadToPlaystore
if [[ $? -ne 0 ]]; then
exit 1
fi
ios:
needs: common
runs-on: macos-latest
steps:
- uses: actions/checkout@v4

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
cache: true

- name: Run tests
run: flutter test

- name: Build iOS IPA
env:
VERSION_NAME: ${{needs.common.outputs.VERSION_NAME}}
VERSION_CODE: ${{needs.common.outputs.VERSION_CODE}}
run: |
flutter build ipa --no-codesign --build-name $VERSION_NAME --build-number $VERSION_CODE
3 changes: 3 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
source "https://rubygems.org"

gem "fastlane"
29 changes: 26 additions & 3 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,12 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0'
}

def KEYSTORE_FILE = rootProject.file('./key.jks')
def GITHUB_BUILD = System.getenv("GITHUB_ACTIONS") == "true" && KEYSTORE_FILE.exists()
def LOCAL_KEY_PRESENT = project.hasProperty('SIGNING_KEY_FILE') && rootProject.file(SIGNING_KEY_FILE).exists()

android {
namespace "com.example.badgemagic"
namespace "org.fossasia.badgemagic"
compileSdk flutter.compileSdkVersion
ndkVersion flutter.ndkVersion

Expand All @@ -34,7 +38,7 @@ android {

defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.badgemagic"
applicationId "org.fossasia.badgemagic"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 21
Expand All @@ -43,11 +47,30 @@ android {
versionName flutterVersionName
}

signingConfigs {
if (GITHUB_BUILD) {
release {
storeFile KEYSTORE_FILE
storePassword System.getenv("STORE_PASS")
keyAlias System.getenv("ALIAS")
keyPassword System.getenv("KEY_PASS")
}
} else if (LOCAL_KEY_PRESENT) {
release {
storeFile rootProject.file(SIGNING_KEY_FILE)
storePassword STORE_PASS
keyAlias ALIAS
keyPassword KEY_PASS
}
}
}

buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
if (LOCAL_KEY_PRESENT || GITHUB_BUILD)
signingConfig signingConfigs.release
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.badgemagic;
package org.fossasia.badgemagic;

import io.flutter.embedding.android.FlutterActivity;

Expand Down
56 changes: 56 additions & 0 deletions docs/commitStyle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
## Commit Style Guidelines for Badge Magic Android

### Message Structure
Commit messages consist of three distinct parts, separated by a blank line: the title, an optional body/content, and an optional footer/metadata. The layout looks like this:

type: subject

body

footer

***

### Title
The title consists of the subject and type of the commit message.

### Type
The type is contained within the title and can be one of the following types:

* **feat:** a new feature
* **fix:** a bug fix
* **docs:** changes to documentation
* **style:** formatting, missing semi-colons, etc; no code change
* **refactor:** refactoring production code
* **test:** adding tests, refactoring test; no production code change
* **chore:** updating build tasks, package manager configs, etc; no production code change

### Subject
The subject is a single short line summarising the change. It should be no greater than 50 characters, should begin with a capital letter and do not end with a period.

Use an imperative tone to describe what a commit does, rather than what it did. For example, use fix; not fixed or fixes or fixing.

For example:
- fix: Typo in Commit Style guidelines
- feat: Update UI of AbcActivity
- fix: Remove deprecated methods
- refactor: API endpoints and JSON assets

instead of writing the following:
- Fixed bug with Y
- Changing behaviour of X

### Body
The body includes the kind of information commit message (if any) should contain.

Not every commit requires both a subject and a body. Sometimes a single line is fine, especially when the change is self-explanatory and no further context is necessary, therefore it is optional. The body is used to explain the what and why of a commit, not the how.

When writing a body, the blank line between the title and the body is required and we should try to limit the length of each line to no more than 72 characters.

### The Footer
The footer is optional and is used to reference issue tracker IDs.

For example:
Fixes #1170

***
Binary file added docs/images/app_icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 818655a

Please sign in to comment.