Compare commits

...
30 Commits
Author SHA1 Message Date
butomo1989 77a1216730 Added docker-android users statistics 2020-07-13 14:20:51 +02:00
butomo1989 56e01002da Added Android 11.0 into travis configuration 2020-07-13 14:10:42 +02:00
butomo1989 287378162f Updated base image 2020-07-13 13:04:49 +02:00
butomo1989 8affae0fa1 Added Android 11.0 2020-07-13 13:03:58 +02:00
Budi UtomoandGitHub ca28b7ad10 Merge pull request #253 from analogue/update_readme_no_google_play
Update README to call out that google play store not installed
2020-07-12 18:54:47 +02:00
Budi UtomoandGitHub edebdfd380 Merge branch 'master' into update_readme_no_google_play 2020-07-12 18:46:08 +02:00
Budi UtomoandGitHub ddf0a451c9 Merge pull request #252 from analogue/fix_crashing_when_run_by_default_as_root_user
Workaround for "Running as root without --no-sandbox is not supported"
2020-07-12 18:45:40 +02:00
analogue fcc439b938 Update README to call out that play store not installed 2020-07-12 10:55:39 -05:00
analogue 68ac0c42ce Workaround crashing when run by default as root user 2020-07-12 09:56:22 -05:00
butomo1989 666d3eaee6 [Fixed issue in codacy] Using correct operator 2020-07-02 14:24:52 +02:00
butomo1989 ecfaf236b9 [Fixed issue in codacy] Added semi-colon 2020-07-02 14:24:18 +02:00
butomo1989 a5714c805d Fixed quote 2020-07-02 14:19:51 +02:00
butomo1989 9eb4b3c595 Fixed link 2020-07-02 14:18:17 +02:00
butomo1989 0389f64365 Removed duplicated note 2020-07-02 14:17:30 +02:00
butomo1989 ba476eb993 Merge branch 'master' of github.com:butomo1989/docker-android 2020-07-02 14:16:18 +02:00
butomo1989 9b2bc985e0 Added sample config of nginx 2020-07-02 14:16:02 +02:00
Budi UtomoandGitHub 1a9b9361e6 Merge pull request #248 from p0vidl0/master
Add selenium session timeout configuration via environment variable
2020-07-02 09:16:28 +02:00
Budi UtomoandGitHub abdb45ea0b Merge branch 'master' into master 2020-07-01 11:19:06 +02:00
butomo1989 b9d6237eb4 Added example to pass password through url 2020-07-01 11:06:05 +02:00
butomo1989 5936037a56 Removed unused lines 2020-06-26 16:02:58 +02:00
butomo1989 0460a62956 Added example of using nginx 2020-06-26 16:01:12 +02:00
Aleksandr Kalashnikov 6403ff78be Add selenium session timeout configuration via environment variable 2020-06-26 10:17:08 +06:00
butomo1989 7ad2eb45c8 Able to have pass in vnc 2020-06-18 16:08:48 +02:00
butomo1989 ea5661fa41 Added note 2020-06-17 17:14:57 +02:00
butomo1989 f323d29aa4 Fixed build issue for API 28 2020-06-17 17:14:50 +02:00
butomo1989 eec0c5df02 Fixed build issue for API 28 2020-06-17 12:21:36 +02:00
butomo1989 b66c5d122a Disabled apklinker 2020-05-08 15:03:47 +02:00
butomo1989 8289bc166f Using Appium 1.17.1 2020-05-08 14:18:14 +02:00
butomo1989 d1e9f7472b Added sponsor link 2020-04-25 09:08:24 +02:00
butomo1989 a22152fd4d Using Appium 1.17.0 2020-04-15 13:13:09 +02:00
20 changed files with 235 additions and 18 deletions
+17
View File
@@ -0,0 +1,17 @@
# These are supported funding model platforms
# Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
github: [budtmo]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
# Bitcoin (BTC)
custom:
- "paypal.me/budtmo"
+1
View File
@@ -20,6 +20,7 @@ env:
- ANDROID_VERSION=8.1
- ANDROID_VERSION=9.0
- ANDROID_VERSION=10.0
- ANDROID_VERSION=11.0
- REAL_DEVICE=True
- GENYMOTION=True
+9 -3
View File
@@ -52,6 +52,7 @@ List of Docker images
|Linux|8.1|27|chrome|61.0|2.33|budtmo/docker-android-x86-8.1|[![](https://images.microbadger.com/badges/image/budtmo/docker-android-x86-8.1.svg)](https://microbadger.com/images/budtmo/docker-android-x86-8.1 "Get your own image badge on microbadger.com")|
|Linux|9.0|28|chrome|66.0|2.40|budtmo/docker-android-x86-9.0|[![](https://images.microbadger.com/badges/image/budtmo/docker-android-x86-9.0.svg)](https://microbadger.com/images/budtmo/docker-android-x86-9.0 "Get your own image badge on microbadger.com")|
|Linux|10.0|29|chrome|74.0|74.0.3729.6|budtmo/docker-android-x86-10.0|[![](https://images.microbadger.com/badges/image/budtmo/docker-android-x86-10.0.svg)](https://microbadger.com/images/budtmo/docker-android-x86-10.0 "Get your own image badge on microbadger.com")|
|Linux|11.0|30|chrome|83.0|83.0.4103.39|budtmo/docker-android-x86-11.0|[![](https://images.microbadger.com/badges/image/budtmo/docker-android-x86-11.0.svg)](https://microbadger.com/images/budtmo/docker-android-x86-11.0 "Get your own image badge on microbadger.com")|
|All |-|-|-|-|-|budtmo/docker-android-real-device|[![](https://images.microbadger.com/badges/image/budtmo/docker-android-real-device.svg)](https://microbadger.com/images/budtmo/docker-android-real-device "Get your own image badge on microbadger.com")|
|All|All|All|All|All|All|budtmo/docker-android-genymotion|[![](https://images.microbadger.com/badges/image/budtmo/docker-android-genymotion.svg)](https://microbadger.com/images/budtmo/docker-android-genymotion "Get your own image badge on microbadger.com")|
@@ -101,7 +102,7 @@ Quick Start
- For different OS, localhost should work.
3. Open ***http://docker-host-ip-address:6080*** from web browser.
3. Open ***http://docker-host-ip-address:6080*** from web browser. Note: Adding ```?view_only=true``` will give user only view only permission.
Custom configurations
---------------------
@@ -208,8 +209,7 @@ SMS Simulation
Google Play Services and Google Play Store
------------------------------------------
Docker-Android contains Google Play Service (v12.8.74) and Google Play Store (v11.0.50). Both applications are downloaded from [apklinker](https://www.apklinker.com/), so please be aware of it in case you use private/company account to that applications.
Not installed at this time.
Jenkins
-------
@@ -251,6 +251,12 @@ Security
--------
All docker images are protected by [Polyverse](https://polyverse.io/) by scrambling the Linux packages. For more information please read [this](https://polyverse.io/how-it-works/)
Users
-----
Docker-Android are being used by 100+ countries around the world.
[![ga-datastudio-docker-android](./images/users.png)](https://datastudio.google.com/s/ht7HVKHKAQE)
Special Thanks
--------------
- [Gian Christanto] for creating a great logo!
+1
View File
@@ -24,6 +24,7 @@ It is also possible to connect appium server that run inside docker-android with
- APPIUM_PORT=\<port\_number>
- SELENIUM_HOST="\<host\_ip\_address>"
- SELENIUM_PORT=\<port\_number>
- SELENIUM_TIMEOUT=\<timeout\_in\_seconds>
To run tests for mobile browser, following parameter can be passed:
+10
View File
@@ -1,3 +1,8 @@
VNC pass
--------
Passing ```VNC_PASSWORD="your_pass_here"``` will secure your vnc connection.
Proxy
-----
@@ -72,3 +77,8 @@ docker run --privileged -d -p 6080:6080 -p 4723:4723 -p 5554:5554 -p 5555:5555 -
```
For the first run, this will create a new avd and all the changes will be accessible in the `local_backup` directory. Now for all future runs, it will reuse the avds. Even this should work with new releases of `docker-android`
Nginx
-----
Sample nginx configuration can be found [here](nginx)
+10 -3
View File
@@ -1,4 +1,4 @@
FROM appium/appium:1.16.0-p2
FROM appium/appium:1.17.1-p1
LABEL maintainer "Budi Utomo <budtmo.os@gmail.com>"
@@ -142,8 +142,8 @@ RUN wget -nv -O chrome.zip "https://chromedriver.storage.googleapis.com/${CHROME
#================================================================
# Download Google Play Services APK and Play Store from apklinker
#================================================================
Run wget -nv -O google_play_services.apk "https://www.apklinker.com/wp-content/uploads/uploaded_apk/5b5155e5ef4f8/com.google.android.gms_${GOOGLE_PLAY_SERVICE}-020700-204998136_12874013_MinAPI21_(x86)(nodpi)_apklinker.com.apk"
Run wget -nv -O google_play_store.apk "https://www.apklinker.com/wp-content/uploads/uploaded_apk/5b632b1164e31/com.android.vending_${GOOGLE_PLAY_STORE}-all-0-PR-206665793_81105000_MinAPI16_(armeabi,armeabi-v7a,mips,mips64,x86,x86_64)(240,320,480dpi)_apklinker.com.apk"
#Run wget -nv -O google_play_services.apk "https://www.apklinker.com/wp-content/uploads/uploaded_apk/5b5155e5ef4f8/com.google.android.gms_${GOOGLE_PLAY_SERVICE}-020700-204998136_12874013_MinAPI21_(x86)(nodpi)_apklinker.com.apk"
#Run wget -nv -O google_play_store.apk "https://www.apklinker.com/wp-content/uploads/uploaded_apk/5b632b1164e31/com.android.vending_${GOOGLE_PLAY_STORE}-all-0-PR-206665793_81105000_MinAPI16_(armeabi,armeabi-v7a,mips,mips64,x86,x86_64)(240,320,480dpi)_apklinker.com.apk"
#================================================
# noVNC Default Configurations
@@ -171,6 +171,13 @@ ADD src/.fehbg /root/.fehbg
ADD src/rc.xml /etc/xdg/openbox/rc.xml
RUN echo /root/.fehbg >> /etc/xdg/openbox/autostart
#======================
# Workarounds
#======================
# Fix emulator from crashing when running as root user.
# See https://github.com/budtmo/docker-android/issues/223
ENV QTWEBENGINE_DISABLE_SANDBOX=1
#===============
# Expose Ports
#---------------
+1 -1
View File
@@ -1,4 +1,4 @@
FROM appium/appium:1.16.0-p2
FROM appium/appium:1.17.1-p1
LABEL maintainer "Budi Utomo <budtmo.os@gmail.com>"
+1 -1
View File
@@ -1,4 +1,4 @@
FROM appium/appium:1.16.0-p2
FROM appium/appium:1.17.1-p1
LABEL maintainer "Budi Utomo <budtmo.os@gmail.com>"
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

+16
View File
@@ -0,0 +1,16 @@
Nginx
-----
You can have one page which contains the list of running containers.
##### Quick Start
1. Run 2 docker-android containers which have port 6081 and 6082
2. Run docker-nginx
```
docker run -d --name nginx --network host -v $PWD/conf.d:/etc/nginx/conf.d nginx:1.18.0
```
3. Open [http://127.0.0.1](http://127.0.0.1) from Web-Browser to see the list of running containers OR open ```http://127.0.0.1/container-1/?nginx=&path=/container-1/websockify&view_only=true&password=secr3t``` to see specific container.
+11
View File
@@ -0,0 +1,11 @@
containers = '[\
{\
"No": "1", \
"Name": "Emulator 01", \
"VNC": "http://127.0.0.1/container-1/?nginx=&path=/container-1/websockify&view_only=true"\
}, \
{\
"No": "2", \
"Name": "Emulator 02", \
"VNC": "http://127.0.0.1/container-2/?nginx=&path=/container-2/websockify&view_only=true"\
}]';
+43
View File
@@ -0,0 +1,43 @@
server {
listen 80;
server_name _;
location / {
root /etc/nginx/conf.d;
index index.html;
}
location /container-1/ {
proxy_pass http://127.0.0.1:6081/;
}
location /container-1/websockify {
proxy_pass http://127.0.0.1:6081/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# VNC connection timeout
proxy_read_timeout 61s;
# Disable cache
proxy_buffering off;
}
location /container-2/ {
proxy_pass http://127.0.0.1:6082/;
}
location /container-2/websockify {
proxy_pass http://127.0.0.1:6082/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# VNC connection timeout
proxy_read_timeout 61s;
# Disable cache
proxy_buffering off;
}
}
+13
View File
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>List of docker-android containers</title>
<link href="styles/main.css" type="text/css" rel="stylesheet">
</head>
<body>
<div id="showData"></div>
<script type="text/javascript" src="data/data.json"></script>
<script src="scripts/main.js" type="text/javascript"></script>
</body>
</html>
+55
View File
@@ -0,0 +1,55 @@
var devices = JSON.parse(containers);
var headers = [];
for (var pos = 0; pos < devices.length; pos++) {
for (var deviceKey in devices[pos]) {
// Check if key is already added to headers
if (headers.indexOf(deviceKey) === -1) {
headers.push(deviceKey);
}
}
}
// Create a table
var table = document.createElement("table");
// Insert table header
var tr = table.insertRow(-1);
for (var pos = 0; pos < headers.length; pos++) {
var th = document.createElement("th"); // TABLE HEADER.
var header = headers[pos];
th.innerHTML = header;
tr.appendChild(th);
}
// Insert table content
for (var pos = 0; pos < devices.length; pos++) {
tr = table.insertRow(-1);
for (var index = 0; index < headers.length; index++) {
var td = document.createElement("td");
var content = devices[pos][headers[index]];
if (index === 1) {
var link = document.createElement("a");
link.href = devices[pos][headers[index+1]];
link.innerHTML = content;
td.appendChild(link);
} else if (index === 2) {
var object = document.createElement("object");
object.type = "text/html";
object.data = content;
object.width = "950px";
object.height = "950px";
td.appendChild(object);
} else {
td.innerHTML = content;
}
tr.appendChild(td);
}
}
// Put the table inside div
var divContainer = document.getElementById("showData");
divContainer.innerHTML = "";
divContainer.appendChild(table);
+13
View File
@@ -0,0 +1,13 @@
th, td {
font:14px Verdana;
}
table, th, td
{
border: solid 1px #DDD;
border-collapse: collapse;
padding: 2px 3px;
text-align: center;
}
th {
font-weight:bold;
}
+13 -5
View File
@@ -10,7 +10,7 @@ else
fi
if [ -z "$2" ]; then
read -p "Android version (5.0.1|5.1.1|6.0|7.0|7.1.1|8.0|8.1|9.0|10.0|all): " ANDROID_VERSION
read -p "Android version (5.0.1|5.1.1|6.0|7.0|7.1.1|8.0|8.1|9.0|10.0|11.0|all): " ANDROID_VERSION
else
ANDROID_VERSION=$2
fi
@@ -31,6 +31,7 @@ declare -A list_of_levels=(
[8.1]=27
[9.0]=28
[10.0]=29
[11.0]=30
)
# The version of the Chrome browser installed on the Android emulator needs to be known beforehand
@@ -45,6 +46,7 @@ declare -A chromedriver_versions=(
[8.1]="2.33"
[9.0]="2.40"
[10.0]="74.0.3729.6"
[11.0]="83.0.4103.39"
)
function get_android_versions() {
@@ -147,10 +149,16 @@ function build() {
# It is because there is no ARM EABI v7a System Image for 6.0
IMG_TYPE=google_apis
BROWSER=browser
elif [ "$v" == "" ]; then
IMG_TYPE=google_apis
BROWSER=chrome
else
#adb root cannot be run in IMG_TYPE=google_apis_playstore
IMG_TYPE=google_apis
BROWSER=chrome
if [ "$v" == "9.0" ]; then
processor=x86_64
fi
fi
echo "[BUILD] IMAGE TYPE: $IMG_TYPE"
level=${list_of_levels[$v]}
@@ -159,8 +167,8 @@ function build() {
echo "[BUILD] System Image: $sys_img"
chrome_driver="${chromedriver_versions[$v]}"
echo "[BUILD] chromedriver version: $chrome_driver"
image_version="$IMAGE-$processor-$v:$RELEASE"
image_latest="$IMAGE-$processor-$v:latest"
image_version="$IMAGE-x86-$v:$RELEASE"
image_latest="$IMAGE-x86-$v:latest"
echo "[BUILD] Image name: $image_version and $image_latest"
echo "[BUILD] Dockerfile: $FILE_NAME"
docker build -t $image_version --build-arg TOKEN=$TOKEN --build-arg ANDROID_VERSION=$v --build-arg API_LEVEL=$level \
@@ -174,8 +182,8 @@ function build() {
function push() {
# Push docker image(s)
for v in "${versions[@]}"; do
image_version="$IMAGE-$processor-$v:$RELEASE"
image_latest="$IMAGE-$processor-$v:latest"
image_version="$IMAGE-x86-$v:$RELEASE"
image_latest="$IMAGE-x86-$v:latest"
echo "[PUSH] Image name: $image_version and $image_latest"
docker push $image_version
docker push $image_latest
+6 -3
View File
@@ -148,8 +148,10 @@ def appium_run(avd_name: str):
appium_port = int(os.getenv('APPIUM_PORT', 4723))
selenium_host = os.getenv('SELENIUM_HOST', '172.17.0.1')
selenium_port = int(os.getenv('SELENIUM_PORT', 4444))
selenium_timeout = int(os.getenv('SELENIUM_TIMEOUT', 30))
browser_name = default_web_browser if mobile_web_test else 'android'
create_node_config(avd_name, browser_name, appium_host, appium_port, selenium_host, selenium_port)
create_node_config(avd_name, browser_name, appium_host, appium_port, selenium_host, selenium_port,
selenium_timeout)
cmd += ' --nodeconfig {file}'.format(file=CONFIG_FILE)
except ValueError as v_err:
logger.error(v_err)
@@ -158,7 +160,7 @@ def appium_run(avd_name: str):
def create_node_config(avd_name: str, browser_name: str, appium_host: str, appium_port: int, selenium_host: str,
selenium_port: int):
selenium_port: int, selenium_timeout: int):
"""
Create custom node config file in json format to be able to connect with selenium server.
@@ -167,6 +169,7 @@ def create_node_config(avd_name: str, browser_name: str, appium_host: str, appiu
:param appium_port: Port number where where appium server is running
:param selenium_host: Host where selenium server is running
:param selenium_port: Port number where selenium server is running
:param selenium_timeout: Selenium session timeout in seconds
"""
config = {
'capabilities': [
@@ -181,7 +184,7 @@ def create_node_config(avd_name: str, browser_name: str, appium_host: str, appiu
],
'configuration': {
'cleanUpCycle': 2000,
'timeout': 30,
'timeout': selenium_timeout,
'proxy': 'org.openqa.grid.selenium.proxy.DefaultRemoteProxy',
'url': 'http://{host}:{port}/wd/hub'.format(host=appium_host, port=appium_port),
'host': appium_host,
+1 -1
View File
@@ -58,7 +58,7 @@ class TestAppium(TestCase):
def test_config_creation(self):
from src import CONFIG_FILE
self.assertFalse(os.path.exists(CONFIG_FILE))
app.create_node_config('test', 'android', '127.0.0.1', 4723, '127.0.0.1', 4444)
app.create_node_config('test', 'android', '127.0.0.1', 4723, '127.0.0.1', 4444, 30)
self.assertTrue(os.path.exists(CONFIG_FILE))
os.remove(CONFIG_FILE)
Executable
+13
View File
@@ -0,0 +1,13 @@
#!/bin/bash
vnc="/usr/bin/x11vnc -display ${DISPLAY} -forever -shared "
pass_path="/root/vncpass"
if [ ! -z "${VNC_PASSWORD}" ]; then
/usr/bin/x11vnc -storepasswd ${VNC_PASSWORD} ${pass_path}
param="-rfbauth ${pass_path}"
else
param="-nopw"
fi
${vnc}${param}
+1 -1
View File
@@ -17,7 +17,7 @@ stderr_logfile=%(ENV_LOG_PATH)s/openbox.stderr.log
priority=2
[program:x11vnc]
command=/usr/bin/x11vnc -display %(ENV_DISPLAY)s -nopw -forever -shared
command=./src/vnc.sh
stdout_logfile=%(ENV_LOG_PATH)s/x11vnc.stdout.log
stderr_logfile=%(ENV_LOG_PATH)s/x11vnc.stderr.log
priority=2