Skip to content

Instantly share code, notes, and snippets.

@saeedata
Created January 23, 2022 07:20
Show Gist options
  • Save saeedata/bea6dbd6f231d39cf0011bc909a53739 to your computer and use it in GitHub Desktop.
Save saeedata/bea6dbd6f231d39cf0011bc909a53739 to your computer and use it in GitHub Desktop.
instruction to setup gitlab ci/cd for android projects
1- script for gitlab-ci.yml
/////////////////////////////// gitlab-ci.yml ///////////////////////////////
image: openjdk:11-jdk
stages:
- build
- deploy
.pre_job:
before_script:
# - sed -i 's|deb.debian.org|debian.parspack.com|g' /etc/apt/sources.list
# - sed -i 's|security.debian.org|debian.asis.ai|g' /etc/apt/sources.list
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1 sudo
.pre_build:
stage: build
before_script:
- !reference [ .pre_job, before_script ]
- export ANDROID_HOME="/home/sdk"
- export PATH=$PATH:${ANDROID_HOME}/cmdline-tools/latest/bin/
- ANDROID_COMPILE_SDK=$(grep -H compile_sdk_ver app/build.gradle | head -n1 | cut -d'=' -f2 | sed -e 's/^[[:space:]]*//' | tr -d "'")
- ANDROID_BUILD_TOOLS=$(grep -H build_tools_ver app/build.gradle | head -n1 | cut -d'=' -f2 | sed -e 's/^[[:space:]]*//' | tr -d "'")
- ANDROID_NDK=$(grep -H ndk_ver app/build.gradle | head -n1 | cut -d'=' -f2 | sed -e 's/^[[:space:]]*//' | tr -d "'")
- ANDROID_CMAKE=$(grep -H cmake_ver app/build.gradle | head -n1 | cut -d'=' -f2 | sed -e 's/^[[:space:]]*//' | tr -d "'")
- curl https://ipinfo.io
- yes | sdkmanager --sdk_root=${ANDROID_HOME} --licenses || true
- sdkmanager --sdk_root=${ANDROID_HOME} "extras;google;google_play_services" "extras;android;m2repository" "extras;google;m2repository"
- sdkmanager --sdk_root=${ANDROID_HOME} "platforms;android-${ANDROID_COMPILE_SDK}"
- sdkmanager --sdk_root=${ANDROID_HOME} "platforms;android-30"
- sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools"
- sdkmanager --sdk_root=${ANDROID_HOME} "build-tools;${ANDROID_BUILD_TOOLS}"
- sdkmanager --sdk_root=${ANDROID_HOME} "tools"
- sdkmanager --sdk_root=${ANDROID_HOME} "ndk;${ANDROID_NDK}"
- sdkmanager --sdk_root=${ANDROID_HOME} "cmake;${ANDROID_CMAKE}"
- chmod +x ./gradlew
.pre_deploy:
stage: deploy
before_script:
- !reference [ .pre_job, before_script ]
- curl -sL https://firebase.tools | bash
- set +e
- printf "PID=#$CI_PIPELINE_ID\n" >> release_note.txt
- printf "Hash=$CI_COMMIT_SHA\n\n" >> release_note.txt
- printf "Changes Log:\n" > release_note.txt
- export VERSION_NAME=$(grep -H "version_name " app/build.gradle | cut -d'=' -f2 | sed -e 's/^[[:space:]]*//' | tr -d "'")
- export VERSION_CODE=$(grep -H version_code app/build.gradle | cut -d'=' -f2 | sed -e 's/^[[:space:]]*//' | tr -d "'")
- export NEW_TAG="v$VERSION_NAME($VERSION_CODE)-$CI_COMMIT_BRANCH-$CI_PIPELINE_ID"
- export LAST_TAG=$(git tag -l | sort -V | grep "$CI_COMMIT_BRANCH" | tail -1)
- export PROJECT_URL=$(echo $CI_PROJECT_URL | sed 's/https:\/\///')
- echo $NEW_TAG
- echo $LAST_TAG
- >
if [ "$LAST_TAG" == "$NEW_TAG" ]; then
export LAST_TAG=$(git tag -l | sort -V | grep "$CI_COMMIT_BRANCH" | tail -2 | head -1)
fi
- echo $LAST_TAG
- git log --format=%B HEAD..."$LAST_TAG" | grep -E -v ".*(#|Merge|^\s*$).*" | cat >> release_note.txt;
- git remote set-url origin "https://oauth2:$GITLAB_TOKEN@$PROJECT_URL"
- git config --global user.email "[email protected]";
- git config --global user.name "Runner";
- git tag -a "$NEW_TAG" -F release_note.txt &>/dev/null
- git push origin "$NEW_TAG" &>/dev/null
- set -e
build:debug:app:
stage: build
extends: .pre_build
only:
- dev
except:
- tags
script:
- ./gradlew assembleDebug
- mv app/build/outputs/apk/debug/app-rubika-debug.apk .
artifacts:
paths:
- app-debug.apk
deploy:debug:app:
stage: deploy
extends: .pre_deploy
retry: 2
needs:
- build:debug:app
only:
- dev
script:
- ls -lrth app-debug.apk
- echo "$(printf "** (Debug)\n\n" && cat release_note.txt)" > release_note.txt
- firebase appdistribution:distribute app-debug.apk --app $FIREBASE_APP_ID --release-notes-file release_note.txt --testers-file testers.txt
build:release:app:
stage: build
extends: .pre_build
only:
- master
except:
- tags
script:
- ./gradlew assembleRelease
- mv app/build/outputs/apk/release/app-release.apk .
artifacts:
paths:
- app-release.apk
deploy:release:app:
stage: deploy
extends: .pre_deploy
retry: 2
needs:
- build:release:app
only:
- master
script:
- ls -lrth app-release.apk
- echo "$(printf "** (Release)\n\n" && cat release_note.txt)" > release_note.txt
- firebase appdistribution:distribute app-release.apk --app $FIREBASE_APP_ID --release-notes-file release_note.txt --testers-file testers.txt
/////////////////////////////// gitlab-ci.yml ///////////////////////////////
2- instal docker on vm https://docs.docker.com/engine/install/
3- install AndroidSdk, gradle, firebase tools:
- copy and sdk to /home/sdk
- create a directory to save gradle caches in /home/.gradle
- install firebase tools
// specific version
$ curl -Lo ./firebase_bin https://firebase.tools/bin/linux/v8.15.0 https_proxy=https://PROXY_URL
// latest version
$ curl -sL firebase.tools | upgrade=true bash
4 - install gitlab runner as docker container and register in gitlab server
$ docker run --rm -t -i \\
-v /var/run/docker.sock:/var/run/docker.sock \\
-v /srv/gitlab-runner/config:/etc/gitlab-runner \\
-v /home/sdk:/home/sdk
-v /home/.gradle:/root/.gradle \\
-v /usr/local/bin/firebase:/usr/local/bin/firebase \\
gitlab/gitlab-runner:latest register \\
--non-interactive --executor="docker" \\
--docker-image alpine:latest \\
--url "http://GITLAB_SERVER_URL/" \\
--registration-token "GITLAB_SERVER_REGISTERATION_URL" \\
--description "Docker runner" \\
--tag-list "docker" \\
--run-untagged="true" \\
--locked="false"
4- config runner settings
$ vim /srv/gitlab-runner/config/config.toml
/////////////////////////////// config.toml ///////////////////////////////
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "Docker runner"
url = "http://GITLAB_SERVER_URL/"
token = "RUNNER_TOKEN"
executor = "docker"
environment = [
"GITLAB_TOKEN=GITLAB_TOKEN",
"FIREBASE_APP_ID=FIREBASE_APP_ID",
"FIREBASE_TOKEN=FIREBASE_TOKEN",
"HTTP_PROXY=http://PROXY_URL",
"HTTPS_PROXY=http://PROXY_URL",
"NO_PROXY=localhost,127.0.0.0/8,192.168.0.0/16"
]
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "alpine:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = [
"/cache",
"/var/run/docker.sock:/var/run/docker.sock",
"/home/sdk:/home/sdk",
"/home/.gradle:/root/.gradle",
"/usr/local/bin/firebase:/usr/local/bin/firebase"
]
pull_policy = ["always", "if-not-present"]
shm_size = 0
/////////////////////////////// config.toml ///////////////////////////////
5- run docker container
$ docker run -d --name docker-runner --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /home/sdk:/home/sdk \
-v /home/.gradle:/root/.gradle \
-v /usr/local/bin/firebase:/usr/local/bin/firebase gitlab/gitlab-runner:latest
6 - usefull docker command
$ docker ps
$ docker stop docker-runner && docker rm docker-runner
$ docker start docker-runner
$ docker run docker-runner /use/local/bin/firebase
$ docker volume ls
$ docker exec -it 2475a6dd019c bash
$ docker images
$ docker info
$ docker inspect --format='{{json .Config}}'
$ docker image rm saeedtest
$ docker build -t saeedtest .
$ docker volume prune
$ docker system prune -af
$ docker stats 25256ddd667c
$ docker pull ubuntu:20.04
$ docker run ubuntu curl https://ipinfo.io
$ docker create Dockerfile
$ docker run busybox Dockerfile
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment