Add docker-compose for development build

Signed-off-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
This commit is contained in:
Andrea Maria Piana 2018-04-10 09:29:18 +01:00
parent f406feacc7
commit 31728d5493
No known key found for this signature in database
GPG Key ID: AA6CCA6DE0E06424
6 changed files with 294 additions and 10 deletions

114
.dockerignore Normal file
View File

@ -0,0 +1,114 @@
.dockerignore
docker-build
env/dev/env/config.cljs
modules/react-native-status/android/build
# OSX
#
.DS_Store
.projectile
.cljs_rhino_repl/
.#*
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
project.xcworkspace
# Android/IJ
#
.idea
.gradle
local.properties
*.iml
# Atom
.tags*
# node.js
#
node_modules/
npm-debug.log
.nvmrc
# BUCK
buck-out/
\.buckd/
android/app/libs
android/app/obj
android/app/build
android/build
android/keystores/debug.keystore
# Generated by re-natal
#
index.android.js
index.ios.js
target/
env/dev/env/config.cljs
.re-natal.local
externs/
shim.js
# Generated by lein voom
#
/pom.xml
# Figwheel
#
figwheel_server.log
.nrepl-port
# Lein
#
.lein-failures
.lein-repl-history
## Doo
#
out
doo-index.html
# Re-natal
re-natal
# Status
Statusgo.framework
status-go-local.aar
status-dev-cli
#ios
ios/Pods
ios/StatusIm.xcworkspace
.ruby-version
#python
*.pyc
*.cache
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/
*/fastlane/report.xml
*/fastlane/Preview.html
*/fastlane/screenshots

View File

@ -1,4 +1,4 @@
.PHONY: react-native test .PHONY: react-native test setup
help: ##@other Show this help help: ##@other Show this help
@perl -e '$(HELP_FUN)' $(MAKEFILE_LIST) @perl -e '$(HELP_FUN)' $(MAKEFILE_LIST)
@ -130,18 +130,23 @@ geth-connect: ##@other Connect to Geth on the device
adb forward tcp:8545 tcp:8545 adb forward tcp:8545 tcp:8545
build/bin/geth attach http://localhost:8545 build/bin/geth attach http://localhost:8545
android-ports: ##@other Add reverse proxy to Android Device/Simulator android-ports-avd: ##@other Add reverse proxy to Android Device/Simulator
adb reverse tcp:8081 tcp:8081 adb -e reverse tcp:8081 tcp:8081
adb reverse tcp:3449 tcp:3449 adb -e reverse tcp:3449 tcp:3449
adb reverse tcp:4567 tcp:4567 adb -e reverse tcp:4567 tcp:4567
android-ports-real: ##@other Add reverse proxy to Android Device/Simulator
adb -d reverse tcp:8081 tcp:8081
adb -d reverse tcp:3449 tcp:3449
adb -d reverse tcp:4567 tcp:4567
startdev-%: startdev-%:
$(eval SYSTEM := $(word 2, $(subst -, , $@))) $(eval SYSTEM := $(word 2, $(subst -, , $@)))
$(eval DEVICE := $(word 3, $(subst -, , $@))) $(eval DEVICE := $(word 3, $(subst -, , $@)))
if [[ "$(SYSTEM)" == "android" ]]; then\ case "$(SYSTEM)" in \
${MAKE} prepare && ${MAKE} android-ports; \ "android") ${MAKE} prepare && ${MAKE} android-ports-$(DEVICE);; \
else \ "ios") ${MAKE} prepare-ios;; \
${MAKE} prepare-ios; \ esac
fi
${MAKE} dev-$(SYSTEM)-$(DEVICE) ${MAKE} dev-$(SYSTEM)-$(DEVICE)
${MAKE} -j2 react-native repl-$(SYSTEM) ${MAKE} -j2 react-native repl-$(SYSTEM)

99
docker-build/Dockerfile Normal file
View File

@ -0,0 +1,99 @@
FROM openjdk:8-jdk
ENV DEBIAN_FRONTEND noninteractive
ENV ANDROID_HOME /opt/android-sdk-linux
ENV PATH ${PATH}:${ANDROID_HOME}/tools/bin:${ANDROID_HOME}/platform-tools:${PATH}:${ANDROID_HOME}/tools
ENV ANDROID_NDK /opt/android-ndk-linux
ENV ANDROID_NDK_HOME /opt/android-ndk-linux
WORKDIR /opt
RUN mkdir -p /opt/android-sdk-linux && mkdir -p ~/.android && touch ~/.android/repositories.cfg
# Install dependencies
RUN apt-get update && \
apt-get install -yq supervisor curl unzip wget sudo maven libc6 libstdc++6 zlib1g libncurses5 make file --no-install-recommends && \
apt-get clean
RUN cd /opt/android-sdk-linux && \
wget -q --output-document=sdk-tools.zip https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip && \
unzip sdk-tools.zip && \
rm -f sdk-tools.zip && \
sdkmanager "cmake;3.6.4111459"
RUN cd /opt/android-sdk-linux && \
wget -q --output-document=sdk-platform-tools.zip 'https://dl.google.com/android/repository/platform-tools-latest-linux.zip' && \
unzip sdk-platform-tools.zip && \
rm -f sdk-platform-tools.zip
RUN wget -q --output-document=android-ndk.zip https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip && \
unzip android-ndk.zip && \
rm -f android-ndk.zip && \
mv android-ndk-r15c android-ndk-linux
RUN yes | sdkmanager --licenses
# install Node JS (https://github.com/nodejs/docker-node/blob/90d5e3df903b830d039d3fe8f30e3a62395db37e/7.5/Dockerfile)
RUN groupadd --gid 1000 node \
&& useradd --uid 1000 --gid node --shell /bin/bash --create-home node
ENV NPM_CONFIG_LOGLEVEL info
# that's the only version that doesn't hang on installing react-native-http inside docker
ENV NODE_VERSION 8.9.1
ENV NODE_ENV development
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs
# END install Node JS
# Support Gradle
ENV TERM dumb
# Install Lein
# Check out latest releases from https://github.com/technomancy/leiningen/releases
ENV LEIN_VERSION=2.8.1
ENV LEIN_INSTALL=/usr/local/bin/
RUN mkdir -p $LEIN_INSTALL \
&& wget -q https://raw.githubusercontent.com/technomancy/leiningen/$LEIN_VERSION/bin/lein-pkg \
&& mv lein-pkg $LEIN_INSTALL/lein \
&& chmod 0755 $LEIN_INSTALL/lein \
&& wget -q https://github.com/technomancy/leiningen/releases/download/$LEIN_VERSION/leiningen-$LEIN_VERSION-standalone.zip \
&& mkdir -p /usr/share/java \
&& mv leiningen-$LEIN_VERSION-standalone.zip /usr/share/java/leiningen-$LEIN_VERSION-standalone.jar
# Install React-Native
RUN npm install -g react-native-cli
# Add files needed for installing dependencies
# Use directory /build for that purpose
WORKDIR /build
ADD .env.jenkins .env
ADD ./project.clj ./
RUN lein deps
ADD ./package.json package-lock.json ./
RUN npm install
ADD . ./
RUN make setup
RUN make prepare
COPY supervisord.conf /etc/supervisord.conf
RUN keytool -genkey -v -keystore status-im.keystore -storepass password -alias status -keyalg RSA -keysize 2048 -validity 10000 -dname "CN=mqttserver.ibm.com, OU=ID, O=IBM, L=Hursley, S=Hants, C=GB" -keypass password
RUN mkdir -p /root/.gradle
RUN mv status-im.keystore /root/.gradle/
RUN ./android/gradlew --parallel -q -b android/build.gradle assembleRelease
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]

37
docker-build/README.md Normal file
View File

@ -0,0 +1,37 @@
# Build
```
docker-compose -f docker-build/docker-compose.yml build
```
This will install all the required sdks, depending on the connection will take some time.
# Run
```
docker-compose -f docker-build/docker-compose.yml up
```
This will start `adbd` and `fighwheel` listening on port `4567`.
You need to connect your device and accept the key.
After the figwheel prompt you can install the application running:
```
docker-compose -f docker-build/docker-compose.yml exec adbd make run-android
```
# Notes
## Adbd key
The adbd key is generated every time you start/stop the container, so you will have to accept it if that happens.
## Security
This will give the docker image access to your USB devices and run in priviliged mode, so run at your own risk.
## Multiple adbd
You will need to make sure no `adbd` is running on your local machine, as that would interfer with the one running in docker.

View File

@ -0,0 +1,15 @@
version: '3'
services:
adbd:
privileged: true
build:
context: $PWD
dockerfile: docker-build/Dockerfile
ports:
- 4567:4567
volumes:
- /dev/bus/usb:/dev/bus/usb
- ../src:/build/src
- ../test:/build/test
- ../android/app/src/:/build/android/app/src

14
supervisord.conf Normal file
View File

@ -0,0 +1,14 @@
[supervisord]
nodaemon = true
[program:fighweel]
command = make startdev-android-real
autorestart = true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stdout
stderr_logfile_maxbytes=0
[program:adbd]
command = adb -a -P 5037 server nodaemon
autorestart = true