diff --git a/.travis.yml b/.travis.yml index 33e14ee1..f785cc3d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,25 @@ -language: ruby -rvm: - - "2.3.8" -services: - - redis-server - - postgresql +language: minimal -# uncomment this line if your project needs to run something other than `rake`: -#before_script: # for Selenium RSpec tests -# - "export DISPLAY=:99.0" -# - "sh -e /etc/init.d/xvfb start" +cache: + directories: + - /home/travis/docker before_install: - - bash script/install/maxmind.bash +- docker load -i /home/travis/docker/images.tar || true -before_script: - - RAILS_ENV=test DATABASE_USERNAME=postgres DATABASE= TEST_DATABASE=nztraintest REDIS_INSTALL=false REDIS_PASS= SCHEDULE_BACKUPS=0 ISOLATE_ROOT=/ ISOLATE_CGROUPS=false ISOLATE_BRANCH=nztrain.travis.ci bash script/install/config.bash --defaults - - AUTOCONFIRM=true script/install.bash --skip-update - - bundle exec rake db:test:load -script: bundle exec rspec +install: +- docker build . -t nztrain:latest + +script: +- > + docker run --privileged --network host + --env-file <(env | grep TRAVIS) + nztrain:latest /bin/bash -c " + service redis start; + service postgresql start; + bundle exec rake db:test:load; + bundle exec rspec" + +before_cache: +- docker save -o /home/travis/docker/images.tar $(docker images -a -q) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..19b78263 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,53 @@ +# Build invocation: +# May need to be executed with --memory-swap -1 or else out of memory error +# docker build --memory-swap -1 . -t nztrain:latest + +# Execution invocation: +# Privileged mode is required for control groups +# Must be invoked with '--network host' for port exposure +# docker --privileged --network host -it nztrain:latest +# to detach + +FROM drecom/ubuntu-ruby:2.3.8 +RUN apt-get update && apt-get install -y sudo git libpq-dev software-properties-common locales + +# Replace Japanese locale with English +RUN echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen && locale-gen +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 + +# Services cannot be started within Docker build environment +RUN printf "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d + +WORKDIR /nztrain +COPY Gemfile* ./ +COPY script ./script +RUN bash script/install/maxmind.bash + +# Bundle installation is invoked in advance to avoid +# prompt at installation script +RUN bundle install --deployment + +RUN RAILS_ENV=development DATABASE_USERNAME=root DATABASE=nztrain \ + TEST_DATABASE=nztraintest APP_NAME=nztrain USER=root \ + APP_USER=root UNICORN_PORT= REDIS_HOST=localhost REDIS_PORT=6379 \ + REDIS_PASS=@/etc/redis/redis.conf REDIS_INSTALL=true \ + SERVER_NAME=_ bash script/install/config.bash --defaults + +COPY config ./config +# Avoid updating as database servers are not live yet +RUN yes | update=false bash script/install.bash + +COPY . . +RUN service postgresql start; \ + service redis start; \ + bash script/update.bash; \ + rm /var/run/redis/redis.pid; \ + service postgresql stop + +CMD service redis start; \ + service postgresql start; \ + bundle exec rails server -d; \ + bundle exec rake qless:work + diff --git a/README.rdoc b/README.rdoc index 50abc467..9038b5a1 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,15 +1,84 @@ == NZTrain -Status: {Build Status}[http://travis-ci.org/NZOI/nztrain] {Coverage Status}[https://coveralls.io/r/NZOI/nztrain] {}[https://codeclimate.com/github/NZOI/nztrain] -Workflow: {WIP Issues}[http://waffle.io/NZOI/nztrain] +{Build Status}[http://travis-ci.org/NZOI/nztrain] {Coverage Status}[https://coveralls.io/r/NZOI/nztrain] {}[https://codeclimate.com/github/NZOI/nztrain] -=== Installation -Run `script/install.bash` to install dependencies. +=== Docker Installation +This requires the Docker engine. -`script/update.bash` will pull changes from origin and recompile various things. This includes assets - assuming that it is for production purposes. +First build the image: -Both scripts depends on `script/install.cfg`, which is built using `script/install/config.bash` automatically. If `script/install.cfg` is incomplete (eg. new configuration is added), `script/install.bash` and `script/update.bash` will prompt for the new configurations required. + $ docker build --memory-swap -1 . -t nztrain:latest + +Then execute the image: + + $ docker run --privileged --network host -it nztrain:latest + +The website will be served over port +3000+. + +To inspect the running container identify the container name: + + $ docker ps + +Then execute an interactive bash shell in the container: + + $ docker exec -it /bin/bash + +=== Manual Installation +This requires Ubuntu Xenial (16.04). + +Invoke the installation script within this repository: + + $ git clone https://github.com/NZOI/nztrain.git + $ cd nztrain + $ ./script/install.bash + +Select all default configuration options by pressing enter repeatedly. + +You will be prompted to select an option to install Ruby. Choose to install +rbenv+ (the fourth option). Then, restart the session and invoke the installation script again: + + $ bash + $ ./script/install.bash + +You will be prompted to select an option to install Ruby *again*. Choose to install either +RVM+ or +rbenv+. All prompts after this are package installation prompts. You may wish to quit the installation script and invoke it with +yes+. + + $ yes | ./script/install.bash + +Finally, run the website: + + $ bundle exec rails server + $ bundle exec rake qless:work + +Each of these commands must be kept alive. This can be achieved by running each command in a separate terminal session. Otherwise, you may wish to daemonize (run in the background) the commands: + + $ bundle exec rails server -d + +The website will be served over port +3000+. + +=== System User +This setups a system user for the website. + +First open a Ruby console: + + $ bundle exec rails console + +Then, create a new user with these commands: + + user = User.find(0) + Role.find_by_name("superadmin").users.push(user) + user.confirm! + require 'io/console' + user.reset_password!(STDIN.getpass("Password: "), STDIN.getpass("Confirm: ")) + +You will be prompted to enter a password twice. The invocation should return true if the user creation was successful. Otherwise, the password may be too short. + +=== Updating +The update script will recompile and pull changes from origin: + + $ cd nztrain + $ ./script/update.bash + +Both the installation and update script depends on the configuration script: +script/install.cfg+ which is built using +script/install/config.bash+ automatically. If +script/install.cfg+ is incomplete (for example, a new configuration is added) then new configurations will be prompted. === Development Tools -- `spring` instead of `bundle exec` to keep a background copy of rails running, and avoid startup time. -- `unicorn` starts of a development server (instead of Webrick). +- Use +spring+ instead of bundle to keep a background copy of Rails running and avoid startup time. +- +unicorn+ starts a development server (instead of Webrick).