TiagoMSSantos/MobileRT

View on GitHub
deploy/Dockerfile.windows

Summary

Maintainability
Test Coverage
###############################################################################
# README
###############################################################################
# This Dockerfile prepares a docker image with MobileRT.
#
# It setups MobileRT by fetching it from git and compiling it using the
# `compile_native.sh` script inside the docker image.
# The script `compile_native.sh` compiles the MobileRT.
#
# At the moment, this Dockerfile allows to setup MobileRT inside a docker image
# based on Windows Operating Systems:
# * Windows Server Core
###############################################################################
###############################################################################


###############################################################################
# Set base docker image
###############################################################################
ARG BASE_IMAGE=mcr.microsoft.com/windows/servercore:ltsc2022
FROM ${BASE_IMAGE}
###############################################################################
###############################################################################


###############################################################################
# Setup arguments
###############################################################################
ARG BUILD_TYPE=release
ARG BRANCH=master
###############################################################################
###############################################################################


###############################################################################
# Define cmd as shell
###############################################################################
SHELL ["cmd", "/S", "/V:ON", "/E:ON", "/C"]
###############################################################################
###############################################################################


###############################################################################
# Install git & setup environment
###############################################################################
# Users: https://techcommunity.microsoft.com/t5/itops-talk-blog/how-to-change-the-user-account-for-windows-containers/ba-p/3601571
USER ContainerAdministrator

# Set system environment variables. ContainerAdministrator must be used so the change is persisted in the image.
# Set lib path. Windows doesn't use LD_LIBRARY_PATH, but use PATH instead.
ENV \
  PATH="C:\\MobileRT\\binariesShell;C:\\Windows;C:\\Windows\\System32;C:\\Windows\\System32\\WindowsPowerShell\\v1.0;C:\\ProgramData\\chocolatey\\bin;C:\\MobileRT\\binariesResourceCompiler;C:\\MobileRT\\libraries;C:\\MobileRT\\build_${BUILD_TYPE}\\lib;C:\\Programs\\Git\\bin;C:\\Git-LFS;C:\\Programs\\CMake\\bin;${PATH}" \
  RC="rc" \
  CXX="g++" \
  CC="gcc" \
  CXXFLAGS="-O3 -std=c++11" \
  BUILD_TYPE="${BUILD_TYPE}" \
  CL="/MP"

RUN \
  mklink /J "C:\\Programs" "C:\\Program Files" && \
  mklink /J "C:\\Git-LFS" "C:\\Program Files\\Git LFS" && \
  set && \
  # Install chocolatey Package Manager.
  powershell -NoProfile -ExecutionPolicy Bypass -Command " \
    Write-Host "Setting up DNS"; \
    $ErrorActionPreference = 'Stop'; \
    $ProgressPreference = 'Continue'; \
    $verbosePreference = 'Continue'; \
    Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending; \
    netsh interface ipv4 set dnsserver 17 static address=8.8.8.8 register=primary; \
    $env:chocolateyUseWindowsCompression = 'true'; \
    winrm set winrm/config/winrs '@{MaxMemoryPerShellMB=\"2048\"}'; \
    Set-ExecutionPolicy Bypass -Scope Process -Force; \
    Write-Host "Setting up Network protocol"; \
    [Net.ServicePointManager]::SecurityProtocol; \
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; \
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; \
    [System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials; \
    [Net.ServicePointManager]::SecurityProtocol; \
    Write-Host "Downloading chocolatey"; \
    iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')); \
  " && \
  # Install git: https://community.chocolatey.org/packages/git
  choco install -y git && \
  # Configure git.
  git config --system https.postBuffer 1048576000 && \
  git config --system --add safe.directory C:/MobileRT && \
  echo "Configured git." && \
  set

USER ContainerUser
###############################################################################
###############################################################################


###############################################################################
# Get MobileRT contents (required to create docker image in CI)
###############################################################################
RUN \
  git --version && \
  # Clone repository.
  git clone https://github.com/TiagoMSSantos/MobileRT.git \
    --shallow-submodules \
    --progress \
    --branch !BRANCH! && \
  cd MobileRT && \
  dir P* /X .\\app\\src\\androidTest\\resources\\CornellBox\\CornellBox-Water.obj && \
  dir P* /X .\\app\\src\\androidTest\\resources\\teapot\\teapot.obj && \
  # Print environment.
  echo "BRANCH: !BRANCH!" && \
  echo "BUILD_TYPE: !BUILD_TYPE!"
###############################################################################
###############################################################################


###############################################################################
# Copy necessary tools to docker image
###############################################################################
COPY tools MobileRT
WORKDIR MobileRT
###############################################################################
###############################################################################


###############################################################################
# Install dependencies
###############################################################################
USER ContainerAdministrator

RUN \
  dir P* /X .\\binariesShell\\sh.exe && \
  dir P* /X .\\binariesShell\\cut.exe && \
  dir P* /X .\\binariesShell\\ls.exe && \
  dir P* /X .\\binariesShell\\timeout.exe && \
  dir P* /X . && \
  ls -la . && \
  ls -la ./binariesShell && \
  ls -la ./binariesResourceCompiler && \
  set && \
  sh scripts/install_dependencies.sh && \
  icacls "C:\MobileRT" /c /t /grant:r "Authenticated Users":(OI)(CI)F && \
  sh -c "echo ${PWD} && ls -la /Qt | grep '[[:digit:]]\.[[:digit:]].*' | awk '{print $(NF)}' | head -1 > qt_version.txt && cat qt_version.txt" && \
  for /f "delims=" %x in ('type qt_version.txt') do set QT_VERSION="%x" && \
  setx /M QT_VERSION "!QT_VERSION: =!"

RUN \
  dir P* /X C:\Qt\!QT_VERSION!\mingw81_64\bin\qmake.exe && \
  setx /M PATH "C:\\Qt\\!QT_VERSION!\\mingw81_64\\bin;!PATH!" && \
  setx /M Qt5_DIR "C:\\Qt\\!QT_VERSION!\\mingw81_64\\lib\\cmake\\Qt5" && \
  setx /M CPLUS_INCLUDE_PATH "C:\\Qt\\!QT_VERSION!\\mingw81_64\\include;C:\\Qt\\!QT_VERSION!\\mingw81_64\\include\\QtWidgets;C:\\Qt\\!QT_VERSION!\\mingw81_64\\include\\QtGui;C:\\Qt\\!QT_VERSION!\\mingw81_64\\include\\QtCore"

USER ContainerUser

# Add environment variables in ContainerUser to also work with BuildKit
ENV QT_VERSION="5.15.2"
ENV \
  PATH="C:\\Qt\\${QT_VERSION}\\mingw81_64\\bin;${PATH}" \
  Qt5_DIR="C:\\Qt\\${QT_VERSION}\\mingw81_64\\lib\\cmake\\Qt5" \
  CPLUS_INCLUDE_PATH="C:\\Qt\\${QT_VERSION}\\mingw81_64\\include;C:\\Qt\\${QT_VERSION}\\mingw81_64\\include\\QtWidgets;C:\\Qt\\${QT_VERSION}\\mingw81_64\\include\\QtGui;C:\\Qt\\${QT_VERSION}\\mingw81_64\\include\\QtCore"
###############################################################################
###############################################################################


###############################################################################
# Compile MobileRT
###############################################################################
RUN \
  # Test commands
  set && \
  dir P* /X . && \
  choco /? && \
  rc /? && \
  qmake --help && \
  sh scripts/compile_native.sh -t !BUILD_TYPE! -c g++ -r yes && \
  du -h -d 1 build_!BUILD_TYPE!/bin && \
  du -h -d 1 build_!BUILD_TYPE!/lib && \
  rm -rfv docs && \
  rm -rfv documentation && \
  rm -rfv git-hooks && \
  rm -rfv gradle && \
  rm -rfv .git && \
  ls -la ./app/src/androidTest/resources/CornellBox/CornellBox-Water.obj && \
  ls -la ./app/src/androidTest/resources/CornellBox/CornellBox-Water.mtl && \
  ls -la ./app/src/androidTest/resources/CornellBox/CornellBox-Water.cam && \
  ls -la ./app/src/androidTest/resources/teapot/teapot.obj && \
  ls -la ./app/src/androidTest/resources/teapot/teapot.mtl && \
  ls -la ./app/src/androidTest/resources/teapot/teapot.cam && \
  ls -la ./binariesShell && \
  ls -la ./binariesResourceCompiler && \
  set && \
  ls -la . && \
  cd
###############################################################################
###############################################################################


###############################################################################
# Execute MobileRT by default
###############################################################################
ENTRYPOINT ["cmd", "/S", "/V:ON", "/E:ON", "/C", "sh", "-c"]
CMD ["sh scripts/profile.sh !BUILD_TYPE!"]
###############################################################################
###############################################################################