Commit 85063772 authored by Leander Schulten's avatar Leander Schulten
Browse files

Add Dockerfile and explanation how Docker/GitLab CI/cross compiling works

parent b79e5511
Pipeline #151991 passed with stage
in 6 minutes and 36 seconds
# Docker/CI
Hier gibt es eine kurze Einführung in Docker und die Gitlab CI. Weiterhin wird erklärt wie das cross compiling funktioniert, bzw. wie man es aufsetzt und aktuell hält.
[Docker](https://www.docker.com/) ist eine Containervirtualisierungs-Software. Ein Docker Container ist ähnlich zu einer VM, nur dass der Container etwas leichtgewichtiger ist.
### Docker unter Windows installieren
Um Docker für Windows herunterladen zu können muss man sich auf [Docker.com](https://www.docker.com/) einen Account erstellen. Nachdem man dies getan hat kann man Docker für Windows herunterladen. Nachdem man es installiert hat sollten ein paar Einstellungen gesetzt werden:
* Unter Shared Drives C auswählen (oder den Laufwerksbuchstaben auf dem man arbeitet)
* Unter Advanced:
* CPUs auf maximal stellen (wir brauchen später recht viel Rechenpower, sonst dauert das bauen Ewigkeiten)
* Memory: Steht bei mir auf 10 GB
* Disk image max size: Steht bei mir auf 120 GB
### Neues Image bauen
0. Docker starten wenn es noch nicht im Hintergrund läuft
1. Öffne eine Konsole
2. cd dich in den Lichtsteuerungs Git Ordner
3. Wenn du das Image später hochladen willst, führe `docker login registry.git.rwth-aachen.de` aus
4. Führe zum bauen `docker build -t TAG .` aus, wobei du `TAG` durch `registry.git.rwth-aachen.de/leander.schulten/lichtsteuerung/build_qt_current_qt_version` (current_qt_version durch z.B. 5_12_4 ersetzen) ersetzt wenn du das Image/den Container hochladen willst oder durch z.B. `lichtsteuerung/build_last_qt_version` oder was ähnliches wenn du das Image nur lokal für dich erstellstellen möchtest. Ist seit dem letzten mal eine neue Qt Version herausgekommen ([Blog](https://blog.qt.io/) [Versionsübersicht](https://wiki.qt.io/Template:Release_Information)) ist es notwendig, an den Befehl `--no-cache` anzuhängen, da Docker sonst einfach das Image vom letzten mal wiederverwendet und die alte Qt Version weiter benutzt.
5. Das Image kann nun mit `docker push TAG` (TAG vom Punkt 4 benutzten) in die Container Registry von GitLab hochgeladen werden. Lese davor [hier](https://git.rwth-aachen.de/leander.schulten/Lichtsteuerung/container_registry) die __komplette__ Seite, benutzte vor allem einen vernünftigen Image Namen oder Tag.
## Cross compiling und Dockerfile
Wir wollen auf einem Linux Container die Lichtsteuerung für Windows bauen. Nicht ganz trivial. Gott sei Dank gibt es dafür fertige Tools wie [MXE](https://github.com/mxe/mxe) die auch schon Qt fertig konfiguriert dabei haben. Vorgefertigte Docker-Images für die verschiedenen Betriebssysteme gibt es auch schon von [Dockcross](https://github.com/dockcross/dockcross), aber leider enthielten diese Fehler, weshalb ich ein neues Dockerfile aus dem bestehenden konstruiert habe.
Wir wollen windows shared x64 Posix haben, also nehmen wir die [Datei](https://github.com/dockcross/dockcross/blob/master/windows-shared-x64-posix/Dockerfile.in) und inkludieren manuell die [Datei](https://github.com/dockcross/dockcross/blob/master/common.windows) für Windows. Wir machen folgende anpassungen:
* Wenn wir MXE clonen checken wir nicht mehr einen Commit aus. Wir wollen die neuste Version.
* Wir fügen zur settings.mk noch die Zeile `MXE_PLUGIN_DIRS := plugins/gcc8` hinzu, da wir einen neuen gcc Compiler mit c++17 Unterstützung verwenden wollen.
* Am ende setzten wir das WorkDir auf `/usr/src/mxe` und bauen diverse Qt Pakete die wir benötigen. Als letztes setzten wir den Path so, dass die MXE Compiler an erster Stelle stehen.
## Gitlab CI
Hier wird kurz die [.gitlab-ci.yml Datei](https://git.rwth-aachen.de/leander.schulten/Lichtsteuerung/blob/windows-release/.gitlab-ci.yml) erklärt. Diese Datei wird autoamtisch von GitLab erkannt und für die CI verwendet.
[Hier](https://git.rwth-aachen.de/leander.schulten/Lichtsteuerung/settings/ci_cd#Runners) hinzugefügte Runner führen dann angestoßen von GitLab die in der .gitlab-ci.yml Datei definierten Skripte in dem Image was wir definiert haben aus.
##### .gitlab-ci.yml Datei:
In der ersten Zeile referenzieren wir das Image welches wir aus dem Dockerfile erstelllt und in die GitLab Registry hochgeladen haben. In diesem Image werden die Stages abgearbeitet.
Unter `stages:` definieren welche Stages in welcher Reihenfolge abgearbeitet werden sollen.
Jede Stage besitzt ein `sript` Feld. Alle dort aufgelisteten Befehle werden der Reihe nach abgearbeitet. Wenn ein Befehl fehlschlägt, fehlt die Stage fehl und alle darauffolgenden Stages werden nicht ausgeführt.
Die Pfade die unter `artifacts` aufgelistet werden können nach erfolgreichem Durchlaufen der Stage heruntergeladen werden.
Die Stage `version` und `deploy` werden nur ausgefürt, wenn der Commit auf dem `windows-release` Branch liegen. Dies wird durch die Angabe von `only: refs: -windows-release` erreicht.
\ No newline at end of file
FROM dockcross/base:latest
MAINTAINER Leander Schulten "leander.Schulten@rwth-aachen.de"
ENV WINEARCH win64
ARG MXE_TARGET_ARCH=x86_64
ARG MXE_TARGET_THREAD=.posix
ARG MXE_TARGET_LINK=shared
#
# Before including this script, make sure to set:
#
# WINEARCH environment variable to either "win64" or "win32"
# MXE_TARGET_ARCH argument to either "x86_64" or "i686". See http://mxe.cc/
# MXE_TARGET_THREAD argument to either "" or ".posix". Default is win32. See http://mxe.cc/
# MXE_TARGET_LINK argument to either "static" or "shared"
#
# For example:
#
# ENV WINEARCH win64
# ARG MXE_TARGET_ARCH=x86_64
# ARG MXE_TARGET_THREAD=
# ARG MXE_TARGET_LINK=shared
#
ENV CMAKE_TOOLCHAIN_FILE /usr/src/mxe/usr/${MXE_TARGET_ARCH}-w64-mingw32.${MXE_TARGET_LINK}${MXE_TARGET_THREAD}/share/cmake/mxe-conf.cmake
ARG DEBIAN_FRONTEND=noninteractive
#
# WINE is used as an emulator for try_run and tests with CMake.
#
# Other dependencies are from the listed MXE requirements:
# http://mxe.cc/#requirements
# 'cmake' is omitted because it is installed from source in the base image
#
RUN \
apt-get update && \
apt-get install --no-install-recommends --yes \
autoconf \
automake \
autopoint \
bash \
bison \
bzip2 \
flex \
gettext \
git \
g++ \
g++-multilib \
gperf \
intltool \
libffi-dev \
libgdk-pixbuf2.0-dev \
libtool-bin \
libltdl-dev \
libssl-dev \
libxml-parser-perl \
libc6-dev-i386 \
lzip \
make \
openssl \
p7zip-full \
patch \
perl \
pkg-config \
python \
ruby \
scons \
sed \
unzip \
wget \
wine \
xz-utils \
&& \
#
# Install Wine
#
dpkg --add-architecture i386 && \
apt-get update && \
apt-get install -y wine32 && \
wine hostname && \
#
# Download MXE sources
#
cd /usr/src && \
git clone https://github.com/mxe/mxe.git && \
cd mxe && \
# git checkout ${MXE_GIT_TAG} && \
#
# Configure "settings.mk" required to build MXE
#
cd /usr/src/mxe && \
echo "MXE_TARGETS := ${MXE_TARGET_ARCH}-w64-mingw32.${MXE_TARGET_LINK}${MXE_TARGET_THREAD}" > settings.mk && \
echo "LOCAL_PKG_LIST := cc cmake" >> settings.mk && \
echo ".DEFAULT local-pkg-list:" >> settings.mk && \
echo "local-pkg-list: \$(LOCAL_PKG_LIST)" >> settings.mk && \
echo "MXE_PLUGIN_DIRS := plugins/gcc8" >> settings.mk && \
#
# Build MXE
#
cd /usr/src/mxe && \
make -j$(nproc) && \
#
# Cleanup: By keeping the MXE build system (Makefile, ...), derived images will be able to install
# additional packages.
#
rm -rf log pkg && \
#
# Update MXE toolchain file
#
echo 'set(CMAKE_CROSSCOMPILING_EMULATOR "/usr/bin/wine")' >> ${CMAKE_TOOLCHAIN_FILE} && \
#
# Replace cmake and cpack binaries
#
cd /usr/bin && \
rm cmake cpack && \
ln -s /usr/src/mxe/usr/bin/${MXE_TARGET_ARCH}-w64-mingw32.${MXE_TARGET_LINK}${MXE_TARGET_THREAD}-cmake cmake && \
ln -s /usr/src/mxe/usr/bin/${MXE_TARGET_ARCH}-w64-mingw32.${MXE_TARGET_LINK}${MXE_TARGET_THREAD}-cpack cpack
ENV PATH ${PATH}:/usr/src/mxe/usr/bin
ENV CROSS_TRIPLE ${MXE_TARGET_ARCH}-w64-mingw32.${MXE_TARGET_LINK}${MXE_TARGET_THREAD}
ENV AS=/usr/src/mxe/usr/bin/${CROSS_TRIPLE}-as \
AR=/usr/src/mxe/usr/bin/${CROSS_TRIPLE}-ar \
CC=/usr/src/mxe/usr/bin/${CROSS_TRIPLE}-gcc \
CPP=/usr/src/mxe/usr/bin/${CROSS_TRIPLE}-cpp \
CXX=/usr/src/mxe/usr/bin/${CROSS_TRIPLE}-g++ \
LD=/usr/src/mxe/usr/bin/${CROSS_TRIPLE}-ld \
FC=/usr/src/mxe/usr/bin/${CROSS_TRIPLE}-gfortran
# Build-time metadata as defined at http://label-schema.org
ARG BUILD_DATE
ARG IMAGE=dockcross/windows-shared-x64-posix
ARG VERSION=latest
ARG VCS_REF
ARG VCS_URL
LABEL org.label-schema.build-date=$BUILD_DATE \
org.label-schema.name=$IMAGE \
org.label-schema.version=$VERSION \
org.label-schema.vcs-ref=$VCS_REF \
org.label-schema.vcs-url=$VCS_URL \
org.label-schema.schema-version="1.0"
ENV DEFAULT_DOCKCROSS_IMAGE ${IMAGE}:${VERSION}
# install qt packages
WORKDIR /usr/src/mxe
RUN make qtbase
RUN make qtdeclarative
RUN make qtimageformats
RUN make qtnetworkauth
RUN make qtquickcontrols2
RUN make qtserialport
RUN make qttools
#set path to mxe compiler
RUN export PATH=/usr/src/mxe/usr/bin:$PATH
......@@ -22,6 +22,9 @@ Features:
* Qt Network Authorization (egal welches OS)
5. Drücke _Next_ und beende die Installation.
## Docker/GitlabCI/Cross-Compilation
Siehe [hier](Docker.md).
## Abhängigkeiten
Die Lichtsteuerung hängt von ein paar anderen Projekten ab.
#### [Boost](https://www.boost.org/)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment