Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add docker build files #53

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,4 @@ dist
docs/build
sideband*.egg-info
sbapp*.egg-info
key.keystore
65 changes: 65 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
FROM ubuntu:22.04 as build

# Install dependencies
RUN DEBIAN_FRONTEND=noninteractive \
apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y git libffi-dev python3-dev python3-virtualenv libssl-dev autoconf openjdk-17-jdk cmake libtool libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev libtk8.6 libgdm-dev libdb4o-cil-dev libpcap-dev unzip zip wget apksigner \
&& apt-get install --reinstall python3

WORKDIR "/root"

# Copy Sideband
COPY ./ Sideband/

# Copy gradle init file
COPY docker/init.gradle .gradle/

# Clone required repos
RUN git clone https://github.com/markqvist/Reticulum \
&& git clone https://github.com/markqvist/LXMF

# Fetch files required for sideband local repository

RUN mkdir dist_archive

WORKDIR "dist_archive"

# Get latest version of whl packages from PyPI
COPY docker/dist_env .

RUN export PACKAGENAME=rns; . ./dist_env; wget --content-disposition -q ${DL_URL}; \
export PACKAGENAME=rnspure; . ./dist_env; wget --content-disposition -q ${DL_URL}; \
export PACKAGENAME=lxmf; . ./dist_env; wget --content-disposition -q ${DL_URL}; \
export PACKAGENAME=nomadnet; . ./dist_env; wget --content-disposition -q ${DL_URL}; \
export PACKAGENAME=rnsh; . ./dist_env; wget --content-disposition -q ${DL_URL}; \
export PACKAGENAME=sbapp; . ./dist_env; wget --content-disposition -q ${DL_URL};

# Get latest RNode Firmware release
RUN export VERSION=$(wget -qO - https://api.github.com/repos/markqvist/RNode_Firmware/releases/latest | grep "zipball_url" | grep -oP "\d+\.\d+"); \
wget -qO - https://api.github.com/repos/markqvist/RNode_Firmware/releases/latest \
| grep "zipball_url" | cut -d : -f 2,3 \
| tr -d \", | wget -qi - -O RNode_Firmware_${VERSION}_Source.zip

# Get source for reticulum.network and unsigned.io sites
RUN git clone https://github.com/markqvist/reticulum_website reticulum.network \
&& cp reticulum.network/docs/manual/Reticulum\ Manual.pdf . \
&& cp reticulum.network/docs/manual/Reticulum\ Manual.epub .

# A mirror can also be accessed at https://liberatedsystems.co.uk/unsigned_io_archive.zip if unsigned.io is down!
RUN wget -q https://unsigned.io/unsigned_io_archive.zip \
&& unzip -q unsigned_io_archive.zip -d unsigned.io && rm unsigned_io_archive.zip


WORKDIR "../Sideband/sbapp"

# Set up virtual environment
RUN virtualenv venv

RUN bash -c "source venv/bin/activate && pip install -U pip && pip install setuptools==60.5 wheel==0.30 buildozer cython"

WORKDIR "../"

RUN bash -c "make release"

FROM scratch as artifact
COPY --from=build /root/Sideband/dist/* /
22 changes: 20 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ apk:
mkdir -p ./dist

fetchapk:
cp ./sbapp/bin/sideband-*-release.apk ./dist/
cp ./sbapp/bin/sideband-*-release-unsigned.apk ./dist/

install:
make -C sbapp install
Expand All @@ -33,8 +33,26 @@ build_wheel:

release: build_wheel apk fetchapk

release_docker:
-mkdir -p ./dist
@echo If you experience errors, please ensure you have docker-buildx installed on your system.
sudo docker build --target=artifact --output type=local,dest=./dist/ .
@echo Build successful. APK copied to ./dist directory.
$(MAKE) sign_release

sign_release:
@echo This stage generates a keystore in the root directory of the repo and signs the APK with it.
@echo If a keystore already exists, it is reused.
@echo Please make sure you have apksigner and zipalign installed on your system before proceeding.
@echo Press enter to continue.
@read VOID
if [ ! -f "./key.keystore" ]; then keytool -genkey -v -keystore key.keystore -keyalg RSA -keysize 4096 -validity 10000 -alias app; fi
VERSION=$(shell ls ./dist/*.apk | cut -d\- -f 2 | head -n 1); \
zipalign -p 4 ./dist/sideband-*-release-unsigned.apk ./dist/sideband-$$VERSION-release.apk; \
apksigner sign --ks-key-alias app --ks key.keystore ./dist/sideband-$$VERSION-release.apk; \

upload:
@echo Ready to publish release, hit enter to continue
@read VOID
@echo Uploading to PyPi...
twine upload dist/sbapp-*
twine upload dist/sbapp-*
2 changes: 2 additions & 0 deletions docker/dist_env
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export VERSION=$(wget -q https://pypi.org/pypi/${PACKAGENAME}/json -O - | grep -oP "\"version\":\"\d+\.\d+\.+\d+\"" -o | cut -d \" -f 4)
export DL_URL=$(wget -q https://pypi.org/pypi/${PACKAGENAME}/json -O - | grep -oP "\"url\":\".{1,150}${VERSION}-py\d-none-any.whl\"" | cut -d \" -f 4 | head -n -1)
21 changes: 21 additions & 0 deletions docker/init.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// This is necessary to ensure that Sideband can be built on the
// correct API version. Else, the build will fail, with the build tools
// nagging us to upgrade the targetSdkVersion (doing so breaks the
// program currently). Yet another case of G**gle foolishness. This
// just bypasses the error and continues compiling regardless.

apply plugin: DisableAbortOnError

class DisableAbortOnError implements Plugin<Gradle> {
void apply (Gradle gradle) {
gradle.allprojects { project ->
afterEvaluate {
android {
lintOptions {
abortOnError = false
}
}
}
}
}
}
21 changes: 11 additions & 10 deletions sbapp/Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
all: prepare debug

prepare: activate cleanrns getrns
prepare: cleanrns getrns

clean:
@echo Cleaning...
Expand All @@ -11,13 +11,10 @@ clean:
-(rm ./bin -r)

cleanlibs:
buildozer android clean
. venv/bin/activate; buildozer android clean

cleanall: clean cleanlibs

activate:
(. venv/bin/activate)

pacthfiles: patchsdl injectxml

patchsdl:
Expand All @@ -42,22 +39,24 @@ injectxml:
cp patches/p4a_build.py .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/dists/sideband/build.py

debug:
buildozer android debug
. venv/bin/activate; buildozer android debug

prebake:
ifneq (,$(wildcard .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/dists/sideband/src/main/res/xml/device_filter.xml))
@echo Device filter XML exists, skipping prebake
else
@(echo Prebaking build before patching files...)
@(sleep 2)
-(buildozer android release)
-(. venv/bin/activate; buildozer android release)
@(echo Prebake finished, applying patches and rebuilding...)
@(sleep 2)
endif

fetchshare:
-(rm ./share/pkg/*)
-(rm ./share/mirrors/* -r)
if [ ! -d "./share/pkg" ]; then mkdir ./share/pkg; fi
if [ ! -d "./share/mirrors" ]; then mkdir ./share/mirrors; fi
cp ../../dist_archive/rns-*-py3-none-any.whl ./share/pkg/
cp ../../dist_archive/rnspure-*-py3-none-any.whl ./share/pkg/
cp ../../dist_archive/lxmf-*-py3-none-any.whl ./share/pkg/
Expand All @@ -72,7 +71,7 @@ fetchshare:
cp ../../dist_archive/Reticulum\ Manual.epub ./share/mirrors/Reticulum_Manual.epub

release:
buildozer android release
. venv/bin/activate; buildozer android release

postbuild:
$(MAKE) cleanrns
Expand All @@ -91,9 +90,11 @@ console:
(adb logcat | grep "python\|sidebandservice")

getrns:
(cp -rv ../../Reticulum/RNS ./;rm ./RNS/Utilities/RNS)
(cp -rv ../../Reticulum/RNS ./)
-(rm ./RNS/Utilities/RNS)
-(rm ./RNS/__pycache__ -r)
(cp -rv ../../LXMF/LXMF ./;rm ./LXMF/Utilities/LXMF)
(cp -rv ../../LXMF/LXMF ./)
-(rm ./LXMF/Utilities/LXMF)
-(rm ./LXMF/__pycache__ -r)

cleanrns:
Expand Down
2 changes: 2 additions & 0 deletions sbapp/buildozer.spec
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ android.release_artifact = apk
android.archs = arm64-v8a,armeabi-v7a
#android.logcat_filters = *:S python:D

android.add_gradle_repositories = flatDir { dirs("../../../../../../patches") }

services = sidebandservice:services/sidebandservice.py:foreground
android.whitelist = lib-dynload/termios.so
android.manifest.intent_filters = patches/intent-filter.xml
Expand Down