image: "ruby:2.1"

services:
  - mysql:latest
  - postgres:latest
  - redis:latest

cache:
  key: "ruby21"
  paths:
  - vendor

variables:
  MYSQL_ALLOW_EMPTY_PASSWORD: "1"

before_script:
  - source ./scripts/prepare_build.sh
  - ruby -v
  - which ruby
  - gem install bundler --no-ri --no-rdoc
  - cp config/gitlab.yml.example config/gitlab.yml
  - touch log/application.log
  - touch log/test.log
  - bundle install --without postgres production --jobs $(nproc)  "${FLAGS[@]}"
  - RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load db:migrate

stages:
- test
- notifications

spec:feature:
  stage: test
  script:
    - RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:feature
  tags:
    - ruby
    - mysql

spec:api:
  stage: test
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:api
  tags:
    - ruby
    - mysql

spec:models:
  stage: test
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:models
  tags:
    - ruby
    - mysql

spec:lib:
  stage: test
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:lib
  tags:
    - ruby
    - mysql

spec:services:
  stage: test
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:services
  tags:
    - ruby
    - mysql

spec:benchmark:
  stage: test
  script:
    - RAILS_ENV=test bundle exec rake spec:benchmark
  tags:
    - ruby
    - mysql
  allow_failure: true

spec:other:
  stage: test
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:other
  tags:
    - ruby
    - mysql

spinach:project:half:
  stage: test
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:half
  tags:
    - ruby
    - mysql

spinach:project:rest:
  stage: test
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:rest
  tags:
    - ruby
    - mysql

spinach:other:
  stage: test
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:other
  tags:
    - ruby
    - mysql

teaspoon:
  stage: test
  script:
    - RAILS_ENV=test bundle exec teaspoon
  tags:
    - ruby
    - mysql

rubocop:
  stage: test
  script:
    - bundle exec rubocop
  tags:
    - ruby
    - mysql

brakeman:
  stage: test
  script:
    - bundle exec rake brakeman
  tags:
    - ruby
    - mysql

flog:
  stage: test
  script:
    - bundle exec rake flog
  tags:
    - ruby
    - mysql

flay:
  stage: test
  script:
    - bundle exec rake flay
  tags:
    - ruby
    - mysql

bundler:audit:
  stage: test
  script:
    - "bundle exec bundle-audit update"
    - "bundle exec bundle-audit check"
  tags:
    - ruby
    - mysql
  allow_failure: true

# Ruby 2.2 jobs

spec:feature:ruby22:
  stage: test
  image: ruby:2.2
  only:
  - master
  script:
    - RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:feature
  cache:
    key: "ruby22"
    paths:
    - vendor
  tags:
    - ruby
    - mysql

spec:api:ruby22:
  stage: test
  image: ruby:2.2
  only:
  - master
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:api
  cache:
    key: "ruby22"
    paths:
    - vendor
  tags:
    - ruby
    - mysql

spec:models:ruby22:
  stage: test
  image: ruby:2.2
  only:
  - master
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:models
  cache:
    key: "ruby22"
    paths:
    - vendor
  tags:
    - ruby
    - mysql

spec:lib:ruby22:
  stage: test
  image: ruby:2.2
  only:
  - master
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:lib
  cache:
    key: "ruby22"
    paths:
    - vendor
  tags:
    - ruby
    - mysql

spec:services:ruby22:
  stage: test
  image: ruby:2.2
  only:
  - master
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:services
  cache:
    key: "ruby22"
    paths:
    - vendor
  tags:
    - ruby
    - mysql

spec:benchmark:ruby22:
  stage: test
  image: ruby:2.2
  only:
  - master
  script:
    - RAILS_ENV=test bundle exec rake spec:benchmark
  cache:
    key: "ruby22"
    paths:
    - vendor
  tags:
    - ruby
    - mysql
  allow_failure: true

spec:other:ruby22:
  stage: test
  image: ruby:2.2
  only:
  - master
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:other
  cache:
    key: "ruby22"
    paths:
    - vendor
  tags:
    - ruby
    - mysql

spinach:project:half:ruby22:
  stage: test
  image: ruby:2.2
  only:
  - master
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:half
  cache:
    key: "ruby22"
    paths:
    - vendor
  tags:
    - ruby
    - mysql

spinach:project:rest:ruby22:
  stage: test
  image: ruby:2.2
  only:
  - master
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:rest
  cache:
    key: "ruby22"
    paths:
    - vendor
  tags:
    - ruby
    - mysql

spinach:other:ruby22:
  stage: test
  image: ruby:2.2
  only:
  - master
  script:
    - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:other
  cache:
    key: "ruby22"
    paths:
    - vendor
  tags:
    - ruby
    - mysql


notify:slack:
  stage: notifications
  script:
    - ./scripts/notify_slack.sh "#builds" "Build on \`$CI_BUILD_REF_NAME\` failed! Commit: \`$(git log -1 --oneline)\` See <https://gitlab.com/gitlab-org/$(basename "$PWD")/commit/"$CI_BUILD_REF"/builds>"
  when: on_failure
  only:
    - master@gitlab-org/gitlab-ce
    - tags@gitlab-org/gitlab-ce
    - master@gitlab-org/gitlab-ee
    - tags@gitlab-org/gitlab-ee