Add GitLab CI and sort Gemfile
The provision folder contains files required to build the Docker Image for the GitLab CI.
This commit is contained in:

committed by
Sebastian Serth

parent
ed4a68beba
commit
918d1265db
50
.gitlab-ci.yml
Normal file
50
.gitlab-ci.yml
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
default:
|
||||||
|
image: codemoon:latest
|
||||||
|
|
||||||
|
workflow:
|
||||||
|
rules:
|
||||||
|
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
|
||||||
|
# don't run a push pipeline if a merge request pipeline if a merge request exists
|
||||||
|
when: never
|
||||||
|
- when: always
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- lint
|
||||||
|
- test
|
||||||
|
|
||||||
|
|
||||||
|
rubocop:
|
||||||
|
stage: lint
|
||||||
|
rules:
|
||||||
|
- if: '$CI_MERGE_REQUEST_ID'
|
||||||
|
when: always
|
||||||
|
- when: never
|
||||||
|
script:
|
||||||
|
- source /home/codeocean/.rvm/scripts/rvm
|
||||||
|
- bundle install
|
||||||
|
- echo $CI_MERGE_REQUEST_DIFF_BASE_SHA
|
||||||
|
- DIFF=$(git diff --name-only --diff-filter=d $CI_MERGE_REQUEST_DIFF_BASE_SHA)
|
||||||
|
- echo $DIFF
|
||||||
|
- "if [[ ! -z $DIFF ]]; then bundle exec rubocop --force-exclusion --parallel --display-style-guide $DIFF; fi"
|
||||||
|
|
||||||
|
|
||||||
|
rspec:
|
||||||
|
stage: test
|
||||||
|
before_script:
|
||||||
|
- sudo -u postgres /usr/lib/postgresql/13/bin/postgres -D /etc/postgresql/13/main/ &
|
||||||
|
- sleep 3
|
||||||
|
- sudo wrapdocker
|
||||||
|
- for f in action_mailer.yml database.yml secrets.yml code_ocean.yml docker.yml.erb mnemosyne.yml; do if [ ! -f config/$f ]; then cp config/$f.ci config/$f; fi; done
|
||||||
|
- source /home/codeocean/.rvm/scripts/rvm
|
||||||
|
- bundle install
|
||||||
|
- yarn install
|
||||||
|
- export RAILS_ENV=test
|
||||||
|
- rake db:create
|
||||||
|
- rake db:schema:load
|
||||||
|
- rake db:migrate
|
||||||
|
- docker login -u "${DOCKERHUB_USER}" -p "${DOCKERHUB_PASS}"
|
||||||
|
- docker pull openhpi/co_execenv_python
|
||||||
|
- docker pull openhpi/co_execenv_java
|
||||||
|
script:
|
||||||
|
- rspec --format progress
|
||||||
|
coverage: '/\(\d+.\d+\%\) covered/'
|
@ -1,5 +1,6 @@
|
|||||||
AllCops:
|
AllCops:
|
||||||
TargetRubyVersion: 2.6
|
TargetRubyVersion: 2.7
|
||||||
|
NewCops: enable
|
||||||
Exclude:
|
Exclude:
|
||||||
- bin/*
|
- bin/*
|
||||||
- config/application.rb
|
- config/application.rb
|
||||||
@ -10,11 +11,11 @@ AllCops:
|
|||||||
- tmp/**/*
|
- tmp/**/*
|
||||||
- vendor/**/*
|
- vendor/**/*
|
||||||
- node_modules/**/*
|
- node_modules/**/*
|
||||||
Rails:
|
|
||||||
Enabled: true
|
|
||||||
Layout/LineLength:
|
Layout/LineLength:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
require: rubocop-rspec
|
require:
|
||||||
|
- rubocop-rspec
|
||||||
|
- rubocop-rails
|
||||||
Style/Documentation:
|
Style/Documentation:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
Layout/SpaceInsideHashLiteralBraces:
|
Layout/SpaceInsideHashLiteralBraces:
|
||||||
|
41
Gemfile
41
Gemfile
@ -1,43 +1,45 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
gem 'bcrypt'
|
gem 'bcrypt'
|
||||||
gem 'bootstrap-will_paginate'
|
gem 'bootstrap-will_paginate'
|
||||||
gem 'carrierwave'
|
gem 'carrierwave'
|
||||||
gem 'docker-api', require: 'docker'
|
gem 'docker-api', require: 'docker'
|
||||||
|
gem 'eventmachine'
|
||||||
gem 'factory_bot_rails'
|
gem 'factory_bot_rails'
|
||||||
|
gem 'faraday'
|
||||||
|
gem 'faye-websocket'
|
||||||
gem 'forgery'
|
gem 'forgery'
|
||||||
gem 'highline'
|
gem 'highline'
|
||||||
gem 'jbuilder'
|
gem 'i18n-js'
|
||||||
gem 'ims-lti', '< 2.0.0'
|
gem 'ims-lti', '< 2.0.0'
|
||||||
|
gem 'jbuilder'
|
||||||
gem 'kramdown'
|
gem 'kramdown'
|
||||||
|
gem 'nokogiri'
|
||||||
|
gem 'pagedown-bootstrap-rails'
|
||||||
gem 'pg'
|
gem 'pg'
|
||||||
|
gem 'proforma', git: 'https://github.com/openHPI/proforma.git', tag: 'v0.5'
|
||||||
gem 'pry-byebug'
|
gem 'pry-byebug'
|
||||||
gem 'puma'
|
gem 'puma'
|
||||||
gem 'pundit'
|
gem 'pundit'
|
||||||
gem 'rails', '5.2.4.4'
|
gem 'rails', '5.2.4.4'
|
||||||
|
gem 'rails_admin'
|
||||||
gem 'rails-i18n'
|
gem 'rails-i18n'
|
||||||
gem 'i18n-js'
|
gem 'rails-timeago'
|
||||||
gem 'ransack'
|
gem 'ransack'
|
||||||
|
gem 'rest-client'
|
||||||
gem 'rubytree'
|
gem 'rubytree'
|
||||||
|
gem 'rubyzip'
|
||||||
gem 'sass-rails'
|
gem 'sass-rails'
|
||||||
gem 'slim-rails'
|
gem 'slim-rails'
|
||||||
gem 'pagedown-bootstrap-rails'
|
|
||||||
gem 'sorcery'
|
gem 'sorcery'
|
||||||
|
gem 'telegraf'
|
||||||
|
gem 'tubesock', git: 'https://github.com/gosukiwi/tubesock', branch: 'patch-1' # Switch to a fork which is compatible with Rails 5
|
||||||
gem 'turbolinks'
|
gem 'turbolinks'
|
||||||
gem 'uglifier'
|
gem 'uglifier'
|
||||||
gem 'tubesock', git: 'https://github.com/gosukiwi/tubesock', branch: 'patch-1' # Switch to a fork which is compatible with Rails 5
|
|
||||||
gem 'faye-websocket'
|
|
||||||
gem 'eventmachine'
|
|
||||||
gem 'nokogiri'
|
|
||||||
gem 'webpacker'
|
gem 'webpacker'
|
||||||
gem 'rest-client'
|
|
||||||
gem 'rubyzip'
|
|
||||||
gem 'faraday'
|
|
||||||
gem 'proforma', git: 'https://github.com/openHPI/proforma.git', tag: 'v0.5'
|
|
||||||
gem 'whenever', require: false
|
gem 'whenever', require: false
|
||||||
gem 'rails-timeago'
|
|
||||||
gem 'rails_admin'
|
|
||||||
gem 'telegraf'
|
|
||||||
|
|
||||||
# Error Tracing
|
# Error Tracing
|
||||||
gem 'concurrent-ruby'
|
gem 'concurrent-ruby'
|
||||||
@ -46,13 +48,14 @@ gem 'newrelic_rpm'
|
|||||||
gem 'sentry-raven'
|
gem 'sentry-raven'
|
||||||
|
|
||||||
group :development, :staging do
|
group :development, :staging do
|
||||||
gem 'bootsnap', require: false
|
|
||||||
gem 'listen'
|
|
||||||
gem 'better_errors'
|
gem 'better_errors'
|
||||||
gem 'binding_of_caller'
|
gem 'binding_of_caller'
|
||||||
|
gem 'bootsnap', require: false
|
||||||
|
gem 'listen'
|
||||||
gem 'pry-rails'
|
gem 'pry-rails'
|
||||||
gem 'rack-mini-profiler'
|
gem 'rack-mini-profiler'
|
||||||
gem 'rubocop', require: false
|
gem 'rubocop', require: false
|
||||||
|
gem 'rubocop-rails', require: false
|
||||||
gem 'rubocop-rspec'
|
gem 'rubocop-rspec'
|
||||||
gem 'web-console'
|
gem 'web-console'
|
||||||
end
|
end
|
||||||
@ -62,17 +65,17 @@ group :development, :test, :staging do
|
|||||||
end
|
end
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'rails-controller-testing'
|
|
||||||
gem 'autotest' # required by autotest-rails
|
gem 'autotest' # required by autotest-rails
|
||||||
gem 'autotest-rails'
|
gem 'autotest-rails'
|
||||||
gem 'capybara'
|
gem 'capybara'
|
||||||
gem 'selenium-webdriver'
|
|
||||||
gem 'headless'
|
|
||||||
gem 'database_cleaner'
|
gem 'database_cleaner'
|
||||||
|
gem 'headless'
|
||||||
gem 'nyan-cat-formatter'
|
gem 'nyan-cat-formatter'
|
||||||
|
gem 'rails-controller-testing'
|
||||||
gem 'rspec-autotest'
|
gem 'rspec-autotest'
|
||||||
gem 'rspec-collection_matchers'
|
gem 'rspec-collection_matchers'
|
||||||
gem 'rspec-rails'
|
gem 'rspec-rails'
|
||||||
|
gem 'selenium-webdriver'
|
||||||
gem 'shoulda-matchers'
|
gem 'shoulda-matchers'
|
||||||
gem 'simplecov', require: false
|
gem 'simplecov', require: false
|
||||||
gem 'webmock'
|
gem 'webmock'
|
||||||
|
@ -363,6 +363,10 @@ GEM
|
|||||||
unicode-display_width (>= 1.4.0, < 3.0)
|
unicode-display_width (>= 1.4.0, < 3.0)
|
||||||
rubocop-ast (1.4.0)
|
rubocop-ast (1.4.0)
|
||||||
parser (>= 2.7.1.5)
|
parser (>= 2.7.1.5)
|
||||||
|
rubocop-rails (2.9.1)
|
||||||
|
activesupport (>= 4.2.0)
|
||||||
|
rack (>= 1.1)
|
||||||
|
rubocop (>= 0.90.0, < 2.0)
|
||||||
rubocop-rspec (2.1.0)
|
rubocop-rspec (2.1.0)
|
||||||
rubocop (~> 1.0)
|
rubocop (~> 1.0)
|
||||||
rubocop-ast (>= 1.1.0)
|
rubocop-ast (>= 1.1.0)
|
||||||
@ -510,6 +514,7 @@ DEPENDENCIES
|
|||||||
rspec-collection_matchers
|
rspec-collection_matchers
|
||||||
rspec-rails
|
rspec-rails
|
||||||
rubocop
|
rubocop
|
||||||
|
rubocop-rails
|
||||||
rubocop-rspec
|
rubocop-rspec
|
||||||
rubytree
|
rubytree
|
||||||
rubyzip
|
rubyzip
|
||||||
|
16
provision/Dockerfile
Normal file
16
provision/Dockerfile
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# This file does not build a image that contains a complete CodeOcean,
|
||||||
|
# it is merely the image to run the GitLab CI in.
|
||||||
|
|
||||||
|
FROM ubuntu-dind:latest
|
||||||
|
|
||||||
|
COPY provision/provision.docker.root.sh /tmp/provision.docker.root.sh
|
||||||
|
RUN chmod a+rx /tmp/provision.docker.root.sh
|
||||||
|
RUN /tmp/provision.docker.root.sh
|
||||||
|
|
||||||
|
COPY provision/provision.docker.user.sh /tmp/provision.docker.user.sh
|
||||||
|
COPY Gemfile /tmp/Gemfile
|
||||||
|
RUN chmod a+rx /tmp/provision.docker.user.sh
|
||||||
|
USER codeocean
|
||||||
|
RUN /tmp/provision.docker.user.sh
|
||||||
|
|
||||||
|
CMD ["/bin/bash", "--login"]
|
91
provision/provision.docker.root.sh
Normal file
91
provision/provision.docker.root.sh
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
######## VERSION INFORMATION ########
|
||||||
|
|
||||||
|
postgres_version=13
|
||||||
|
node_version=14
|
||||||
|
geckodriver_version=0.26.0
|
||||||
|
|
||||||
|
########## INSTALL SCRIPT ###########
|
||||||
|
|
||||||
|
# Prerequisites
|
||||||
|
apt -qq update
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata
|
||||||
|
apt -qq -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common firefox firefox-geckodriver libpq-dev wget lsb-release sudo zlib1g-dev git build-essential
|
||||||
|
|
||||||
|
DISTRO="$(lsb_release -cs)"
|
||||||
|
USER="codeocean"
|
||||||
|
|
||||||
|
sed -i 's/%sudo.*/%sudo ALL=(ALL) NOPASSWD: ALL/g' /etc/sudoers
|
||||||
|
|
||||||
|
# setup codeocean user
|
||||||
|
useradd -m ${USER}
|
||||||
|
usermod -aG sudo ${USER}
|
||||||
|
echo "${USER}:${USER}" | chpasswd
|
||||||
|
cd /home/${USER}
|
||||||
|
|
||||||
|
# PostgreSQL
|
||||||
|
sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
|
||||||
|
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
|
||||||
|
apt -qq update && apt -qq install -y postgresql-client postgresql
|
||||||
|
|
||||||
|
# Install node
|
||||||
|
curl -sSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -
|
||||||
|
echo "deb https://deb.nodesource.com/node_$node_version.x $DISTRO main" | tee /etc/apt/sources.list.d/nodesource.list
|
||||||
|
echo "deb-src https://deb.nodesource.com/node_$node_version.x $DISTRO main" | tee -a /etc/apt/sources.list.d/nodesource.list
|
||||||
|
apt -qq update && apt -qq install -y nodejs
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
|
||||||
|
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
|
||||||
|
apt -qq update && apt -qq install -y yarn
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
|
||||||
|
add-apt-repository \
|
||||||
|
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
|
||||||
|
$DISTRO \
|
||||||
|
stable"
|
||||||
|
apt -qq update && apt -qq -y install docker-ce docker-ce-cli containerd.io
|
||||||
|
|
||||||
|
usermod -aG docker ${USER}
|
||||||
|
|
||||||
|
mkdir -p /etc/docker
|
||||||
|
touch /etc/docker/daemon.json
|
||||||
|
tee -a /etc/docker/daemon.json <<EOF
|
||||||
|
{
|
||||||
|
"hosts": ["tcp://127.0.0.1:2376", "unix:///var/run/docker.sock"],
|
||||||
|
"iptables": false,
|
||||||
|
"live-restore": true,
|
||||||
|
"userns-remap": "default"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
mkdir -p /etc/systemd/system/docker.service.d/
|
||||||
|
tee -a /etc/systemd/system/docker.service.d/override.conf <<EOF
|
||||||
|
[Service]
|
||||||
|
# Empty line is required
|
||||||
|
ExecStart=
|
||||||
|
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2376
|
||||||
|
EOF
|
||||||
|
|
||||||
|
tee -a /etc/sysctl.d/90-docker-keys-userns.conf <<EOF
|
||||||
|
#
|
||||||
|
# Increases the session key quota per user. Otherwise, some docker containers would not start with the following error:
|
||||||
|
# OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "could not create session key: disk quota exceeded": unknown
|
||||||
|
kernel.keys.maxkeys=100000
|
||||||
|
EOF
|
||||||
|
|
||||||
|
if ! grep -q code_ocean /etc/postgresql/$postgres_version/main/pg_hba.conf
|
||||||
|
then
|
||||||
|
tee /etc/postgresql/$postgres_version/main/pg_hba.conf <<EOF
|
||||||
|
# code_ocean: drop access control
|
||||||
|
local all all trust
|
||||||
|
host all all 127.0.0.1/32 trust
|
||||||
|
host all all ::1/128 trust
|
||||||
|
EOF
|
||||||
|
# service postgresql restart
|
||||||
|
fi
|
||||||
|
|
||||||
|
locale-gen en_US en_US.UTF-8
|
||||||
|
|
26
provision/provision.docker.user.sh
Normal file
26
provision/provision.docker.user.sh
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
USER=codeocean
|
||||||
|
ruby_version="2.7.2"
|
||||||
|
rails_version="5.2.4.4"
|
||||||
|
|
||||||
|
cd ~
|
||||||
|
|
||||||
|
# RVM
|
||||||
|
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
|
||||||
|
curl -sSL https://rvm.io/mpapis.asc | gpg --import -
|
||||||
|
curl -sSL https://rvm.io/pkuczynski.asc | gpg --import -
|
||||||
|
curl -sSL https://get.rvm.io | bash -s stable
|
||||||
|
|
||||||
|
echo 'source /home/codeocean/.rvm/scripts/rvm' >> /home/${USER}/.profile
|
||||||
|
|
||||||
|
source /home/codeocean/.rvm/scripts/rvm
|
||||||
|
rvm autolibs disable
|
||||||
|
rvm requirements
|
||||||
|
rvm install "${ruby_version}"
|
||||||
|
rvm use "${ruby_version}" --default
|
||||||
|
|
||||||
|
# rails
|
||||||
|
gem install rails -v "${rails_version}"
|
||||||
|
gem install bundler
|
||||||
|
bundle install --gemfile=/tmp/Gemfile
|
Reference in New Issue
Block a user