Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Docker with Github Actions for building #82

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Build
on: [push]

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: whoan/docker-build-with-cache-action@v3
with:
# Secrets are specified in the repository settings
# A Docker account is required for registry caching
username: "${{ secrets.DOCKER_USERNAME }}"
password: "${{ secrets.DOCKER_PASSWORD }}"
image_name: "${{ secrets.DOCKER_USERNAME }}/nztrain"

- name: Run tests
run: >
docker run --privileged --network host --name container
"${{ secrets.DOCKER_USERNAME }}/nztrain:latest"
/bin/bash -l -c "
service redis start;
service postgresql start;
bundle exec rake db:test:load;
bundle exec rspec"

- name: Copy coverage data
run: docker cp container:/nztrain/coverage/lcov/nztrain.lcov .

- name: Coveralls
uses: coverallsapp/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
path-to-lcov: ./nztrain.lcov

21 changes: 0 additions & 21 deletions .travis.yml

This file was deleted.

67 changes: 67 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# 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 run --privileged --network host -it nztrain:latest
# <C-p> <C-q> to detach

FROM ubuntu:xenial

# Services cannot be started within Docker build environment
RUN printf "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d
RUN apt-get update && apt-get install -y sudo git \
libpq-dev software-properties-common curl locales

# Set locales for database
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
RUN echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen && locale-gen
RUN update-locale LANG=en_US.UTF-8

# Install RVM
RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys \
409B6B1796C275462A1703113804BB82D39DC0E3 \
7D2BAF1CF37B13E2069D6956105BD0E739499BDB
RUN curl -L https://get.rvm.io | bash -s stable
ENV PATH="/usr/local/rvm/bin/:${PATH}"
SHELL ["/bin/bash", "-l", "-c"]

# Install Ruby 2.3.8
RUN rvm requirements
RUN rvm install 2.3.8
RUN gem install bundler --no-ri --no-rdoc

WORKDIR /nztrain
COPY script ./script
RUN bash script/install/maxmind.bash
RUN yes | bash script/install/imagemagick.bash

COPY config ./config
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
# Avoid updating as database servers are not live yet
RUN yes | update=false bash script/install.bash

COPY Gemfile* ./
# Bundle installation is invoked in advance to avoid prompt
RUN bundle install --deployment

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

3 changes: 2 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ gem 'sinatra'

# Monitoring
gem 'newrelic_rpm'
gem 'coveralls', require: false
gem 'simplecov', require: false
gem 'simplecov-lcov', require: false

group :development do
gem 'better_errors'
Expand Down
15 changes: 4 additions & 11 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -127,12 +127,6 @@ GEM
country_select (3.1.1)
countries (~> 2.0)
sort_alphabetical (~> 1.0)
coveralls (0.8.21)
json (>= 1.8, < 3)
simplecov (~> 0.14.1)
term-ansicolor (~> 1.3)
thor (~> 0.19.4)
tins (~> 1.6)
crass (1.0.5)
daemons (1.3.1)
debug_inspector (0.0.3)
Expand Down Expand Up @@ -348,6 +342,7 @@ GEM
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.2)
simplecov-lcov (0.7.0)
sinatra (1.4.8)
rack (~> 1.5)
rack-protection (~> 1.4)
Expand Down Expand Up @@ -377,8 +372,6 @@ GEM
request_store (~> 1.0.3)
strong_attributes (~> 0.0.2)
superfish-rails (1.6.0.1)
term-ansicolor (1.6.0)
tins (~> 1.0)
therubyracer (0.12.3)
libv8 (~> 3.16.14.15)
ref
Expand All @@ -389,7 +382,6 @@ GEM
thor (0.19.4)
thread_safe (0.3.6)
tilt (2.0.8)
tins (1.16.3)
ttfunk (1.5.1)
tzinfo (0.3.53)
uglifier (4.1.2)
Expand Down Expand Up @@ -431,7 +423,6 @@ DEPENDENCIES
connection_pool
countries
country_select
coveralls
devise (~> 3.2.2)
facebox-rails
factory_girl
Expand Down Expand Up @@ -477,6 +468,8 @@ DEPENDENCIES
sass-rails
simple-navigation (= 3.11.0)
simple_form (= 3.0.1)
simplecov
simplecov-lcov
sinatra
spring
squeel
Expand All @@ -491,4 +484,4 @@ DEPENDENCIES
yui-compressor

BUNDLED WITH
1.16.1
1.16.2
85 changes: 77 additions & 8 deletions README.rdoc
Original file line number Diff line number Diff line change
@@ -1,15 +1,84 @@
== NZTrain
Status: {<img src="https://secure.travis-ci.org/NZOI/nztrain.png?branch=master" alt="Build Status" />}[http://travis-ci.org/NZOI/nztrain] {<img src="https://coveralls.io/repos/NZOI/nztrain/badge.png" alt="Coverage Status" />}[https://coveralls.io/r/NZOI/nztrain] {<img src="https://codeclimate.com/github/NZOI/nztrain.png" />}[https://codeclimate.com/github/NZOI/nztrain]
Workflow: {<img src="https://badge.waffle.io/NZOI/nztrain.png" alt="WIP Issues" />}[http://waffle.io/NZOI/nztrain]
{<img src="https://secure.travis-ci.org/NZOI/nztrain.png?branch=master" alt="Build Status" />}[http://travis-ci.org/NZOI/nztrain] {<img src="https://coveralls.io/repos/NZOI/nztrain/badge.png" alt="Coverage Status" />}[https://coveralls.io/r/NZOI/nztrain] {<img src="https://codeclimate.com/github/NZOI/nztrain.png" />}[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 <container> /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).

7 changes: 5 additions & 2 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
require 'coveralls'
Coveralls.wear!('rails')
require 'simplecov'
require 'simplecov-lcov'
SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
SimpleCov.start 'rails'

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
Expand Down