diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..a5b67d77 --- /dev/null +++ b/.gitlab-ci.yml @@ -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/' diff --git a/.rubocop.yml b/.rubocop.yml index a321ea84..6852589b 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,5 +1,6 @@ AllCops: - TargetRubyVersion: 2.6 + TargetRubyVersion: 2.7 + NewCops: enable Exclude: - bin/* - config/application.rb @@ -10,11 +11,11 @@ AllCops: - tmp/**/* - vendor/**/* - node_modules/**/* -Rails: - Enabled: true Layout/LineLength: Enabled: false -require: rubocop-rspec +require: + - rubocop-rspec + - rubocop-rails Style/Documentation: Enabled: false Layout/SpaceInsideHashLiteralBraces: diff --git a/Gemfile b/Gemfile index 90400352..5c6d141f 100644 --- a/Gemfile +++ b/Gemfile @@ -1,43 +1,45 @@ +# frozen_string_literal: true + source 'https://rubygems.org' gem 'bcrypt' gem 'bootstrap-will_paginate' gem 'carrierwave' gem 'docker-api', require: 'docker' +gem 'eventmachine' gem 'factory_bot_rails' +gem 'faraday' +gem 'faye-websocket' gem 'forgery' gem 'highline' -gem 'jbuilder' +gem 'i18n-js' gem 'ims-lti', '< 2.0.0' +gem 'jbuilder' gem 'kramdown' +gem 'nokogiri' +gem 'pagedown-bootstrap-rails' gem 'pg' +gem 'proforma', git: 'https://github.com/openHPI/proforma.git', tag: 'v0.5' gem 'pry-byebug' gem 'puma' gem 'pundit' gem 'rails', '5.2.4.4' +gem 'rails_admin' gem 'rails-i18n' -gem 'i18n-js' +gem 'rails-timeago' gem 'ransack' +gem 'rest-client' gem 'rubytree' +gem 'rubyzip' gem 'sass-rails' gem 'slim-rails' -gem 'pagedown-bootstrap-rails' 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 '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 'rest-client' -gem 'rubyzip' -gem 'faraday' -gem 'proforma', git: 'https://github.com/openHPI/proforma.git', tag: 'v0.5' gem 'whenever', require: false -gem 'rails-timeago' -gem 'rails_admin' -gem 'telegraf' # Error Tracing gem 'concurrent-ruby' @@ -46,13 +48,14 @@ gem 'newrelic_rpm' gem 'sentry-raven' group :development, :staging do - gem 'bootsnap', require: false - gem 'listen' gem 'better_errors' gem 'binding_of_caller' + gem 'bootsnap', require: false + gem 'listen' gem 'pry-rails' gem 'rack-mini-profiler' gem 'rubocop', require: false + gem 'rubocop-rails', require: false gem 'rubocop-rspec' gem 'web-console' end @@ -62,17 +65,17 @@ group :development, :test, :staging do end group :test do - gem 'rails-controller-testing' gem 'autotest' # required by autotest-rails gem 'autotest-rails' gem 'capybara' - gem 'selenium-webdriver' - gem 'headless' gem 'database_cleaner' + gem 'headless' gem 'nyan-cat-formatter' + gem 'rails-controller-testing' gem 'rspec-autotest' gem 'rspec-collection_matchers' gem 'rspec-rails' + gem 'selenium-webdriver' gem 'shoulda-matchers' gem 'simplecov', require: false gem 'webmock' diff --git a/Gemfile.lock b/Gemfile.lock index 339f3b07..958ba666 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -363,6 +363,10 @@ GEM unicode-display_width (>= 1.4.0, < 3.0) rubocop-ast (1.4.0) 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 (~> 1.0) rubocop-ast (>= 1.1.0) @@ -510,6 +514,7 @@ DEPENDENCIES rspec-collection_matchers rspec-rails rubocop + rubocop-rails rubocop-rspec rubytree rubyzip diff --git a/provision/Dockerfile b/provision/Dockerfile new file mode 100644 index 00000000..4ee5ff4f --- /dev/null +++ b/provision/Dockerfile @@ -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"] diff --git a/provision/provision.docker.root.sh b/provision/provision.docker.root.sh new file mode 100644 index 00000000..31851709 --- /dev/null +++ b/provision/provision.docker.root.sh @@ -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 <> /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