mirror of
https://github.com/budtmo/docker-android.git
synced 2026-07-31 04:07:25 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ea71ea6b8 | ||
|
|
08ff64d950 | ||
|
|
fcffca21ff | ||
|
|
95adfd1fbd | ||
|
|
5029d33528 | ||
|
|
c9ab42ecfb | ||
|
|
7c48af9b84 | ||
|
|
e1d6e3cdbe | ||
|
|
648010d519 | ||
|
|
9d3cb60f41 | ||
|
|
e2ad6b75d2 | ||
|
|
486fb5825b | ||
|
|
e56eb0e3ab | ||
|
|
6fe6a80f40 | ||
|
|
f7b30c3129 | ||
|
|
b6a1a57bed | ||
|
|
83baa09384 | ||
|
|
8a69c64de3 | ||
|
|
488e53149c | ||
|
|
2bc30edf4c | ||
|
|
8d544448f1 | ||
|
|
f7b560a28b | ||
|
|
0e578710f3 | ||
|
|
65df456066 | ||
|
|
5b694c2c55 | ||
|
|
6406504f94 | ||
|
|
b7c4538896 | ||
|
|
c7d988bd61 | ||
|
|
47e968927a | ||
|
|
dcf196ec4a | ||
|
|
aff1b062e1 | ||
|
|
59f6e4bd33 | ||
|
|
0b9af7e6b2 | ||
|
|
d9b5f8d86c |
+4
-1
@@ -6,4 +6,7 @@
|
|||||||
.coverage
|
.coverage
|
||||||
coverage.xml
|
coverage.xml
|
||||||
xunit.xml
|
xunit.xml
|
||||||
coverage/*
|
coverage/*
|
||||||
|
|
||||||
|
# Video
|
||||||
|
video*
|
||||||
|
|||||||
+6
-6
@@ -11,12 +11,12 @@ services:
|
|||||||
install: "pip install -r requirements.txt"
|
install: "pip install -r requirements.txt"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
matrix:
|
- ANDROID_VERSION=5.0.1
|
||||||
- ANDROID_VERSION=5.0.1
|
- ANDROID_VERSION=5.1.1
|
||||||
- ANDROID_VERSION=5.1.1
|
- ANDROID_VERSION=6.0
|
||||||
- ANDROID_VERSION=6.0
|
- ANDROID_VERSION=7.0
|
||||||
- ANDROID_VERSION=7.0
|
- ANDROID_VERSION=7.1.1
|
||||||
- ANDROID_VERSION=7.1.1
|
- REAL_DEVICE=True
|
||||||
|
|
||||||
script: bash travis.sh
|
script: bash travis.sh
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
Docker-Android
|
Docker-Android
|
||||||
==============
|
==============
|
||||||
|
|
||||||
|
[](https://gitter.im/butomo1989/docker-android?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
[](https://travis-ci.org/butomo1989/docker-android)
|
[](https://travis-ci.org/butomo1989/docker-android)
|
||||||
[](https://codecov.io/gh/butomo1989/docker-android)
|
[](https://codecov.io/gh/butomo1989/docker-android)
|
||||||
[](https://www.codacy.com/app/butomo1989/docker-appium?utm_source=github.com&utm_medium=referral&utm_content=butomo1989/docker-appium&utm_campaign=Badge_Grade)
|
[](https://www.codacy.com/app/butomo1989/docker-appium?utm_source=github.com&utm_medium=referral&utm_content=butomo1989/docker-appium&utm_campaign=Badge_Grade)
|
||||||
|
|||||||
+11
-3
@@ -14,18 +14,20 @@ services:
|
|||||||
nexus_7.1.1:
|
nexus_7.1.1:
|
||||||
image: butomo1989/docker-android-x86-7.1.1
|
image: butomo1989/docker-android-x86-7.1.1
|
||||||
privileged: true
|
privileged: true
|
||||||
# Change path of apk that you want to test. I use sample_apk that I provide in folder "example"
|
|
||||||
volumes:
|
|
||||||
- $PWD/example/sample_apk:/root/tmp
|
|
||||||
# Increase scale number if needed
|
# Increase scale number if needed
|
||||||
scale: 1
|
scale: 1
|
||||||
ports:
|
ports:
|
||||||
- 6080
|
- 6080
|
||||||
|
# Change path of apk that you want to test. I use sample_apk that I provide in folder "example"
|
||||||
|
volumes:
|
||||||
|
- $PWD/example/sample_apk:/root/tmp
|
||||||
|
- ./video-nexus_7.1.1:/tmp/video
|
||||||
environment:
|
environment:
|
||||||
- DEVICE=Nexus 5
|
- DEVICE=Nexus 5
|
||||||
- CONNECT_TO_GRID=True
|
- CONNECT_TO_GRID=True
|
||||||
- APPIUM=true
|
- APPIUM=true
|
||||||
- SELENIUM_HOST=selenium_hub
|
- SELENIUM_HOST=selenium_hub
|
||||||
|
- AUTO_RECORD=True
|
||||||
|
|
||||||
# Docker-Android for mobile website testing with chrome browser
|
# Docker-Android for mobile website testing with chrome browser
|
||||||
# Chrome browser exists only for version 7.0 and 7.1.1
|
# Chrome browser exists only for version 7.0 and 7.1.1
|
||||||
@@ -36,12 +38,15 @@ services:
|
|||||||
scale: 1
|
scale: 1
|
||||||
ports:
|
ports:
|
||||||
- 6080
|
- 6080
|
||||||
|
volumes:
|
||||||
|
- ./video-samsung_7.1.1:/tmp/video
|
||||||
environment:
|
environment:
|
||||||
- DEVICE=Samsung Galaxy S6
|
- DEVICE=Samsung Galaxy S6
|
||||||
- CONNECT_TO_GRID=True
|
- CONNECT_TO_GRID=True
|
||||||
- APPIUM=true
|
- APPIUM=true
|
||||||
- SELENIUM_HOST=selenium_hub
|
- SELENIUM_HOST=selenium_hub
|
||||||
- MOBILE_WEB_TEST=True
|
- MOBILE_WEB_TEST=True
|
||||||
|
- AUTO_RECORD=True
|
||||||
|
|
||||||
# Docker-Android for mobile website testing with default browser
|
# Docker-Android for mobile website testing with default browser
|
||||||
# Default browser exists only for version 5.0.1, 5.1.1 and 6.0
|
# Default browser exists only for version 5.0.1, 5.1.1 and 6.0
|
||||||
@@ -52,9 +57,12 @@ services:
|
|||||||
scale: 1
|
scale: 1
|
||||||
ports:
|
ports:
|
||||||
- 6080
|
- 6080
|
||||||
|
volumes:
|
||||||
|
- ./video-samsung_5.1.1:/tmp/video
|
||||||
environment:
|
environment:
|
||||||
- DEVICE=Samsung Galaxy S6
|
- DEVICE=Samsung Galaxy S6
|
||||||
- CONNECT_TO_GRID=True
|
- CONNECT_TO_GRID=True
|
||||||
- APPIUM=true
|
- APPIUM=true
|
||||||
- SELENIUM_HOST=selenium_hub
|
- SELENIUM_HOST=selenium_hub
|
||||||
- MOBILE_WEB_TEST=True
|
- MOBILE_WEB_TEST=True
|
||||||
|
- AUTO_RECORD=True
|
||||||
|
|||||||
+22
-49
@@ -1,6 +1,6 @@
|
|||||||
FROM ubuntu:16.04
|
FROM appium/appium:1.6.6-beta-p0
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
LABEL maintainer "Budi Utomo <budi.ut.1989@gmail.com>"
|
||||||
|
|
||||||
#=============
|
#=============
|
||||||
# Set WORKDIR
|
# Set WORKDIR
|
||||||
@@ -10,29 +10,15 @@ WORKDIR /root
|
|||||||
#==================
|
#==================
|
||||||
# General Packages
|
# General Packages
|
||||||
#------------------
|
#------------------
|
||||||
# wget
|
|
||||||
# Network downloader
|
|
||||||
# unzip
|
|
||||||
# Unzip zip file
|
|
||||||
# curl
|
|
||||||
# Transfer data from or to a server
|
|
||||||
# xterm
|
# xterm
|
||||||
# Terminal emulator
|
# Terminal emulator
|
||||||
# supervisor
|
# supervisor
|
||||||
# Process manager
|
# Process manager
|
||||||
# openjdk-8-jdk
|
|
||||||
# Java
|
|
||||||
# libqt5webkit5
|
|
||||||
# Web content engine (Fix issue in Android)
|
|
||||||
# socat
|
# socat
|
||||||
# Port forwarder
|
# Port forwarder
|
||||||
# libgconf-2-4
|
|
||||||
# Required package for chrome and chromedriver to run on Linux
|
|
||||||
#------------------
|
#------------------
|
||||||
# NoVNC Packages
|
# NoVNC Packages
|
||||||
#------------------
|
#------------------
|
||||||
# xvfb
|
|
||||||
# X virtual framebuffer
|
|
||||||
# x11vnc
|
# x11vnc
|
||||||
# VNC server for X display
|
# VNC server for X display
|
||||||
# openbox
|
# openbox
|
||||||
@@ -43,23 +29,25 @@ WORKDIR /root
|
|||||||
# Numpy, For faster performance: https://github.com/novnc/websockify/issues/77
|
# Numpy, For faster performance: https://github.com/novnc/websockify/issues/77
|
||||||
# net-tools
|
# net-tools
|
||||||
# Netstat
|
# Netstat
|
||||||
|
#------------------
|
||||||
|
# Video Recording
|
||||||
|
#------------------
|
||||||
|
# ffmpeg
|
||||||
|
# Video recorder
|
||||||
|
# jq
|
||||||
|
# Sed for JSON data
|
||||||
#==================
|
#==================
|
||||||
RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
|
RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
|
||||||
wget \
|
|
||||||
unzip \
|
|
||||||
curl \
|
|
||||||
xterm \
|
xterm \
|
||||||
supervisor \
|
supervisor \
|
||||||
openjdk-8-jdk \
|
|
||||||
libqt5webkit5 \
|
|
||||||
socat \
|
socat \
|
||||||
libgconf-2-4 \
|
|
||||||
xvfb \
|
|
||||||
x11vnc \
|
x11vnc \
|
||||||
openbox \
|
openbox \
|
||||||
menu \
|
menu \
|
||||||
python-numpy \
|
python-numpy \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
ffmpeg \
|
||||||
|
jq \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
#=======
|
#=======
|
||||||
@@ -79,52 +67,36 @@ RUN wget -nv -O noVNC.zip "https://github.com/kanaka/noVNC/archive/${NOVNC_SHA}
|
|||||||
&& rm websockify.zip \
|
&& rm websockify.zip \
|
||||||
&& ln noVNC/vnc_auto.html noVNC/index.html
|
&& ln noVNC/vnc_auto.html noVNC/index.html
|
||||||
|
|
||||||
#=====================
|
|
||||||
# Install Android SDK
|
|
||||||
#=====================
|
|
||||||
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre
|
|
||||||
ENV PATH ${PATH}:${JAVA_HOME}/bin
|
|
||||||
|
|
||||||
ENV SDK_VERSION=25.2.3 \
|
|
||||||
ANDROID_HOME=/root
|
|
||||||
RUN wget -nv -O android.zip https://dl.google.com/android/repository/tools_r${SDK_VERSION}-linux.zip \
|
|
||||||
&& unzip android.zip && rm android.zip
|
|
||||||
ENV PATH ${PATH}:${ANDROID_HOME}/tools
|
|
||||||
RUN echo y | android update sdk --no-ui -a --filter platform-tools
|
|
||||||
ENV PATH ${PATH}:${ANDROID_HOME}/platform-tools
|
|
||||||
|
|
||||||
#====================================
|
|
||||||
# Install latest nodejs, npm, appium
|
|
||||||
#====================================
|
|
||||||
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - \
|
|
||||||
&& apt-get -qqy update && apt-get -qqy install nodejs && rm -rf /var/lib/apt/lists/*
|
|
||||||
ENV APPIUM_VERSION 1.6.3
|
|
||||||
RUN npm install -g appium@$APPIUM_VERSION && npm cache clean
|
|
||||||
|
|
||||||
#======================
|
#======================
|
||||||
# Install SDK packages
|
# Install SDK packages
|
||||||
#======================
|
#======================
|
||||||
ARG ANDROID_VERSION=5.0.1
|
ARG ANDROID_VERSION=5.0.1
|
||||||
ARG BUILD_TOOL=25.0.3
|
|
||||||
ARG API_LEVEL=21
|
ARG API_LEVEL=21
|
||||||
ARG PROCESSOR=x86
|
ARG PROCESSOR=x86
|
||||||
ARG SYS_IMG=x86_64
|
ARG SYS_IMG=x86_64
|
||||||
ARG IMG_TYPE=google_apis
|
ARG IMG_TYPE=google_apis
|
||||||
ARG BROWSER=android
|
ARG BROWSER=android
|
||||||
ENV ANDROID_VERSION=$ANDROID_VERSION \
|
ENV ANDROID_VERSION=$ANDROID_VERSION \
|
||||||
BUILD_TOOL=$BUILD_TOOL \
|
|
||||||
API_LEVEL=$API_LEVEL \
|
API_LEVEL=$API_LEVEL \
|
||||||
PROCESSOR=$PROCESSOR \
|
PROCESSOR=$PROCESSOR \
|
||||||
SYS_IMG=$SYS_IMG \
|
SYS_IMG=$SYS_IMG \
|
||||||
IMG_TYPE=$IMG_TYPE \
|
IMG_TYPE=$IMG_TYPE \
|
||||||
BROWSER=$BROWSER
|
BROWSER=$BROWSER
|
||||||
RUN echo y | android update sdk --no-ui -a --filter build-tools-${BUILD_TOOL}
|
|
||||||
ENV PATH ${PATH}:${ANDROID_HOME}/build-tools
|
ENV PATH ${PATH}:${ANDROID_HOME}/build-tools
|
||||||
|
|
||||||
RUN rm ${ANDROID_HOME}/tools/emulator \
|
RUN rm ${ANDROID_HOME}/tools/emulator \
|
||||||
&& ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator
|
&& ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator
|
||||||
RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL}
|
RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL}
|
||||||
|
|
||||||
|
#==============================================
|
||||||
|
# Download chrome driver v2.26
|
||||||
|
# to be able to use chrome browser in emulator
|
||||||
|
# Issue: https://github.com/butomo1989/docker-android/commit/6406504f944dae73d0a0c5d8e71a17a47dff9b33
|
||||||
|
#==============================================
|
||||||
|
RUN wget -nv -O chrome.zip "https://chromedriver.storage.googleapis.com/2.26/chromedriver_linux64.zip" \
|
||||||
|
&& unzip -x chrome.zip \
|
||||||
|
&& rm chrome.zip
|
||||||
|
|
||||||
#================================================
|
#================================================
|
||||||
# noVNC Default Configurations
|
# noVNC Default Configurations
|
||||||
# These Configurations can be changed through -e
|
# These Configurations can be changed through -e
|
||||||
@@ -137,6 +109,7 @@ ENV DISPLAY=:0 \
|
|||||||
LOCAL_PORT=5900 \
|
LOCAL_PORT=5900 \
|
||||||
TARGET_PORT=6080 \
|
TARGET_PORT=6080 \
|
||||||
TIMEOUT=1 \
|
TIMEOUT=1 \
|
||||||
|
VIDEO_PATH=/tmp/video \
|
||||||
LOG_PATH=/var/log/supervisor
|
LOG_PATH=/var/log/supervisor
|
||||||
|
|
||||||
#===============
|
#===============
|
||||||
@@ -165,7 +138,7 @@ COPY src /root/src
|
|||||||
COPY supervisord.conf /root/
|
COPY supervisord.conf /root/
|
||||||
RUN chmod -R +x /root/src && chmod +x /root/supervisord.conf
|
RUN chmod -R +x /root/src && chmod +x /root/supervisord.conf
|
||||||
|
|
||||||
HEALTHCHECK --interval=2s --timeout=600s --retries=1 \
|
HEALTHCHECK --interval=2s --timeout=40s --retries=1 \
|
||||||
CMD adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done'
|
CMD adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done'
|
||||||
|
|
||||||
CMD /usr/bin/supervisord --configuration supervisord.conf
|
CMD /usr/bin/supervisord --configuration supervisord.conf
|
||||||
|
|||||||
+21
-48
@@ -1,6 +1,6 @@
|
|||||||
FROM ubuntu:16.04
|
FROM appium/appium:1.6.6-beta-p0
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
LABEL maintainer "Budi Utomo <budi.ut.1989@gmail.com>"
|
||||||
|
|
||||||
#=============
|
#=============
|
||||||
# Set WORKDIR
|
# Set WORKDIR
|
||||||
@@ -10,29 +10,15 @@ WORKDIR /root
|
|||||||
#==================
|
#==================
|
||||||
# General Packages
|
# General Packages
|
||||||
#------------------
|
#------------------
|
||||||
# wget
|
|
||||||
# Network downloader
|
|
||||||
# unzip
|
|
||||||
# Unzip zip file
|
|
||||||
# curl
|
|
||||||
# Transfer data from or to a server
|
|
||||||
# xterm
|
# xterm
|
||||||
# Terminal emulator
|
# Terminal emulator
|
||||||
# supervisor
|
# supervisor
|
||||||
# Process manager
|
# Process manager
|
||||||
# openjdk-8-jdk
|
|
||||||
# Java
|
|
||||||
# libqt5webkit5
|
|
||||||
# Web content engine (Fix issue in Android)
|
|
||||||
# socat
|
# socat
|
||||||
# Port forwarder
|
# Port forwarder
|
||||||
# libgconf-2-4
|
|
||||||
# Required package for chrome and chromedriver to run on Linux
|
|
||||||
#------------------
|
#------------------
|
||||||
# NoVNC Packages
|
# NoVNC Packages
|
||||||
#------------------
|
#------------------
|
||||||
# xvfb
|
|
||||||
# X virtual framebuffer
|
|
||||||
# x11vnc
|
# x11vnc
|
||||||
# VNC server for X display
|
# VNC server for X display
|
||||||
# openbox
|
# openbox
|
||||||
@@ -44,6 +30,13 @@ WORKDIR /root
|
|||||||
# net-tools
|
# net-tools
|
||||||
# Netstat
|
# Netstat
|
||||||
#------------------
|
#------------------
|
||||||
|
# Video Recording
|
||||||
|
#------------------
|
||||||
|
# ffmpeg
|
||||||
|
# Video recorder
|
||||||
|
# jq
|
||||||
|
# Sed for JSON data
|
||||||
|
#------------------
|
||||||
# KVM Package
|
# KVM Package
|
||||||
# for emulator x86
|
# for emulator x86
|
||||||
# https://help.ubuntu.com/community/KVM/Installation
|
# https://help.ubuntu.com/community/KVM/Installation
|
||||||
@@ -54,21 +47,16 @@ WORKDIR /root
|
|||||||
# bridge-utils
|
# bridge-utils
|
||||||
#==================
|
#==================
|
||||||
RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
|
RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
|
||||||
wget \
|
|
||||||
unzip \
|
|
||||||
curl \
|
|
||||||
xterm \
|
xterm \
|
||||||
supervisor \
|
supervisor \
|
||||||
openjdk-8-jdk \
|
|
||||||
libqt5webkit5 \
|
|
||||||
socat \
|
socat \
|
||||||
libgconf-2-4 \
|
|
||||||
xvfb \
|
|
||||||
x11vnc \
|
x11vnc \
|
||||||
openbox \
|
openbox \
|
||||||
menu \
|
menu \
|
||||||
python-numpy \
|
python-numpy \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
ffmpeg \
|
||||||
|
jq \
|
||||||
qemu-kvm \
|
qemu-kvm \
|
||||||
libvirt-bin \
|
libvirt-bin \
|
||||||
ubuntu-vm-builder \
|
ubuntu-vm-builder \
|
||||||
@@ -92,52 +80,36 @@ RUN wget -nv -O noVNC.zip "https://github.com/kanaka/noVNC/archive/${NOVNC_SHA}
|
|||||||
&& rm websockify.zip \
|
&& rm websockify.zip \
|
||||||
&& ln noVNC/vnc_auto.html noVNC/index.html
|
&& ln noVNC/vnc_auto.html noVNC/index.html
|
||||||
|
|
||||||
#=====================
|
|
||||||
# Install Android SDK
|
|
||||||
#=====================
|
|
||||||
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre
|
|
||||||
ENV PATH ${PATH}:${JAVA_HOME}/bin
|
|
||||||
|
|
||||||
ENV SDK_VERSION=25.2.3 \
|
|
||||||
ANDROID_HOME=/root
|
|
||||||
RUN wget -nv -O android.zip https://dl.google.com/android/repository/tools_r${SDK_VERSION}-linux.zip \
|
|
||||||
&& unzip android.zip && rm android.zip
|
|
||||||
ENV PATH ${PATH}:${ANDROID_HOME}/tools
|
|
||||||
RUN echo y | android update sdk --no-ui -a --filter platform-tools
|
|
||||||
ENV PATH ${PATH}:${ANDROID_HOME}/platform-tools
|
|
||||||
|
|
||||||
#====================================
|
|
||||||
# Install latest nodejs, npm, appium
|
|
||||||
#====================================
|
|
||||||
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - \
|
|
||||||
&& apt-get -qqy update && apt-get -qqy install nodejs && rm -rf /var/lib/apt/lists/*
|
|
||||||
ENV APPIUM_VERSION 1.6.3
|
|
||||||
RUN npm install -g appium@$APPIUM_VERSION && npm cache clean
|
|
||||||
|
|
||||||
#======================
|
#======================
|
||||||
# Install SDK packages
|
# Install SDK packages
|
||||||
#======================
|
#======================
|
||||||
ARG ANDROID_VERSION=5.0.1
|
ARG ANDROID_VERSION=5.0.1
|
||||||
ARG BUILD_TOOL=25.0.3
|
|
||||||
ARG API_LEVEL=21
|
ARG API_LEVEL=21
|
||||||
ARG PROCESSOR=x86
|
ARG PROCESSOR=x86
|
||||||
ARG SYS_IMG=x86_64
|
ARG SYS_IMG=x86_64
|
||||||
ARG IMG_TYPE=google_apis
|
ARG IMG_TYPE=google_apis
|
||||||
ARG BROWSER=android
|
ARG BROWSER=android
|
||||||
ENV ANDROID_VERSION=$ANDROID_VERSION \
|
ENV ANDROID_VERSION=$ANDROID_VERSION \
|
||||||
BUILD_TOOL=$BUILD_TOOL \
|
|
||||||
API_LEVEL=$API_LEVEL \
|
API_LEVEL=$API_LEVEL \
|
||||||
PROCESSOR=$PROCESSOR \
|
PROCESSOR=$PROCESSOR \
|
||||||
SYS_IMG=$SYS_IMG \
|
SYS_IMG=$SYS_IMG \
|
||||||
IMG_TYPE=$IMG_TYPE \
|
IMG_TYPE=$IMG_TYPE \
|
||||||
BROWSER=$BROWSER
|
BROWSER=$BROWSER
|
||||||
RUN echo y | android update sdk --no-ui -a --filter build-tools-${BUILD_TOOL}
|
|
||||||
ENV PATH ${PATH}:${ANDROID_HOME}/build-tools
|
ENV PATH ${PATH}:${ANDROID_HOME}/build-tools
|
||||||
|
|
||||||
RUN rm ${ANDROID_HOME}/tools/emulator \
|
RUN rm ${ANDROID_HOME}/tools/emulator \
|
||||||
&& ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator
|
&& ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator
|
||||||
RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL}
|
RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL}
|
||||||
|
|
||||||
|
#==============================================
|
||||||
|
# Download chrome driver v2.26
|
||||||
|
# to be able to use chrome browser in emulator
|
||||||
|
# Issue: https://github.com/butomo1989/docker-android/commit/6406504f944dae73d0a0c5d8e71a17a47dff9b33
|
||||||
|
#==============================================
|
||||||
|
RUN wget -nv -O chrome.zip "https://chromedriver.storage.googleapis.com/2.26/chromedriver_linux64.zip" \
|
||||||
|
&& unzip -x chrome.zip \
|
||||||
|
&& rm chrome.zip
|
||||||
|
|
||||||
#================================================
|
#================================================
|
||||||
# noVNC Default Configurations
|
# noVNC Default Configurations
|
||||||
# These Configurations can be changed through -e
|
# These Configurations can be changed through -e
|
||||||
@@ -150,6 +122,7 @@ ENV DISPLAY=:0 \
|
|||||||
LOCAL_PORT=5900 \
|
LOCAL_PORT=5900 \
|
||||||
TARGET_PORT=6080 \
|
TARGET_PORT=6080 \
|
||||||
TIMEOUT=1 \
|
TIMEOUT=1 \
|
||||||
|
VIDEO_PATH=/tmp/video \
|
||||||
LOG_PATH=/var/log/supervisor
|
LOG_PATH=/var/log/supervisor
|
||||||
|
|
||||||
#===============
|
#===============
|
||||||
|
|||||||
+117
-1
@@ -1 +1,117 @@
|
|||||||
# TODO
|
FROM appium/appium:1.6.6-beta-p0
|
||||||
|
|
||||||
|
LABEL maintainer "Budi Utomo <budi.ut.1989@gmail.com>"
|
||||||
|
|
||||||
|
#=============
|
||||||
|
# Set WORKDIR
|
||||||
|
#=============
|
||||||
|
WORKDIR /root
|
||||||
|
|
||||||
|
#==================
|
||||||
|
# General Packages
|
||||||
|
#------------------
|
||||||
|
# xterm
|
||||||
|
# Terminal emulator
|
||||||
|
# supervisor
|
||||||
|
# Process manager
|
||||||
|
# socat
|
||||||
|
# Port forwarder
|
||||||
|
#------------------
|
||||||
|
# NoVNC Packages
|
||||||
|
#------------------
|
||||||
|
# x11vnc
|
||||||
|
# VNC server for X display
|
||||||
|
# openbox
|
||||||
|
# Windows manager
|
||||||
|
# menu
|
||||||
|
# Debian menu
|
||||||
|
# python-numpy
|
||||||
|
# Numpy, For faster performance: https://github.com/novnc/websockify/issues/77
|
||||||
|
# net-tools
|
||||||
|
# Netstat
|
||||||
|
#------------------
|
||||||
|
# Video Recording
|
||||||
|
#------------------
|
||||||
|
# ffmpeg
|
||||||
|
# Video recorder
|
||||||
|
# jq
|
||||||
|
# Sed for JSON data
|
||||||
|
#==================
|
||||||
|
RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
|
||||||
|
xterm \
|
||||||
|
supervisor \
|
||||||
|
socat \
|
||||||
|
x11vnc \
|
||||||
|
openbox \
|
||||||
|
menu \
|
||||||
|
python-numpy \
|
||||||
|
net-tools \
|
||||||
|
ffmpeg \
|
||||||
|
jq \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
#=======
|
||||||
|
# noVNC
|
||||||
|
# Use same commit id that docker-selenium uses
|
||||||
|
# https://github.com/elgalu/docker-selenium/blob/236b861177bd2917d864e52291114b1f5e4540d7/Dockerfile#L412-L413
|
||||||
|
#=======
|
||||||
|
ENV NOVNC_SHA="b403cb92fb8de82d04f305b4f14fa978003890d7" \
|
||||||
|
WEBSOCKIFY_SHA="558a6439f14b0d85a31145541745e25c255d576b"
|
||||||
|
RUN wget -nv -O noVNC.zip "https://github.com/kanaka/noVNC/archive/${NOVNC_SHA}.zip" \
|
||||||
|
&& unzip -x noVNC.zip \
|
||||||
|
&& rm noVNC.zip \
|
||||||
|
&& mv noVNC-${NOVNC_SHA} noVNC \
|
||||||
|
&& wget -nv -O websockify.zip "https://github.com/kanaka/websockify/archive/${WEBSOCKIFY_SHA}.zip" \
|
||||||
|
&& unzip -x websockify.zip \
|
||||||
|
&& mv websockify-${WEBSOCKIFY_SHA} ./noVNC/utils/websockify \
|
||||||
|
&& rm websockify.zip \
|
||||||
|
&& ln noVNC/vnc_auto.html noVNC/index.html
|
||||||
|
|
||||||
|
#==============================================
|
||||||
|
# Download Adb remote screen
|
||||||
|
#==============================================
|
||||||
|
RUN wget -nv -O asm.zip "http://adakoda.github.io/android-screen-monitor/download/3.0.0/ASM_3_00.zip" \
|
||||||
|
&& unzip asm.zip \
|
||||||
|
&& rm asm.zip
|
||||||
|
|
||||||
|
#================================================
|
||||||
|
# noVNC Default Configurations
|
||||||
|
# These Configurations can be changed through -e
|
||||||
|
#================================================
|
||||||
|
ENV DISPLAY=:0 \
|
||||||
|
SCREEN=0 \
|
||||||
|
SCREEN_WIDTH=1600 \
|
||||||
|
SCREEN_HEIGHT=900 \
|
||||||
|
SCREEN_DEPTH=16 \
|
||||||
|
LOCAL_PORT=5900 \
|
||||||
|
TARGET_PORT=6080 \
|
||||||
|
TIMEOUT=1 \
|
||||||
|
VIDEO_PATH=/tmp/video \
|
||||||
|
LOG_PATH=/var/log/supervisor
|
||||||
|
|
||||||
|
#=========================
|
||||||
|
# Set default variables
|
||||||
|
#=========================
|
||||||
|
ENV REAL_DEVICE=True
|
||||||
|
ENV BROWSER=android
|
||||||
|
|
||||||
|
#===============
|
||||||
|
# Expose Ports
|
||||||
|
#---------------
|
||||||
|
# 4723
|
||||||
|
# Appium port
|
||||||
|
# 6080
|
||||||
|
# noVNC port
|
||||||
|
# 5555
|
||||||
|
# ADB connection port
|
||||||
|
#===============
|
||||||
|
EXPOSE 4723 6080 5555
|
||||||
|
|
||||||
|
#===================
|
||||||
|
# Run docker-appium
|
||||||
|
#===================
|
||||||
|
COPY src /root/src
|
||||||
|
COPY supervisord.conf /root/
|
||||||
|
RUN chmod -R +x /root/src && chmod +x /root/supervisord.conf
|
||||||
|
|
||||||
|
CMD /usr/bin/supervisord --configuration supervisord.conf
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
from appium import webdriver
|
from appium import webdriver
|
||||||
|
|
||||||
|
|
||||||
@@ -13,13 +15,24 @@ class MSiteChromeAndroidUITests(unittest.TestCase):
|
|||||||
'deviceName': 'Android Emulator',
|
'deviceName': 'Android Emulator',
|
||||||
'appPackage': 'com.android.chrome',
|
'appPackage': 'com.android.chrome',
|
||||||
'appActivity': 'com.google.android.apps.chrome.Main',
|
'appActivity': 'com.google.android.apps.chrome.Main',
|
||||||
'browserName': 'chrome',
|
'browserName': 'chrome'
|
||||||
'ignore-certificate-errors': True
|
|
||||||
}
|
}
|
||||||
self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps)
|
self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps)
|
||||||
|
|
||||||
def test_open_url(self):
|
def test_open_url(self):
|
||||||
self.driver.get('http://targeturl.com')
|
self.driver.get('http://google.com')
|
||||||
|
|
||||||
|
# Handle Welcome Home
|
||||||
|
self.driver.switch_to.context('NATIVE_APP')
|
||||||
|
self.driver.find_element_by_id('terms_accept').click()
|
||||||
|
self.driver.find_element_by_id('negative_button').click()
|
||||||
|
|
||||||
|
# Search for Github
|
||||||
|
self.driver.switch_to.context('CHROMIUM')
|
||||||
|
search = self.driver.find_element_by_name('q')
|
||||||
|
search.send_keys('butomo1989 docker-android')
|
||||||
|
search.submit()
|
||||||
|
sleep(2)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
self.driver.quit()
|
self.driver.quit()
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
from appium import webdriver
|
from appium import webdriver
|
||||||
|
|
||||||
|
|
||||||
@@ -18,7 +20,12 @@ class MSiteDefaultBrowserAndroidUITests(unittest.TestCase):
|
|||||||
self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps)
|
self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps)
|
||||||
|
|
||||||
def test_open_url(self):
|
def test_open_url(self):
|
||||||
self.driver.get('http://targeturl.com')
|
self.driver.get('http://google.com')
|
||||||
|
|
||||||
|
search = self.driver.find_element_by_name('q')
|
||||||
|
search.send_keys('butomo1989 docker-android')
|
||||||
|
search.submit()
|
||||||
|
sleep(2)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
self.driver.quit()
|
self.driver.quit()
|
||||||
|
|||||||
+63
-10
@@ -2,7 +2,6 @@
|
|||||||
# Bash version should >= 4 to be able to run this script.
|
# Bash version should >= 4 to be able to run this script.
|
||||||
|
|
||||||
IMAGE="butomo1989/docker-android"
|
IMAGE="butomo1989/docker-android"
|
||||||
LATEST_BUILD_TOOL=25.0.2
|
|
||||||
|
|
||||||
if [ -z "$1" ]; then
|
if [ -z "$1" ]; then
|
||||||
read -p "Task (test|build|push|all) : " TASK
|
read -p "Task (test|build|push|all) : " TASK
|
||||||
@@ -93,8 +92,60 @@ get_android_versions
|
|||||||
get_processors
|
get_processors
|
||||||
|
|
||||||
function test() {
|
function test() {
|
||||||
(export ANDROID_HOME=/root && export ANDROID_VERSION=5.0.1 && export API_LEVEL=21 \
|
# Prepare needed parameter to run tests
|
||||||
&& export PROCESSOR=x86 && export SYS_IMG=x86_64 && export IMG_TYPE=google_apis && nosetests -v)
|
test_android_version=7.1.1
|
||||||
|
test_api_level=25
|
||||||
|
test_processor=x86
|
||||||
|
test_sys_img=x86_64
|
||||||
|
test_img_type=google_apis
|
||||||
|
test_browser=chrome
|
||||||
|
test_image=test_img
|
||||||
|
test_container=test_con
|
||||||
|
|
||||||
|
# Run e2e tests
|
||||||
|
# E2E tests must be run only for linux OS / x86 image to reduce duration of test execution
|
||||||
|
if [ "$(uname -s)" == 'Linux' ] && [ "$E2E" = true ]; then
|
||||||
|
echo "----BUILD TEST IMAGE----"
|
||||||
|
docker build -t $test_image --build-arg ANDROID_VERSION=$test_android_version \
|
||||||
|
--build-arg API_LEVEL=$test_api_level --build-arg PROCESSOR=$test_processor --build-arg SYS_IMG=$test_sys_img \
|
||||||
|
--build-arg IMG_TYPE=$test_img_type --build-arg BROWSER=$test_browser -f docker/Emulator_x86 .
|
||||||
|
|
||||||
|
echo "----REMOVE OLD TEST CONTAINER----"
|
||||||
|
docker kill $test_container && docker rm $test_container
|
||||||
|
|
||||||
|
echo "----PREPARE CONTAINER----"
|
||||||
|
docker run --privileged -d -p 4723:4723 -p 6080:6080 -e APPIUM=True -e DEVICE="Samsung Galaxy S6" --name $test_container $test_image
|
||||||
|
docker cp example/sample_apk $test_container:/root/tmp
|
||||||
|
attempt=0
|
||||||
|
while [ ${attempt} -le 10 ]; do
|
||||||
|
attempt=$(($attempt + 1))
|
||||||
|
output=$(docker ps | grep healthy | grep test_con | wc -l)
|
||||||
|
if [[ "$output" == 1 ]]; then
|
||||||
|
echo "Emulator is ready."
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "Waiting 10 seconds for emulator to be ready (attempt: $attempt)"
|
||||||
|
sleep 10
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $attempt == 10 ]]; then
|
||||||
|
echo "Failed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "----RUN E2E TESTS----"
|
||||||
|
nosetests src/tests/e2e -v
|
||||||
|
|
||||||
|
echo "----REMOVE TEST CONTAINER----"
|
||||||
|
docker kill $test_container && docker rm $test_container
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run unit tests (After e2e test to get coverage result)
|
||||||
|
echo "----UNIT TESTS----"
|
||||||
|
(export ANDROID_HOME=/root && export ANDROID_VERSION=$test_android_version && export API_LEVEL=$test_api_level \
|
||||||
|
&& export PROCESSOR=$test_processor && export SYS_IMG=$test_sys_img && export IMG_TYPE=$test_img_type \
|
||||||
|
&& nosetests src/tests/unit -v)
|
||||||
}
|
}
|
||||||
|
|
||||||
function build() {
|
function build() {
|
||||||
@@ -111,9 +162,13 @@ function build() {
|
|||||||
|
|
||||||
for v in "${versions[@]}"; do
|
for v in "${versions[@]}"; do
|
||||||
# Find image type and default web browser
|
# Find image type and default web browser
|
||||||
if [ "$v" == "5.0.1" ] || [ "$v" == "5.1.1" ] || [ "$v" == "6.0" ]; then
|
if [ "$v" == "5.0.1" ] || [ "$v" == "5.1.1" ]; then
|
||||||
IMG_TYPE=android
|
IMG_TYPE=android
|
||||||
BROWSER=browser
|
BROWSER=browser
|
||||||
|
elif [ "$v" == "6.0" ]; then
|
||||||
|
# It is because there is no ARM EABI v7a System Image for 6.0
|
||||||
|
IMG_TYPE=google_apis
|
||||||
|
BROWSER=browser
|
||||||
else
|
else
|
||||||
IMG_TYPE=google_apis
|
IMG_TYPE=google_apis
|
||||||
BROWSER=chrome
|
BROWSER=chrome
|
||||||
@@ -127,12 +182,10 @@ function build() {
|
|||||||
image_latest="$IMAGE-$p-$v:latest"
|
image_latest="$IMAGE-$p-$v:latest"
|
||||||
echo "[BUILD] Image name: $image_version and $image_latest"
|
echo "[BUILD] Image name: $image_version and $image_latest"
|
||||||
echo "[BUILD] Dockerfile: $FILE_NAME"
|
echo "[BUILD] Dockerfile: $FILE_NAME"
|
||||||
docker build -t $image_version --build-arg ANDROID_VERSION=$v --build-arg BUILD_TOOL=$LATEST_BUILD_TOOL \
|
docker build -t $image_version --build-arg ANDROID_VERSION=$v --build-arg API_LEVEL=$level \
|
||||||
--build-arg API_LEVEL=$level --build-arg PROCESSOR=$p --build-arg SYS_IMG=$sys_img \
|
--build-arg PROCESSOR=$p --build-arg SYS_IMG=$sys_img --build-arg IMG_TYPE=$IMG_TYPE \
|
||||||
--build-arg IMG_TYPE=$IMG_TYPE --build-arg BROWSER=$BROWSER -f $FILE_NAME .
|
--build-arg BROWSER=$BROWSER -f $FILE_NAME .
|
||||||
docker build -t $image_latest --build-arg ANDROID_VERSION=$v --build-arg BUILD_TOOL=$LATEST_BUILD_TOOL \
|
docker tag $image_version $image_latest
|
||||||
--build-arg API_LEVEL=$level --build-arg PROCESSOR=$p --build-arg SYS_IMG=$sys_img \
|
|
||||||
--build-arg IMG_TYPE=$IMG_TYPE --build-arg BROWSER=$BROWSER -f $FILE_NAME .
|
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
read -p "Task (build|push|all) : " TASK
|
||||||
|
else
|
||||||
|
TASK=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$2" ]; then
|
||||||
|
read -p "Release version: " RELEASE
|
||||||
|
else
|
||||||
|
RELEASE=$2
|
||||||
|
fi
|
||||||
|
|
||||||
|
IMAGE="butomo1989/docker-android"
|
||||||
|
FILE_NAME=docker/Real_device
|
||||||
|
|
||||||
|
image_version="$IMAGE-real-device:$RELEASE"
|
||||||
|
image_latest="$IMAGE-real-device:latest"
|
||||||
|
|
||||||
|
function build() {
|
||||||
|
echo "[BUILD] Image name: $image_version and $image_latest"
|
||||||
|
echo "[BUILD] Dockerfile: $FILE_NAME"
|
||||||
|
docker build -t $image_version -f $FILE_NAME .
|
||||||
|
docker tag $image_version $image_latest
|
||||||
|
}
|
||||||
|
|
||||||
|
function push() {
|
||||||
|
echo "[PUSH] Image name: $image_version and $image_latest"
|
||||||
|
docker push $image_version
|
||||||
|
docker push $image_latest
|
||||||
|
}
|
||||||
|
|
||||||
|
case $TASK in
|
||||||
|
build)
|
||||||
|
build
|
||||||
|
;;
|
||||||
|
push)
|
||||||
|
push
|
||||||
|
;;
|
||||||
|
all)
|
||||||
|
build
|
||||||
|
push
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Invalid environment! Valid options: test, build, push, all"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
selenium==3.3.1
|
||||||
|
Appium-Python-Client==0.24
|
||||||
coverage==4.2
|
coverage==4.2
|
||||||
mock==2.0.0
|
mock==2.0.0
|
||||||
nose==1.3.7
|
nose==1.3.7
|
||||||
|
|||||||
@@ -2,5 +2,6 @@ import os
|
|||||||
|
|
||||||
ROOT = '/root'
|
ROOT = '/root'
|
||||||
WORKDIR = os.path.dirname(__file__)
|
WORKDIR = os.path.dirname(__file__)
|
||||||
|
CHROME_DRIVER = os.path.join(ROOT, 'chromedriver')
|
||||||
CONFIG_FILE = os.path.join(WORKDIR, 'nodeconfig.json')
|
CONFIG_FILE = os.path.join(WORKDIR, 'nodeconfig.json')
|
||||||
LOGGING_FILE = os.path.join(WORKDIR, 'logging.conf')
|
LOGGING_FILE = os.path.join(WORKDIR, 'logging.conf')
|
||||||
|
|||||||
+18
-6
@@ -4,13 +4,21 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import errno
|
||||||
|
|
||||||
from src import CONFIG_FILE, ROOT
|
from src import CONFIG_FILE, ROOT, CHROME_DRIVER
|
||||||
from src import log
|
from src import log
|
||||||
|
|
||||||
log.init()
|
log.init()
|
||||||
logger = logging.getLogger('app')
|
logger = logging.getLogger('app')
|
||||||
|
|
||||||
|
def symlink_force(target, link_name):
|
||||||
|
try:
|
||||||
|
os.symlink(target, link_name)
|
||||||
|
except OSError as e:
|
||||||
|
if e.errno == errno.EEXIST:
|
||||||
|
os.remove(link_name)
|
||||||
|
os.symlink(target, link_name)
|
||||||
|
|
||||||
def get_or_raise(env: str) -> str:
|
def get_or_raise(env: str) -> str:
|
||||||
"""
|
"""
|
||||||
@@ -71,7 +79,7 @@ def prepare_avd(device: str, avd_name: str):
|
|||||||
skin_dst_path = os.path.join(ANDROID_HOME, 'platforms', 'android-{api}'.format(api=API_LEVEL), 'skins')
|
skin_dst_path = os.path.join(ANDROID_HOME, 'platforms', 'android-{api}'.format(api=API_LEVEL), 'skins')
|
||||||
logger.info('Skin destination path: {dst}'.format(dst=skin_dst_path))
|
logger.info('Skin destination path: {dst}'.format(dst=skin_dst_path))
|
||||||
for s in os.listdir(skin_rsc_path):
|
for s in os.listdir(skin_rsc_path):
|
||||||
os.symlink(os.path.join(skin_rsc_path, s), os.path.join(skin_dst_path, s))
|
symlink_force(os.path.join(skin_rsc_path, s), os.path.join(skin_dst_path, s))
|
||||||
|
|
||||||
# Hardware and its skin
|
# Hardware and its skin
|
||||||
device_name_bash = device.replace(' ', '\ ')
|
device_name_bash = device.replace(' ', '\ ')
|
||||||
@@ -85,7 +93,7 @@ def prepare_avd(device: str, avd_name: str):
|
|||||||
profile_src_path = os.path.join(ROOT, 'devices', 'profiles', '{profile}.xml'.format(profile=skin_name))
|
profile_src_path = os.path.join(ROOT, 'devices', 'profiles', '{profile}.xml'.format(profile=skin_name))
|
||||||
logger.info('Hardware profile resource path: {rsc}'.format(rsc=profile_src_path))
|
logger.info('Hardware profile resource path: {rsc}'.format(rsc=profile_src_path))
|
||||||
logger.info('Hardware profile destination path: {dst}'.format(dst=profile_dst_path))
|
logger.info('Hardware profile destination path: {dst}'.format(dst=profile_dst_path))
|
||||||
os.symlink(profile_src_path, profile_dst_path)
|
symlink_force(profile_src_path, profile_dst_path)
|
||||||
|
|
||||||
# Append command
|
# Append command
|
||||||
cmd += ' -d {device} -s {skin}'.format(device=device_name_bash, skin=skin_name)
|
cmd += ' -d {device} -s {skin}'.format(device=device_name_bash, skin=skin_name)
|
||||||
@@ -100,14 +108,17 @@ def appium_run(avd_name: str):
|
|||||||
:param avd_name: Name of android virtual device / emulator
|
:param avd_name: Name of android virtual device / emulator
|
||||||
"""
|
"""
|
||||||
cmd = 'appium'
|
cmd = 'appium'
|
||||||
local_ip = os.popen('ifconfig eth0 | grep \'inet addr:\' | cut -d: -f2 | awk \'{ print $1}\'').read().strip()
|
|
||||||
|
default_web_browser = os.getenv('BROWSER')
|
||||||
|
if default_web_browser == 'chrome':
|
||||||
|
cmd += ' --chromedriver-executable {driver}'.format(driver=CHROME_DRIVER)
|
||||||
|
|
||||||
grid_connect = convert_str_to_bool(str(os.getenv('CONNECT_TO_GRID', False)))
|
grid_connect = convert_str_to_bool(str(os.getenv('CONNECT_TO_GRID', False)))
|
||||||
logger.info('Connect to selenium grid? {connect}'.format(connect=grid_connect))
|
logger.info('Connect to selenium grid? {connect}'.format(connect=grid_connect))
|
||||||
if grid_connect:
|
if grid_connect:
|
||||||
|
local_ip = os.popen('ifconfig eth0 | grep \'inet addr:\' | cut -d: -f2 | awk \'{ print $1}\'').read().strip()
|
||||||
try:
|
try:
|
||||||
mobile_web_test = convert_str_to_bool(str(os.getenv('MOBILE_WEB_TEST', False)))
|
mobile_web_test = convert_str_to_bool(str(os.getenv('MOBILE_WEB_TEST', False)))
|
||||||
default_web_browser = os.getenv('BROWSER')
|
|
||||||
appium_host = os.getenv('APPIUM_HOST', local_ip)
|
appium_host = os.getenv('APPIUM_HOST', local_ip)
|
||||||
appium_port = int(os.getenv('APPIUM_PORT', 4723))
|
appium_port = int(os.getenv('APPIUM_PORT', 4723))
|
||||||
selenium_host = os.getenv('SELENIUM_HOST', '172.17.0.1')
|
selenium_host = os.getenv('SELENIUM_HOST', '172.17.0.1')
|
||||||
@@ -121,7 +132,8 @@ def appium_run(avd_name: str):
|
|||||||
subprocess.check_call('xterm -T "{title}" -n "{title}" -e \"{cmd}\"'.format(title=title, cmd=cmd), shell=True)
|
subprocess.check_call('xterm -T "{title}" -n "{title}" -e \"{cmd}\"'.format(title=title, cmd=cmd), shell=True)
|
||||||
|
|
||||||
|
|
||||||
def create_node_config(avd_name: str, browser_name: str, appium_host: str, appium_port: int, selenium_host: str, selenium_port: int):
|
def create_node_config(avd_name: str, browser_name: str, appium_host: str, appium_port: int, selenium_host: str,
|
||||||
|
selenium_port: int):
|
||||||
"""
|
"""
|
||||||
Create custom node config file in json format to be able to connect with selenium server.
|
Create custom node config file in json format to be able to connect with selenium server.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -z $REAL_DEVICE ]; then
|
||||||
|
python3 -m src.app
|
||||||
|
else
|
||||||
|
CMD="appium"
|
||||||
|
if [ ! -z "$CONNECT_TO_GRID" ]; then
|
||||||
|
NODE_CONFIG_JSON="/root/src/nodeconfig.json"
|
||||||
|
/root/generate_config.sh $NODE_CONFIG_JSON
|
||||||
|
CMD+=" --nodeconfig $NODE_CONFIG_JSON"
|
||||||
|
fi
|
||||||
|
$CMD
|
||||||
|
fi
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -z "$REAL_DEVICE"]; then
|
||||||
|
echo "Container is using android emulator"
|
||||||
|
else
|
||||||
|
echo "Starting android screen mirro..."
|
||||||
|
java -jar /root/asm.jar $ANDROID_HOME
|
||||||
|
fi
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function start() {
|
||||||
|
mkdir -p $VIDEO_PATH
|
||||||
|
name="$(date '+%d_%m_%Y_%H_%M_%S').mp4"
|
||||||
|
echo "Start video recording"
|
||||||
|
ffmpeg -video_size 1599x899 -framerate 15 -f x11grab -i $DISPLAY $VIDEO_PATH/$name -y
|
||||||
|
}
|
||||||
|
|
||||||
|
function stop() {
|
||||||
|
echo "Stop video recording"
|
||||||
|
kill $(ps -ef | grep [f]fmpeg | awk '{print $2}')
|
||||||
|
}
|
||||||
|
|
||||||
|
function auto_record() {
|
||||||
|
echo "Auto record: $AUTO_RECORD"
|
||||||
|
sleep 6
|
||||||
|
|
||||||
|
while [ $AUTO_RECORD == "True" ]; do
|
||||||
|
# Check if there is test running
|
||||||
|
no_test=true
|
||||||
|
while $no_test; do
|
||||||
|
task=$(curl -s localhost:4723/wd/hub/sessions | jq -r '.value')
|
||||||
|
if [ "$task" == "" ] || [ "$task" == "[]" ]; then
|
||||||
|
sleep .5
|
||||||
|
else
|
||||||
|
start &
|
||||||
|
no_test=false
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check if test is finished
|
||||||
|
while [ $no_test == false ]; do
|
||||||
|
task=$(curl -s localhost:4723/wd/hub/sessions | jq -r '.value')
|
||||||
|
if [ "$task" == "" ] || [ "$task" == "[]" ]; then
|
||||||
|
stop
|
||||||
|
no_test=true
|
||||||
|
else
|
||||||
|
sleep .5
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Auto recording is disabled!"
|
||||||
|
}
|
||||||
|
|
||||||
|
$@
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
"""Unit test to test app."""
|
|
||||||
import os
|
|
||||||
from unittest import TestCase
|
|
||||||
|
|
||||||
import mock
|
|
||||||
|
|
||||||
from src import app
|
|
||||||
|
|
||||||
|
|
||||||
class TestApp(TestCase):
|
|
||||||
"""Unit test class to test other methods in the app."""
|
|
||||||
|
|
||||||
def test_valid_env(self):
|
|
||||||
key = 'ENV_1'
|
|
||||||
os.environ[key] = 'test'
|
|
||||||
app.get_or_raise(key)
|
|
||||||
del os.environ[key]
|
|
||||||
|
|
||||||
def test_invalid_env(self):
|
|
||||||
with self.assertRaises(RuntimeError):
|
|
||||||
app.get_or_raise('ENV_2')
|
|
||||||
|
|
||||||
def test_valid_bool(self):
|
|
||||||
self.assertEqual(app.convert_str_to_bool('True'), True)
|
|
||||||
self.assertEqual(app.convert_str_to_bool('t'), True)
|
|
||||||
self.assertEqual(app.convert_str_to_bool('1'), True)
|
|
||||||
self.assertEqual(app.convert_str_to_bool('YES'), True)
|
|
||||||
|
|
||||||
def test_invalid_bool(self):
|
|
||||||
self.assertEqual(app.convert_str_to_bool(''), False)
|
|
||||||
self.assertEqual(app.convert_str_to_bool('test'), False)
|
|
||||||
|
|
||||||
def test_invalid_format(self):
|
|
||||||
self.assertEqual(app.convert_str_to_bool(True), None)
|
|
||||||
|
|
||||||
@mock.patch('src.app.prepare_avd')
|
|
||||||
@mock.patch('subprocess.Popen')
|
|
||||||
def test_run_with_appium(self, mocked_avd, mocked_subprocess):
|
|
||||||
with mock.patch('src.app.appium_run') as mocked_appium:
|
|
||||||
os.environ['APPIUM'] = str(True)
|
|
||||||
app.run()
|
|
||||||
self.assertTrue(mocked_avd.called)
|
|
||||||
self.assertTrue(mocked_subprocess.called)
|
|
||||||
self.assertTrue(mocked_appium.called)
|
|
||||||
|
|
||||||
@mock.patch('src.app.prepare_avd')
|
|
||||||
@mock.patch('subprocess.Popen')
|
|
||||||
def test_run_withhout_appium(self, mocked_avd, mocked_subprocess):
|
|
||||||
with mock.patch('src.app.appium_run') as mocked_appium:
|
|
||||||
os.environ['APPIUM'] = str(False)
|
|
||||||
app.run()
|
|
||||||
self.assertTrue(mocked_avd.called)
|
|
||||||
self.assertTrue(mocked_subprocess.called)
|
|
||||||
self.assertFalse(mocked_appium.called)
|
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
"""e2e test to test sample android application inside docker-android"""
|
||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
from appium import webdriver
|
||||||
|
|
||||||
|
|
||||||
|
class TestE2EAndroidApk(TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
desired_caps = {
|
||||||
|
'platformName': 'Android',
|
||||||
|
'deviceName': 'Android Emulator',
|
||||||
|
'automationName': 'UIAutomator2',
|
||||||
|
'app': '/root/tmp/sample_apk_debug.apk'
|
||||||
|
}
|
||||||
|
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
|
||||||
|
|
||||||
|
def test_calculation(self):
|
||||||
|
text_fields = self.driver.find_elements_by_class_name('android.widget.EditText')
|
||||||
|
text_fields[0].send_keys(4)
|
||||||
|
text_fields[1].send_keys(6)
|
||||||
|
|
||||||
|
btn_calculate = self.driver.find_element_by_class_name('android.widget.Button')
|
||||||
|
btn_calculate.click()
|
||||||
|
|
||||||
|
self.assertEqual('10', text_fields[2].text)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.driver.quit()
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
"""e2e test to test chrome application inside docker-android"""
|
||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
from appium import webdriver
|
||||||
|
|
||||||
|
|
||||||
|
class TestE2EChrome(TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
desired_caps = {
|
||||||
|
'platformName': 'Android',
|
||||||
|
'deviceName': 'Android Emulator',
|
||||||
|
'appPackage': 'com.android.chrome',
|
||||||
|
'appActivity': 'com.google.android.apps.chrome.Main',
|
||||||
|
'browserName': 'chrome'
|
||||||
|
}
|
||||||
|
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
|
||||||
|
|
||||||
|
def test_open_url(self):
|
||||||
|
self.driver.get('http://google.com')
|
||||||
|
|
||||||
|
# Handle Welcome Home
|
||||||
|
self.driver.switch_to.context('NATIVE_APP')
|
||||||
|
self.driver.find_element_by_id('terms_accept').click()
|
||||||
|
self.driver.find_element_by_id('negative_button').click()
|
||||||
|
|
||||||
|
# Search for Github
|
||||||
|
self.driver.switch_to.context('CHROMIUM')
|
||||||
|
search = self.driver.find_element_by_name('q')
|
||||||
|
search.send_keys('butomo1989 docker-android')
|
||||||
|
search.submit()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.driver.quit()
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
"""Unit test to test app."""
|
||||||
|
import os
|
||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
import mock
|
||||||
|
|
||||||
|
from src import app
|
||||||
|
|
||||||
|
|
||||||
|
class TestApp(TestCase):
|
||||||
|
"""Unit test class to test other methods in the app."""
|
||||||
|
|
||||||
|
#create symlink
|
||||||
|
@classmethod
|
||||||
|
def test_symlink_correct(self):
|
||||||
|
os.mknod(os.path.join("./","testFile1.txt"))
|
||||||
|
app.symlink_force(os.path.join("./","testFile1.txt"),os.path.join("./","link_testFile1.txt"))
|
||||||
|
os.remove(os.path.join("./","testFile1.txt"))
|
||||||
|
os.remove(os.path.join("./","link_testFile1.txt"))
|
||||||
|
|
||||||
|
#link already exist
|
||||||
|
@classmethod
|
||||||
|
def test_symlink_already_exist(self):
|
||||||
|
os.mknod(os.path.join("./","testFile2.txt"))
|
||||||
|
os.mknod(os.path.join("./","link_testFile2.txt"))
|
||||||
|
app.symlink_force(os.path.join("./","testFile2.txt"),os.path.join("./","link_testFile2.txt"))
|
||||||
|
os.remove(os.path.join("./","testFile2.txt"))
|
||||||
|
os.remove(os.path.join("./","link_testFile2.txt"))
|
||||||
|
|
||||||
|
def test_valid_env(self):
|
||||||
|
key = 'ENV_1'
|
||||||
|
os.environ[key] = 'test'
|
||||||
|
app.get_or_raise(key)
|
||||||
|
del os.environ[key]
|
||||||
|
|
||||||
|
def test_invalid_env(self):
|
||||||
|
with self.assertRaises(RuntimeError):
|
||||||
|
app.get_or_raise('ENV_2')
|
||||||
|
|
||||||
|
def test_valid_bool(self):
|
||||||
|
self.assertEqual(app.convert_str_to_bool('True'), True)
|
||||||
|
self.assertEqual(app.convert_str_to_bool('t'), True)
|
||||||
|
self.assertEqual(app.convert_str_to_bool('1'), True)
|
||||||
|
self.assertEqual(app.convert_str_to_bool('YES'), True)
|
||||||
|
|
||||||
|
def test_invalid_bool(self):
|
||||||
|
self.assertEqual(app.convert_str_to_bool(''), False)
|
||||||
|
self.assertEqual(app.convert_str_to_bool('test'), False)
|
||||||
|
|
||||||
|
def test_invalid_format(self):
|
||||||
|
self.assertEqual(app.convert_str_to_bool(True), None)
|
||||||
|
|
||||||
|
@mock.patch('src.app.prepare_avd')
|
||||||
|
@mock.patch('subprocess.Popen')
|
||||||
|
def test_run_with_appium(self, mocked_avd, mocked_subprocess):
|
||||||
|
with mock.patch('src.app.appium_run') as mocked_appium:
|
||||||
|
os.environ['APPIUM'] = str(True)
|
||||||
|
app.run()
|
||||||
|
self.assertTrue(mocked_avd.called)
|
||||||
|
self.assertTrue(mocked_subprocess.called)
|
||||||
|
self.assertTrue(mocked_appium.called)
|
||||||
|
|
||||||
|
@mock.patch('src.app.prepare_avd')
|
||||||
|
@mock.patch('subprocess.Popen')
|
||||||
|
def test_run_withhout_appium(self, mocked_avd, mocked_subprocess):
|
||||||
|
with mock.patch('src.app.appium_run') as mocked_appium:
|
||||||
|
os.environ['APPIUM'] = str(False)
|
||||||
|
app.run()
|
||||||
|
self.assertTrue(mocked_avd.called)
|
||||||
|
self.assertTrue(mocked_subprocess.called)
|
||||||
|
self.assertFalse(mocked_appium.called)
|
||||||
@@ -14,6 +14,14 @@ class TestAppium(TestCase):
|
|||||||
os.environ['CONNECT_TO_GRID'] = str(True)
|
os.environ['CONNECT_TO_GRID'] = str(True)
|
||||||
self.avd_name = 'test_avd'
|
self.avd_name = 'test_avd'
|
||||||
|
|
||||||
|
@mock.patch('subprocess.check_call')
|
||||||
|
def test_chrome_driver(self, mocked_subprocess):
|
||||||
|
os.environ['CONNECT_TO_GRID'] = str(False)
|
||||||
|
os.environ['BROWSER'] = 'chrome'
|
||||||
|
self.assertFalse(mocked_subprocess.called)
|
||||||
|
app.appium_run(self.avd_name)
|
||||||
|
self.assertTrue(mocked_subprocess.called)
|
||||||
|
|
||||||
@mock.patch('subprocess.check_call')
|
@mock.patch('subprocess.check_call')
|
||||||
def test_without_selenium_grid(self, mocked_subprocess):
|
def test_without_selenium_grid(self, mocked_subprocess):
|
||||||
os.environ['CONNECT_TO_GRID'] = str(False)
|
os.environ['CONNECT_TO_GRID'] = str(False)
|
||||||
@@ -21,23 +29,29 @@ class TestAppium(TestCase):
|
|||||||
app.appium_run(self.avd_name)
|
app.appium_run(self.avd_name)
|
||||||
self.assertTrue(mocked_subprocess.called)
|
self.assertTrue(mocked_subprocess.called)
|
||||||
|
|
||||||
|
@mock.patch('os.popen')
|
||||||
@mock.patch('subprocess.check_call')
|
@mock.patch('subprocess.check_call')
|
||||||
def test_with_selenium_grid(self, mocked_subprocess):
|
def test_with_selenium_grid(self, mocked_os, mocked_subprocess):
|
||||||
with mock.patch('src.app.create_node_config') as mocked_config:
|
with mock.patch('src.app.create_node_config') as mocked_config:
|
||||||
self.assertFalse(mocked_config.called)
|
self.assertFalse(mocked_config.called)
|
||||||
|
self.assertFalse(mocked_os.called)
|
||||||
self.assertFalse(mocked_subprocess.called)
|
self.assertFalse(mocked_subprocess.called)
|
||||||
app.appium_run(self.avd_name)
|
app.appium_run(self.avd_name)
|
||||||
self.assertTrue(mocked_config.called)
|
self.assertTrue(mocked_config.called)
|
||||||
|
self.assertTrue(mocked_os.called)
|
||||||
self.assertTrue(mocked_subprocess.called)
|
self.assertTrue(mocked_subprocess.called)
|
||||||
|
|
||||||
|
@mock.patch('os.popen')
|
||||||
@mock.patch('subprocess.check_call')
|
@mock.patch('subprocess.check_call')
|
||||||
def test_invalid_integer(self, mocked_subprocess):
|
def test_invalid_integer(self, mocked_os, mocked_subprocess):
|
||||||
os.environ['APPIUM_PORT'] = 'test'
|
os.environ['APPIUM_PORT'] = 'test'
|
||||||
with mock.patch('src.app.create_node_config') as mocked_config:
|
with mock.patch('src.app.create_node_config') as mocked_config:
|
||||||
self.assertFalse(mocked_config.called)
|
self.assertFalse(mocked_config.called)
|
||||||
|
self.assertFalse(mocked_os.called)
|
||||||
self.assertFalse(mocked_subprocess.called)
|
self.assertFalse(mocked_subprocess.called)
|
||||||
app.appium_run(self.avd_name)
|
app.appium_run(self.avd_name)
|
||||||
self.assertFalse(mocked_config.called)
|
self.assertFalse(mocked_config.called)
|
||||||
|
self.assertTrue(mocked_os.called)
|
||||||
self.assertTrue(mocked_subprocess.called)
|
self.assertTrue(mocked_subprocess.called)
|
||||||
self.assertRaises(ValueError)
|
self.assertRaises(ValueError)
|
||||||
|
|
||||||
@@ -52,3 +66,5 @@ class TestAppium(TestCase):
|
|||||||
del os.environ['CONNECT_TO_GRID']
|
del os.environ['CONNECT_TO_GRID']
|
||||||
if os.getenv('APPIUM_PORT'):
|
if os.getenv('APPIUM_PORT'):
|
||||||
del os.environ['APPIUM_PORT']
|
del os.environ['APPIUM_PORT']
|
||||||
|
if os.getenv('BROWSER'):
|
||||||
|
del os.environ['BROWSER']
|
||||||
+24
-1
@@ -2,33 +2,56 @@
|
|||||||
nodaemon=true
|
nodaemon=true
|
||||||
logfile=%(ENV_LOG_PATH)s/supervisord.log
|
logfile=%(ENV_LOG_PATH)s/supervisord.log
|
||||||
childlogdir=%(ENV_LOG_PATH)s
|
childlogdir=%(ENV_LOG_PATH)s
|
||||||
|
priority=1
|
||||||
|
|
||||||
[program:xvfb]
|
[program:xvfb]
|
||||||
command=/usr/bin/Xvfb %(ENV_DISPLAY)s -screen %(ENV_SCREEN)s %(ENV_SCREEN_WIDTH)sx%(ENV_SCREEN_HEIGHT)sx%(ENV_SCREEN_DEPTH)s
|
command=/usr/bin/Xvfb %(ENV_DISPLAY)s -screen %(ENV_SCREEN)s %(ENV_SCREEN_WIDTH)sx%(ENV_SCREEN_HEIGHT)sx%(ENV_SCREEN_DEPTH)s
|
||||||
stdout_logfile=%(ENV_LOG_PATH)s/xvfb.stdout.log
|
stdout_logfile=%(ENV_LOG_PATH)s/xvfb.stdout.log
|
||||||
stderr_logfile=%(ENV_LOG_PATH)s/xvfb.stderr.log
|
stderr_logfile=%(ENV_LOG_PATH)s/xvfb.stderr.log
|
||||||
|
priority=1
|
||||||
|
|
||||||
[program:openbox]
|
[program:openbox]
|
||||||
command=/usr/bin/openbox-session
|
command=/usr/bin/openbox-session
|
||||||
stdout_logfile=%(ENV_LOG_PATH)s/openbox.stdout.log
|
stdout_logfile=%(ENV_LOG_PATH)s/openbox.stdout.log
|
||||||
stderr_logfile=%(ENV_LOG_PATH)s/openbox.stderr.log
|
stderr_logfile=%(ENV_LOG_PATH)s/openbox.stderr.log
|
||||||
|
priority=2
|
||||||
|
|
||||||
[program:x11vnc]
|
[program:x11vnc]
|
||||||
command=/usr/bin/x11vnc -display %(ENV_DISPLAY)s -nopw -forever -shared
|
command=/usr/bin/x11vnc -display %(ENV_DISPLAY)s -nopw -forever -shared
|
||||||
stdout_logfile=%(ENV_LOG_PATH)s/x11vnc.stdout.log
|
stdout_logfile=%(ENV_LOG_PATH)s/x11vnc.stdout.log
|
||||||
stderr_logfile=%(ENV_LOG_PATH)s/x11vnc.stderr.log
|
stderr_logfile=%(ENV_LOG_PATH)s/x11vnc.stderr.log
|
||||||
|
priority=2
|
||||||
|
|
||||||
[program:novnc]
|
[program:novnc]
|
||||||
command=./noVNC/utils/launch.sh --vnc localhost:%(ENV_LOCAL_PORT)s --listen %(ENV_TARGET_PORT)s
|
command=./noVNC/utils/launch.sh --vnc localhost:%(ENV_LOCAL_PORT)s --listen %(ENV_TARGET_PORT)s
|
||||||
stdout_logfile=%(ENV_LOG_PATH)s/novnc.stdout.log
|
stdout_logfile=%(ENV_LOG_PATH)s/novnc.stdout.log
|
||||||
stderr_logfile=%(ENV_LOG_PATH)s/novnc.stderr.log
|
stderr_logfile=%(ENV_LOG_PATH)s/novnc.stderr.log
|
||||||
|
priority=2
|
||||||
|
|
||||||
[program:port-forward]
|
[program:port-forward]
|
||||||
command=./src/port_forward.sh
|
command=./src/port_forward.sh
|
||||||
autorestart=false
|
autorestart=false
|
||||||
|
priority=1
|
||||||
|
|
||||||
|
;startsecs to fix "not expected" error. see: https://github.com/Supervisor/supervisor/issues/212#issuecomment-47933372
|
||||||
|
[program:android-screen-mirror]
|
||||||
|
command=./src/asm.sh
|
||||||
|
autorestart=false
|
||||||
|
startsecs=0
|
||||||
|
stdout_logfile=%(ENV_LOG_PATH)s/android-screen-mirror.stdout.log
|
||||||
|
stderr_logfile=%(ENV_LOG_PATH)s/android-screen-mirror.stderr.log
|
||||||
|
priority=3
|
||||||
|
|
||||||
[program:docker-appium]
|
[program:docker-appium]
|
||||||
command=python3 -m src.app
|
command=./src/appium.sh
|
||||||
autorestart=false
|
autorestart=false
|
||||||
stdout_logfile=%(ENV_LOG_PATH)s/docker-android.stdout.log
|
stdout_logfile=%(ENV_LOG_PATH)s/docker-android.stdout.log
|
||||||
stderr_logfile=%(ENV_LOG_PATH)s/docker-android.stderr.log
|
stderr_logfile=%(ENV_LOG_PATH)s/docker-android.stderr.log
|
||||||
|
priority=4
|
||||||
|
|
||||||
|
[program:auto-recording]
|
||||||
|
command=./src/record.sh auto_record
|
||||||
|
autorestart=false
|
||||||
|
stdout_logfile=%(ENV_LOG_PATH)s/video-recording.stdout.log
|
||||||
|
stderr_logfile=%(ENV_LOG_PATH)s/video-recording.stderr.log
|
||||||
|
priority=4
|
||||||
|
|||||||
@@ -5,10 +5,15 @@ if [ -z "$TRAVIS_TAG" ]; then
|
|||||||
echo "UNIT TEST ONLY"
|
echo "UNIT TEST ONLY"
|
||||||
bash release.sh test all all 0.1
|
bash release.sh test all all 0.1
|
||||||
else
|
else
|
||||||
echo "Log in to docker hub"
|
if [ ! -z "$ANDROID_VERSION" ]; then
|
||||||
docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
|
echo "Log in to docker hub"
|
||||||
echo "[Version: $ANDROID_VERSION] RUN UNIT TEST, BUILD DOCKER IMAGES AND PUSH THOSE TO DOCKER HUB"
|
docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
|
||||||
bash release.sh all $ANDROID_VERSION all $TRAVIS_TAG
|
echo "[Version: $ANDROID_VERSION] RUN UNIT TEST, BUILD DOCKER IMAGES AND PUSH THOSE TO DOCKER HUB"
|
||||||
|
bash release.sh all $ANDROID_VERSION all $TRAVIS_TAG
|
||||||
|
elif [ ! -z "$REAL_DEVICE" ]; then
|
||||||
|
echo "[SUPPORT FOR REAL DEVICE: BUILD DOCKER IMAGES AND PUSH THOSE TO DOCKER HUB ]"
|
||||||
|
bash release_real.sh all $TRAVIS_TAG
|
||||||
|
fi
|
||||||
echo "Log out of docker hub"
|
echo "Log out of docker hub"
|
||||||
docker logout
|
docker logout
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user