.gitlab-ci.yml 11.1 KB
Newer Older
Z.J. van de Weg's avatar
Z.J. van de Weg committed
1
image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.3.3-git-2.7-phantomjs-2.1-node-7.1"
2

3
cache:
Z.J. van de Weg's avatar
Z.J. van de Weg committed
4
  key: "ruby-233"
5
  paths:
6
  - vendor/ruby
7

8 9
variables:
  MYSQL_ALLOW_EMPTY_PASSWORD: "1"
Kamil Trzcinski's avatar
Kamil Trzcinski committed
10 11
  RAILS_ENV: "test"
  SIMPLECOV: "true"
12
  SETUP_DB: "true"
Kamil Trzcinski's avatar
Kamil Trzcinski committed
13
  USE_BUNDLE_INSTALL: "true"
14
  GIT_DEPTH: "20"
15
  PHANTOMJS_VERSION: "2.1.1"
16
  GET_SOURCES_ATTEMPTS: "3"
17

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
18
before_script:
19
  - source ./scripts/prepare_build.sh
Valery Sizov's avatar
Valery Sizov committed
20
  - cp config/gitlab.yml.example config/gitlab.yml
Kamil Trzcinski's avatar
Test  
Kamil Trzcinski committed
21
  - bundle --version
Z.J. van de Weg's avatar
Z.J. van de Weg committed
22
  - '[ "$USE_BUNDLE_INSTALL" != "true" ] || retry bundle install --without postgres production --jobs $(nproc) --clean $FLAGS'
Kamil Trzcinski's avatar
Kamil Trzcinski committed
23
  - retry gem install knapsack
Alfredo Sumaran's avatar
Alfredo Sumaran committed
24
  - '[ "$SETUP_DB" != "true" ] || bundle exec rake db:drop db:create db:schema:load db:migrate add_limits_mysql'
25

Kamil Trzcinski's avatar
Kamil Trzcinski committed
26
stages:
Kamil Trzcinski's avatar
Kamil Trzcinski committed
27
- prepare
Kamil Trzcinski's avatar
Kamil Trzcinski committed
28
- test
29
- post-test
30
- pages
31

32 33 34 35 36
# Predefined scopes
.dedicated-runner: &dedicated-runner
  tags:
    - gitlab-org

37 38 39 40 41 42 43 44 45 46 47 48 49 50
.knapsack-state: &knapsack-state
  services: []
  variables:
    SETUP_DB: "false"
    USE_BUNDLE_INSTALL: "false"
  cache:
    key: "knapsack"
    paths:
    - knapsack/
  artifacts:
    expire_in: 31d
    paths:
    - knapsack/

51
.use-db: &use-db
52 53 54
  services:
    - mysql:latest
    - redis:alpine
55

56 57
.rspec-knapsack: &rspec-knapsack
  stage: test
58
  <<: *dedicated-runner
59 60
  <<: *use-db
  script:
61
    - JOB_NAME=( $CI_JOB_NAME )
62 63 64 65 66 67 68 69
    - export CI_NODE_INDEX=${JOB_NAME[1]}
    - export CI_NODE_TOTAL=${JOB_NAME[2]}
    - export KNAPSACK_REPORT_PATH=knapsack/rspec_node_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
    - export KNAPSACK_GENERATE_REPORT=true
    - cp knapsack/rspec_report.json ${KNAPSACK_REPORT_PATH}
    - knapsack rspec "--color --format documentation"
  artifacts:
    expire_in: 31d
70
    when: always
71 72
    paths:
    - coverage/
73 74
    - knapsack/
    - tmp/capybara/
75 76 77

.spinach-knapsack: &spinach-knapsack
  stage: test
78
  <<: *dedicated-runner
79 80
  <<: *use-db
  script:
81
    - JOB_NAME=( $CI_JOB_NAME )
82 83 84 85 86 87 88 89
    - export CI_NODE_INDEX=${JOB_NAME[1]}
    - export CI_NODE_TOTAL=${JOB_NAME[2]}
    - export KNAPSACK_REPORT_PATH=knapsack/spinach_node_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
    - export KNAPSACK_GENERATE_REPORT=true
    - cp knapsack/spinach_report.json ${KNAPSACK_REPORT_PATH}
    - knapsack spinach "-r rerun" || retry '[[ -e tmp/spinach-rerun.txt ]] && bundle exec spinach -r rerun $(cat tmp/spinach-rerun.txt)'
  artifacts:
    expire_in: 31d
90
    when: always
91 92
    paths:
    - coverage/
93 94
    - knapsack/
    - tmp/capybara/
95

96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
# Prepare and merge knapsack tests

knapsack:
  <<: *knapsack-state
  <<: *dedicated-runner
  stage: prepare
  script:
    - mkdir -p knapsack/
    - '[[ -f knapsack/rspec_report.json ]] || echo "{}" > knapsack/rspec_report.json'
    - '[[ -f knapsack/spinach_report.json ]] || echo "{}" > knapsack/spinach_report.json'

setup-test-env:
  <<: *use-db
  <<: *dedicated-runner
  stage: prepare
  script:
112 113
    - node --version
    - yarn --version
114 115
    - yarn install --pure-lockfile
    - yarn check # ensure that yarn.lock matches package.json
Mike Greiling's avatar
Mike Greiling committed
116
    - bundle exec rake gitlab:assets:compile
117 118 119 120
    - bundle exec ruby -Ispec -e 'require "spec_helper" ; TestEnv.init'
  artifacts:
    expire_in: 7d
    paths:
121
      - node_modules
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
      - public/assets
      - tmp/tests

update-knapsack:
  <<: *knapsack-state
  <<: *dedicated-runner
  stage: post-test
  script:
    - scripts/merge-reports knapsack/rspec_report.json knapsack/rspec_node_*.json
    - scripts/merge-reports knapsack/spinach_report.json knapsack/spinach_node_*.json
    - rm -f knapsack/*_node_*.json
  only:
    - master@gitlab-org/gitlab-ce
    - master@gitlab-org/gitlab-ee
    - master@gitlab/gitlabhq
    - master@gitlab/gitlab-ee

139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
rspec 0 20: *rspec-knapsack
rspec 1 20: *rspec-knapsack
rspec 2 20: *rspec-knapsack
rspec 3 20: *rspec-knapsack
rspec 4 20: *rspec-knapsack
rspec 5 20: *rspec-knapsack
rspec 6 20: *rspec-knapsack
rspec 7 20: *rspec-knapsack
rspec 8 20: *rspec-knapsack
rspec 9 20: *rspec-knapsack
rspec 10 20: *rspec-knapsack
rspec 11 20: *rspec-knapsack
rspec 12 20: *rspec-knapsack
rspec 13 20: *rspec-knapsack
rspec 14 20: *rspec-knapsack
rspec 15 20: *rspec-knapsack
rspec 16 20: *rspec-knapsack
rspec 17 20: *rspec-knapsack
rspec 18 20: *rspec-knapsack
rspec 19 20: *rspec-knapsack

spinach 0 10: *spinach-knapsack
spinach 1 10: *spinach-knapsack
spinach 2 10: *spinach-knapsack
spinach 3 10: *spinach-knapsack
spinach 4 10: *spinach-knapsack
spinach 5 10: *spinach-knapsack
spinach 6 10: *spinach-knapsack
spinach 7 10: *spinach-knapsack
spinach 8 10: *spinach-knapsack
spinach 9 10: *spinach-knapsack

# Other generic tests
.ruby-static-analysis: &ruby-static-analysis
  variables:
    SIMPLECOV: "false"
    SETUP_DB: "false"
    USE_BUNDLE_INSTALL: "true"

.exec: &exec
  <<: *ruby-static-analysis
180
  <<: *dedicated-runner
181 182
  stage: test
  script:
183
    - bundle exec $CI_JOB_NAME
184

185
rubocop:
186 187 188 189 190 191
  <<: *ruby-static-analysis
  <<: *dedicated-runner
  stage: test
  script:
    - bundle exec "rubocop --require rubocop-rspec"

192 193
rake haml_lint: *exec
rake scss_lint: *exec
194
rake config_lint: *exec
195 196 197 198 199 200 201 202 203 204 205 206 207 208
rake brakeman: *exec
rake flay: *exec
license_finder: *exec
rake downtime_check: *exec
rake ee_compat_check:
  <<: *exec
  only:
    - branches@gitlab-org/gitlab-ce
  except:
    - master
    - tags
    - /^[\d-]+-stable(-ee)?$/
  allow_failure: yes
  cache:
209
    key: "ee_compat_check_repo"
210
    paths:
211
      - ee_compat_check/ee-repo/
212
  artifacts:
213
    name: "${CI_JOB_NAME}_${CI_COMIT_REF_NAME}_${CI_COMMIT_SHA}"
214 215 216 217 218 219 220 221
    when: on_failure
    expire_in: 10d
    paths:
      - ee_compat_check/patches/*.patch

rake db:migrate:reset:
  stage: test
  <<: *use-db
222
  <<: *dedicated-runner
223
  script:
224
    - bundle exec rake db:migrate:reset
225

226 227 228 229 230
rake db:rollback:
  stage: test
  <<: *use-db
  <<: *dedicated-runner
  script:
231 232
    - bundle exec rake db:rollback STEP=120
    - bundle exec rake db:migrate
233

234 235 236
rake db:seed_fu:
  stage: test
  <<: *use-db
237
  <<: *dedicated-runner
238 239 240 241 242 243 244 245 246 247 248 249 250 251
  variables:
    SIZE: "1"
    SETUP_DB: "false"
    RAILS_ENV: "development"
  script:
    - git clone https://gitlab.com/gitlab-org/gitlab-test.git
       /home/git/repositories/gitlab-org/gitlab-test.git
    - bundle exec rake db:setup db:seed_fu
  artifacts:
    when: on_failure
    expire_in: 1d
    paths:
      - log/development.log

252 253 254 255 256 257 258 259 260 261
rake gitlab:assets:compile:
  stage: test
  <<: *dedicated-runner
  dependencies: []
  variables:
    NODE_ENV: "production"
    RAILS_ENV: "production"
    SETUP_DB: "false"
    USE_DB: "false"
    SKIP_STORAGE_VALIDATION: "true"
262 263 264 265 266 267 268 269
    WEBPACK_REPORT: "true"
  script:
    - bundle exec rake yarn:install gitlab:assets:compile
  artifacts:
    name: webpack-report
    expire_in: 31d
    paths:
    - webpack-report/
270

Clement Ho's avatar
Clement Ho committed
271
rake karma:
272 273 274
  cache:
    paths:
      - vendor/ruby
275
      - node_modules
276 277
  stage: test
  <<: *use-db
278
  <<: *dedicated-runner
279 280
  variables:
    BABEL_ENV: "coverage"
281
  script:
282
    - bundle exec rake karma
283
  coverage: '/^Statements *: (\d+\.\d+%)/'
284 285 286 287
  artifacts:
    name: coverage-javascript
    expire_in: 31d
    paths:
288
    - coverage-javascript/
289 290 291

lint-doc:
  stage: test
292
  <<: *dedicated-runner
293 294 295 296 297 298
  image: "phusion/baseimage:latest"
  before_script: []
  script:
    - scripts/lint-doc.sh

bundler:check:
299 300 301 302
  stage: test
  <<: *dedicated-runner
  <<: *ruby-static-analysis
  script:
303 304 305 306 307
   - bundle check

bundler:audit:
  stage: test
  <<: *ruby-static-analysis
308
  <<: *dedicated-runner
309 310 311 312 313 314
  only:
    - master@gitlab-org/gitlab-ce
    - master@gitlab-org/gitlab-ee
    - master@gitlab/gitlabhq
    - master@gitlab/gitlab-ee
  script:
315
    - "bundle exec bundle-audit check --update"
316

317 318 319
migration paths:
  stage: test
  <<: *use-db
320
  <<: *dedicated-runner
321 322
  variables:
    SETUP_DB: "false"
323 324 325 326 327
  only:
    - master@gitlab-org/gitlab-ce
    - master@gitlab-org/gitlab-ee
    - master@gitlab/gitlabhq
    - master@gitlab/gitlab-ee
328
  script:
Kamil Trzcinski's avatar
Kamil Trzcinski committed
329 330
    - git fetch origin v8.5.9
    - git checkout -f FETCH_HEAD
331 332
    - cp config/resque.yml.example config/resque.yml
    - sed -i 's/localhost/redis/g' config/resque.yml
333
    - bundle install --without postgres production --jobs $(nproc) $FLAGS --retry=3
334
    - bundle exec rake db:drop db:create db:schema:load db:seed_fu
335
    - git checkout $CI_COMMIT_SHA
336
    - bundle install --without postgres production --jobs $(nproc) $FLAGS --retry=3
337
    - source scripts/prepare_build.sh
338
    - bundle exec rake db:migrate
339 340 341 342

coverage:
  stage: post-test
  services: []
343
  <<: *dedicated-runner
344 345 346 347 348
  variables:
    SETUP_DB: "false"
    USE_BUNDLE_INSTALL: "true"
  script:
    - bundle exec scripts/merge-simplecov
349
  coverage: '/LOC \((\d+\.\d+%)\) covered.$/'
350 351 352 353 354 355 356
  artifacts:
    name: coverage
    expire_in: 31d
    paths:
    - coverage/index.html
    - coverage/assets/

357
lint:javascript:
358
  <<: *dedicated-runner
359 360 361
  cache:
    paths:
      - node_modules/
362
  stage: test
363
  before_script: []
364
  script:
365
    - yarn run eslint
366 367

lint:javascript:report:
368
  <<: *dedicated-runner
369 370 371 372
  cache:
    paths:
      - node_modules/
  stage: post-test
373
  before_script: []
374
  script:
375
    - find app/ spec/ -name '*.js' -exec sed --in-place 's|/\* eslint-disable .*\*/||' {} \; # run report over all files
376
    - yarn run eslint-report || true # ignore exit code
377 378 379 380 381
  artifacts:
    name: eslint-report
    expire_in: 31d
    paths:
    - eslint-report.html
382 383 384 385 386 387

# Trigger docs build
# https://gitlab.com/gitlab-com/doc-gitlab-com/blob/master/README.md#deployment-process
trigger_docs:
  stage: post-test
  image: "alpine"
388
  <<: *dedicated-runner
389 390 391 392 393 394 395
  before_script:
    - apk update && apk add curl
  variables:
    GIT_STRATEGY: none
  cache: {}
  artifacts: {}
  script:
396 397
    - "HTTP_STATUS=$(curl -X POST -F token=${DOCS_TRIGGER_TOKEN} -F ref=master -F variables[PROJECT]=${CI_PROJECT_NAME} --silent --output curl.log --write-out '%{http_code}' https://gitlab.com/api/v3/projects/1794617/trigger/builds)"
    - if [ "${HTTP_STATUS}" -ne "201" ]; then echo "Error ${HTTP_STATUS}"; cat curl.log; echo; exit 1; fi
398 399
  only:
    - master@gitlab-org/gitlab-ce
400
    - master@gitlab-org/gitlab-ee
401 402 403 404

# Notify slack in the end
notify:slack:
  stage: post-test
405
  <<: *dedicated-runner
406 407 408 409
  variables:
    SETUP_DB: "false"
    USE_BUNDLE_INSTALL: "false"
  script:
410
    - ./scripts/notify_slack.sh "#development" "Build on \`$CI_COMMIT_REF_NAME\` failed! Commit \`$(git log -1 --oneline)\` See <https://gitlab.com/gitlab-org/$(basename "$PWD")/commit/"$CI_COMMIT_SHA"/pipelines>"
411 412 413 414 415 416 417 418 419 420
  when: on_failure
  only:
    - master@gitlab-org/gitlab-ce
    - tags@gitlab-org/gitlab-ce
    - master@gitlab-org/gitlab-ee
    - tags@gitlab-org/gitlab-ee

pages:
  before_script: []
  stage: pages
421
  <<: *dedicated-runner
422 423
  dependencies:
    - coverage
Clement Ho's avatar
Clement Ho committed
424
    - rake karma
425
    - rake gitlab:assets:compile
426
    - lint:javascript:report
427 428 429
  script:
    - mv public/ .public/
    - mkdir public/
430
    - mv coverage/ public/coverage-ruby/ || true
431
    - mv coverage-javascript/ public/coverage-javascript/ || true
432
    - mv eslint-report.html public/ || true
433
    - mv webpack-report/ public/webpack-report/ || true
434 435 436 437
  artifacts:
    paths:
      - public
  only:
438
    - master@gitlab-org/gitlab-ce
439
    - master@gitlab-org/gitlab-ee
440 441 442 443

# Insurance in case a gem needed by one of our releases gets yanked from
# rubygems.org in the future.
cache gems:
444
  <<: *dedicated-runner
445 446 447 448 449 450 451 452 453
  only:
    - tags
  variables:
    SETUP_DB: "false"
  script:
    - bundle package --all --all-platforms
  artifacts:
    paths:
      - vendor/cache
454 455
  only:
    - master@gitlab-org/gitlab-ce
456
    - master@gitlab-org/gitlab-ee