--- /dev/null
- TARGETS?=centos7 debian10 debian11 ubuntu1804 ubuntu2004
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+# Use bash, and run all lines in each recipe as one shell command
+SHELL := /bin/bash
+.ONESHELL:
+
+GOPATH?=~/go
+APP_NAME?=arvados-workbench2
+
+# VERSION uses all the above to produce X.Y.Z.timestamp
+# something in the lines of 1.2.0.20180612145021, this will be the package version
+# it can be overwritten when invoking make as in make packages VERSION=1.2.0
+VERSION?=$(shell ./version-at-commit.sh HEAD)
+# We don't use BUILD_NUMBER at the moment, but it needs to be defined
+BUILD_NUMBER?=0
+GIT_COMMIT?=$(shell git rev-parse --short HEAD)
+
+# ITERATION is the package iteration, intended for manual change if anything non-code related
+# changes in the package. (i.e. example config files externally added
+ITERATION?=1
+
- for target in $(TARGETS) ; do \
- mkdir -p packages/$$target
- if [[ $$target =~ ^centos ]]; then
- cp -p $(RPM_FILE) packages/$$target ; \
- else
- cp -p $(DEB_FILE) packages/$$target ; \
- fi
- done
- rm -f $(RPM_FILE)
- rm -f $(DEB_FILE)
++TARGETS?=centos7 rocky8 debian10 debian11 ubuntu1804 ubuntu2004
+
+ARVADOS_DIRECTORY?=unset
+
+DESCRIPTION=Arvados Workbench2 - Arvados is a free and open source platform for big data science.
+MAINTAINER=Arvados Package Maintainers <packaging@arvados.org>
+
+# DEST_DIR will have the build package copied.
+DEST_DIR=/var/www/$(APP_NAME)/workbench2/
+
+# Debian package file
+DEB_FILE=$(APP_NAME)_$(VERSION)-$(ITERATION)_amd64.deb
+
+# redHat package file
+RPM_FILE=$(APP_NAME)-$(VERSION)-$(ITERATION).x86_64.rpm
+
+export WORKSPACE?=$(shell pwd)
+
+.PHONY: help clean* yarn-install test build packages packages-with-version integration-tests-in-docker
+
+help:
+ @echo >&2
+ @echo >&2 "There is no default make target here. Did you mean 'make test'?"
+ @echo >&2
+ @echo >&2 "More info:"
+ @echo >&2 " Installing --> http://doc.arvados.org/install"
+ @echo >&2 " Developing/contributing --> https://dev.arvados.org"
+ @echo >&2 " Project home --> https://arvados.org"
+ @echo >&2
+ @false
+
+clean-deb:
+ rm -f $(WORKSPACE)/*.deb
+
+clean-rpm:
+ rm -f $(WORKSPACE)/*.rpm
+
+clean-node-modules:
+ rm -rf $(WORKSPACE)/node_modules
+
+clean: clean-rpm clean-deb clean-node-modules
+
+arvados-server-install: check-arvados-directory
+ cd $(ARVADOS_DIRECTORY)
+ go mod download
+ cd cmd/arvados-server
+ go install
+ cd -
+ ls -l $(GOPATH)/bin/arvados-server
+ $(GOPATH)/bin/arvados-server install -type test
+
+yarn-install:
+ yarn install
+
+unit-tests: yarn-install
+ yarn test --no-watchAll --bail --ci
+
+integration-tests: yarn-install check-arvados-directory
+ yarn run cypress install
+ $(WORKSPACE)/tools/run-integration-tests.sh -a $(ARVADOS_DIRECTORY)
+
+integration-tests-in-docker: workbench2-build-image check-arvados-directory
+ docker run -ti -v$(PWD):/usr/src/workbench2 -v$(ARVADOS_DIRECTORY):/usr/src/arvados -w /usr/src/workbench2 -e ARVADOS_DIRECTORY=/usr/src/arvados workbench2-build make arvados-server-install integration-tests
+
+unit-tests-in-docker: workbench2-build-image check-arvados-directory
+ docker run -ti -v$(PWD):/usr/src/workbench2 -v$(ARVADOS_DIRECTORY):/usr/src/arvados -w /usr/src/workbench2 -e ARVADOS_DIRECTORY=/usr/src/arvados workbench2-build make arvados-server-install unit-tests
+
+test: unit-tests integration-tests
+
+build: yarn-install
+ VERSION=$(VERSION) BUILD_NUMBER=$(BUILD_NUMBER) GIT_COMMIT=$(GIT_COMMIT) yarn build
+
+$(DEB_FILE): build
+ fpm \
+ -s dir \
+ -t deb \
+ -n "$(APP_NAME)" \
+ -v "$(VERSION)" \
+ --iteration "$(ITERATION)" \
+ --vendor="The Arvados Authors" \
+ --maintainer="$(MAINTAINER)" \
+ --url="https://arvados.org" \
+ --license="GNU Affero General Public License, version 3.0" \
+ --description="$(DESCRIPTION)" \
+ --config-files="etc/arvados/$(APP_NAME)/workbench2.example.json" \
+ $(WORKSPACE)/build/=$(DEST_DIR) \
+ etc/arvados/workbench2/workbench2.example.json=/etc/arvados/$(APP_NAME)/workbench2.example.json
+
+$(RPM_FILE): build
+ fpm \
+ -s dir \
+ -t rpm \
+ -n "$(APP_NAME)" \
+ -v "$(VERSION)" \
+ --iteration "$(ITERATION)" \
+ --vendor="The Arvados Authors" \
+ --maintainer="$(MAINTAINER)" \
+ --url="https://arvados.org" \
+ --license="GNU Affero General Public License, version 3.0" \
+ --description="$(DESCRIPTION)" \
+ --config-files="etc/arvados/$(APP_NAME)/workbench2.example.json" \
+ $(WORKSPACE)/build/=$(DEST_DIR) \
+ etc/arvados/workbench2/workbench2.example.json=/etc/arvados/$(APP_NAME)/workbench2.example.json
+
+copy: $(DEB_FILE) $(RPM_FILE)
++ for target in $(TARGETS); do \
++ mkdir -p "packages/$$target" && \
++ case "$$target" in \
++ centos*|rocky*) cp -p "$(RPM_FILE)" "packages/$$target" ;; \
++ debian*|ubuntu*) cp -p "$(DEB_FILE)" "packages/$$target" ;; \
++ *) echo "Unknown copy target $$target"; exit 1 ;; \
++ esac ; \
++ done ; \
++ rm -f "$(DEB_FILE)" "$(RPM_FILE)"
+
+# use FPM to create DEB and RPM
+packages: copy
+
+check-arvados-directory:
+ @if test "${ARVADOS_DIRECTORY}" == "unset"; then echo "the environment variable ARVADOS_DIRECTORY must be set to the path of an arvados git checkout"; exit 1; fi
+ @if ! test -d "${ARVADOS_DIRECTORY}"; then echo "the environment variable ARVADOS_DIRECTORY does not point at a directory"; exit 1; fi
+
+packages-in-docker: check-arvados-directory workbench2-build-image
+ docker run --env ci="true" \
+ --env ARVADOS_DIRECTORY=/tmp/arvados \
+ --env APP_NAME=${APP_NAME} \
+ --env ITERATION=${ITERATION} \
+ --env TARGETS="${TARGETS}" \
+ -w="/tmp/workbench2" \
+ -t -v ${WORKSPACE}:/tmp/workbench2 \
+ -v ${ARVADOS_DIRECTORY}:/tmp/arvados workbench2-build:latest \
+ make packages
+
+workbench2-build-image:
+ (cd docker && docker build -t workbench2-build .)
--- /dev/null
- yarn run wait-on --timeout 300000 https-get://localhost:${WB2_PORT} || exit 1
+#!/bin/bash
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: AGPL-3.0
+
+set -e -o pipefail
+
+cleanup() {
+ set -x
+ set +e +o pipefail
+ kill ${arvboot_PID} ${consume_stdout_PID} ${wb2_PID} ${consume_wb2_stdout_PID}
+ wait ${arvboot_PID} ${consume_stdout_PID} ${wb2_PID} ${consume_wb2_stdout_PID} || true
+ if [ ${CLEANUP_ARVADOS_DIR} -eq 1 ]; then
+ rm -rf ${ARVADOS_DIR}
+ fi
+ echo >&2 "done"
+}
+
+random_free_port() {
+ while port=$(shuf -n1 -i $(cat /proc/sys/net/ipv4/ip_local_port_range | tr '\011' '-'))
+ netstat -atun | grep -q ":$port\s" ; do
+ continue
+ done
+ echo $port
+}
+
+usage() {
+ echo "Usage: ${0} [options]"
+ echo "Options:"
+ echo " -i Run Cypress in interactive mode."
+ echo " -a PATH Arvados dir. If PATH doesn't exist, a repo clone is downloaded there."
+ echo " -w PATH Workbench2 dir. Default: Current working directory"
+ exit 0
+}
+
+# Allow self-signed certs on 'wait-on'
+export NODE_TLS_REJECT_UNAUTHORIZED=0
+
+ARVADOS_DIR="unset"
+CLEANUP_ARVADOS_DIR=0
+CYPRESS_MODE="run"
+WB2_DIR=`pwd`
+
+while getopts "ia:w:" o; do
+ case "${o}" in
+ i)
+ # Interactive mode
+ CYPRESS_MODE="open"
+ ;;
+ a)
+ ARVADOS_DIR=${OPTARG}
+ ;;
+ w)
+ WB2_DIR=${OPTARG}
+ ;;
+ *)
+ echo "Invalid Option: -$OPTARG" 1>&2
+ usage
+ ;;
+ esac
+done
+shift $((OPTIND-1))
+
+if [ "${ARVADOS_DIR}" = "unset" ]; then
+ echo "ARVADOS_DIR is unset, creating a temporary directory for new checkout"
+ ARVADOS_DIR=`mktemp -d`
+fi
+
+echo "ARVADOS_DIR is ${ARVADOS_DIR}"
+
+ARVADOS_LOG=${ARVADOS_DIR}/arvados.log
+ARVADOS_CONF=${WB2_DIR}/tools/arvados_config.yml
+VOCABULARY_CONF=${WB2_DIR}/tools/example-vocabulary.json
+
+if [ ! -f "${WB2_DIR}/src/index.tsx" ]; then
+ echo "ERROR: '${WB2_DIR}' isn't workbench2's directory"
+ usage
+fi
+
+if [ ! -f ${ARVADOS_CONF} ]; then
+ echo "ERROR: Arvados config file ${ARVADOS_CONF} not found"
+ exit 1
+fi
+
+if [ -f "${WB2_DIR}/public/config.json" ]; then
+ echo "ERROR: Please move public/config.json file out of the way"
+ exit 1
+fi
+
+if [ ! -d "${ARVADOS_DIR}/.git" ]; then
+ mkdir -p ${ARVADOS_DIR} || exit 1
+ CLEANUP_ARVADOS_DIR=1
+ echo "Downloading arvados..."
+ git clone https://git.arvados.org/arvados.git ${ARVADOS_DIR} || exit 1
+fi
+
+if [ ! -x ${GOPATH:-${HOME}/go}/bin/arvados-server ]; then
+ echo "Building & installing arvados-server..."
+ cd ${ARVADOS_DIR}
+ go mod download || exit 1
+ cd cmd/arvados-server
+ go install
+ cd -
+
+ echo "Installing dev dependencies..."
+ ${GOPATH:-${HOME}/go}/bin/arvados-server install -type test || exit 1
+fi
+
+echo "Launching arvados in test mode..."
+TMPSUBDIR=$(mktemp -d -p /tmp | cut -d \/ -f3) # Removes the /tmp/ part for the regex below
+TMPDIR=/tmp/${TMPSUBDIR}
+cp ${VOCABULARY_CONF} ${TMPDIR}/voc.json
+cp ${ARVADOS_CONF} ${TMPDIR}/arvados.yml
+sed -i "s/VocabularyPath: \".*\"/VocabularyPath: \"\/tmp\/${TMPSUBDIR}\/voc.json\"/" ${TMPDIR}/arvados.yml
+coproc arvboot (${GOPATH:-${HOME}/go}/bin/arvados-server boot \
+ -type test \
+ -source "${ARVADOS_DIR}" \
+ -config ${TMPDIR}/arvados.yml \
+ -no-workbench1 \
+ -no-workbench2 \
+ -own-temporary-database \
+ -timeout 20m 2> ${ARVADOS_LOG})
+trap cleanup ERR EXIT
+
+read controllerInfo <&"${arvboot[0]}" || exit 1
+controllerURL=`echo "$controllerInfo" | awk '{print $1;}'`;
+echo "Arvados up and running at ${controllerURL}"
+IFS='/' ; read -ra controllerHostPort <<< "${controllerURL}" ; unset IFS
+controllerHostPort=${controllerHostPort[2]}
+
+# Copy coproc's stdout to stderr, to ensure `arvados-server boot`
+# doesn't get blocked trying to write stdout.
+exec 7<&"${arvboot[0]}"; coproc consume_stdout (cat <&7 >&2)
+
+cd ${WB2_DIR}
+echo "Launching workbench2..."
+WB2_PORT=`random_free_port`
+coproc wb2 (PORT=${WB2_PORT} \
+ REACT_APP_ARVADOS_API_HOST=${controllerHostPort} \
+ yarn start)
+exec 8<&"${wb2[0]}"; coproc consume_wb2_stdout (cat <&8 >&2)
+
+# Wait for workbench2 to be up.
+# Using https-get to avoid false positive 'ready' detection.
- CYPRESS_BASE_URL=https://localhost:${WB2_PORT} \
++yarn run wait-on --timeout 300000 https-get://127.0.0.1:${WB2_PORT} || exit 1
+
+echo "Running tests..."
+CYPRESS_system_token=systemusertesttoken1234567890aoeuidhtnsqjkxbmwvzpy \
+ CYPRESS_controller_url=${controllerURL} \
++ CYPRESS_BASE_URL=https://127.0.0.1:${WB2_PORT} \
+ yarn run cypress ${CYPRESS_MODE}