X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/19ae770973482257117fe8ded5619c3018c4b60f..ecb7d4501373a21ae69494beee8252f107ec1b56:/tools/arvbox/bin/arvbox diff --git a/tools/arvbox/bin/arvbox b/tools/arvbox/bin/arvbox index 88726a4683..234d15aecd 100755 --- a/tools/arvbox/bin/arvbox +++ b/tools/arvbox/bin/arvbox @@ -1,4 +1,7 @@ #!/bin/sh +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0 set -e @@ -39,18 +42,21 @@ if test -z "$ARVADOS_ROOT" ; then ARVADOS_ROOT="$ARVBOX_DATA/arvados" fi -if test -z "$ARVADOS_DEV_ROOT" ; then - ARVADOS_DEV_ROOT="$ARVBOX_DATA/arvados-dev" -fi - if test -z "$SSO_ROOT" ; then SSO_ROOT="$ARVBOX_DATA/sso-devise-omniauth-provider" fi +if test -z "$COMPOSER_ROOT" ; then + COMPOSER_ROOT="$ARVBOX_DATA/composer" +fi + PG_DATA="$ARVBOX_DATA/postgres" VAR_DATA="$ARVBOX_DATA/var" PASSENGER="$ARVBOX_DATA/passenger" GEMS="$ARVBOX_DATA/gems" +PIPCACHE="$ARVBOX_DATA/pip" +NPMCACHE="$ARVBOX_DATA/npm" +GOSTUFF="$ARVBOX_DATA/gopath" getip() { docker inspect $ARVBOX_CONTAINER | grep \"IPAddress\" | head -n1 | tr -d ' ":,\n' | cut -c10- @@ -103,12 +109,40 @@ wait_for_arvbox() { } run() { - if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then - echo "Container $ARVBOX_CONTAINER is already running, use stop, restart or rebuild" - exit 1 + CONFIG=$1 + TAG=$2 + + shift + + need_setup=1 + + if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then + if test "$CONFIG" = test ; then + need_setup=0 + else + echo "Container $ARVBOX_CONTAINER is already running" + exit 0 + fi fi - if echo "$1" | grep '^public' ; then + if test $need_setup = 1 ; then + if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then + echo "Container $ARVBOX_CONTAINER already exists but is not running; use restart or reboot" + exit 1 + fi + fi + + if test -n "$TAG" + then + if test $(echo $TAG | cut -c1-1) != '-' ; then + TAG=":$TAG" + shift + else + unset TAG + fi + fi + + if echo "$CONFIG" | grep '^public' ; then if test -n "$ARVBOX_PUBLISH_IP" ; then localip=$ARVBOX_PUBLISH_IP else @@ -127,12 +161,13 @@ run() { --publish=25100:25100 --publish=25107:25107 --publish=25108:25108 - --publish=8001:8001" + --publish=8001:8001 + --publish=8002:8002" else PUBLIC="" fi - if echo "$1" | grep 'demo$' ; then + if echo "$CONFIG" | grep 'demo$' ; then if test -d "$ARVBOX_DATA" ; then echo "It looks like you already have a development container named $ARVBOX_CONTAINER." echo "Set ARVBOX_CONTAINER to set a different name for your demo container" @@ -149,11 +184,12 @@ run() { --privileged \ --volumes-from $ARVBOX_CONTAINER-data \ $PUBLIC \ - arvados/arvbox-demo + arvados/arvbox-demo$TAG updateconf wait_for_arvbox else - mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS" + mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS" "$PIPCACHE" "$NPMCACHE" "$GOSTUFF" + if ! test -d "$ARVADOS_ROOT" ; then git clone https://github.com/curoverse/arvados.git "$ARVADOS_ROOT" @@ -161,71 +197,78 @@ run() { if ! test -d "$SSO_ROOT" ; then git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT" fi + if ! test -d "$COMPOSER_ROOT" ; then + git clone https://github.com/curoverse/composer.git "$COMPOSER_ROOT" + fi - if test "$1" = test ; then - shift - - if ! test -d "$ARVADOS_DEV_ROOT" ; then - git clone https://github.com/curoverse/arvados-dev.git "$ARVADOS_DEV_ROOT" - fi + if test "$CONFIG" = test ; then mkdir -p $VAR_DATA/test - docker run \ - --detach \ - --name=$ARVBOX_CONTAINER \ - --privileged \ - "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \ - "--volume=$ARVADOS_DEV_ROOT:/usr/src/arvados-dev:rw" \ - "--volume=$SSO_ROOT:/usr/src/sso:rw" \ - "--volume=$PG_DATA:/var/lib/postgresql:rw" \ - "--volume=$VAR_DATA:/var/lib/arvados:rw" \ - "--volume=$PASSENGER:/var/lib/passenger:rw" \ - "--volume=$GEMS:/var/lib/gems:rw" \ - arvados/arvbox-dev \ - /usr/local/bin/runsvinit -svdir=/etc/test-service - - docker exec -ti \ - $ARVBOX_CONTAINER \ - /usr/local/lib/arvbox/runsu.sh \ - /usr/local/lib/arvbox/waitforpostgres.sh - - docker exec -ti \ - $ARVBOX_CONTAINER \ - /usr/local/lib/arvbox/runsu.sh \ - /var/lib/arvbox/service/sso/run-service --only-setup - - docker exec -ti \ - $ARVBOX_CONTAINER \ - /usr/local/lib/arvbox/runsu.sh \ - /var/lib/arvbox/service/api/run-service --only-setup + if test "$need_setup" = 1 ; then + docker run \ + --detach \ + --name=$ARVBOX_CONTAINER \ + --privileged \ + "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \ + "--volume=$SSO_ROOT:/usr/src/sso:rw" \ + "--volume=$COMPOSER_ROOT:/usr/src/composer:rw" \ + "--volume=$PG_DATA:/var/lib/postgresql:rw" \ + "--volume=$VAR_DATA:/var/lib/arvados:rw" \ + "--volume=$PASSENGER:/var/lib/passenger:rw" \ + "--volume=$GEMS:/var/lib/gems:rw" \ + "--volume=$PIPCACHE:/var/lib/pip:rw" \ + "--volume=$NPMCACHE:/var/lib/npm:rw" \ + "--volume=$GOSTUFF:/var/lib/gopath:rw" \ + "--env=SVDIR=/etc/test-service" \ + arvados/arvbox-dev$TAG + + docker exec -ti \ + $ARVBOX_CONTAINER \ + /usr/local/lib/arvbox/runsu.sh \ + /usr/local/lib/arvbox/waitforpostgres.sh + + docker exec -ti \ + $ARVBOX_CONTAINER \ + /usr/local/lib/arvbox/runsu.sh \ + /var/lib/arvbox/service/sso/run-service --only-setup + + docker exec -ti \ + $ARVBOX_CONTAINER \ + /usr/local/lib/arvbox/runsu.sh \ + /var/lib/arvbox/service/api/run-service --only-setup + fi docker exec -ti \ $ARVBOX_CONTAINER \ /usr/local/lib/arvbox/runsu.sh \ - /usr/src/arvados-dev/jenkins/run-tests.sh \ + /usr/src/arvados/build/run-tests.sh \ --temp /var/lib/arvados/test \ WORKSPACE=/usr/src/arvados \ GEM_HOME=/var/lib/gems \ "$@" - elif echo "$1" | grep 'dev$' ; then + elif echo "$CONFIG" | grep 'dev$' ; then docker run \ --detach \ --name=$ARVBOX_CONTAINER \ --privileged \ "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \ "--volume=$SSO_ROOT:/usr/src/sso:rw" \ + "--volume=$COMPOSER_ROOT:/usr/src/composer:rw" \ "--volume=$PG_DATA:/var/lib/postgresql:rw" \ "--volume=$VAR_DATA:/var/lib/arvados:rw" \ "--volume=$PASSENGER:/var/lib/passenger:rw" \ "--volume=$GEMS:/var/lib/gems:rw" \ + "--volume=$PIPCACHE:/var/lib/pip:rw" \ + "--volume=$NPMCACHE:/var/lib/npm:rw" \ + "--volume=$GOSTUFF:/var/lib/gopath:rw" \ $PUBLIC \ - arvados/arvbox-dev + arvados/arvbox-dev$TAG updateconf wait_for_arvbox echo "The Arvados source code is checked out at: $ARVADOS_ROOT" else - echo "Unknown configuration '$1'" + echo "Unknown configuration '$CONFIG'" fi fi } @@ -249,11 +292,20 @@ build() { echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)" exit 1 fi - docker build -t arvados/arvbox-base -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER" + if docker --version |grep " 1\.[0-9]\." ; then + # Docker version prior 1.10 require -f flag + # -f flag removed in Docker 1.12 + FORCE=-f + fi + GITHEAD=$(cd $ARVBOX_DOCKER && git log --format=%H -n1 HEAD) + docker build --build-arg=arvados_version=$GITHEAD $NO_CACHE -t arvados/arvbox-base:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER" + docker tag $FORCE arvados/arvbox-base:$GITHEAD arvados/arvbox-base:latest if test "$1" = localdemo -o "$1" = publicdemo ; then - docker build -t arvados/arvbox-demo -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER" + docker build $NO_CACHE -t arvados/arvbox-demo:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER" + docker tag $FORCE arvados/arvbox-demo:$GITHEAD arvados/arvbox-demo:latest else - docker build -t arvados/arvbox-dev -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER" + docker build $NO_CACHE -t arvados/arvbox-dev:$GITHEAD -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER" + docker tag $FORCE arvados/arvbox-dev:$GITHEAD arvados/arvbox-dev:latest fi } @@ -279,6 +331,11 @@ case "$subcmd" in build $@ ;; + rebuild) + check $@ + NO_CACHE=--no-cache build $@ + ;; + start|run) check $@ run $@ @@ -302,7 +359,7 @@ case "$subcmd" in run $@ ;; - rebuild) + reboot) check $@ stop build $@ @@ -373,7 +430,7 @@ case "$subcmd" in log) if test -n "$1" ; then - exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM less --follow-name +GF "/etc/service/$1/log/main/current" + exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM less --follow-name -R +GF "/etc/service/$1/log/main/current" else exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM tail $(docker exec -ti $ARVBOX_CONTAINER find -L /etc -path '/etc/service/*/log/main/current' -printf " %p") fi @@ -381,7 +438,7 @@ case "$subcmd" in cat) if test -n "$1" ; then - exec docker exec -ti $ARVBOX_CONTAINER cat "$@" + exec docker exec $ARVBOX_CONTAINER cat "$@" else echo "Usage: $0 $subcmd " fi @@ -415,10 +472,9 @@ case "$subcmd" in *) echo "Arvados-in-a-box http://arvados.org" echo - echo "$(basename $0) (build|start|run|open|shell|ip|stop|rebuild|reset|destroy|log|svrestart)" - echo - echo "build build arvbox Docker image" - echo "start|run start $ARVBOX_CONTAINER container" + echo "build build arvbox Docker image" + echo "rebuild build arvbox Docker image, no layer cache" + echo "start|run [tag] start $ARVBOX_CONTAINER container" echo "open open arvbox workbench in a web browser" echo "shell enter arvbox shell" echo "ip print arvbox docker container ip address" @@ -426,7 +482,7 @@ case "$subcmd" in echo "status print some information about current arvbox" echo "stop stop arvbox container" echo "restart stop, then run again" - echo "rebuild stop, build arvbox Docker image, run" + echo "reboot stop, build arvbox Docker image, run" echo "reset delete arvbox arvados data (be careful!)" echo "destroy delete all arvbox code and data (be careful!)" echo "log tail log of specified service"