diff --git a/.rake/vagrant.rb b/.rake/vagrant.rb deleted file mode 100644 index 21793411..00000000 --- a/.rake/vagrant.rb +++ /dev/null @@ -1,14 +0,0 @@ -namespace :vagrant do - task :shell, [:command] do |_t, args| - fail "Usage rake vagrant:shell[command]" unless args[:command] - - vagrant_path = 'PATH=/home/vagrant/.rbenv/shims:$PATH' - - # We need to reset RUBYLIB in order to use gems in - # the context of the VM. - # - # Please see: https://github.com/mitchellh/vagrant/issues/6158#issuecomment-135796049 - # for more info. - sh "unset RUBYLIB; vagrant ssh -c 'cd /vagrant/ && #{vagrant_path} bundle exec #{args[:command]}'" - end -end diff --git a/.travis.yml b/.travis.yml index 70d925f3..3cadc3c7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,6 @@ language: ruby -cache: bundler +services: docker +before_install: + - docker-compose build script: - - bundle exec rake db:setup RAILS_ENV=test - - bundle exec rake db:test:prepare - - bundle exec rake spec - - bundle exec rake cucumber -rvm: - - 2.3.1 + - docker-compose run -e "RAILS_ENV=test" web rake db:test:prepare spec cucumber diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 573f0965..46d03054 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,35 +3,39 @@ ## Setting Up Development Environment ### 1 Fork and clone the repository. +https://help.github.com/articles/fork-a-repo/ -### 2 Install Vagrant. -https://www.vagrantup.com/downloads.html +### 2 Install Docker. +https://docs.docker.com/install/ -### 3 Install VirtualBox -https://www.virtualbox.org/wiki/Downloads +### 3 Build the Docker Container +Build the container +``` +docker-compose build +``` -### 4 Capture the powers of vagrant - * In the repo dir: vagrant up (Safely ignore: 'dpkg-preconfigure: unable to re-open stdin: No such file or directory') - * If changes have been made since running vagrant up: vagrant provision - - * Start the rails server. There are two ways to do this, depending on your familiarity running from within the vagrant shell: +### 4 Run the Docker Container - 1. A local `rake` wrapper that allows direct execution on the machine. - * Run `rake vagrant:shell[command]`1 - * To start the rails server using the rake wrapper use: `rake vagrant:shell['rails s -b 0.0.0.0']`. - * Navigate to `localhost:3000` - 2. Using `vagrant ssh` to gain access directly to the machine. - * To login to the machine: vagrant ssh - * `cd /vagrant/` to navigate to the refuge repo. - * To start the rails server use: `rails s -b 0.0.0.0`. - * Navigate to `localhost:3000` +You can now run and shutdown the app with: +``` +docker-compose up +docker-compose down +``` - [1] You can run any command locally using `rake vagrant:shell[]` and it will be executed in the repo root of the vagrant machine. You can try `rake vagrant:shell['pwd']` and see it will print the directory that the repo is in on the vagrant machine! +It will be available at localhost:3000 -### 5 Optional tasks: -run rake db:fix_accents to clean up encoding problems in the safe2pee data. (Use rake db:fix_accents[dry_run] to preview the changes.) +### 5 Run the Tests +``` +docker-compose run -e "RAILS_ENV=test" web rake db:test:prepare spec cucumber +``` -### 6 Assets +### 6 Optional tasks: +To clean up encoding problems in the safe2pee data, run (Use `rake db:fix_accents[dry_run]` to preview the changes.): +``` +docker-compose run rake db:fixaccents +``` + +### 7 Assets * [Assets Repo](https://github.com/RefugeRestrooms/refuge_assets) ## Testing diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..a6834d32 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM ruby:2.3.1 +RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs +ENV PHANTOM_JS=2.1.1 +RUN apt-get update && \ + apt-get install build-essential chrpath libssl-dev libxft-dev -y && \ + apt-get install libfreetype6 libfreetype6-dev -y && \ + apt-get install libfontconfig1 libfontconfig1-dev -y && \ + cd ~ && \ + export PHANTOM_JS="phantomjs-2.1.1-linux-x86_64" && \ + wget https://github.com/Medium/phantomjs/releases/download/v2.1.1/$PHANTOM_JS.tar.bz2 && \ + tar xvjf $PHANTOM_JS.tar.bz2 && \ + mv $PHANTOM_JS /usr/local/share && \ + ln -sf /usr/local/share/$PHANTOM_JS/bin/phantomjs /usr/local/bin +RUN mkdir /refugerestrooms +WORKDIR /refugerestrooms +COPY Gemfile /refugerestrooms/Gemfile +COPY Gemfile.lock /refugerestrooms/Gemfile.lock +RUN bundle install +COPY . /refugerestrooms diff --git a/Rakefile b/Rakefile index c5ac3a48..aa55ec69 100644 --- a/Rakefile +++ b/Rakefile @@ -5,6 +5,3 @@ require File.expand_path('../config/application', __FILE__) SaferstallsRails::Application.load_tasks -Dir.glob('.rake/*.rb').each do |f| - import f -end diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index 06ebfc8a..00000000 --- a/Vagrantfile +++ /dev/null @@ -1,54 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -# Vagrantfile API/syntax version. Don't touch unless you know what you're doing! -VAGRANTFILE_API_VERSION = "2" -BOXNAME = "refugerestrooms" - -Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| - # Ubuntu 14.04 base box - config.vm.box = "ubuntu/trusty64" - config.vm.hostname = BOXNAME - #config.vm.box_download_checksum = - - # Disable automatic box update checking. If you disable this, then - # boxes will only be checked for updates when the user runs - # `vagrant box outdated`. This is not recommended. - # config.vm.box_check_update = false - - # Access the rails server at localhost:3000 - config.vm.network "forwarded_port", guest: 3000, host: 3000 - - # Use this if you need to copy files via scp or something - # config.vm.network "private_network", ip: "192.168.33.10" - - # If true, then any SSH connections made will enable agent forwarding. - # Default value: false - # config.ssh.forward_agent = true - - # View virtualbox provider docs for more options - config.vm.provider "virtualbox" do |vb| - vb.name = BOXNAME - # Uncomment this if you need more than default of 512 - vb.customize ["modifyvm", :id, "--memory", "1024"] - end - - # If this gets bigger I can make it into a chef run - # mi-wood - config.vm.provision "shell", path: "setup/setup_vagrant.sh", privileged: false - - # Enable provisioning with chef solo, specifying a cookbooks path, roles - # path, and data_bags path (all relative to this Vagrantfile), and adding - # some recipes and/or roles. - # - # config.vm.provision "chef_solo" do |chef| - # chef.cookbooks_path = "../my-recipes/cookbooks" - # chef.roles_path = "../my-recipes/roles" - # chef.data_bags_path = "../my-recipes/data_bags" - # chef.add_recipe "mysql" - # chef.add_role "web" - # - # # You may also specify custom JSON attributes: - # chef.json = { mysql_password: "foo" } - # end -end diff --git a/config/database.yml b/config/database.yml index 1bdf148e..dc2c66e5 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,13 +1,17 @@ -development: +default: &default adapter: postgresql encoding: unicode - database: bathrooms_development + host: db + username: postgres + password: pool: 5 - host: localhost + +development: + <<: *default + database: bathrooms_development + test: - adapter: postgresql - encoding: unicode + <<: *default database: bathrooms_test - pool: 5 - host: localhost + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..a300d2c4 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3' +services: + db: + image: postgres + web: + build: . + entrypoint: [setup/entry] + command: bundle exec rails s -p 3000 -b '0.0.0.0' + volumes: + - .:/refugerestrooms + ports: + - "3000:3000" + depends_on: + - db diff --git a/setup/entry b/setup/entry new file mode 100755 index 00000000..620cc5b9 --- /dev/null +++ b/setup/entry @@ -0,0 +1,7 @@ +#!/bin/bash +set -e + +rake db:create +rake db:migrate + +exec "$@" diff --git a/setup/pg_hba.conf b/setup/pg_hba.conf deleted file mode 100644 index e2e88588..00000000 --- a/setup/pg_hba.conf +++ /dev/null @@ -1,99 +0,0 @@ -# PostgreSQL Client Authentication Configuration File -# =================================================== -# -# Refer to the "Client Authentication" section in the PostgreSQL -# documentation for a complete description of this file. A short -# synopsis follows. -# -# This file controls: which hosts are allowed to connect, how clients -# are authenticated, which PostgreSQL user names they can use, which -# databases they can access. Records take one of these forms: -# -# local DATABASE USER METHOD [OPTIONS] -# host DATABASE USER ADDRESS METHOD [OPTIONS] -# hostssl DATABASE USER ADDRESS METHOD [OPTIONS] -# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS] -# -# (The uppercase items must be replaced by actual values.) -# -# The first field is the connection type: "local" is a Unix-domain -# socket, "host" is either a plain or SSL-encrypted TCP/IP socket, -# "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a -# plain TCP/IP socket. -# -# DATABASE can be "all", "sameuser", "samerole", "replication", a -# database name, or a comma-separated list thereof. The "all" -# keyword does not match "replication". Access to replication -# must be enabled in a separate record (see example below). -# -# USER can be "all", a user name, a group name prefixed with "+", or a -# comma-separated list thereof. In both the DATABASE and USER fields -# you can also write a file name prefixed with "@" to include names -# from a separate file. -# -# ADDRESS specifies the set of hosts the record matches. It can be a -# host name, or it is made up of an IP address and a CIDR mask that is -# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that -# specifies the number of significant bits in the mask. A host name -# that starts with a dot (.) matches a suffix of the actual host name. -# Alternatively, you can write an IP address and netmask in separate -# columns to specify the set of hosts. Instead of a CIDR-address, you -# can write "samehost" to match any of the server's own IP addresses, -# or "samenet" to match any address in any subnet that the server is -# directly connected to. -# -# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi", -# "krb5", "ident", "peer", "pam", "ldap", "radius" or "cert". Note that -# "password" sends passwords in clear text; "md5" is preferred since -# it sends encrypted passwords. -# -# OPTIONS are a set of options for the authentication in the format -# NAME=VALUE. The available options depend on the different -# authentication methods -- refer to the "Client Authentication" -# section in the documentation for a list of which options are -# available for which authentication methods. -# -# Database and user names containing spaces, commas, quotes and other -# special characters must be quoted. Quoting one of the keywords -# "all", "sameuser", "samerole" or "replication" makes the name lose -# its special character, and just match a database or username with -# that name. -# -# This file is read on server startup and when the postmaster receives -# a SIGHUP signal. If you edit the file on a running system, you have -# to SIGHUP the postmaster for the changes to take effect. You can -# use "pg_ctl reload" to do that. - -# Put your actual configuration here -# ---------------------------------- -# -# If you want to allow non-local connections, you need to add more -# "host" records. In that case you will also need to make PostgreSQL -# listen on a non-local interface via the listen_addresses -# configuration parameter, or via the -i or -h command line switches. - - - - -# DO NOT DISABLE! -# If you change this first entry you will need to make sure that the -# database superuser can access the database using some other method. -# Noninteractive access to all databases is required during automatic -# maintenance (custom daily cronjobs, replication, and similar tasks). -# -# Database administrative login by Unix domain socket -local all postgres peer - -# TYPE DATABASE USER ADDRESS METHOD - -# "local" is for Unix domain socket connections only -local all all trust -# IPv4 local connections: -host all all 127.0.0.1/32 trust -# IPv6 local connections: -host all all ::1/128 trust -# Allow replication connections from localhost, by a user with the -# replication privilege. -#local replication postgres peer -#host replication postgres 127.0.0.1/32 md5 -#host replication postgres ::1/128 md5 diff --git a/setup/setup_vagrant.sh b/setup/setup_vagrant.sh deleted file mode 100644 index 50c93e43..00000000 --- a/setup/setup_vagrant.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/bash -# This script is run from vagrant to setup packages -# It's only tested with ubuntu 14.04 -set -e - -REFUGE_PATH=/vagrant - -# required packages -declare -A packages -packages=( - ["git"]="=1:1.9.1-1" - ["libreadline-dev"]="" - ["nodejs"]="=0.10.25~dfsg2-2ubuntu1" - ["phantomjs"]="=1.9.0-1" - ["postgresql-server-dev-9.3"]="" - ["postgresql-contrib-9.3"]="" -) - -sudo apt-get update -for package in "${!packages[@]}" -do - version=${packages["$package"]} - if dpkg -s $package 2>/dev/null | grep -q "$version"; then - echo $package' installed, skipping' - else - echo "installing $package, version $version..." - sudo apt-get install -y -q $package$version - fi -done - -# Install rbenv and ruby-build -echo 'installing rbenv...' -cd -if ! [ -d .rbenv ]; then - git clone https://github.com/sstephenson/rbenv.git .rbenv -fi -if ! grep -q '.rbenv/bin' $HOME/.bashrc; then - echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc -fi -if ! grep -q 'rbenv init' $HOME/.bashrc; then - echo 'eval "$(rbenv init -)"' >> ~/.bashrc -fi -if ! [ -d ~/.rbenv/plugins/ruby-build ]; then - git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build -fi -if ! grep -q ruby-build $HOME/.bashrc; then - echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc -fi - -# source .bashrc doesn't appear to be setting the path -# adding the following for now: -export PATH="$HOME/.rbenv/bin:$PATH" -eval "$(rbenv init -)" -export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH" - -# Install ruby -ruby_version=$(cat $REFUGE_PATH/.ruby-version | tr -d '\n\r') -if rbenv versions | grep $ruby_version; then - echo 'ruby '$ruby_version' installed, skipping...' -else - echo 'install ruby '$ruby_version - rbenv install $ruby_version -fi - -# Set local ruby version -rbenv local $ruby_version - -# Install bundle reqs -cd $REFUGE_PATH -if which bundle | grep 1.12.15; then - echo 'bundler installed, skipping' -else - echo 'Installing bundler...' - - # We must target a specific version of bundler - # which is specified in vagrant.gemspec. - # File found here: https://github.com/mitchellh/vagrant/blob/a4c7bb822873924619f95edc9baee654fb3d6f1f/vagrant.gemspec#L23 - # Please see https://github.com/mitchellh/vagrant/issues/7193#issuecomment-204309088 for info - gem install bundler -v 1.12.5 --no-rdoc --no-ri -q -fi -echo 'Running bundle install...' -bundle install --gemfile=$REFUGE_PATH/Gemfile - -# Change permissions on pg_hba.conf -pg_hba=/etc/postgresql/9.3/main/pg_hba.conf -sudo cp "$REFUGE_PATH/setup/pg_hba.conf" $pg_hba -sudo chown postgres:postgres $pg_hba -sudo chmod 640 $pg_hba -sudo -u postgres psql -c 'select pg_reload_conf();' postgres - -# Creating postres user -if ! sudo -u postgres psql -c 'SELECT rolname FROM pg_roles;' postgres | grep vagrant; then - echo 'Creating vagrant postgres user...' - sudo -u postgres createuser vagrant --createdb --superuser -fi - -# Seed db -echo 'Seeding db...' -bundle exec rake db:setup