From 3dd776190afecfafc1747ecc66f648460a28c17a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Soko=C5=82owski?= Date: Wed, 5 Sep 2018 14:17:25 -0400 Subject: [PATCH] use ubuntu:12.04 image to build linux app MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jakub SokoĊ‚owski --- .gitignore | 1 + ci/Jenkinsfile.linux | 22 +++++++++++- ci/desktop.groovy | 2 -- desktop/docker/Dockerfile | 71 +++++++++++++++++++++++++++++++++++++++ desktop/docker/Makefile | 17 ++++++++++ desktop/docker/README.md | 3 ++ 6 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 desktop/docker/Dockerfile create mode 100644 desktop/docker/Makefile create mode 100644 desktop/docker/README.md diff --git a/.gitignore b/.gitignore index 86a816172c..ebc9683a47 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,7 @@ shim.js # Desktop build index.desktop.js +desktop/docker/*.run # Generated by lein voom # diff --git a/ci/Jenkinsfile.linux b/ci/Jenkinsfile.linux index 5092899c8b..6f64e6a267 100644 --- a/ci/Jenkinsfile.linux +++ b/ci/Jenkinsfile.linux @@ -1,5 +1,18 @@ pipeline { - agent { label 'linux-new' } + agent { + /* privileged mode is necessary for fuse */ + docker { + label 'linux-new' + image 'statusteam/linux-desktop-ubuntu:16.04' + args ( + "--privileged "+ + "-v /dev/fuse:/dev/fuse "+ + "-v /var/tmp/lein:/var/tmp/lein:rw "+ + "-v /var/tmp/npm:/var/tmp/npm:rw "+ + "-v /opt/StatusImAppImage.zip:/opt/StatusImAppImage.zip:ro" + ) + } + } options { buildDiscarder(logRotator( @@ -9,10 +22,16 @@ pipeline { )) } + /** + * WARNING: Jenkins ignores PATH changes in Docker + * https://issues.jenkins-ci.org/browse/JENKINS-49076 + **/ environment { LANG = 'en_US.UTF-8' LANGUAGE = 'en_US.UTF-8' LC_ALL = 'en_US.UTF-8' + NPM_CONFIG_CACHE = '/var/tmp/npm' + LEIN_HOME = '/var/tmp/lein' } stages { @@ -22,6 +41,7 @@ pipeline { /* Necessary to load methods */ desktop = load 'ci/desktop.groovy' cmn = load 'ci/common.groovy' + sh 'env' desktop.prepDeps() } } diff --git a/ci/desktop.groovy b/ci/desktop.groovy index 0e797181f6..6d797dca8b 100644 --- a/ci/desktop.groovy +++ b/ci/desktop.groovy @@ -86,8 +86,6 @@ def prepDeps() { } def compileLinux() { - /* add path for QT installation binaries */ - env.PATH = "${qtBin}:${env.PATH}" dir('desktop') { sh 'rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile' sh """ diff --git a/desktop/docker/Dockerfile b/desktop/docker/Dockerfile new file mode 100644 index 0000000000..250338958b --- /dev/null +++ b/desktop/docker/Dockerfile @@ -0,0 +1,71 @@ +FROM ubuntu:16.04 AS qt_build + +RUN apt-get update && apt-get -y install \ + git libx11-xcb1 libxss1 libasound2 libfontconfig1 libdbus-1-3 && \ + apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +ADD qt-opensource-linux-x64-5.9.1.run /tmp/ +RUN git clone --depth=1 https://github.com/benlau/qtci.git /tmp/qtci && \ + /tmp/qtci/bin/extract-qt-installer /tmp/qt-opensource-linux-x64-5.9.1.run /opt/qt && \ + cd /opt/qt && \ + rm -fr Examples Docs Tools 5.9.1/android_armv7 \ + MaintenanceTool.dat MaintenanceTool MaintenanceTool.ini + +FROM ubuntu:16.04 + +COPY --from=qt_build /opt/qt /opt/qt +RUN ln -s /opt/qt/5.9.1/gcc_64/mkspecs /usr/local/mkspecs && \ + ln -s /opt/qt/5.9.1/gcc_64/plugins /usr/local/plugins && \ + ln -s /opt/qt/5.9.1/gcc_64 /opt/qt59 + +ENV LANG en_US.UTF-8 \ + LC_ALL en_US.UTF-8 \ + LANGUAGE en_US.UTF-8 \ + LEIN_HOME /var/tmp/lein \ + NPM_CONFIG_CACHE /var/tmp/npm + +# We have to do this because Jenkins doens't let us +# https://issues.jenkins-ci.org/browse/JENKINS-49076 +ENV PATH /opt/qt59/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + +RUN apt-get update && apt-get -y --no-install-recommends install curl software-properties-common && \ + curl -sL https://deb.nodesource.com/setup_8.x | bash - && \ + curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ + echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ + add-apt-repository -y ppa:longsleep/golang-backports && \ + apt-get remove -y software-properties-common && \ + apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + wget git unzip golang-go nodejs yarn file \ + apt-transport-https locales openjdk-8-jdk-headless \ + extra-cmake-modules build-essential gcc g++ fuse \ + libx11-xcb1 libxss1 libasound2 libgl-dev libsm6 libxrandr2 \ + libjasper-dev libegl1-mesa libxcomposite-dev libxcursor-dev && \ + locale-gen en_US.UTF-8 && \ + npm install -g npm@5.5.1 && \ + apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/man + +RUN cd /tmp && wget -q https://cmake.org/files/v3.12/cmake-3.12.2-Linux-x86_64.tar.gz && \ + tar xf cmake-3.12.2-Linux-x86_64.tar.gz --strip 1 -C /usr/local && \ + rm -fr /usr/local/doc/cmake && rm cmake-3.12.2-Linux-x86_64.tar.gz + +RUN curl -sL https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein -o /usr/bin/lein && \ + chmod +x /usr/bin/lein && /usr/bin/lein version + +RUN cd /tmp && \ + git clone --depth=1 https://github.com/status-im/react-native-desktop.git && \ + cp -r /tmp/react-native-desktop/react-native-cli /opt && \ + cd /opt/react-native-cli && \ + npm update && npm install -g && \ + cd && rm -r /tmp/react-native-desktop + +# These are the UID and GID values used by Jenkins +RUN addgroup --gid 1002 jenkins && \ + adduser --shell /bin/bash \ + --disabled-password --gecos "" \ + --uid 1001 --gid 1002 \ + --home /var/tmp/jenkins jenkins + +LABEL source="https://github.com/status-im/status-react/tree/develop/desktop/docker" \ + description="Image for building Linux Desktop version of Status app." \ + maintainer="jakub@status.im" diff --git a/desktop/docker/Makefile b/desktop/docker/Makefile new file mode 100644 index 0000000000..8e264fa22b --- /dev/null +++ b/desktop/docker/Makefile @@ -0,0 +1,17 @@ +GIT_COMMIT = $(shell git rev-parse --short HEAD) + +IMAGE_NAME = statusteam/linux-desktop-ubuntu:16.04 +QT_MD5SUM = b8dd904894ac6b09076b5f61d8b9d71a +QT_ARCHIVE = qt-opensource-linux-x64-5.9.1.run + +build: $(QT_ARCHIVE) + docker build \ + --label "commit=$(GIT_COMMIT)" \ + -t $(IMAGE_NAME) . + +$(QT_ARCHIVE): + wget https://download.qt.io/archive/qt/5.9/5.9.1/$(QT_ARCHIVE) + echo "$(QT_MD5SUM) $(QT_ARCHIVE)" | md5sum --check + +push: build + docker push $(IMAGE_NAME) diff --git a/desktop/docker/README.md b/desktop/docker/README.md new file mode 100644 index 0000000000..17b01d7d98 --- /dev/null +++ b/desktop/docker/README.md @@ -0,0 +1,3 @@ +# Description + +This dockerfile is used to generate an image based on Ubuntu that will be used by Jenkins to build the Linux version of the desktop app.