From f7b57a974d1c68878c562ef365dd947b7407c496 Mon Sep 17 00:00:00 2001 From: Martin Stockhammer Date: Sun, 16 Apr 2017 20:32:34 +0200 Subject: [PATCH] Adding docker scripts for ci browser testing --- src/ci/docker/webtest/Dockerfile | 77 ++++++++++++++++++++ src/ci/docker/webtest/chrome_launcher.sh | 41 +++++++++++ src/ci/docker/webtest/entry_point.sh | 51 +++++++++++++ src/ci/scripts/container_webtest.sh | 92 ++++++++++++++++++++++++ 4 files changed, 261 insertions(+) create mode 100644 src/ci/docker/webtest/Dockerfile create mode 100644 src/ci/docker/webtest/chrome_launcher.sh create mode 100644 src/ci/docker/webtest/entry_point.sh create mode 100644 src/ci/scripts/container_webtest.sh diff --git a/src/ci/docker/webtest/Dockerfile b/src/ci/docker/webtest/Dockerfile new file mode 100644 index 000000000..b4c416f40 --- /dev/null +++ b/src/ci/docker/webtest/Dockerfile @@ -0,0 +1,77 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +# Author: Martin Stockhammer +# Date: 2017-04-16 +# +# Dockerfile for ci testing of the web modules. +# Currently only chrome browser is installed into the image. +# Uses selenium version 2.53.1 + +FROM ubuntu:yakkety +MAINTAINER Apache Archiva + +ENV DEBIAN_FRONTEND noninteractive +ENV DEBCONF_NONINTERACTIVE_SEEN true + +ARG CHROME_VERSION=google-chrome-stable +RUN apt-get -qqy update +RUN apt-get -qqy install apt-utils >/dev/null 2>&1 +RUN apt-get -qqy install wget unzip >/dev/null +RUN apt-get -qqy upgrade +RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ + && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list \ + && apt-get -qqy update \ + && apt-get -qqy install \ + $CHROME_VERSION \ + >/dev/null + + +ARG CHROME_DRIVER_VERSION=2.29 +RUN wget --no-verbose -O /tmp/chromedriver_linux64.zip https://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip \ + && rm -rf /opt/selenium/chromedriver \ + && unzip /tmp/chromedriver_linux64.zip -d /opt/selenium \ + && rm /tmp/chromedriver_linux64.zip \ + && mv /opt/selenium/chromedriver /opt/selenium/chromedriver-$CHROME_DRIVER_VERSION \ + && chmod 755 /opt/selenium/chromedriver-$CHROME_DRIVER_VERSION \ + && ln -fs /opt/selenium/chromedriver-$CHROME_DRIVER_VERSION /usr/bin/chromedriver \ + >/dev/null + +RUN apt-get -qqy install openjdk-8-jdk xvfb dbus locales >/dev/null \ + && rm -rf /var/lib/apt/lists/* /var/cache/apt/* \ + >/dev/null + +ARG SELENIUM_VERSION=2.53.1 +RUN mkdir -p /opt/bin && wget --no-verbose -O /opt/bin/selenium-server-standalone.jar https://selenium-release.storage.googleapis.com/2.53/selenium-server-standalone-$SELENIUM_VERSION.jar \ + && chmod 644 /opt/bin/selenium-server-standalone.jar + +COPY entry_point.sh /opt/bin/entry_point.sh +COPY chrome_launcher.sh /usr/bin/google-chrome +RUN chmod +x /opt/bin/entry_point.sh +RUN chmod +x /usr/bin/google-chrome + +ENV SCREEN_WIDTH 1360 +ENV SCREEN_HEIGHT 1020 +ENV SCREEN_DEPTH 24 +ENV X_START_NUM=3 + +RUN echo "DBUS_SESSION_BUS_ADDRESS=/dev/null" >> /etc/environment + +CMD ["/opt/bin/entry_point.sh"] + + diff --git a/src/ci/docker/webtest/chrome_launcher.sh b/src/ci/docker/webtest/chrome_launcher.sh new file mode 100644 index 000000000..02e3fe753 --- /dev/null +++ b/src/ci/docker/webtest/chrome_launcher.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +# Author: Martin Stockhammer +# Date: 2017-04-16 +# +# Starts the chrome browser from the chrome installation path. +# + +export GNOME_DISABLE_CRASH_DIALOG=SET_BY_GOOGLE_CHROME +export DBUS_SESSION_BUS_ADDRESS=/dev/null + +# Make sure that the profile directory specified in the environment, if any, +# overrides the default. +if [[ -n "$CHROME_USER_DATA_DIR" ]]; then + PROFILE_DIRECTORY_FLAG="--user-data-dir=$CHROME_USER_DATA_DIR" +fi + +# Sanitize std{in,out,err} because they'll be shared with untrusted child +# processes (http://crbug.com/376567). +exec < /dev/null +exec > >(exec cat) +exec 2> >(exec cat >&2) + +exec /opt/google/chrome/chrome --no-sandbox "$@" diff --git a/src/ci/docker/webtest/entry_point.sh b/src/ci/docker/webtest/entry_point.sh new file mode 100644 index 000000000..4c6c1974a --- /dev/null +++ b/src/ci/docker/webtest/entry_point.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +# Author: Martin Stockhammer +# Date: 2017-04-16 +# +# This is the start script for the docker image that runs the +# selenium standalone server. +# Starts a Xvfb framebuffer server for the browser display. +# Uses the automatic display number determination from the xvfb-run script. + + +# Set the number for the xserver display to start +: ${X_START_NUM:-1} + +export GEOMETRY="$SCREEN_WIDTH""x""$SCREEN_HEIGHT""x""$SCREEN_DEPTH" + +function shutdown { + kill -s SIGTERM $NODE_PID + wait $NODE_PID +} + +if [ ! -z "$SE_OPTS" ]; then + echo "appending selenium options: ${SE_OPTS}" +fi + +rm -f /tmp/.X*lock + +xvfb-run -a -n $X_START_NUM --server-args="-screen 0 $GEOMETRY -ac +extension RANDR" \ + java ${JAVA_OPTS} -jar /opt/bin/selenium-server-standalone.jar \ + ${SE_OPTS} & +NODE_PID=$! + +trap shutdown SIGTERM SIGINT +wait $NODE_PID diff --git a/src/ci/scripts/container_webtest.sh b/src/ci/scripts/container_webtest.sh new file mode 100644 index 000000000..0b73d8430 --- /dev/null +++ b/src/ci/scripts/container_webtest.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +# Author: Martin Stockhammer +# Date: 2017-04-16 +# +# Builds and runs a container +# +# Tries to find the docker configuration in ../docker/${DOCKER_CFG} +# + +# Always change the version, if your Dockerfile or scripts of the container change +CONTAINER_VERSION="1.0" +CONTAINER_NAME="archiva/selenium" +DOCKER_CFG="webtest" +INSTANCE_NAME="archiva-webtest" +PORT_MAPPING="4444:4444" +NETWORK_TYPE="host" + +HERE=`dirname $0` + +TAG="${CONTAINER_NAME}:${CONTAINER_VERSION}" + +START_ARG="$1" + +function stop_instance() { + CONT=`docker ps -q --filter=name=${INSTANCE_NAME}` + if [ "${CONT}" != "" ]; then + echo "Stopping container ${INSTANCE_NAME}" + docker stop "${INSTANCE_NAME}" + fi + # We remove the instance always + CONT=`docker ps -a -q --filter=name=${INSTANCE_NAME}` + if [ "${CONT}" != "" ]; then + echo "Removing container ${INSTANCE_NAME}" + docker rm "${INSTANCE_NAME}" + fi +} + +function start_instance() { + echo "Starting container ${INSTANCE_NAME}" + docker run -d --network="${NETWORK_TYPE}" -p "${PORT_MAPPING}" --name "${INSTANCE_NAME}" "${TAG}" +} + +function print_usage() { + echo "container_webtest start|stop" + echo "Starts or stops the container. Builds the images if necessary" +} + +if [ "${START_ARG}" == "start" ]; then + IMG=`docker images -q ${TAG}` + # Build the image, if it does not exist + if [ "${IMG}" == "" ]; then + echo "Building image ${TAG}" + DOCKER_DIR="${HERE}/../docker/${DOCKER_CFG}" + MY_PWD=`pwd` + cd ${DOCKER_DIR} || { echo "Could not change to docker directory ${DOCKER_CFG}"; exit 1; } + docker build --force-rm -t "${TAG}" . + if [ $? -ne 0 ]; then + cd ${MY_PWD} + echo "Could not build docker image" + exit 1 + fi + cd ${MY_PWD} + IMG=`docker images -q ${TAG}` + fi + # Removing old instances + stop_instance + # Starting + start_instance +elif [ "${START_ARG}" == "stop" ]; then + stop_instance +else + print_usage +fi + -- 2.39.5