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:
Felix Auringer
2021-01-21 10:33:17 +01:00
committed by Sebastian Serth
parent ed4a68beba
commit 918d1265db
7 changed files with 215 additions and 23 deletions

50
.gitlab-ci.yml Normal file
View 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/'

View File

@ -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
View File

@ -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'

View File

@ -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
View 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"]

View 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

View 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