We need to force-tag the arvados/jobs docker image.
[arvados-dev.git] / jenkins / arvados-api-server-extras / arvados-api-server-upgrade.sh
1 #!/bin/bash
2
3 set -e
4
5 if [ -e /etc/redhat-release ]; then
6     WWW_OWNER=apache:apache
7 else
8     # Assume we're on a Debian-based system for now.
9     WWW_OWNER=www-data:www-data
10 fi
11
12 NGINX_SERVICE=${NGINX_SERVICE:-$(service --status-all 2>/dev/null \
13     | grep -Eo '\bnginx[^[:space:]]*' || true)}
14 if [ -z "$NGINX_SERVICE" ]; then
15     cat >&2 <<EOF
16 Error: nginx service not found. Aborting.
17 Set NGINX_SERVICE to the name of the service hosting the Rails server.
18 EOF
19     exit 1
20 elif [ "$NGINX_SERVICE" != "$(echo "$NGINX_SERVICE" | head -n 1)" ]; then
21     cat >&2 <<EOF
22 Error: multiple nginx services found. Aborting.
23 Set NGINX_SERVICE to the name of the service hosting the Rails server.
24 EOF
25     exit 1
26 fi
27
28 RELEASE_PATH=/var/www/arvados-api/current
29 SHARED_PATH=/var/www/arvados-api/shared
30 CONFIG_PATH=/etc/arvados/api/
31
32 echo "Assumption: $NGINX_SERVICE is configured to serve $HOSTNAME from /var/www/$HOSTNAME/current"
33 echo "Assumption: /var/www/$HOSTNAME is symlinked to /var/www/arvados-api"
34 echo "Assumption: configuration files are in /etc/arvados/api/"
35 echo "Assumption: $NGINX_SERVICE and passenger run as $WWW_OWNER"
36 echo
37
38 echo "Copying files from $CONFIG_PATH"
39 cp -f $CONFIG_PATH/database.yml $RELEASE_PATH/config/database.yml
40 cp -f $RELEASE_PATH/config/environments/production.rb.example $RELEASE_PATH/config/environments/production.rb
41 cp -f $CONFIG_PATH/application.yml $RELEASE_PATH/config/application.yml
42 cp -f $CONFIG_PATH/omniauth.rb $RELEASE_PATH/config/initializers/omniauth.rb
43 echo "Done."
44
45 # Before we do anything else, make sure some directories and files are in place
46 if [[ ! -e $SHARED_PATH/log ]]; then mkdir -p $SHARED_PATH/log; fi
47 if [[ ! -e $RELEASE_PATH/tmp ]]; then mkdir -p $RELEASE_PATH/tmp; fi
48 if [[ ! -e $RELEASE_PATH/log ]]; then ln -s $SHARED_PATH/log $RELEASE_PATH/log; fi
49 if [[ ! -e $SHARED_PATH/log/production.log ]]; then touch $SHARED_PATH/log/production.log; fi
50
51 cd "$RELEASE_PATH"
52 export RAILS_ENV=production
53
54 echo "Running bundle install"
55 bundle install --path $SHARED_PATH/vendor_bundle
56 echo "Done."
57
58 echo "Precompiling assets"
59 # precompile assets; thankfully this does not take long
60 bundle exec rake assets:precompile
61 echo "Done."
62
63 echo "Ensuring directory and file permissions"
64 # Ensure correct ownership of a few files
65 chown "$WWW_OWNER" $RELEASE_PATH/config/environment.rb
66 chown "$WWW_OWNER" $RELEASE_PATH/config.ru
67 chown "$WWW_OWNER" $RELEASE_PATH/config/database.yml
68 chown "$WWW_OWNER" $RELEASE_PATH/Gemfile.lock
69 chown -R "$WWW_OWNER" $RELEASE_PATH/tmp
70 chown -R "$WWW_OWNER" $SHARED_PATH/log
71 chown "$WWW_OWNER" $RELEASE_PATH/db/structure.sql
72 chmod 644 $SHARED_PATH/log/*
73 echo "Done."
74
75 echo "Running sanity check"
76 bundle exec rake config:check
77 SANITY_CHECK_EXIT_CODE=$?
78 echo "Done."
79
80 if [[ "$SANITY_CHECK_EXIT_CODE" != "0" ]]; then
81   echo "Sanity check failed, aborting. Please roll back to the previous version of the package."
82   echo "The database has not been migrated yet, so reinstalling the previous version is safe."
83   exit $SANITY_CHECK_EXIT_CODE
84 fi
85
86 echo "Checking database status"
87 # If we use `grep -q`, rake will write a backtrace on EPIPE.
88 if bundle exec rake db:migrate:status | grep '^database: ' >/dev/null; then
89     echo "Starting db:migrate"
90     bundle exec rake db:migrate
91 elif [ 0 -eq ${PIPESTATUS[0]} ]; then
92     # The database exists, but the migrations table doesn't.
93     echo "Setting up database"
94     bundle exec rake db:structure:load db:seed
95 else
96     echo "Error: Database is not ready to set up. Aborting." >&2
97     exit 1
98 fi
99 echo "Done."
100
101 echo "Restarting nginx"
102 service "$NGINX_SERVICE" restart
103 echo "Done."