From 8170fe4992b29b76e9953cc5e59a6eaa703a0c79 Mon Sep 17 00:00:00 2001 From: MicroEJ GitHub Delivery Date: Tue, 19 Oct 2021 15:56:41 +0000 Subject: [PATCH] Version 1.0.0 --- 4.1.5/Dockerfile | 82 +++++++++++++++++++++ 5.4.1/Dockerfile | 100 ++++++++++++++++++++++++++ CHANGELOG.rst | 14 ++++ Jenkinsfile | 181 +++++++++++++++++++++++++++++++++++++++++++++++ LICENSE.txt | 38 ++++++++++ README.md | 1 - README.rst | 82 +++++++++++++++++++++ 7 files changed, 497 insertions(+), 1 deletion(-) create mode 100644 4.1.5/Dockerfile create mode 100644 5.4.1/Dockerfile create mode 100644 CHANGELOG.rst create mode 100644 Jenkinsfile create mode 100644 LICENSE.txt delete mode 100644 README.md create mode 100644 README.rst diff --git a/4.1.5/Dockerfile b/4.1.5/Dockerfile new file mode 100644 index 0000000..48be716 --- /dev/null +++ b/4.1.5/Dockerfile @@ -0,0 +1,82 @@ +# Dockerfile +# +# Copyright 2021 MicroEJ Corp. All rights reserved. +# This library is provided in source code for use, modification and test, subject to license terms. +# Any modification of the source code will break MicroEJ Corp. warranties on the whole library. +FROM eclipse-temurin:8 + +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y --no-install-recommends \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg \ + lsb-release && \ + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \ + echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \ + apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + git \ + unzip \ + udev \ + docker-ce-cli \ + ssh \ + sshpass \ + # Required for Eclipse-based SDK to run + libwebkit2gtk-4.0-37 && \ + rm -rf /var/lib/apt/lists/* && \ + apt-get clean + +RUN echo 'ACTION!="add", GOTO="usbdongle_end"\n' \ + 'SUBSYSTEM=="usb", GOTO="usbdongle_start"\n' \ + 'SUBSYSTEMS=="usb", GOTO="usbdongle_start"\n' \ + 'GOTO="usbdongle_end"\n' \ + 'LABEL="usbdongle_start"\n' \ + 'ATTRS{idVendor}=="096e" , ATTRS{idProduct}=="0006" , MODE="0666"\n' \ + 'LABEL="usbdongle_end"' > /etc/udev/rules.d/91-usbdongle.rules + +# Set the new user parameter. +ARG user=jenkins +ARG group=jenkins +ARG uid=1000 +ARG gid=1000 +RUN addgroup --gid ${gid} ${group} && \ + adduser --home /home/${user} --uid ${uid} --ingroup ${group} --disabled-password ${user} + +# Good practice, switch back to user. +USER ${user} + +# Set env +ENV HOME /home/${user} +ENV ECLIPSE_HOME=$HOME/ECLIPSE +ENV MICROEJ_BUILD_JDK_HOME=$JAVA_HOME +ENV MICROEJ_BUILDKIT_HOME=${HOME}/Tool-CommandLineBuild +ENV PATH=$MICROEJ_BUILDKIT_HOME:$PATH + +# Set workdir +WORKDIR ${HOME} + +# I) Install SDK +RUN curl -O https://repository.microej.com/packages/SDK/4.1.5/zip/microej-sdk-4.1.5-linux_x86_64.zip && \ + mkdir -p $ECLIPSE_HOME && \ + unzip microej-sdk-4.1.5-linux_x86_64.zip -d $ECLIPSE_HOME && \ + rm -f microej-sdk-4.1.5-linux_x86_64.zip && \ +# II) Install Tool-CommandLineBuild + git clone --recursive https://github.com/MicroEJ/Tool-CommandLineBuild.git && \ +# III) Extract BuildKit from SDK + mkdir -p Tool-CommandLineBuild/buildKit/ && \ + unzip ${ECLIPSE_HOME}/plugins/com.is2t.eclipse.plugin.easyant4e_1.7.3.20180621-1638.jar 'lib/*' -d Tool-CommandLineBuild/buildKit/ant && \ + unzip ${ECLIPSE_HOME}/plugins/com.is2t.eclipse.plugin.easyant4e.offlinerepo_1.6.0.20180621-1638.jar repositories/is2t_repo.zip && \ + unzip repositories/is2t_repo.zip -d Tool-CommandLineBuild/buildKit/microej-build-repository && \ + rm -rf repositories && \ +# IV) Install jdtCompiler from SDK 20.12 + curl -O https://repository.microej.com/packages/SDK/20.12/zip/microej-sdk-20.12-linux_x86_64.zip && \ + unzip microej-sdk-20.12-linux_x86_64.zip 'plugins/com.is2t.eclipse.plugin.easyant4e_2.3.1.202012101611.jar' && \ + unzip plugins/com.is2t.eclipse.plugin.easyant4e_2.3.1.202012101611.jar lib/jdtCompilerAdapter.jar lib/org.eclipse.jdt.compiler.apt.jar lib/org.eclipse.jdt.core.jar -d Tool-CommandLineBuild/buildKit/ant/ && \ + rm -rf microej-sdk-20.12-linux_x86_64.zip plugins && \ +# V) Configure BuildKit + echo "\neasyant.inject.build.compiler=org.eclipse.jdt.core.JDTCompilerAdapter" >> Tool-CommandLineBuild/local-build.properties && \ + echo "\neasyant.inject.eclipse.home=\"${ECLIPSE_HOME}\"" >> Tool-CommandLineBuild/local-build.properties && \ + echo 'sdk.version=4.1.5' > $MICROEJ_BUILDKIT_HOME/release.properties + diff --git a/5.4.1/Dockerfile b/5.4.1/Dockerfile new file mode 100644 index 0000000..24c5768 --- /dev/null +++ b/5.4.1/Dockerfile @@ -0,0 +1,100 @@ +# Dockerfile +# +# Copyright 2021 MicroEJ Corp. All rights reserved. +# This library is provided in source code for use, modification and test, subject to license terms. +# Any modification of the source code will break MicroEJ Corp. warranties on the whole library. +FROM eclipse-temurin:8 + +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y --no-install-recommends \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg \ + lsb-release && \ + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \ + echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \ + apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + git \ + unzip \ + udev \ + docker-ce-cli \ + ssh \ + sshpass \ + # Required for Eclipse-based SDK to run + libwebkit2gtk-4.0-37 && \ + rm -rf /var/lib/apt/lists/* && \ + apt-get clean + +RUN echo 'ACTION!="add", GOTO="usbdongle_end"\n' \ + 'SUBSYSTEM=="usb", GOTO="usbdongle_start"\n' \ + 'SUBSYSTEMS=="usb", GOTO="usbdongle_start"\n' \ + 'GOTO="usbdongle_end"\n' \ + 'LABEL="usbdongle_start"\n' \ + 'ATTRS{idVendor}=="096e" , ATTRS{idProduct}=="0006" , MODE="0666"\n' \ + 'LABEL="usbdongle_end"' > /etc/udev/rules.d/91-usbdongle.rules + +# Set the new user parameter. +ARG user=jenkins +ARG group=jenkins +ARG uid=1000 +ARG gid=1000 +RUN addgroup --gid ${gid} ${group} && \ + adduser --home /home/${user} --uid ${uid} --ingroup ${group} --disabled-password ${user} + +# Good practice, switch back to user. +USER ${user} + +# Set env +ENV HOME /home/${user} +ENV ECLIPSE_HOME=$HOME/ECLIPSE +ENV BUILD_KIT_HOME=$HOME/buildKit +ENV PATH=$BUILD_KIT_HOME/bin:$PATH + +# Set workdir +WORKDIR ${HOME} + +# I) Install SDK +RUN curl -O https://repository.microej.com/packages/SDK/21.03/zip/microej-sdk-21.03-linux_x86_64.zip && \ + mkdir -p $ECLIPSE_HOME && \ + unzip microej-sdk-21.03-linux_x86_64.zip -d $ECLIPSE_HOME && \ + rm -f microej-sdk-21.03-linux_x86_64.zip && \ +# II) Configure SDK location + mkdir -p $HOME/.microej && \ + echo "[options]\neclipse.home=\"${ECLIPSE_HOME}\"" > $HOME/.microej/.mmmconfig && \ +# III) Update SDK to 5.4.1 +# 1. Uninstall SDK 5.4.0 + $ECLIPSE_HOME/MicroEJ-SDK \ + -application org.eclipse.equinox.p2.director \ + -noSplash \ + -uninstallIU \ + com.is2t.microej.sdk.feature.feature.group && \ +# 2. Install SDK 5.4.1 + $ECLIPSE_HOME/MicroEJ-SDK \ + -application org.eclipse.equinox.p2.director \ + -noSplash \ + -repository \ + https://repository.microej.com/p2/sdk/5.4.1 \ + -installIUs \ + com.is2t.microej.sdk.feature.feature.group && \ +# IV) Extract Build Kit from SDK + mkdir -p $BUILD_KIT_HOME && \ +# 1. Extract build repository + unzip $ECLIPSE_HOME/plugins/com.is2t.eclipse.plugin.easyant4e.offlinerepo_1.6.1.202104161741.jar repositories/microej-build-repository.zip && \ + unzip repositories/microej-build-repository.zip -d $BUILD_KIT_HOME/microej-build-repository && \ + rm -rf repositories/ && \ +# 2. Extract mmm-cli + unzip $ECLIPSE_HOME/plugins/com.is2t.eclipse.plugin.easyant4e_2.4.0.202104161741.jar cli/mmm-cli.zip && \ + unzip cli/mmm-cli.zip -d $BUILD_KIT_HOME/ && \ + rm -rf cli && \ +# 3. Extract ivysettings + unzip $ECLIPSE_HOME/plugins/com.is2t.eclipse.plugin.easyant4e_2.4.0.202104161741.jar resources/microej-ivysettings-5.4.xml && \ + mkdir -p $BUILD_KIT_HOME/microej-module-repository/ && \ + mv resources/microej-ivysettings-5.4.xml $BUILD_KIT_HOME/microej-module-repository/ivysettings.xml && \ + rm -rf resources/ && \ +# 4. Set SDK version + echo 'sdk.version=5.4.1' > $BUILD_KIT_HOME/release.properties + + diff --git a/CHANGELOG.rst b/CHANGELOG.rst new file mode 100644 index 0000000..7d12ea7 --- /dev/null +++ b/CHANGELOG.rst @@ -0,0 +1,14 @@ +.. + Copyright 2021 MicroEJ Corp. All rights reserved. + This library is provided in source code for use, modification and test, subject to license terms. + Any modification of the source code will break MicroEJ Corp. warranties on the whole library. + +=========== + Changelog +=========== + +---------------------- + [1.0.0] - 2021-10-07 +---------------------- + +- Add ``Dockerfile`` of MicroEJ BuildKit Docker Image for MicroEJ SDK 4.1.5 and 5.4.1 diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..db71f42 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,181 @@ +// Copyright 2021 MicroEJ Corp. All rights reserved. +// This library is provided in source code for use, modification and test, subject to license terms. +// Any modification of the source code will break MicroEJ Corp. warranties on the whole library. +pipeline { + agent { label 'docker' } + stages { + stage('Git clean') { + steps { sh 'git clean -fdx' } + } + stage('Lint check 5.4.1') { + agent { docker { + image 'hadolint/hadolint:latest-alpine' + reuseNode true + } + } + steps { + sh 'hadolint --no-fail 5.4.1/Dockerfile' + } + } + stage('Lint check 4.1.5') { + agent { docker { + image 'hadolint/hadolint:latest-alpine' + reuseNode true + } + } + steps { + sh 'hadolint --no-fail 4.1.5/Dockerfile' + } + } + stage('Build 5.4.1') { + steps { + sh 'docker build -t sdk:5.4.1 5.4.1' + } + } + stage('Test: ensure sdk:5.4.1 can run docker') { + agent { docker { + image 'sdk:5.4.1' + reuseNode true + args '-u root -v/var/run/docker.sock:/var/run/docker.sock' + } + } + steps { sh 'docker run --rm -t hello-world' } + } + stage('Build 4.1.5') { + steps { + sh 'docker build -t sdk:4.1.5 4.1.5' + } + } + stage('Test: ensure sdk:4.1.5 can run docker') { + agent { docker { + image 'sdk:4.1.5' + reuseNode true + args '-u root -v/var/run/docker.sock:/var/run/docker.sock' + } + } + steps { sh 'docker run --rm -t hello-world' } + } + stage('Test: build microej-studio-rebrand') { + agent { docker { + image 'sdk:5.4.1' + reuseNode true + } + } + + steps { + sh 'mmm init -D"skeleton.org=com.is2t.easyant.skeletons" -D"skeleton.module=microej-studio-rebrand" -D"skeleton.rev=+" -D"project.org=com.mycompany" -Dproject.module=microej-studio-rebrand -Dproject.rev=1.0.0 -Dskeleton.target.dir=microej-studio-rebrand' + sh 'cd microej-studio-rebrand && mmm -Dizpack.microej.product.location=${ECLIPSE_HOME} -Dproduct.target.os=linux64' + } + } + stage('Test: build microej-javalib') { + agent { docker { + image 'sdk:5.4.1' + reuseNode true + } + } + + steps { + sh 'mmm init -D"skeleton.org=com.is2t.easyant.skeletons" -D"skeleton.module=microej-javalib" -D"skeleton.rev=+" -D"project.org=com.mycompany" -Dproject.module=myjavalib -Dproject.rev=1.0.0 -Dskeleton.target.dir=microej-javalib' + sh 'cd microej-javalib && mmm' + } + } + stage('Test: build addon-processor') { + agent { docker { + image 'sdk:5.4.1' + reuseNode true + } + } + + steps { + sh 'mmm init -D"skeleton.org=com.is2t.easyant.skeletons" -D"skeleton.module=addon-processor" -D"skeleton.rev=+" -D"project.org=com.mycompany" -Dproject.module=myjavalib -Dproject.rev=1.0.0 -Dskeleton.target.dir=addon-processor' + sh 'cd addon-processor && mmm' + } + } + stage('Test: build microej-javaapi') { + agent { docker { + image 'sdk:5.4.1' + reuseNode true + } + } + + steps { + sh 'mmm init -D"skeleton.org=com.is2t.easyant.skeletons" -D"skeleton.module=microej-javaapi" -D"skeleton.rev=+" -D"project.org=com.mycompany" -Dproject.module=myjavalib -Dproject.rev=1.0.0 -Dskeleton.target.dir=microej-javaapi' + sh 'cd microej-javaapi && mmm' + } + } + stage('Test: build microej-javaimpl') { + agent { docker { + image 'sdk:5.4.1' + reuseNode true + } + } + + steps { + sh 'mmm init -D"skeleton.org=com.is2t.easyant.skeletons" -D"skeleton.module=microej-javaimpl" -D"skeleton.rev=+" -D"project.org=com.mycompany" -Dproject.module=myjavalib -Dproject.rev=1.0.0 -Dskeleton.target.dir=microej-javaimpl' + sh 'cd microej-javaimpl && mmm' + } + } + stage('Test: build microej-meta-build') { + agent { docker { + image 'sdk:5.4.1' + reuseNode true + } + } + + steps { + sh 'mmm init -D"skeleton.org=com.is2t.easyant.skeletons" -D"skeleton.module=microej-meta-build" -D"skeleton.rev=+" -D"project.org=com.mycompany" -Dproject.module=myjavalib -Dproject.rev=1.0.0 -Dskeleton.target.dir=microej-meta-build' + sh 'cd microej-meta-build && mmm' + } + } + stage('Test: build microej-mock') { + agent { docker { + image 'sdk:5.4.1' + reuseNode true + } + } + + steps { + sh 'mmm init -D"skeleton.org=com.is2t.easyant.skeletons" -D"skeleton.module=microej-mock" -D"skeleton.rev=+" -D"project.org=com.mycompany" -Dproject.module=myjavalib -Dproject.rev=1.0.0 -Dskeleton.target.dir=microej-mock' + sh 'cd microej-mock && mmm' + } + } + stage('Test: build artifact-repository') { + agent { docker { + image 'sdk:5.4.1' + reuseNode true + } + } + + steps { + sh 'mmm init -D"skeleton.org=com.is2t.easyant.skeletons" -D"skeleton.module=artifact-repository" -D"skeleton.rev=+" -D"project.org=com.mycompany" -Dproject.module=myjavalib -Dproject.rev=1.0.0 -Dskeleton.target.dir=artifact-repository' + sh 'cd artifact-repository && mmm' + } + } + stage('Test: build application') { + agent { docker { + image 'sdk:5.4.1' + reuseNode true + } + } + + steps { + sh 'mmm init -D"skeleton.org=com.is2t.easyant.skeletons" -D"skeleton.module=application" -D"skeleton.rev=+" -D"project.org=com.mycompany" -Dproject.module=myjavalib -Dproject.rev=1.0.0 -Dskeleton.target.dir=application' + sh 'cd application && mmm' + } + } + stage('Test: build platform and firmware-singleapp') { + agent { docker { + image 'sdk:5.4.1' + reuseNode true + } + } + steps { + sh 'rm -rf Platform-Espressif-ESP-WROVER-KIT-V4.1' + sh 'git clone --depth 1 https://github.com/MicroEJ/Platform-Espressif-ESP-WROVER-KIT-V4.1' + sh 'cd Platform-Espressif-ESP-WROVER-KIT-V4.1/ESP32-WROVER-Xtensa-FreeRTOS-configuration/ && mmm' + sh 'mmm init -D"skeleton.org=com.is2t.easyant.skeletons" -D"skeleton.module=firmware-singleapp" -D"skeleton.rev=+" -D"project.org=com.mycompany" -Dproject.module=firmware-singleapp -Dproject.rev=1.0.0 -Dskeleton.target.dir=firmware-singleapp' + sh 'cd firmware-singleapp && mmm -D"platform-loader.target.platform.dir=$(pwd)/../Platform-Espressif-ESP-WROVER-KIT-V4.1/ESP32WROVER-Platform-GNUv52b96_xtensa-esp32-psram-1.7.1/source" -D"virtual.device.sim.only=SET"' + } + } + } +} diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..ee39695 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,38 @@ +This Software is provided both as Executable Software (code compiled AND +delivered by MicroEJ Corp.) and Software Source Code. + +If YOU are a MicroEJ SDK licensee, YOU can choose between the following +open-source license and Your MicroEJ SDK LICENSE (MicroEJ SDK EULA) : + +The Executable Software can be, at your option, subject to MicroEJ SDK EULA. + +The source code will always be subject to the following license. + +For the avoidance of doubt, any modification of the source code, or any +addition to the Software will break the warranties and will exempt MicroEJ Corp. +from any obligation arising under any specific agreement . +----------------------------------------------------------------------------- + +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of MicroEJ Corp. nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 976482a..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -This is initial commit \ No newline at end of file diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..9f2ea43 --- /dev/null +++ b/README.rst @@ -0,0 +1,82 @@ +.. + Copyright 2021 MicroEJ Corp. All rights reserved. + This library is provided in source code for use, modification and test, subject to license terms. + Any modification of the source code will break MicroEJ Corp. warranties on the whole library. + +.. image:: https://shields.microej.com/endpoint?url=https://repository.microej.com/packages/badges/sdk_5.4.json + :alt: SDK 5.4 Compatible + +.. image:: https://shields.microej.com/endpoint?url=https://repository.microej.com/packages/badges/sdk_4.1.json + :alt: SDK 4.1 Compatible + +================================= + Docker for MicroEJ BuildKit SDK +================================= + +Overview +======== + +This is the git repository to build the MicroEJ BuildKit Docker Image for various MicroEJ SDK versions. + +Documentation +============= + +MicroEJ SDK version ``5.4.1`` and above +--------------------------------------- + +For MicroEJ SDK version ``5.4.1`` and above, please refer to https://docs.microej.com/en/latest/ApplicationDeveloperGuide/mmm.html#command-line-interface. + +Build the image from ``Dockerfile``: + +.. code-block:: console + + $ docker build -t sdk:5.4.1 5.4.1 + +Start the image for interactive usage: + +.. code-block:: console + + $ docker run --rm -it sdk:5.4.1 bash + +Build a project from a local folder: + +.. code-block:: console + + $ docker run --rm -v PATH/TO/PROJECT:/project -w /project sdk:5.4.1 mmm build + +MicroEJ SDK version ``4.1.5`` to ``5.3.1`` +------------------------------------------ + +For MicroEJ SDK version ``4.1.5`` to ``5.3.1``, please refer to https://github.com/MicroEJ/Tool-CommandLineBuild. + +Build the image from ``Dockerfile``: + +.. code-block:: console + + $ docker build -t sdk:4.1.5 4.1.5 + +Start the image for interactive usage: + +.. code-block:: console + + $ docker run --rm -it sdk:4.1.5 bash + +Build a project from a local folder: + +.. code-block:: console + + $ docker run --rm -v PATH/TO/PROJECT:/project -w /project sdk:4.1.5 build_module_local.sh ./ + +Automated tests +--------------- + +| A Jenkinsfile is at the root of this project to automatically test project Dockerfiles. You can launch it using Jenkins CI. +| We followed the Jenkins recommendations to write this Jenkinsfile : `Using Docker with Pipeline `_. +| If you want to run it, you need to have at least one node labelled "docker". + +Where to get help? +================== + +- `MicroEJ Forum `_ +- `MicroEJ Documentation Center `_ +- `MicroEJ Technical Hot-line `_