DEV Community

Papon Ahasan
Papon Ahasan

Posted on • Edited on

CI/CD using GitHub Actions

🧠 What is CI/CD?

āϧāϰ⧋ āϤ⧁āĻŽāĻŋ āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύ āĻ¸ā§āϕ⧁āϞ⧇ āĻ—āĻŋā§Ÿā§‡ āĻ›āĻŦāĻŋ āφāρāϕ⧋āĨ¤ āϤ⧋āĻŽāĻžāϰ āϟāĻŋāϚāĻžāϰ āϚāĻžā§Ÿ, āϤ⧁āĻŽāĻŋ āφāρāĻ•āĻž āĻļ⧇āώ āĻ•āϰāϞ⧇āχ āϏ⧇āϟāĻž āϤāĻžāϕ⧇ āĻĻ⧇āĻ–āĻžāĻ“ — āϝāĻžāϤ⧇ āϏ⧇ āĻĻ⧇āϖ⧇ āĻ āĻŋāĻ• āφāϛ⧇ āĻ•āĻŋāύāĻžāĨ¤ āĻāϟāĻžāχ CI/CD-āĻāϰ āĻŽāϤ⧋āĨ¤

āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āϤ⧁āĻŽāĻŋ āĻ›āĻŦāĻŋ āφāρāϕ⧋ (code āϞ⧇āĻ–ā§‹), āϏāĻ™ā§āϗ⧇ āϏāĻ™ā§āϗ⧇ āĻāĻ•āϜāύ āϟāĻŋāϚāĻžāϰ āϏ⧇āϟāĻž āĻĻ⧇āϖ⧇ (test āĻ•āϰ⧇)āĨ¤ -> CI (Continuous Integration)

āϝāĻĻāĻŋ āĻ›āĻŦāĻŋ āĻ āĻŋāĻ• āĻšā§Ÿ (test āĻĒāĻžāϏ āĻ•āϰ⧇), āϤāĻ–āύ āϏ⧇āϟāĻž āĻ…āĻŸā§‹āĻŽā§‡āϟāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϤ⧋āĻŽāĻžāϰ āĻŦāĻ¨ā§āϧ⧁āĻĻ⧇āϰ āĻĻ⧇āĻ–āĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻĒāĻžāĻ āĻŋā§Ÿā§‡ āĻĻ⧇āĻ“ā§ŸāĻž āĻšā§Ÿ (release āĻŦāĻž deploy āĻ•āϰāĻž āĻšā§Ÿ)āĨ¤ -> CD (Continuous Delivery)

  • CI = Continuous Integration
    ➤ Code push āĻ•āϰāϞ⧇āχ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ…āĻŸā§‹ āĻŦāĻŋāĻ˛ā§āĻĄ āĻ•āϰ⧇ āĻĻ⧇āϖ⧇ bug āφāϛ⧇ āĻ•āĻŋāύāĻž
    ➤ Automatically build & test code after every commit/pull request

  • CD = Continuous Delivery or Deployment
    ➤ āϏāĻŦ āĻ•āĻŋāϛ⧁ āĻ āĻŋāĻ• āĻĨāĻžāĻ•āϞ⧇ apk/build/upload āĻ•āϰ⧇ āĻĻā§‡ā§Ÿ — human āĻ›āĻžāĻĄāĻŧāĻžāχ
    ➤ Automatically prepare artifacts (APK/AAB) for release
    ➤ Automatically push to Play Store/internal track (optional, risky for prod)

āφāĻŽāϰāĻž Android Studio āĻĻāĻŋā§Ÿā§‡ āĻ…ā§āϝāĻžāĻĒ āĻŦāĻžāύāĻžāχ, Gradle āĻĻāĻŋā§Ÿā§‡ build āĻ•āϰāĻŋ, test āϚāĻžāϞāĻžāχ, APK āϤ⧈āϰāĻŋ āĻ•āϰāĻŋāχ QA āĻŦāĻž Client āϕ⧇ āĻĒāĻžāĻ āĻžāχāĨ¤ āĻāχāϏāĻŦ āĻ•āĻžāϜ āφāĻŽāϰāĻž āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āύāĻŋāĻœā§‡ āύāĻŋāĻœā§‡ āĻ•āϰāϤ⧇ āĻšā§ŸāĨ¤

CI/CD āĻšāϞ āĻāĻŽāύ āĻāĻ•āϟāĻž āĻ…āĻŸā§‹ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ, āϝ⧇āϟāĻž āφāĻŽāĻžāĻĻ⧇āϰ āĻšā§Ÿā§‡ āĻāχāϏāĻŦ āĻ•āĻžāϜ āύāĻŋāĻœā§‡ āύāĻŋāĻœā§‡āχ āĻ•āϰ⧇ āĻĢ⧇āϞ⧇ — āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āĻŋāϛ⧁āχ āĻ•āϰāϤ⧇ āĻšā§Ÿ āύāĻž!

🧰 CI/CD Tools

Benefits

  • Faster release cycle
  • fewer bugs
  • consistent builds

đŸ—ī¸ GitHub Actions

– GitHub Actions āĻšāϞ āĻāĻ•āϟāĻž āϛ⧋āĻŸā§āϟ Robot āϝ⧇āϟāĻž Code Push āĻšāϞ⧇āχ āĻ•āĻžāϜ āĻļ⧁āϰ⧁ āĻ•āϰ⧇!

āφāĻŽāϰāĻž āĻ•āĻ–āύ āϕ⧀ āĻ•āϰāϤ⧇ āϚāĻžāχ, āϏ⧇āϟāĻž YAML āĻ āĻŦāϞ⧇ āĻĻ⧇āχ(Think of GitHub Actions YAML file as a āϰ⧋āĻŦāϟāϕ⧇ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāύāĻž āĻĻā§‡ā§ŸāĻžāϰ āĻ–āĻžāϤāĻž, āĻāĻ•āϟāĻž Text āĻĢāĻžāχāϞ, āϝ⧇āϟāĻž āϤ⧁āĻŽāĻŋ GitHub Actions āĻŦāĻž āĻ…āĻ¨ā§āϝ configuration-āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧋ āϰ⧋āĻŦāϟāϕ⧇ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāύāĻž āĻĻāĻŋāϤ⧇āĨ¤)

āφāĻŽāϰāĻž .github/workflows/ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇ āĻāĻ•āϟāĻž YAML āĻĢāĻžāχāϞ āĻĻ⧇āχ, āϝ⧇āĻŽāύ:

your-project/
└── .github/
    └── workflows/
        └── firebase-ci.yml
Enter fullscreen mode Exit fullscreen mode

āĻāχ GitHub Actions āϰ⧋āĻŦāϟ —

  • Code āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰ⧇ āĻ¨ā§‡ā§Ÿ (checkout)
  • Gradle āĻĻāĻŋā§Ÿā§‡ build āĻ•āϰ⧇
  • JUnit/Mockito āĻĻāĻŋā§Ÿā§‡ test āϚāĻžāϞāĻžā§Ÿ
  • āϏāĻŦ āĻ āĻŋāĻ• āĻĨāĻžāĻ•āϞ⧇ ➤ APK āĻĢāĻžāχāϞ āĻŦāĻžāύāĻžā§Ÿ
  • āϤāĻžāϰāĻĒāϰ ➤ Firebase App Distribution āĻŦāĻž Google Drive-āĻ upload āĻ•āϰ⧇
  • āϚāĻžāχāϞ⧇ ➤ Slack, Email āĻŦāĻž Telegram-āĻ notify āĻ•āϰ⧇ āĻĻā§‡ā§Ÿ

āϝāĻ–āύāχ āϤ⧁āĻŽāĻŋ main āĻŦā§āϰāĻžāĻžā§āĻšā§‡ āϕ⧋āĻĄ push āĻ•āϰ⧋, āϤāĻ–āύ āύāĻŋāĻšā§‡āϰ āϧāĻžāĻĒāϗ⧁āϞ⧋ āϚāϞāĻŦ⧇:

  • Android Lint Check: Code clean āφāϛ⧇ āĻ•āĻŋāύāĻž, Android guideline āĻŽā§‡āύ⧇ āϞ⧇āĻ–āĻž āĻšā§Ÿā§‡āϛ⧇ āĻ•āĻŋāύāĻž — āϏ⧇āϟāĻž āĻĻ⧇āϖ⧇āĨ¤

  • Unit Test: āϛ⧋āϟ āϛ⧋āϟ function āĻ āĻŋāĻ•āĻŽāϤ⧋ āĻ•āĻžāϜ āĻ•āϰāϛ⧇ āĻ•āĻŋāύāĻž āϏ⧇āϟāĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧇āĨ¤

  • Instrumentation Test: āĻĒ⧁āϰ⧋ UI/Activity āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰāϛ⧇ āĻ•āĻŋāύāĻž āĻĻ⧇āϖ⧇āĨ¤

  • Static Code Analysis: Code-āĻ āϭ⧁āϞ āϧāϰāĻŖ āĻŦāĻž āϏāĻŽāĻ¸ā§āϝāĻž āφāϛ⧇ āĻ•āĻŋāύāĻž āĻĻ⧇āϖ⧇ (āϝ⧇āĻŽāύ SonarQube āĻĻāĻŋā§Ÿā§‡)āĨ¤

  • APK Build (Packaging): .apk āĻĢāĻžāχāϞ āĻŦāĻžāύāĻžā§ŸāĨ¤

  • Functional Test: UI āĻŦāĻžāϟāύ, āĻ¸ā§āĻ•ā§āϰāĻŋāύ āĻ āĻŋāĻ•āĻŽāϤ⧋ āϰ⧇āϏāĻĒāĻ¨ā§āĻĄ āĻ•āϰ⧇ āĻ•āĻŋāύāĻž āĻĻ⧇āϖ⧇āĨ¤

  • Deploy: āϝāĻĻāĻŋ āϏāĻŦ āĻ āĻŋāĻ• āĻĨāĻžāϕ⧇, āϤāĻ–āύ Firebase App Distribution āĻŦāĻž Google Drive āĻ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧇ āĻĻā§‡ā§Ÿ — āϝāĻžāϤ⧇ QA āϟāĻŋāĻŽ āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

Pipeline Building Blocks

These are the stages of a typical Android CI/CD pipeline:

Build Artifact Management:

Deployment & Distribution:

🧱 YAML-āĻāϰ āĻŽā§‚āϞ āĻ•āĻžāĻ āĻžāĻŽā§‹ (Structure)

āĻāĻ•āϟāĻž YAML āĻĢāĻžāχāϞ āϏāĻžāϧāĻžāϰāĻŖāϤ ā§ŠāϟāĻŋ āĻ…āĻ‚āĻļ⧇ āĻ­āĻžāĻ— āĻ•āϰāĻž āϝāĻžā§Ÿ:

name: āĻāχ āĻĒ⧁āϰ⧋ Workflow-āĻāϰ āύāĻžāĻŽ (Just āĻāĻ•āϟāĻž āϟāĻžāχāĻŸā§‡āϞ).
on: āĻ•āĻŦ⧇ āĻāχ āĻ•āĻžāϜāϗ⧁āϞ⧋ āϚāϞāĻŦ⧇? (Trigger condition)
jobs: āφāϏāϞ āĻ•āĻžāϜāϗ⧁āϞ⧋, Step by Step, āϕ⧀ āϕ⧀ āĻšāĻŦ⧇?

āĻŦāĻžāĻ¸ā§āϤāĻŦ⧇ YAML āĻĢāĻžāχāϞ āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϰ⧋āĻŦāϟāϕ⧇ āĻŦāϞāĻŋ:

name: Android Build

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: āϕ⧋āĻĄ āύāĻžāĻ“
        uses: actions/checkout@v4

      - name: JDK āϏ⧇āϟ āĻ•āϰ⧋
        uses: actions/setup-java@v4
        with:
          java-version: '17'

      - name: gradlew āϚāĻžāϞāĻžāĻ“
        run: chmod +x ./gradlew

      - name: APK āĻŦāĻžāύāĻžāĻ“
        run: ./gradlew assembleDebug

      - name: APK Upload āĻ•āϰ⧋
        uses: actions/upload-artifact@v4
        with:
          name: app-debug.apk
          path: app/build/outputs/apk/debug/app-debug.apk
Enter fullscreen mode Exit fullscreen mode

đŸŽ¯ āωāĻĻāĻžāĻšāϰāĻŖ:

on: push ➤ push āĻ•āϰāϞ⧇ āϚāϞāĻŦ⧇
on: pull_request ➤ PR āĻ•āϰāϞ⧇ āϚāϞāĻŦ⧇
on: schedule ➤ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽā§Ÿ āĻ…āύ⧁āϝāĻžā§Ÿā§€ āϚāϞāĻŦ⧇

build: āĻšāϞ āĻāχ āĻ•āĻžāĻœā§‡āϰ āύāĻžāĻŽ — āϤ⧁āĻŽāĻŋ āχāĻšā§āϛ⧇āĻŽāϤ⧋ āĻ…āĻ¨ā§āϝ āĻ•āĻŋāϛ⧁ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧋ āϝ⧇āĻŽāύ test:, deploy: āχāĻ¤ā§āϝāĻžāĻĻāĻŋāĨ¤

runs-on, GitHub āϤ⧋āĻŽāĻžāϰ āĻ•āĻžāϜ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻž āĻ­āĻžāĻ°ā§āϚ⧁⧟āĻžāϞ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ (server) āϚāĻžāϞ⧁ āĻ•āϰāĻŦ⧇āĨ¤
runs-on: ubuntu-latest # Linux machine
runs-on: windows-latest # Windows machine
runs-on: macos-latest # Mac machine (iOS dev-āĻāϰ āϜāĻ¨ā§āϝ āĻĻāϰāĻ•āĻžāϰ)

GitHub Marketplace: https://github.com/marketplace

🔄 CI/CD Flow (GitHub Actions ➤ Firebase App Distribution)

āĻāχ āĻĢā§āϞ⧋āϟāĻŋ Android āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ APK build āĻ•āϰ⧇ Firebase-āĻ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧇ — āĻ…āĻŸā§‹āĻŽā§‡āϟāĻŋāĻ•āĻ­āĻžāĻŦ⧇, āϝāĻ–āύāχ main branch-āĻ āϕ⧋āĻĄ push āĻ•āϰāĻŦ⧇āĨ¤

01: GitHub Repo āϤ⧈āϰāĻŋ āĻ•āϰ⧋

02: āĻāχ .yml āĻĢāĻžāχāϞāϟāĻž āϰāĻžāĻ–ā§‹ your-project/.github/workflows/firebase-ci.yml āĻĢāĻžāχāϞ.

mkdir -p .github/workflows 
touch .github/workflows/firebase-ci.yml
Enter fullscreen mode Exit fullscreen mode
your-project/
└── .github/
    └── workflows/
        └── firebase-ci.yml
Enter fullscreen mode Exit fullscreen mode

03: Gradle wrapper (./gradlew) āĻĢāĻžāχāϞ āϝ⧇āύ executable āĻĨāĻžāϕ⧇.

04: Firebase App ID āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰ⧋: ➤ Firebase Console ➤ Project Settings ➤ General ➤ Android App ➤ App ID

05: Firebase Token āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰ⧋āĨ¤ CLI āĻĻāĻŋā§Ÿā§‡ āϞāĻ—āχāύ āĻ•āϰ⧇ token āĻŦāĻžāύāĻžāĻ“āĨ¤ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĻāĻŋā§Ÿā§‡ : firebase login:ciāĨ¤ āĻāĻ•āϟāĻž āϞāĻŽā§āĻŦāĻž āĻŸā§‹āϕ⧇āύ āφāϏāĻŦ⧇āĨ¤ Copy āĻ•āϰ⧇ āϰāĻžāĻ–ā§‹āĨ¤

brew install node
node -v
npm -v
npm install -g firebase-tools
firebase login:ci
firebase --version
Enter fullscreen mode Exit fullscreen mode

06: GitHub Secrets āϏ⧇āϟ āĻ•āϰ⧋: GitHub Repo ➤ Settings ➤ Secrets and variables ➤ Actions ➤ “New repository secret” āĻ āĻ—āĻŋā§Ÿā§‡ āĻāχ āĻĻ⧁āχāϟāĻž key add āĻ•āϰ⧋

|Secret Name     |         Value                     |
|----------------|-----------------------------------|
|FIREBASE_APP_ID | Firebase Console āĻĨ⧇āϕ⧇ āĻ¨ā§‡ā§ŸāĻž App ID.  |
|FIREBASE_TOKEN  | Firebase CLI āĻĻāĻŋā§Ÿā§‡ generate āĻ•āϰāĻž token|
Enter fullscreen mode Exit fullscreen mode

⚠ Important Warnings:

  1. FIREBASE_TOKEN is deprecated
- You are using FIREBASE_TOKEN to authenticate.

- Firebase CLI will remove this method in a future release.

✅ Recommended: Use Service Account JSON instead.
Enter fullscreen mode Exit fullscreen mode

🔒 Create Service Account & Get JSON Key:

- Go to Firebase Console → Project Settings → Service Accounts

- Click “Generate new private key” → Download the .json file

- Add the file to GitHub Secrets (name it SERVICE_ACCOUNT_JSON)
Enter fullscreen mode Exit fullscreen mode

Update your GitHub Actions .yml like:

- name: Upload to Firebase App Distribution
  uses: wzieba/Firebase-Distribution-Github-Action@v1
  with:
    appId: ${{ secrets.FIREBASE_APP_ID }}
    serviceCredentialsFileContent: ${{ secrets.SERVICE_ACCOUNT_JSON }}
    file: app/build/outputs/apk/release/app-release.apk
    testers: your_email@example.com
    releaseNotes: "Automated build from GitHub Actions"
Enter fullscreen mode Exit fullscreen mode

07: Firebase Console-āĻ āĻ—āĻŋā§Ÿā§‡ testers āĻŦāĻž group āϤ⧈āϰāĻŋ:

  • Firebase Console ➝ App Distribution ➝ Testers & Groups

    • Add testers ➝ āϤ⧋āĻŽāĻžāϰ āχāĻŽā§‡āχāϞ āĻ…ā§āϝāĻžāĻĄā§āϰ⧇āϏ āĻ…āĻĨāĻŦāĻž āĻŸā§‡āĻ¸ā§āϟāĻžāϰāĻĻ⧇āϰ āχāĻŽā§‡āχāϞ āϝ⧋āĻ— āĻ•āϰ⧋
  • āϚāĻžāχāϞ⧇ Group āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϤāĻžāϰ āύāĻžāĻŽ āϰāĻžāĻ–ā§‹, āϝ⧇āĻŽāύ: internal-testers

08: āĻāĻ–āύ main branch-āĻ āϕ⧋āĻĄ push āĻ•āϰāϞ⧇āχ:

✅ APK build āĻšāĻŦ⧇
✅ Firebase App Distribution āĻ testers group-āĻ āĻĒāĻžāĻ āĻžāύ⧋ āĻšāĻŦ⧇
✅ QA āϟāĻŋāĻŽ āĻĢā§‹āύ⧇ Firebase āĻĨ⧇āϕ⧇ install āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇

📄 firebase-ci.yml āĻĢāĻžāχāϞ

name: Android CI/CD - Build and Firebase Upload

on:
  push:
    branches: [ main ]  # main branch āĻ push āĻšāϞ⧇ trigger āĻšāĻŦ⧇

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # 1. āϕ⧋āĻĄ āĻšā§‡āĻ•āφāωāϟ
      - name: Checkout project code
        uses: actions/checkout@v4

      # 2. JDK āϏ⧇āϟāφāĻĒ (Java 17)
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '17'

      # 3. gradlew āĻĒāĻžāϰāĻŽāĻŋāĻļāύ āĻĻāĻŋāύ (Linux āĻāϰ āϜāĻ¨ā§āϝ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ)
      - name: Make gradlew executable
        run: chmod +x ./gradlew

      # 4. Debug APK build āĻ•āϰ⧁āύ
      - name: Build Debug APK
        run: ./gradlew assembleDebug

      # 5. Firebase App Distribution āĻ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧁āύ
      - name: Upload to Firebase App Distribution
        uses: wzieba/Firebase-Distribution-Github-Action@v1
        with:
          appId: ${{ secrets.FIREBASE_APP_ID }}
          token: ${{ secrets.FIREBASE_TOKEN }}
          groups: "internal-testers"
          file: app/build/outputs/apk/debug/app-debug.apk
          releaseNotes: "Bug fixes and improvements"
          notifyTesters: true
Enter fullscreen mode Exit fullscreen mode

https://singhajit.com/android-ci-cd-using-github-actions/

CI/CD Tools: GitHub Actions, GitLab CI, Jenkins, Bitrise, CircleCI, Fastlane

DevOps Skills: Automated build/test/deploy pipelines, Gradle optimization, Firebase App Distribution

  • Start with: GitHub Actions → Lint → Test → Build

  • Next: Add Firebase Upload + Slack Notification

  • Advanced: Code Quality + Play Store Automation

  • Use Secrets for safety (Firebase Token, API keys)

Recommended

  • Start with GitHub Actions
  • Learn Fastlane: Even if you use GitHub Actions, Fastlane handles signing, Play Store / App Store uploads, screenshots, and versioning
  • Explore at least one alternative
    • Bitrise → for mobile apps
    • GitLab CI → if you work with GitLab repos
  • Understand CI/CD fundamentals
    • Workflow triggers: push, PR, schedule
    • Environment variables and secrets
    • Caching, parallel jobs
    • Deploy strategies: canary, staged rollout

Ref

Tracks in Google Play

  • Internal Track--> Internal testing track – āϛ⧋āϟ āϟāĻŋāĻŽ āĻŦāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ testers-āĻāϰ āϜāĻ¨ā§āϝ, āϖ⧁āĻŦ āĻĻā§āϰ⧁āϤ āφāĻĒāϞ⧋āĻĄ āĻšā§ŸāĨ¤
  • Alpha Track (Closed Testing)--> Closed testing track – select group of testers, release before beta/production.
  • Beta Track (Open Testing) --> Open testing track – larger tester group, pre-release before production.
  • Production Track --> Public release – āϏāĻ•āϞ Play Store user-āĻāϰ āϜāĻ¨ā§āϝāĨ¤

Status Parameter

  • completed - Build immediately published to track (not draft).
  • draft - Build saved as draft, manual publish needed.

whatsNew/
├─ internal/
│ └─ en-US.txt
├─ beta/
│ └─ en-US.txt
└─ production/
└─ en-US.txt

SkinBD app production release
- New features
- Bug fixes
Enter fullscreen mode Exit fullscreen mode

GitFlow

1. Main Branch (Production ready code)

  • āĻāĻ–āĻžāύ⧇ āϏāĻŦāϏāĻŽā§Ÿ stable production code āĻĨāĻžāϕ⧇āĨ¤
  • Example: v1.0 app live āφāϛ⧇āĨ¤

2. Develop Branch (Ongoing development)

  • āϏāĻŦ developer āĻāĻ–āĻžāύ⧇ merge āĻ•āϰ⧇āĨ¤ āĻāϟāĻž future release āĻāϰ āϜāĻ¨ā§āϝāĨ¤

3. Feature Branch āϤ⧈āϰāĻŋ

  • Rakib āύāϤ⧁āύ feature āĻŦāĻžāύāĻžāϤ⧇ āĻļ⧁āϰ⧁ āĻ•āϰāϞ⧋:
git checkout develop &
git checkout -b feature/login-api & git commit -m "feat: add login API with JWT authentication" & 
git push origin feature/login-api
Enter fullscreen mode Exit fullscreen mode
  • Sara UI āĻŦāĻžāύāĻžāϤ⧇ āĻļ⧁āϰ⧁ āĻ•āϰāϞ⧋:
git checkout develop & 
git checkout -b feature/login-ui
git commit -m "feat: add login screen with username/password fields"
git push origin feature/login-ui
Enter fullscreen mode Exit fullscreen mode

4. Pull Request (PR)

  • Rakib GitHub/GitLab āĻ PR āϤ⧈āϰāĻŋ āĻ•āϰāϞ⧋ → feature/login-api → develop
  • CI/CD pipeline run āĻšāϞ⧋ → test & build pass
  • Teammates review āĻ•āϰāϞ⧋, comments āĻĻāĻŋāϞ⧋ → Rakib fix āĻ•āϰāϞ⧋
  • āϤāĻžāϰāĻĒāϰ merge approved
  • Sara āĻ“ āĻāĻ•āχāĻ­āĻžāĻŦ⧇ feature/login-ui → develop PR āĻĻāĻŋāϞ⧋ → merge approved

5. Release Branch

  • Release āĻāϰ āϏāĻŽā§Ÿ:
  • git checkout develop
  • git checkout -b release/v1.1
  • QA āϟāĻŋāĻŽ āĻāχ branch āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰāĻŦ⧇āĨ¤
  • Bug fix āĻĻāϰāĻ•āĻžāϰ āĻšāϞ⧇ āϏāϰāĻžāϏāϰāĻŋ āĻāχ branch āĻ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤

6. Production Release

git checkout main
git merge release/v1.1
git tag -a v1.1 -m "Release 1.1"
git push origin main --tags
Enter fullscreen mode Exit fullscreen mode

7. Hotfix Example

  • Production āĻ login bug āϧāϰāĻž āĻĒ⧜āϞ⧋ → hotfix branch:
git checkout main
git checkout -b hotfix/login-bug
# fix bug
git commit -m "fix: login null pointer exception"
git push origin hotfix/login-bug
Enter fullscreen mode Exit fullscreen mode
  • PR → review → merge into main and develop.

Real-life Output:

  • main → v1.0 (old release), later updated to v1.1
  • develop → āϚāϞāĻŽāĻžāύ development branch
  • feature/login-api → Rakib āĻāϰ āĻ•āĻžāϜ
  • feature/login-ui → Sara āĻāϰ āĻ•āĻžāϜ
  • release/v1.1 → staging QA tested branch
  • hotfix/login-bug → production bugfix

Top comments (0)