Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/akarsh/android-ci-tutorial-for-docker-and-gitlab
The projects presents Android CI tutorial covering Docker and GitLab
https://github.com/akarsh/android-ci-tutorial-for-docker-and-gitlab
dockerfile gitlab-ci
Last synced: about 20 hours ago
JSON representation
The projects presents Android CI tutorial covering Docker and GitLab
- Host: GitHub
- URL: https://github.com/akarsh/android-ci-tutorial-for-docker-and-gitlab
- Owner: akarsh
- License: mit
- Created: 2017-12-08T10:11:11.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2017-12-18T11:13:41.000Z (about 7 years ago)
- Last Synced: 2024-11-06T04:29:37.034Z (about 2 months ago)
- Topics: dockerfile, gitlab-ci
- Homepage:
- Size: 1.02 MB
- Stars: 6
- Watchers: 2
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Android CI tutorial for Docker and GitLab
The projects presents Android CI tutorial covering Docker and GitLab
- [Android CI tutorial for Docker and GitLab](#android-ci-tutorial-for-docker-and-gitlab)
- [Scripts](#scripts)
- [Docker](#docker)
- [GitLab](#gitlab)
- [Tutorials](#tutorials)
- [References to Dockerfiles](#references-to-dockerfiles)## Scripts
Gitlab scripts - .gitlab-ci.yml
All the scripts are stored in the folder **GitLabCIScripts**## Docker
Goal: To create a Docker image that contains the Android SDK command line tools installed in it.
- Create a account in [Docker](https://www.docker.com/). Then go to [Docker hub](https://hub.docker.com).
- Next, link your Github or Bitbucket account to your Docker account.
![linking github account](./images/github-link-accounts.png)
- Then, go to Github or Bitbucket to create a new repository that contains Docker file. Because, Docker currently supports only Github and Bitbucket for creating automation builds.
![creating a project in Github](./images/github-project-creation.png)
- After creating a repository in Github or Bitbucket. Create a new file. Name the file as
Dockerfile
without any extensions.
![](./images/adding-dockerfile.png)
Here is the code for Dockerfile
```Docker
#
# GitLab CI: Android
# Version: 1.0.0
#
# https://hub.docker.com/r/sakarsh/gitlab-ci-android-akarsh-seggemu/
#FROM ubuntu:18.04
MAINTAINER Akarsh SeggemuENV VERSION_SDK_TOOLS "3859397"
ENV ANDROID_HOME "/sdk"
ENV PATH "$PATH:${ANDROID_HOME}/tools"
ENV DEBIAN_FRONTEND noninteractiveRUN apt-get -qq update && \
apt-get install -qqy --no-install-recommends \
bzip2 \
curl \
git-core \
html2text \
openjdk-8-jdk \
libc6-i386 \
lib32stdc++6 \
lib32gcc1 \
lib32ncurses5 \
lib32z1 \
unzip \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*RUN rm -f /etc/ssl/certs/java/cacerts; \
/var/lib/dpkg/info/ca-certificates-java.postinst configureRUN curl -s https://dl.google.com/android/repository/sdk-tools-linux-${VERSION_SDK_TOOLS}.zip > /sdk.zip && \
unzip /sdk.zip -d /sdk && \
rm -v /sdk.zipRUN mkdir -p $ANDROID_HOME/licenses/ \
&& echo "8933bad161af4178b1185d1a37fbf41ea5269c55\nd56f5187479451eabf01fb78af6dfcb131a6481e" > $ANDROID_HOME/licenses/android-sdk-license \
&& echo "84831b9409646a918e30573bab4c9c91346d8abd" > $ANDROID_HOME/licenses/android-sdk-preview-licenseADD packages.txt /sdk
RUN mkdir -p /root/.android && \
touch /root/.android/repositories.cfg && \
${ANDROID_HOME}/tools/bin/sdkmanager --updateRUN while read -r package; do PACKAGES="${PACKAGES}${package} "; done < /sdk/packages.txt && \
${ANDROID_HOME}/tools/bin/sdkmanager ${PACKAGES}
```The Dockerfile code contains the following,
- The base OS image is defined in **FROM**
- The maintainer of the docker in **MAINTAINER**
- The Android SDK tools is update after evey new release. With every new update the version number in the download link is updated. Having a variable **ENV VERSION_SDK_TOOLS** for the version number reduces the effort in long run for maintaining the Dockerfile.
- **ENV ANDROID_HOME** is used for storing sdk folder name.
- **ENV PATH** is used for storing the android sdk tools path.
- **DEBIAN_FRONTEND** is used for installing the packages in Docker.
- **RUN apt-get -qq update** and the consecutive commands are used to update the packages and install packages.
- **RUN rm -f /etc/ssl/certs/java/cacerts;** is used for java ceritifcate.
- **RUN curl -s https://dl.google.com/android/repository/sdk-tools-linux-${VERSION_SDK_TOOLS}.zip** for downloading the Android SDK tools
- **RUN mkdir -p $ANDROID_HOME/licenses/** is used for creating a directory to accept Android SDK license during installation of Android SDK Tools.
- **ADD packages.txt /sdk** this command adds the file packages.txt ti the sdk folder.- The packages.txt contains the additional packages such as Google play services to be installed.
- Create a new file in the repository and name it as
packages.txt
and add the following code,
```Docker
add-ons;addon-google_apis-google-24
build-tools;26.0.2
extras;android;m2repository
extras;google;m2repository
extras;google;google_play_services
extras;m2repository;com;android;support;constraint; constraint-layout;1.0.2
extras;m2repository;com;android;support;constraint; constraint-layout-solver;1.0.2
platform-tools
platforms;android-26
```
- **RUN mkdir -p /root/.android &&** is used to create a folder and the subsequent commands are used to update the Android SDK.- **RUN while read -r package; do PACKAGES="${PACKAGES}${package}** is used to run the packages.txt file. Next, the packages are downloaded and installed.
- After the creating the Dockerfile and adding the mentioned code above. Next, go to [Docker hub](https://hub.docker.com) and click on **create a automated build**
![](./images/create-automate-build.png)
- Select the linked Github or bitbucket account to access the Github or Bitbucket repository.
![select the linked github account to access the github repository](./images/link-github-ro-bitbucket.png)
- Select the Github or Bitbucket repository.
![select the github repository file](./images/select-the-github-repository-in-docker.png)
- Add a short description for the automated build and click on create.
![creation of automated build in docker](./images/docker-automated-build-creation.png)
- Build page will be shown after completing the creation of automated build.
![build overview page](./images/donw-creating-automated-build.png)
- Next, click on **Build Settings** tab and click on **trigger** to **trigger** a build job.
![](./images/trigger-a-build-job.png)
- When the build job is completed. Click on **Build Details** to see the status of the build. **Success** indicated the build is successfully built the docker image. Now, the Docker image is ready.
![](./images/build-details.png)
## GitLab
Follow the instructions on GitLab Documentation about [Creatin .gitlab-ci.yml](https://docs.gitlab.com/ee/ci/quick_start/README.html) file.
A standard template file for Android application development provided by GitLab as follows,
```yml
# This file is a template, and might need editing before it works on your project.
# Read more about this script on this blog post https://about.gitlab.com/2016/11/30/setting-up-gitlab-ci-for-android-projects/, by Greyson Parrelli
image: openjdk:8-jdkvariables:
ANDROID_COMPILE_SDK: "25"
ANDROID_BUILD_TOOLS: "24.0.0"
ANDROID_SDK_TOOLS: "24.4.1"before_script:
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
- wget --quiet --output-document=android-sdk.tgz https://dl.google.com/android/android-sdk_r${ANDROID_SDK_TOOLS}-linux.tgz
- tar --extract --gzip --file=android-sdk.tgz
- echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter android-${ANDROID_COMPILE_SDK}
- echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter platform-tools
- echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter build-tools-${ANDROID_BUILD_TOOLS}
- echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter extra-android-m2repository
- echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter extra-google-google_play_services
- echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter extra-google-m2repository
- export ANDROID_HOME=$PWD/android-sdk-linux
- export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
- chmod +x ./gradlewstages:
- build
- testbuild:
stage: build
script:
- ./gradlew assembleDebug
artifacts:
paths:
- app/build/outputs/unitTests:
stage: test
script:
- ./gradlew testfunctionalTests:
stage: test
script:
- wget --quiet --output-document=android-wait-for-emulator https://raw.githubusercontent.com/travis-ci/travis-cookbooks/0f497eb71291b52a703143c5cd63a217c8766dc9/community-cookbooks/android-sdk/files/default/android-wait-for-emulator
- chmod +x android-wait-for-emulator
- echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter sys-img-x86-google_apis-${ANDROID_COMPILE_SDK}
- echo no | android-sdk-linux/tools/android create avd -n test -t android-${ANDROID_COMPILE_SDK} --abi google_apis/x86
- android-sdk-linux/tools/emulator64-x86 -avd test -no-window -no-audio &
- ./android-wait-for-emulator
- adb shell input keyevent 82
- ./gradlew cAT```
![GitLab CI yml android template selection](./images/Gitlab-CI-standard-template.png)
In the template, **openjdk:8-jdk** Docker image is used and all the Android SDK tools and packages are installed during the build job. They are listed in **before_script**.
Instead of downloading and installing Android SDK tools and packages every time during the build job. We can use the Docker image built above in the **.gitLab-ci.yml file**.
The Docker image created above can be used as follows,
sakarsh/gitlab-ci-android-akarsh-seggemu:latest
By specifying the **Docker hub username/Docker image**. The **:latest** is used to get the latest build from Docker.
Using the Docker image mentioned above in **.gitlab-ci.yml** as follows,
```yml
image: sakarsh/gitlab-ci-android-akarsh-seggemu:latestbefore_script:
- export GRADLE_USER_HOME=`pwd`/.gradle
- mkdir -p $GRADLE_USER_HOME
- chmod +x ./gradlewstages:
- build
- testbuild:
stage: build
script:
- ./gradlew assembleDebug
artifacts:
paths:
- app/build/outputs/unitTests:
stage: test
script:
- ./gradlew testfunctionalTests:
stage: test
script:
- wget --quiet --output-document=android-wait-for-emulator https://raw.githubusercontent.com/travis-ci/travis-cookbooks/0f497eb71291b52a703143c5cd63a217c8766dc9/community-cookbooks/android-sdk/files/default/android-wait-for-emulator
- chmod +x android-wait-for-emulator
- echo y | android-sdk-linux/tools/android --silent update sdk --no-ui --all --filter sys-img-x86-google_apis-${ANDROID_COMPILE_SDK}
- echo no | android-sdk-linux/tools/android create avd -n test -t android-${ANDROID_COMPILE_SDK} --abi google_apis/x86
- android-sdk-linux/tools/emulator64-x86 -avd test -no-window -no-audio &
- ./android-wait-for-emulator
- adb shell input keyevent 82
- ./gradlew cAT```
Using an already configured Docker image with Android SDK tools and packages decreases the total build time.
### Tutorials
- [Dockerfile project](http://dockerfile.github.io/)
- [GitLab CI](https://docs.gitlab.com/ee/ci/)
### References to Dockerfiles
- [dockerfiles](https://github.com/jessfraz/dockerfiles) - contains various Dockerfiles.