Docker: Add dockerfile for Linux build environment.
- Dockerfile with getDependencies.sh
- Pipeline stages for Docker lint, build and promote
diff --git a/docker/dockerfile b/docker/dockerfile
new file mode 100644
index 0000000..4ea6a2b
--- /dev/null
+++ b/docker/dockerfile
@@ -0,0 +1,106 @@
+# Due to bandwidth limitation, we need to keep the base image into our
+# Artifactory Docker Registry. Because we have more than one registry,
+# we need to set during build time which Artifactory Docker Registry to use.
+ARG DOCKER_REGISTRY
+FROM ${DOCKER_REGISTRY}/ubuntu:focal
+
+# jenkins user needs to be present to work on CI
+# User 1000 for Kubernetes
+RUN useradd -u 1000 -U -m -c Jenkins jenkins
+
+# install packages from official Ubuntu repo
+ENV DEBIAN_FRONTEND=noninteractive
+RUN apt-get update && \
+    apt-get install --no-install-recommends -y \
+        bc=1.07.1-2build1 \
+        build-essential=12.8ubuntu1.1 \
+        curl=7.68.0-1ubuntu2.5 \
+        dos2unix=7.4.0-2 \
+        git=1:2.25.1-1ubuntu3.1 \
+        lib32stdc++6=10.2.0-5ubuntu1~20.04 \
+        mscgen=0.20-12 \
+        p7zip-full=16.02+dfsg-7build1 \
+        python3=3.8.2-0ubuntu2 \
+        python3-pip=20.0.2-5ubuntu1.3 \
+        tar=1.30+dfsg-7ubuntu0.20.04.1 \
+        unzip=6.0-25ubuntu1 \
+        wget=1.20.3-1ubuntu1 \
+        libxml2-utils=2.9.10+dfsg-5 \
+        zip=3.0-11build1 && \
+    apt-get autoremove -y && \
+    apt-get autoclean -y && \
+    rm -rf /var/lib/apt/lists/*
+
+# Create build ARGs for installer files & versions
+ARG ARMCC=ArmCompiler-5.06u7-linux.sh
+ARG ARMCLANG=ArmCompiler-6.16-linux-x86_64.sh
+ARG ARMCLANGLTM=ArmCompiler-6.6.4-linux-x86_64.sh
+ARG GCC=gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
+ARG DOXYGEN=doxygen_1.8.6-2_amd64.deb
+ARG FASTMODELS=fvp-11.12-linux-x86_64.tar.gz
+
+# Including dependency folder
+ARG DEPENDENCIESFOLDER=dependenciesFiles
+ARG TOOLS_PATH=/opt
+ARG INSTALLER_PATH=/tmp/dependenciesFiles
+RUN mkdir -p ${INSTALLER_PATH}
+COPY dependenciesFiles/ ${INSTALLER_PATH}
+
+# install & setup armcc
+RUN ${INSTALLER_PATH}/${ARMCC} --i-agree-to-the-contained-eula --no-interactive -v -d ${TOOLS_PATH}/armcc
+ENV PATH=${PATH}:${TOOLS_PATH}/armcc/bin
+ENV CI_ARMCC5_TOOLCHAIN_ROOT=${TOOLS_PATH}/armclang/bin
+
+# install & setup armclang
+RUN ${INSTALLER_PATH}/${ARMCLANG} --i-agree-to-the-contained-eula --no-interactive -v -d ${TOOLS_PATH}/armclang
+ENV PATH=${PATH}:${TOOLS_PATH}/armclang/bin
+ENV CI_ARMCC6_TOOLCHAIN_ROOT=${TOOLS_PATH}/armclang/bin
+
+# install & setup armclang ltm
+RUN ${INSTALLER_PATH}/${ARMCLANGLTM} --i-agree-to-the-contained-eula --no-interactive -v -d ${TOOLS_PATH}/armclangltm
+ENV CI_ARMCC6LTM_TOOLCHAIN_ROOT=${TOOLS_PATH}/armclangltm/bin
+
+# install & setup gcc
+RUN mkdir -p ${TOOLS_PATH}
+WORKDIR ${TOOLS_PATH}
+RUN tar -xvf ${INSTALLER_PATH}/${GCC}
+ENV PATH=${PATH}:${TOOLS_PATH}/gcc-arm-none-eabi-10-2020-q4-major/bin
+ENV CI_GCC_TOOLCHAIN_ROOT=${TOOLS_PATH}/gcc-arm-none-eabi-10-2020-q4-major/bin
+WORKDIR /
+
+# install fast models 11.12
+RUN mkdir -p ${TOOLS_PATH}/fvp/
+WORKDIR ${TOOLS_PATH}/fvp/
+RUN tar -xvf ${INSTALLER_PATH}/${FASTMODELS}
+ENV PATH=${PATH}:${TOOLS_PATH}/fvp
+WORKDIR /
+
+# install doxygen
+RUN dpkg -i ${INSTALLER_PATH}/${DOXYGEN}
+
+# install PackChk
+RUN cp ${INSTALLER_PATH}/PackChk /usr/local/bin/PackChk
+RUN chmod +x /usr/local/bin/PackChk
+
+# install Python requirements
+COPY requirements.txt ${INSTALLER_PATH}/
+RUN python3 -m pip install --no-cache-dir -r ${INSTALLER_PATH}/requirements.txt
+
+# install buildtools
+RUN python3 -m pip install --no-cache-dir -r ${INSTALLER_PATH}/buildtools/requirements.txt
+RUN mv ${INSTALLER_PATH}/buildtools ${TOOLS_PATH}
+COPY rtebuild /home/jenkins/.rtebuild
+COPY rtebuild /root/.rtebuild
+ENV PATH=${PATH}:${TOOLS_PATH}/buildtools
+
+# install python-matrix-runner
+# hadolint disable=DL3013
+RUN python3 -m pip install ${INSTALLER_PATH}/python-matrix-runner
+
+# set ARMLMD_LICENSE_FILE for ARM compilers
+ENV ARMLMD_LICENSE_FILE="7010@euhpc-lic-armlmd.euhpc.arm.com:7010@euhpc-lic03.euhpc.arm.com:7010@euhpc-lic05.euhpc.arm.com:7010@euhpc-lic07.euhpc.arm.com"
+
+# remove dependency folder
+RUN rm -rf ${INSTALLER_PATH}
+
+CMD ["bash"]
\ No newline at end of file
diff --git a/docker/getDependencies.sh b/docker/getDependencies.sh
new file mode 100755
index 0000000..9e52cff
--- /dev/null
+++ b/docker/getDependencies.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+# local variables
+DEPENDENCIES_FOLDER=dependenciesFiles
+ARTIFACTORY_URL=https://eu-west-1.artifactory.aws.arm.com:443/artifactory
+ARTIFACTORY_DEPOT=mcu.depot/ci/depot
+PACKCHK_VERSION=1.3.93
+
+if [ -z "$ARTIFACTORY_API_KEY" ]; then
+    echo "Please set your Artifactory ARTIFACTORY_API_KEY"
+    exit 1
+fi
+
+if [ -z "$USER" ]; then
+    echo "Please set your short ARM user e.g. sampel01"
+    exit 1
+fi
+
+function downloadFromArtifactory {
+    filename=$(basename $1)
+    echo "Fetching ${filename} ..."
+    if [[ -f "${filename}" ]]; then
+        sha256sum=$(curl -s -I -H "X-JFrog-Art-Api:$ARTIFACTORY_API_KEY" "${ARTIFACTORY_URL}/${1}" | grep "X-Checksum-Sha256" | cut -d" " -f2)
+        if echo "${sha256sum} *${filename}" | sha256sum -c --status; then
+            echo " ... already up to date"
+        else
+            rm ${filename}
+        fi
+    fi
+    if [[ ! -f "${filename}" ]]; then
+        curl -C - -H "X-JFrog-Art-Api:$ARTIFACTORY_API_KEY" -O "${ARTIFACTORY_URL}/${1}"
+        chmod +x ${filename}
+    fi
+}
+
+function downloadFromDepot {
+    downloadFromArtifactory "${ARTIFACTORY_DEPOT}/${1}"
+}
+
+function gitClone {
+    echo "Cloning/updating ${2} ..."
+    if [[ ! -d "${2}" ]]; then
+        git clone -b $3 $1 $2
+    else
+        pushd $2
+        git clean -fdx
+        git checkout -f $3
+        git pull origin $3
+        popd
+    fi
+}
+
+mkdir -p $DEPENDENCIES_FOLDER
+pushd $DEPENDENCIES_FOLDER || exit
+
+downloadFromDepot "doxygen_1.8.6-2_amd64.deb"
+downloadFromDepot "ArmCompiler-5.06u7-linux.sh"
+downloadFromDepot "ArmCompiler-6.16-linux-x86_64.sh"
+downloadFromDepot "ArmCompiler-6.6.4-linux-x86_64.sh"
+downloadFromDepot "gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2"
+downloadFromDepot "fvp-11.12-linux-x86_64.tar.gz"
+downloadFromArtifactory "mcu.promoted/staging/devtools/tools/packchk/${PACKCHK_VERSION}/linux64/PackChk"
+
+gitClone "ssh://${USER}@eu-gerrit-1.euhpc.arm.com:29418/dsg/cmsis/buildtools" "buildtools" "master"
+gitClone "ssh://${USER}@eu-gerrit-1.euhpc.arm.com:29418/scratch/jonant01/python-matrix-runner" "python-matrix-runner" "master"
+
+popd || exit
diff --git a/docker/requirements.txt b/docker/requirements.txt
new file mode 100644
index 0000000..7fc77dd
--- /dev/null
+++ b/docker/requirements.txt
@@ -0,0 +1,5 @@
+gcovr~=4.2
+junit-xml~=1.9
+jira~=2.0
+junitparser~=1.4
+Jinja2~=2.11
diff --git a/docker/rtebuild/armcc.rtebuild b/docker/rtebuild/armcc.rtebuild
new file mode 100644
index 0000000..a18f15d
--- /dev/null
+++ b/docker/rtebuild/armcc.rtebuild
@@ -0,0 +1,27 @@
+toolchain:
+  ARMCC5:
+    env:
+      PATH     : [ "/opt/armcc/bin" ]
+    rte:
+      Tcompiler: "ARMCC"
+      Toptions : "AC5"
+    ccompiler:
+      cmd     : "armcc"
+      cmdfile : "--via \""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "-D"
+    assembler:
+      cmd     : "armasm"
+      cmdfile : "--via \""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "--pd \"%{str.join(' SETA ', (str.split(value, '=') + [ '1' ])[0:2])}\""
+    linker:
+      cmd     : "armlink"
+      cmdfile : "--via \""
+      input   : "\""
+      output  : "-o \""
+      script  : "--scatter=\""
diff --git a/docker/rtebuild/armclang.rtebuild b/docker/rtebuild/armclang.rtebuild
new file mode 100644
index 0000000..948191d
--- /dev/null
+++ b/docker/rtebuild/armclang.rtebuild
@@ -0,0 +1,63 @@
+toolchain:
+  ARMCC6:
+    env:
+      PATH     : [ "/opt/armclang/bin" ]
+    rte:
+      Tcompiler: "ARMCC"
+      Toptions : "AC6"
+    ccompiler:
+      cmd     : "armclang"
+      cmdfile : "@\""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "-D"
+    assembler:
+      cmd     : "armclang"
+      cmdfile : "@\""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "-D"
+    linker:
+      cmd     : "armclang"
+      cmdfile : "@\""
+      input   : "\""
+      output  : "-o \""
+      script  : "-Wl,--scatter=\""
+    librarian:
+      cmd     : "armar"
+      cmdfile : "--Via \""
+      input   : "\""
+      output  : "--create \""
+  ARMCC6_MDK:
+    env:
+      PATH             : [ "/opt/armclang/bin" ]
+    rte:
+      Tcompiler: "ARMCC"
+      Toptions : "AC6"
+    ccompiler:
+      cmd     : "armclang"
+      cmdfile : "@\""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "-D"
+    assembler:
+      cmd     : "armasm"
+      cmdfile : "--Via \""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "--pd \"%{value.replace('=', ' SETA ') if '=' in value else value+' SETA 1'}\""
+    linker:
+      cmd     : "armlink"
+      cmdfile : "--Via \""
+      input   : "\""
+      output  : "-o \""
+      script  : "--scatter=\""
+    librarian:
+      cmd     : "armar"
+      cmdfile : "--Via \""
+      input   : "\""
+      output  : "--create \""
diff --git a/docker/rtebuild/armclang_ltm.rtebuild b/docker/rtebuild/armclang_ltm.rtebuild
new file mode 100644
index 0000000..b688202
--- /dev/null
+++ b/docker/rtebuild/armclang_ltm.rtebuild
@@ -0,0 +1,63 @@
+toolchain:
+  ARMCC6_LTM:
+    env:
+      PATH             : [ "/opt/armclangltm/bin" ]
+    rte:
+      Tcompiler: "ARMCC"
+      Toptions : "AC6"
+    ccompiler:
+      cmd     : "armclang"
+      cmdfile : "@\""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "-D"
+    assembler:
+      cmd     : "armclang"
+      cmdfile : "@\""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "-D"
+    linker:
+      cmd     : "armclang"
+      cmdfile : "@\""
+      input   : "\""
+      output  : "-o \""
+      script  : "-Wl,--scatter=\""
+    librarian:
+      cmd     : "armar"
+      cmdfile : "--Via \""
+      input   : "\""
+      output  : "--create \""
+  ARMCC6_LTM_MDK:
+    env:
+      PATH             : [ "/opt/armclangltm/bin" ]
+    rte:
+      Tcompiler: "ARMCC"
+      Toptions : "AC6"
+    ccompiler:
+      cmd     : "armclang"
+      cmdfile : "@\""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "-D"
+    assembler:
+      cmd     : "armasm"
+      cmdfile : "--Via \""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "--pd \"%{value.replace('=', ' SETA ') if '=' in value else value+' SETA 1'}\""
+    linker:
+      cmd     : "armlink"
+      cmdfile : "--Via \""
+      input   : "\""
+      output  : "-o \""
+      script  : "--scatter=\""
+    librarian:
+      cmd     : "armar"
+      cmdfile : "--Via \""
+      input   : "\""
+      output  : "--create \""
diff --git a/docker/rtebuild/gcc.rtebuild b/docker/rtebuild/gcc.rtebuild
new file mode 100644
index 0000000..a9e5af6
--- /dev/null
+++ b/docker/rtebuild/gcc.rtebuild
@@ -0,0 +1,27 @@
+toolchain:
+  GCC:
+    env:
+      PATH     : [ "/opt/gcc-arm-none-eabi-10-2020-q4-major/bin" ]
+    rte:
+      Tcompiler: "GCC"
+      Toptions : ""
+    ccompiler:
+      cmd     : "arm-none-eabi-gcc"
+      cmdfile : "@\""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "-D"
+    assembler:
+      cmd     : "arm-none-eabi-gcc"
+      cmdfile : "@\""
+      input   : "\""
+      output  : "-o \""
+      include : "-I\""
+      define  : "-D"
+    linker:
+      cmd     : "arm-none-eabi-gcc"
+      cmdfile : "@\""
+      input   : "\""
+      output  : "-o \""
+      script  : "-T \""
diff --git a/docker/rtebuild/toolchain.rtebuild b/docker/rtebuild/toolchain.rtebuild
new file mode 100644
index 0000000..8970170
--- /dev/null
+++ b/docker/rtebuild/toolchain.rtebuild
@@ -0,0 +1,6 @@
+packdir: ${home}/.rtebuild/PACK
+import:
+ - armcc.rtebuild
+ - armclang.rtebuild
+ - armclang_ltm.rtebuild
+ - gcc.rtebuild