diff --git a/Dockerfile b/Dockerfile index fe46cd45..338e96dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,34 @@ FROM ubuntu:xenial -RUN apt-get update && \ - apt-get install -y curl && \ +# Install the JDK +# We are going to need some 32 bit binaries because aapt requires it +# file is need by the script that creates NDK toolchains +ENV DEBIAN_FRONTEND noninteractive +RUN dpkg --add-architecture i386 && \ + apt-get update -qq && \ + apt-get install -y file git curl wget zip unzip bsdmainutils strace lsof \ + build-essential libc6:i386 software-properties-common \ + libstdc++6:i386 libgcc1:i386 libncurses5:i386 libz1:i386 \ + s3cmd libconfig++9v5 python build-essential && \ curl -sL https://deb.nodesource.com/setup_4.x | bash - && \ - apt-get install -y nodejs gcc-4.9 python build-essential + apt-get install -y nodejs && \ + echo oracle-java6-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \ + add-apt-repository -y ppa:webupd8team/java && \ + apt-get update -qq && \ + apt-get install -y oracle-java8-installer && \ + rm -rf /var/cache/oracle-jdk8-installer && \ + apt-get clean ENV NPM_CONFIG_UNSAFE_PERM true + +# Locales +RUN locale-gen en_US.UTF-8 +ENV LANG "en_US.UTF-8" +ENV LANGUAGE "en_US.UTF-8" +ENV LC_ALL "en_US.UTF-8" + +# ENV PATH ${PATH}:${NDK_HOME} + +# Install writable dir +RUN mkdir /tmp/opt && chmod 777 /tmp/opt + diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000..4c3ab071 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,126 @@ +#!groovy +import groovy.json.JsonOutput + +repoName = 'realm-js' // This is a global variable + +def getSourceArchive() { + checkout scm + sh 'git clean -ffdx -e .????????' + sshagent(['realm-ci-ssh']) { + sh 'git submodule update --init --recursive' + } +} + +def readGitTag() { + sh "git describe --exact-match --tags HEAD | tail -n 1 > tag.txt 2>&1 || true" + def tag = readFile('tag.txt').trim() + return tag +} + +def readGitSha() { + sh "git rev-parse HEAD | cut -b1-8 > sha.txt" + def sha = readFile('sha.txt').readLines().last().trim() + return sha +} + +def getVersion(){ + def dependencies = readProperties file: 'dependencies.list' + def gitTag = readGitTag() + def gitSha = readGitSha() + if (gitTag == "") { + return "${dependencies.VERSION}-g${gitSha}" + } + else { + return dependencies.VERSION + } +} + +def setBuildName(newBuildName) { + currentBuild.displayName = "${currentBuild.displayName} - ${newBuildName}" +} + +def gitTag +def gitSha +def dependencies +def version + +stage('check') { + node('docker') { + getSourceArchive() + + dependencies = readProperties file: 'dependencies.list' + + gitTag = readGitTag() + gitSha = readGitSha() + version = getVersion() + echo "tag: ${gitTag}" + if (gitTag == "") { + echo "No tag given for this build" + setBuildName("${gitSha}") + } else { + if (gitTag != "v${dependencies.VERSION}") { + echo "Git tag '${gitTag}' does not match v${dependencies.VERSION}" + } else { + echo "Building release: '${gitTag}'" + setBuildName("Tag ${gitTag}") + } + } + echo "version: ${version}" + } +} + +def doDockerBuild(target, postStep = null) { + return { + timeout(50) { // minutes + node('docker') { + getSourceArchive() + sh "bash scripts/docker-test.sh ${target}" + if(postStep) { + postStep.call() + } + } + } + } +} + +def doBuild(nodeSpec, target, postStep = null) { + return { + timeout(50) { // minutes + node(nodeSpec) { + getSourceArchive() + sh "bash scripts/test.sh ${target}" + if(postStep) { + postStep.call() + } + } + } + } +} + +stage('build') { + parallel( + eslint: doDockerBuild('eslint-ci', { + step([$class: 'CheckStylePublisher', canComputeNew: false, canRunOnFailed: true, defaultEncoding: '', healthy: '', pattern: 'eslint.xml', unHealthy: '']) + }), + jsdoc: doDockerBuild('jsdoc', { + publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: 'docs/output', reportFiles: 'index.html', reportName: 'Docs']) + }), + linux_node_debug: doDockerBuild('node Debug'), + linux_node_release: doDockerBuild('node Release'), + linux_test_runners: doDockerBuild('test-runners'), + macos_node_debug: doBuild('osx_vegas', 'node Debug'), + macos_node_release: doBuild('osx_vegas', 'node Release'), + macos_realmjs_debug: doBuild('osx_vegas', 'realmjs Debug'), + macos_realmjs_release: doBuild('osx_vegas', 'realmjs Release'), + macos_react_tests_debug: doBuild('osx_vegas', 'react-tests Debug'), + macos_react_tests_release: doBuild('osx_vegas', 'react-tests Release', { + junit 'build/reports/junit.xml' + }), + macos_react_example_debug: doBuild('osx_vegas', 'react-example Debug'), + macos_react_example_release: doBuild('osx_vegas', 'react-example Release'), + android_react_tests: doBuild('FastLinux', 'react-tests-android', { + sh "cat tests/react-test-app/tests.xml" + junit 'tests/react-test-app/tests.xml' + }) + ) +} \ No newline at end of file diff --git a/scripts/docker-wrapper.sh b/scripts/docker-wrapper.sh new file mode 100755 index 00000000..22bdfee3 --- /dev/null +++ b/scripts/docker-wrapper.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# This is a wrapper script which uses docker. It allows you to run commands +# in a docker environment. + +set -e + +cmd=${@:-/bin/bash} + +./scripts/docker_build_wrapper.sh ci/realm-js:build . + +exec docker run --rm \ + -u $(id -u) \ + -e HOME=/tmp \ + -v $(pwd):/source \ + -w /source \ + ci/realm-js:build \ + ${cmd} diff --git a/scripts/test.sh b/scripts/test.sh index f931ff32..814a6365 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -112,6 +112,11 @@ case "$TARGET" in npm install npm run lint . ;; +"eslint-ci") + [[ $CONFIGURATION == 'Debug' ]] && exit 0 + npm install + ./node_modules/.bin/eslint -f checkstyle . > eslint.xml || true + ;; "jsdoc") [[ $CONFIGURATION == 'Debug' ]] && exit 0 npm install