From d81a66225594487b12e5ed498d5470e584e80d25 Mon Sep 17 00:00:00 2001 From: vaskoevgen Date: Wed, 21 Jan 2026 11:00:58 -0600 Subject: [PATCH 1/8] feat: init repository --- .github/workflows/android-docker.yml | 27 ++++++ .gradle/8.2/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/8.2/checksums/md5-checksums.bin | Bin 0 -> 37047 bytes .gradle/8.2/checksums/sha1-checksums.bin | Bin 0 -> 83885 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../8.2/dependencies-accessors/gc.properties | 0 .gradle/8.2/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/8.2/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/8.2/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/vcs-1/gc.properties | 0 Dockerfile | 35 ++++++++ README.md | 11 ++- TUTORIAL.md | 79 ++++++++++++++++++ app/build.gradle | 37 ++++++++ app/src/main/AndroidManifest.xml | 26 ++++++ build.gradle | 18 ++++ gradle/wrapper/gradle-wrapper.properties | 5 ++ gradlew | 12 +++ settings.gradle | 16 ++++ 21 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/android-docker.yml create mode 100644 .gradle/8.2/checksums/checksums.lock create mode 100644 .gradle/8.2/checksums/md5-checksums.bin create mode 100644 .gradle/8.2/checksums/sha1-checksums.bin create mode 100644 .gradle/8.2/dependencies-accessors/dependencies-accessors.lock create mode 100644 .gradle/8.2/dependencies-accessors/gc.properties create mode 100644 .gradle/8.2/fileChanges/last-build.bin create mode 100644 .gradle/8.2/fileHashes/fileHashes.lock create mode 100644 .gradle/8.2/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 Dockerfile create mode 100644 TUTORIAL.md create mode 100644 app/build.gradle create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 settings.gradle diff --git a/.github/workflows/android-docker.yml b/.github/workflows/android-docker.yml new file mode 100644 index 0000000..c789b19 --- /dev/null +++ b/.github/workflows/android-docker.yml @@ -0,0 +1,27 @@ +name: Android CI with Docker + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build-in-docker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Build Docker Image + run: docker build -t android-ci . + + - name: Run Gradle Build in Docker + # Mount current directory to /app + # Use the image built in previous step + # Run './gradlew build' + run: | + docker run --rm \ + -v ${{ github.workspace }}:/app \ + -w /app \ + android-ci \ + ./gradlew build diff --git a/.gradle/8.2/checksums/checksums.lock b/.gradle/8.2/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..5e2f67381af2b816376e658979fdb372533b9c78 GIT binary patch literal 17 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 Nf&_f#WaveS{{w7o(X0Rf literal 0 HcmV?d00001 diff --git a/.gradle/8.2/checksums/sha1-checksums.bin b/.gradle/8.2/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..68e79b6a89dd54b81f91d94b85e1bbd8ae23a013 GIT binary patch literal 83885 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 Gtp5Q*8f8xa literal 0 HcmV?d00001 diff --git a/.gradle/8.2/dependencies-accessors/dependencies-accessors.lock b/.gradle/8.2/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..8dc62e6fb75654674306201e6cc8c697d5df7d65 GIT binary patch literal 17 TcmZQxlc| literal 0 HcmV?d00001 diff --git a/.gradle/8.2/gc.properties b/.gradle/8.2/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..6aaa3fa36936b973d18afb868e29380e823babcf GIT binary patch literal 17 UcmZRMc$U`iiGRKl0|YPv05Z4(>i_@% literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..46e42bb --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Wed Jan 21 10:42:29 CST 2026 +gradle.version=8.2 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..83f5478 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,35 @@ +FROM eclipse-temurin:17-jdk + +# Set environment variables +ENV ANDROID_HOME /opt/android-sdk +ENV PATH ${PATH}:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools + +# Install necessary system packages +RUN apt-get update && apt-get install -y --no-install-recommends \ + curl \ + unzip \ + git \ + && rm -rf /var/lib/apt/lists/* + +# Download and install Android Command Line Tools +# Version: cmdline-tools;latest (checked from developer.android.com, typically part of commandlinetools-linux-*.zip) +# Using specific version suitable for stability. +# As of early 2024, cmdline-tools 11.0 is common, checking official link pattern. +# https://dl.google.com/android/repository/commandlinetools-linux-10406996_latest.zip is a recent one. +# We will use a reasonably recent valid URL. +ARG CMDLINE_TOOLS_URL=https://dl.google.com/android/repository/commandlinetools-linux-10406996_latest.zip + +RUN mkdir -p ${ANDROID_HOME}/cmdline-tools \ + && curl -o cmdline-tools.zip ${CMDLINE_TOOLS_URL} \ + && unzip cmdline-tools.zip -d ${ANDROID_HOME}/cmdline-tools \ + && mv ${ANDROID_HOME}/cmdline-tools/cmdline-tools ${ANDROID_HOME}/cmdline-tools/latest \ + && rm cmdline-tools.zip + +# Accept licenses +RUN yes | sdkmanager --licenses + +# Install SDK packages +# Based on build.gradle: compileSdk 34, minSdk 24 +RUN sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" + +WORKDIR /app diff --git a/README.md b/README.md index b4ab13c..013b6ec 100644 --- a/README.md +++ b/README.md @@ -1 +1,10 @@ -# android-tutorial \ No newline at end of file +# Android Build with Docker and GitHub Actions + +This repository contains a sample Android project and a tutorial on how to set up a CI/CD pipeline using Docker and GitHub Actions. + +## Contents + +- [App Source Code](./app/) +- [Dockerfile](./Dockerfile) +- [GitHub Actions Workflow](./.github/workflows/android-docker.yml) +- [**TUTORIAL**: Step-by-Step Guide](./TUTORIAL.md) \ No newline at end of file diff --git a/TUTORIAL.md b/TUTORIAL.md new file mode 100644 index 0000000..1ba42b7 --- /dev/null +++ b/TUTORIAL.md @@ -0,0 +1,79 @@ +# Tutorial: Android GitHub Actions in Docker + +This tutorial guides you through setting up a CI/CD pipeline for your Android application using GitHub Actions and Docker. This ensures a consistent build environment and automates your build process. + +## Prerequisites + +- An Android project (already set up in this repository). +- Docker installed on your development machine (for local testing). +- A GitHub repository. + +## 1. The Docker Build Environment + +We use a `Dockerfile` to define an immutable build environment. This container includes: +- **OpenJDK 17**: The Java version required by the Gradle build. +- **Android Command Line Tools**: Necessary for managing the Android SDK. +- **Android SDK Components**: Specifically `platforms;android-34` and `build-tools;34.0.0` as defined in `app/build.gradle`. + +### Key Dockerfile Sections + +```dockerfile +# Base image +FROM openjdk:17-jdk-slim + +# Install system dependencies +RUN apt-get update && apt-get install -y curl unzip git ... + +# Download Command Line Tools +RUN curl -o cmdline-tools.zip ... + +# Install SDK Packages +RUN sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" +``` + +## 2. GitHub Actions Workflow + +The workflow is defined in `.github/workflows/android-docker.yml`. It triggers on pushes and pull requests to the `main` branch. + +### Workflow Breakdown + +1. **Checkout Code**: Retrieves your project source code. +2. **Build Docker Image**: Builds the container defined in your `Dockerfile`. +3. **Run Build**: Mounts the project source code into the container and runs `./gradlew build`. + +```yaml + - name: Run Gradle Build in Docker + run: | + docker run --rm \ + -v ${{ github.workspace }}:/app \ + -w /app \ + android-ci \ + ./gradlew build +``` + +## 3. Running Locally + +You can test the build environment locally using Docker before pushing to GitHub. + +### Step 1: Build the Image + +```bash +docker build -t android-ci . +``` + +### Step 2: Run the Build + +```bash +docker run --rm -v $(pwd):/app -w /app android-ci ./gradlew assembleDebug +``` + +This command: +- `--rm`: Removes the container after it exits. +- `-v $(pwd):/app`: Maps your current directory to `/app` inside the container. +- `-w /app`: Sets the working directory to `/app`. +- `android-ci`: Uses the image you just built. +- `./gradlew assembleDebug`: Runs the Gradle task to build the debug APK. + +## Conclusion + +By containerizing your build environment, you eliminate "it works on my machine" issues and simplify your CI configuration. This setup forms the foundation for more advanced pipelines, including running tests and deploying to the Play Store. diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..7e98e40 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,37 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'com.example.myapplication' + compileSdk 34 + + defaultConfig { + applicationId "com.example.myapplication" + minSdk 24 + targetSdk 34 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.11.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..51e92fd --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..d766a8c --- /dev/null +++ b/build.gradle @@ -0,0 +1,18 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath "com.android.tools.build:gradle:8.2.0" + } +} + +plugins { + id 'com.android.application' version '8.2.0' apply false +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..15de902 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..7b61bff --- /dev/null +++ b/gradlew @@ -0,0 +1,12 @@ +#!/bin/sh + +# Simple wrapper that assumes gradle is available in the environment for this tutorial +# In a real project, this would be the actual Gradle Wrapper script generated by `gradle wrapper` + +if command -v gradle >/dev/null 2>&1; then + exec gradle "$@" +else + echo "Error: gradle is not installed/found in PATH." + echo "For this tutorial, please ensure gradle is installed or run within the provided Docker container." + exit 1 +fi diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..76a7c06 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} +rootProject.name = "My Application" +include ':app' From 30f8aa6df29e6c27843b3f1f91638345b954e24b Mon Sep 17 00:00:00 2001 From: vaskoevgen Date: Wed, 21 Jan 2026 11:05:14 -0600 Subject: [PATCH 2/8] feat: add feature branch build --- .github/workflows/android-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android-docker.yml b/.github/workflows/android-docker.yml index c789b19..5c45883 100644 --- a/.github/workflows/android-docker.yml +++ b/.github/workflows/android-docker.yml @@ -2,7 +2,7 @@ name: Android CI with Docker on: push: - branches: [ "main" ] + branches: [ "main", "feat/*", "feature/*" ] pull_request: branches: [ "main" ] From 9d8edecfbd05511ca132d35d9c1461bd2498188b Mon Sep 17 00:00:00 2001 From: vaskoevgen Date: Wed, 21 Jan 2026 11:10:36 -0600 Subject: [PATCH 3/8] fix: grant execution permission to gradlew --- .github/workflows/android-docker.yml | 2 +- gradlew | 0 2 files changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 gradlew diff --git a/.github/workflows/android-docker.yml b/.github/workflows/android-docker.yml index 5c45883..d47b3d5 100644 --- a/.github/workflows/android-docker.yml +++ b/.github/workflows/android-docker.yml @@ -24,4 +24,4 @@ jobs: -v ${{ github.workspace }}:/app \ -w /app \ android-ci \ - ./gradlew build + bash -c "chmod +x gradlew && ./gradlew build" diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From fbc0a418385f6db501f777bcf67ed9a60eb527e8 Mon Sep 17 00:00:00 2001 From: vaskoevgen Date: Wed, 21 Jan 2026 11:13:53 -0600 Subject: [PATCH 4/8] fix: install gradle 8.2 in dockerfile --- Dockerfile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Dockerfile b/Dockerfile index 83f5478..7d8fc10 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,6 +28,13 @@ RUN mkdir -p ${ANDROID_HOME}/cmdline-tools \ # Accept licenses RUN yes | sdkmanager --licenses +# Install Gradle 8.2 +RUN curl -L https://services.gradle.org/distributions/gradle-8.2-bin.zip -o gradle.zip \ + && unzip gradle.zip -d /opt \ + && rm gradle.zip \ + && mv /opt/gradle-8.2 /opt/gradle +ENV PATH ${PATH}:/opt/gradle/bin + # Install SDK packages # Based on build.gradle: compileSdk 34, minSdk 24 RUN sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" From f9005164cd6aa51eed938701ff92b644877d3316 Mon Sep 17 00:00:00 2001 From: vaskoevgen Date: Wed, 21 Jan 2026 11:17:21 -0600 Subject: [PATCH 5/8] fix: enable AndroidX --- gradle.properties | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 gradle.properties diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..abc6b64 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +android.enableJetifier=true From 4b1b7340fa3f3663a0319217ebf7808fb116258b Mon Sep 17 00:00:00 2001 From: vaskoevgen Date: Wed, 21 Jan 2026 11:22:08 -0600 Subject: [PATCH 6/8] fix: add missing android resources --- app/src/main/res/mipmap/ic_launcher.xml | 9 +++++++++ app/src/main/res/mipmap/ic_launcher_round.xml | 9 +++++++++ app/src/main/res/values/strings.xml | 3 +++ app/src/main/res/values/themes.xml | 6 ++++++ app/src/main/res/xml/backup_rules.xml | 4 ++++ app/src/main/res/xml/data_extraction_rules.xml | 5 +++++ 6 files changed, 36 insertions(+) create mode 100644 app/src/main/res/mipmap/ic_launcher.xml create mode 100644 app/src/main/res/mipmap/ic_launcher_round.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml diff --git a/app/src/main/res/mipmap/ic_launcher.xml b/app/src/main/res/mipmap/ic_launcher.xml new file mode 100644 index 0000000..9731226 --- /dev/null +++ b/app/src/main/res/mipmap/ic_launcher.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/mipmap/ic_launcher_round.xml b/app/src/main/res/mipmap/ic_launcher_round.xml new file mode 100644 index 0000000..a6d7135 --- /dev/null +++ b/app/src/main/res/mipmap/ic_launcher_round.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..efd3073 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + My Application + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..f121c20 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..63326da --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..da8aa42 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,5 @@ + + + + + From d48b874130e1a30ef33eff474050ab8d59e627ee Mon Sep 17 00:00:00 2001 From: vaskoevgen Date: Wed, 21 Jan 2026 11:29:03 -0600 Subject: [PATCH 7/8] fix: add MainActivity --- .../java/com/example/myapplication/MainActivity.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 app/src/main/java/com/example/myapplication/MainActivity.java diff --git a/app/src/main/java/com/example/myapplication/MainActivity.java b/app/src/main/java/com/example/myapplication/MainActivity.java new file mode 100644 index 0000000..71f623e --- /dev/null +++ b/app/src/main/java/com/example/myapplication/MainActivity.java @@ -0,0 +1,12 @@ +package com.example.myapplication; + +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; + +public class MainActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // No layout required for this basic build test + } +} From 945ff8d6a0027513f119b1d8f4b1b505b0c09536 Mon Sep 17 00:00:00 2001 From: vaskoevgen Date: Wed, 21 Jan 2026 12:04:25 -0600 Subject: [PATCH 8/8] feat: upload apk artifact --- .github/workflows/android-docker.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/android-docker.yml b/.github/workflows/android-docker.yml index d47b3d5..11d0988 100644 --- a/.github/workflows/android-docker.yml +++ b/.github/workflows/android-docker.yml @@ -25,3 +25,9 @@ jobs: -w /app \ android-ci \ bash -c "chmod +x gradlew && ./gradlew build" + + - name: Upload APK + uses: actions/upload-artifact@v4 + with: + name: app-debug + path: app/build/outputs/apk/debug/app-debug.apk