Created
January 23, 2022 07:20
-
-
Save saeedata/bea6dbd6f231d39cf0011bc909a53739 to your computer and use it in GitHub Desktop.
instruction to setup gitlab ci/cd for android projects
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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