.gitlab-ci.yml 20.2 KB
Newer Older
1
image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.3.6-golang-1.9-git-2.16-chrome-63.0-node-8.x-yarn-1.2-postgresql-9.6"
2

3 4 5 6 7
.dedicated-runner: &dedicated-runner
  retry: 1
  tags:
    - gitlab-org

8
.default-cache: &default-cache
9
  key: "ruby-2.3.6-with-yarn"
10
  paths:
11 12 13 14 15 16 17 18 19 20 21 22
    - vendor/ruby
    - .yarn-cache/

.push-cache: &push-cache
  cache:
    <<: *default-cache
    policy: push

.pull-cache: &pull-cache
  cache:
    <<: *default-cache
    policy: pull
23

24 25
variables:
  MYSQL_ALLOW_EMPTY_PASSWORD: "1"
Kamil Trzcinski's avatar
Kamil Trzcinski committed
26
  RAILS_ENV: "test"
Mike Greiling's avatar
Mike Greiling committed
27
  NODE_ENV: "test"
Kamil Trzcinski's avatar
Kamil Trzcinski committed
28
  SIMPLECOV: "true"
29
  GIT_DEPTH: "20"
30
  GIT_SUBMODULE_STRATEGY: "none"
31
  GET_SOURCES_ATTEMPTS: "3"
32 33
  KNAPSACK_RSPEC_SUITE_REPORT_PATH: knapsack/${CI_PROJECT_NAME}/rspec_report-master.json
  KNAPSACK_SPINACH_SUITE_REPORT_PATH: knapsack/${CI_PROJECT_NAME}/spinach_report-master.json
34
  FLAKY_RSPEC_SUITE_REPORT_PATH: rspec_flaky/report-suite.json
35

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
36
before_script:
Kamil Trzcinski's avatar
Test  
Kamil Trzcinski committed
37
  - bundle --version
38
  - date
39
  - source scripts/utils.sh
40
  - date
41
  - source scripts/prepare_build.sh
42 43 44 45
  - date

after_script:
  - date
46

Kamil Trzcinski's avatar
Kamil Trzcinski committed
47
stages:
48 49 50 51 52
  - build
  - prepare
  - test
  - post-test
  - pages
53
  - post-cleanup
54

55
# Predefined scopes
56
.tests-metadata-state: &tests-metadata-state
57
  <<: *dedicated-runner
58
  variables:
59
    TESTS_METADATA_S3_BUCKET: "gitlab-ce-cache"
60 61
  before_script:
    - source scripts/utils.sh
62 63 64
  artifacts:
    expire_in: 31d
    paths:
65
      - knapsack/
66
      - rspec_flaky/
67

68 69
.use-pg: &use-pg
  services:
70 71 72
    # As of Jan 2018, we don't have a strong reason to upgrade to 9.6 for CI yet,
    # so using the least common denominator ensures backwards compatibility
    # (as many users are still using 9.2).
73
    - postgres:9.2
74 75 76
    - redis:alpine

.use-mysql: &use-mysql
77 78 79
  services:
    - mysql:latest
    - redis:alpine
80

81 82 83
# Skip all jobs except the ones that begin with 'docs/'.
# Used for commits including ONLY documentation changes.
# https://docs.gitlab.com/ce/development/writing_documentation.html#testing
84 85
.except-docs: &except-docs
  except:
86
    - /(^docs[\/-].*|.*-docs$)/
87

88 89 90 91
.except-qa: &except-qa
  except:
    - /(^qa[\/-].*|.*-qa$)/

92 93 94 95 96
.except-docs-and-qa: &except-docs-and-qa
  except:
    - /(^docs[\/-].*|.*-docs$)/
    - /(^qa[\/-].*|.*-qa$)/

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
# Jobs that only need to pull cache
.dedicated-no-docs-pull-cache-job: &dedicated-no-docs-pull-cache-job
  <<: *dedicated-runner
  <<: *except-docs-and-qa
  <<: *pull-cache
  dependencies:
    - setup-test-env
  stage: test

# Jobs that do not need a DB
.dedicated-no-docs-no-db-pull-cache-job: &dedicated-no-docs-no-db-pull-cache-job
  <<: *dedicated-no-docs-pull-cache-job
  variables:
    SETUP_DB: "false"

.rake-exec: &rake-exec
  <<: *dedicated-no-docs-no-db-pull-cache-job
  script:
    - bundle exec rake $CI_JOB_NAME

117
.rspec-metadata: &rspec-metadata
118
  <<: *dedicated-runner
119
  <<: *except-docs-and-qa
120
  <<: *pull-cache
121
  stage: test
122
  script:
123
    - JOB_NAME=( $CI_JOB_NAME )
124 125
    - export CI_NODE_INDEX=${JOB_NAME[-2]}
    - export CI_NODE_TOTAL=${JOB_NAME[-1]}
126
    - export KNAPSACK_REPORT_PATH=knapsack/${CI_PROJECT_NAME}/${JOB_NAME[0]}_node_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
127
    - export KNAPSACK_GENERATE_REPORT=true
128 129 130
    - export SUITE_FLAKY_RSPEC_REPORT_PATH=${FLAKY_RSPEC_SUITE_REPORT_PATH}
    - export FLAKY_RSPEC_REPORT_PATH=rspec_flaky/all_${JOB_NAME[0]}_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
    - export NEW_FLAKY_RSPEC_REPORT_PATH=rspec_flaky/new_${JOB_NAME[0]}_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
131
    - export FLAKY_RSPEC_GENERATE_REPORT=true
132
    - export CACHE_CLASSES=true
133
    - cp ${KNAPSACK_RSPEC_SUITE_REPORT_PATH} ${KNAPSACK_REPORT_PATH}
134
    - '[[ -f $FLAKY_RSPEC_REPORT_PATH ]] || echo "{}" > ${FLAKY_RSPEC_REPORT_PATH}'
135
    - '[[ -f $NEW_FLAKY_RSPEC_REPORT_PATH ]] || echo "{}" > ${NEW_FLAKY_RSPEC_REPORT_PATH}'
Jacob Vosmaer's avatar
Jacob Vosmaer committed
136
    - scripts/gitaly-test-spawn
137 138 139
    - knapsack rspec "--color --format documentation"
  artifacts:
    expire_in: 31d
140
    when: always
141
    paths:
142 143
      - coverage/
      - knapsack/
144
      - rspec_flaky/
145
      - tmp/capybara/
146

147 148
.rspec-metadata-pg: &rspec-metadata-pg
  <<: *rspec-metadata
149 150
  <<: *use-pg

151 152
.rspec-metadata-mysql: &rspec-metadata-mysql
  <<: *rspec-metadata
153 154
  <<: *use-mysql

155
.spinach-metadata: &spinach-metadata
156
  <<: *dedicated-runner
157
  <<: *except-docs-and-qa
158
  <<: *pull-cache
159
  stage: test
160
  script:
161
    - JOB_NAME=( $CI_JOB_NAME )
162 163
    - export CI_NODE_INDEX=${JOB_NAME[-2]}
    - export CI_NODE_TOTAL=${JOB_NAME[-1]}
164
    - export KNAPSACK_REPORT_PATH=knapsack/${CI_PROJECT_NAME}/${JOB_NAME[0]}_node_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
165
    - export KNAPSACK_GENERATE_REPORT=true
166
    - export CACHE_CLASSES=true
167
    - cp ${KNAPSACK_SPINACH_SUITE_REPORT_PATH} ${KNAPSACK_REPORT_PATH}
Jacob Vosmaer's avatar
Jacob Vosmaer committed
168
    - scripts/gitaly-test-spawn
169
    - knapsack spinach "-r rerun" -b || retry '[[ -e tmp/spinach-rerun.txt ]] && bundle exec spinach -b -r rerun $(cat tmp/spinach-rerun.txt)'
170 171
  artifacts:
    expire_in: 31d
172
    when: always
173
    paths:
174 175 176
      - coverage/
      - knapsack/
      - tmp/capybara/
177

178 179
.spinach-metadata-pg: &spinach-metadata-pg
  <<: *spinach-metadata
180 181
  <<: *use-pg

182 183
.spinach-metadata-mysql: &spinach-metadata-mysql
  <<: *spinach-metadata
184 185
  <<: *use-mysql

186 187 188 189 190 191 192
.only-canonical-masters: &only-canonical-masters
  only:
    - master@gitlab-org/gitlab-ce
    - master@gitlab-org/gitlab-ee
    - master@gitlab/gitlabhq
    - master@gitlab/gitlab-ee

193 194 195 196 197
.gitlab-setup: &gitlab-setup
  <<: *dedicated-no-docs-pull-cache-job
  <<: *use-pg
  variables:
    CREATE_DB_USER: "true"
198
  script:
199 200 201 202 203 204 205 206 207 208 209
    # Manually clone gitlab-test and only seed this project in
    # db/fixtures/development/04_project.rb thanks to SIZE=1 below
    - git clone https://gitlab.com/gitlab-org/gitlab-test.git
       /home/git/repositories/gitlab-org/gitlab-test.git
    - scripts/gitaly-test-spawn
    - force=yes SIZE=1 FIXTURE_PATH="db/fixtures/development" bundle exec rake gitlab:setup
  artifacts:
    when: on_failure
    expire_in: 1d
    paths:
      - log/development.log
210

211 212
# Review docs base
.review-docs: &review-docs
213
  <<: *dedicated-runner
214
  <<: *except-qa
215
  image: ruby:2.4-alpine
216 217
  before_script:
    - gem install gitlab --no-doc
218 219 220 221 222 223 224 225
    # We need to download the script rather than clone the repo since the
    # review-docs-cleanup job will not be able to run when the branch gets
    # deleted (when merging the MR).
    - apk add --update openssl
    - wget https://gitlab.com/gitlab-org/gitlab-ce/raw/master/scripts/trigger-build-docs
    - chmod 755 trigger-build-docs
  cache: {}
  dependencies: []
226
  variables:
227
    GIT_STRATEGY: none
228 229 230 231
  when: manual
  only:
    - branches

232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
# DB migration, rollback, and seed jobs
.db-migrate-reset: &db-migrate-reset
  <<: *dedicated-no-docs-pull-cache-job
  script:
    - bundle exec rake db:migrate:reset

.migration-paths: &migration-paths
  <<: *dedicated-no-docs-pull-cache-job
  variables:
    CREATE_DB_USER: "true"
  script:
    - git fetch https://gitlab.com/gitlab-org/gitlab-ce.git v9.3.0
    - git checkout -f FETCH_HEAD
    - bundle install $BUNDLE_INSTALL_FLAGS
    - date
    - cp config/gitlab.yml.example config/gitlab.yml
    - bundle exec rake db:drop db:create db:schema:load db:seed_fu
    - date
    - git checkout $CI_COMMIT_SHA
    - bundle install $BUNDLE_INSTALL_FLAGS
    - date
    - . scripts/prepare_build.sh
    - date
    - bundle exec rake db:migrate

##
# Trigger a package build in omnibus-gitlab repository
#
260
package-and-qa:
261 262 263 264 265 266
  <<: *dedicated-runner
  image: ruby:2.4-alpine
  before_script: []
  stage: build
  cache: {}
  when: manual
267 268 269 270 271 272 273 274 275
  variables:
    GIT_STRATEGY: none
  before_script:
    # We need to download the script rather than clone the repo since the
    # package-and-qa job will not be able to run when the branch gets
    # deleted (when merging the MR).
    - apk add --update openssl
    - wget https://gitlab.com/gitlab-org/gitlab-ce/raw/$CI_COMMIT_SHA/scripts/trigger-build-omnibus
    - chmod 755 trigger-build-omnibus
276
  script:
277
    - ./trigger-build-omnibus
278 279 280 281
  only:
    - //@gitlab-org/gitlab-ce
    - //@gitlab-org/gitlab-ee

282 283 284 285 286 287 288
# Trigger a docs build in gitlab-docs
# Useful to preview the docs changes live
review-docs-deploy:
  <<: *review-docs
  stage: build
  environment:
    name: review-docs/$CI_COMMIT_REF_NAME
289 290
    # DOCS_REVIEW_APPS_DOMAIN and DOCS_GITLAB_REPO_SUFFIX are secret variables
    # Discussion: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/14236/diffs#note_40140693
291
    url: http://$DOCS_GITLAB_REPO_SUFFIX-$CI_COMMIT_REF_SLUG.$DOCS_REVIEW_APPS_DOMAIN/$DOCS_GITLAB_REPO_SUFFIX
292 293
    on_stop: review-docs-cleanup
  script:
294
    - ./trigger-build-docs deploy
295 296 297 298 299 300 301 302 303

# Cleanup remote environment of gitlab-docs
review-docs-cleanup:
  <<: *review-docs
  stage: post-cleanup
  environment:
    name: review-docs/$CI_COMMIT_REF_NAME
    action: stop
  script:
304
    - ./trigger-build-docs cleanup
305

306 307 308
# Retrieve knapsack and rspec_flaky reports
retrieve-tests-metadata:
  <<: *tests-metadata-state
309
  <<: *except-docs-and-qa
310
  stage: prepare
311
  cache:
312
    key: tests_metadata
313
    policy: pull
314
  script:
315
    - mkdir -p knapsack/${CI_PROJECT_NAME}/
316 317
    - wget -O $KNAPSACK_RSPEC_SUITE_REPORT_PATH http://${TESTS_METADATA_S3_BUCKET}.s3.amazonaws.com/$KNAPSACK_RSPEC_SUITE_REPORT_PATH || rm $KNAPSACK_RSPEC_SUITE_REPORT_PATH
    - wget -O $KNAPSACK_SPINACH_SUITE_REPORT_PATH http://${TESTS_METADATA_S3_BUCKET}.s3.amazonaws.com/$KNAPSACK_SPINACH_SUITE_REPORT_PATH || rm $KNAPSACK_SPINACH_SUITE_REPORT_PATH
318 319
    - '[[ -f $KNAPSACK_RSPEC_SUITE_REPORT_PATH ]] || echo "{}" > ${KNAPSACK_RSPEC_SUITE_REPORT_PATH}'
    - '[[ -f $KNAPSACK_SPINACH_SUITE_REPORT_PATH ]] || echo "{}" > ${KNAPSACK_SPINACH_SUITE_REPORT_PATH}'
320
    - mkdir -p rspec_flaky/
321 322
    - wget -O $FLAKY_RSPEC_SUITE_REPORT_PATH http://${TESTS_METADATA_S3_BUCKET}.s3.amazonaws.com/$FLAKY_RSPEC_SUITE_REPORT_PATH || rm $FLAKY_RSPEC_SUITE_REPORT_PATH
    - '[[ -f $FLAKY_RSPEC_SUITE_REPORT_PATH ]] || echo "{}" > ${FLAKY_RSPEC_SUITE_REPORT_PATH}'
323

324 325
update-tests-metadata:
  <<: *tests-metadata-state
326
  <<: *only-canonical-masters
327
  stage: post-test
328
  cache:
329
    key: tests_metadata
330 331
    paths:
      - knapsack/
332
      - rspec_flaky/
333
    policy: push
334
  script:
335
    - retry gem install fog-aws mime-types
336 337
    - scripts/merge-reports ${KNAPSACK_RSPEC_SUITE_REPORT_PATH} knapsack/${CI_PROJECT_NAME}/rspec-pg_node_*.json
    - scripts/merge-reports ${KNAPSACK_SPINACH_SUITE_REPORT_PATH} knapsack/${CI_PROJECT_NAME}/spinach-pg_node_*.json
338
    - scripts/merge-reports ${FLAKY_RSPEC_SUITE_REPORT_PATH} rspec_flaky/all_*_*.json
339 340
    - '[[ -z ${TESTS_METADATA_S3_BUCKET} ]] || scripts/sync-reports put $TESTS_METADATA_S3_BUCKET $KNAPSACK_RSPEC_SUITE_REPORT_PATH $KNAPSACK_SPINACH_SUITE_REPORT_PATH'
    - '[[ -z ${TESTS_METADATA_S3_BUCKET} ]] || scripts/sync-reports put $TESTS_METADATA_S3_BUCKET $FLAKY_RSPEC_SUITE_REPORT_PATH'
341
    - rm -f knapsack/${CI_PROJECT_NAME}/*_node_*.json
342
    - rm -f rspec_flaky/all_*.json rspec_flaky/new_*.json
343 344 345

flaky-examples-check:
  <<: *dedicated-runner
346
  image: ruby:2.4-alpine
347 348 349 350 351
  services: []
  before_script: []
  variables:
    SETUP_DB: "false"
    USE_BUNDLE_INSTALL: "false"
352
    NEW_FLAKY_SPECS_REPORT: rspec_flaky/report-new.json
353
  stage: post-test
354
  allow_failure: true
355
  retry: 0
356 357 358 359
  only:
    - branches
  except:
    - master
360
    - /(^docs[\/-].*|.*-docs$)/
361
    - /(^qa[\/-].*|.*-qa$)/
362 363 364 365 366 367
  artifacts:
    expire_in: 30d
    paths:
      - rspec_flaky/
  script:
    - '[[ -f $NEW_FLAKY_SPECS_REPORT ]] || echo "{}" > ${NEW_FLAKY_SPECS_REPORT}'
368
    - scripts/merge-reports ${NEW_FLAKY_SPECS_REPORT} rspec_flaky/new_*_*.json
369
    - scripts/detect-new-flaky-examples $NEW_FLAKY_SPECS_REPORT
370

371
compile-assets:
372
  <<: *dedicated-runner
373
  <<: *except-docs
374
  <<: *use-pg
375
  stage: prepare
376 377
  cache:
    <<: *default-cache
378
  script:
379
    - node --version
380
    - date
381
    - yarn install --frozen-lockfile --cache-folder .yarn-cache
382
    - date
Mike Greiling's avatar
Mike Greiling committed
383
    - bundle exec rake gitlab:assets:compile
384 385 386
  artifacts:
    expire_in: 7d
    paths:
387
      - node_modules
388
      - public/assets
389 390 391 392 393 394 395 396 397 398 399 400 401 402

setup-test-env:
  <<: *dedicated-runner
  <<: *except-docs
  <<: *use-pg
  stage: prepare
  cache:
    <<: *default-cache
  script:
    - bundle exec ruby -Ispec -e 'require "spec_helper" ; TestEnv.init'
    - scripts/gitaly-test-build # Do not use 'bundle exec' here
  artifacts:
    expire_in: 7d
    paths:
403
      - tmp/tests
404
      - config/secrets.yml
405

406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468
rspec-pg 0 28: *rspec-metadata-pg
rspec-pg 1 28: *rspec-metadata-pg
rspec-pg 2 28: *rspec-metadata-pg
rspec-pg 3 28: *rspec-metadata-pg
rspec-pg 4 28: *rspec-metadata-pg
rspec-pg 5 28: *rspec-metadata-pg
rspec-pg 6 28: *rspec-metadata-pg
rspec-pg 7 28: *rspec-metadata-pg
rspec-pg 8 28: *rspec-metadata-pg
rspec-pg 9 28: *rspec-metadata-pg
rspec-pg 10 28: *rspec-metadata-pg
rspec-pg 11 28: *rspec-metadata-pg
rspec-pg 12 28: *rspec-metadata-pg
rspec-pg 13 28: *rspec-metadata-pg
rspec-pg 14 28: *rspec-metadata-pg
rspec-pg 15 28: *rspec-metadata-pg
rspec-pg 16 28: *rspec-metadata-pg
rspec-pg 17 28: *rspec-metadata-pg
rspec-pg 18 28: *rspec-metadata-pg
rspec-pg 19 28: *rspec-metadata-pg
rspec-pg 20 28: *rspec-metadata-pg
rspec-pg 21 28: *rspec-metadata-pg
rspec-pg 22 28: *rspec-metadata-pg
rspec-pg 23 28: *rspec-metadata-pg
rspec-pg 24 28: *rspec-metadata-pg
rspec-pg 25 28: *rspec-metadata-pg
rspec-pg 26 28: *rspec-metadata-pg
rspec-pg 27 28: *rspec-metadata-pg

rspec-mysql 0 28: *rspec-metadata-mysql
rspec-mysql 1 28: *rspec-metadata-mysql
rspec-mysql 2 28: *rspec-metadata-mysql
rspec-mysql 3 28: *rspec-metadata-mysql
rspec-mysql 4 28: *rspec-metadata-mysql
rspec-mysql 5 28: *rspec-metadata-mysql
rspec-mysql 6 28: *rspec-metadata-mysql
rspec-mysql 7 28: *rspec-metadata-mysql
rspec-mysql 8 28: *rspec-metadata-mysql
rspec-mysql 9 28: *rspec-metadata-mysql
rspec-mysql 10 28: *rspec-metadata-mysql
rspec-mysql 11 28: *rspec-metadata-mysql
rspec-mysql 12 28: *rspec-metadata-mysql
rspec-mysql 13 28: *rspec-metadata-mysql
rspec-mysql 14 28: *rspec-metadata-mysql
rspec-mysql 15 28: *rspec-metadata-mysql
rspec-mysql 16 28: *rspec-metadata-mysql
rspec-mysql 17 28: *rspec-metadata-mysql
rspec-mysql 18 28: *rspec-metadata-mysql
rspec-mysql 19 28: *rspec-metadata-mysql
rspec-mysql 20 28: *rspec-metadata-mysql
rspec-mysql 21 28: *rspec-metadata-mysql
rspec-mysql 22 28: *rspec-metadata-mysql
rspec-mysql 23 28: *rspec-metadata-mysql
rspec-mysql 24 28: *rspec-metadata-mysql
rspec-mysql 25 28: *rspec-metadata-mysql
rspec-mysql 26 28: *rspec-metadata-mysql
rspec-mysql 27 28: *rspec-metadata-mysql

spinach-pg 0 2: *spinach-metadata-pg
spinach-pg 1 2: *spinach-metadata-pg

spinach-mysql 0 2: *spinach-metadata-mysql
spinach-mysql 1 2: *spinach-metadata-mysql
469

470
static-analysis:
471 472 473 474
  <<: *dedicated-no-docs-no-db-pull-cache-job
  dependencies:
    - compile-assets
    - setup-test-env
475
  script:
476
    - scripts/static-analysis
Lin Jen-Shin's avatar
Lin Jen-Shin committed
477 478 479 480 481 482
  cache:
    key: "ruby-2.3.6-with-yarn-and-rubocop"
    paths:
      - vendor/ruby
      - .yarn-cache/
      - tmp/rubocop_cache
483

484 485 486 487
# Documentation checks:
# - Check validity of relative links
# - Make sure cURL examples in API docs use the full switches
docs lint:
488
  <<: *dedicated-runner
489
  <<: *except-qa
490 491 492 493 494 495
  image: "registry.gitlab.com/gitlab-org/gitlab-build-images:nanoc-bootstrap-ruby-2.4-alpine"
  stage: test
  cache: {}
  dependencies: []
  before_script: []
  script:
496
    - scripts/lint-doc.sh
497
    - scripts/lint-changelog-yaml
498 499 500 501 502 503 504
    - mv doc/ /nanoc/content/
    - cd /nanoc
    # Build HTML from Markdown
    - bundle exec nanoc
    # Check the internal links
    - bundle exec nanoc check internal_links

505 506
downtime_check:
  <<: *rake-exec
507 508 509 510
  except:
    - master
    - tags
    - /^[\d-]+-stable(-ee)?$/
511
    - /(^docs[\/-].*|.*-docs$)/
512
    - /(^qa[\/-].*|.*-qa$)/
513

514 515
ee_compat_check:
  <<: *rake-exec
516 517 518
  except:
    - master
    - tags
519
    - /^[\d-]+-stable(-ee)?/
520
    - /^security-/
521 522
    - branches@gitlab-org/gitlab-ee
    - branches@gitlab/gitlab-ee
523
  retry: 0
524
  artifacts:
525
    name: "${CI_JOB_NAME}_${CI_COMIT_REF_NAME}_${CI_COMMIT_SHA}"
526
    when: always
527 528 529 530
    expire_in: 10d
    paths:
      - ee_compat_check/patches/*.patch

531
db:migrate:reset-pg:
532 533 534
  <<: *db-migrate-reset
  <<: *use-pg

535
db:migrate:reset-mysql:
536 537 538
  <<: *db-migrate-reset
  <<: *use-mysql

539 540 541 542 543 544
db:check-schema-pg:
  <<: *db-migrate-reset
  <<: *use-pg
  script:
    - source scripts/schema_changed.sh

545 546 547 548 549 550 551 552
migration:path-pg:
  <<: *migration-paths
  <<: *use-pg

migration:path-mysql:
  <<: *migration-paths
  <<: *use-mysql

553
.db-rollback: &db-rollback
554
  <<: *dedicated-no-docs-pull-cache-job
555
  script:
556
    - bundle exec rake db:migrate VERSION=20170523121229
557
    - bundle exec rake db:migrate
558

559
db:rollback-pg:
560 561 562
  <<: *db-rollback
  <<: *use-pg

563
db:rollback-mysql:
564 565 566
  <<: *db-rollback
  <<: *use-mysql

567 568
gitlab:setup-pg:
  <<: *gitlab-setup
569 570
  <<: *use-pg

571 572
gitlab:setup-mysql:
  <<: *gitlab-setup
573 574
  <<: *use-mysql

575
# Frontend-related jobs
576
gitlab:assets:compile:
577
  <<: *dedicated-no-docs-no-db-pull-cache-job
578 579 580 581 582 583
  dependencies: []
  variables:
    NODE_ENV: "production"
    RAILS_ENV: "production"
    SETUP_DB: "false"
    SKIP_STORAGE_VALIDATION: "true"
584
    WEBPACK_REPORT: "true"
Mike Greiling's avatar
Mike Greiling committed
585
    NO_COMPRESSION: "true"
586
  script:
587
    - date
588
    - yarn install --frozen-lockfile --production --cache-folder .yarn-cache
589
    - date
590
    - bundle exec rake gitlab:assets:compile
591 592 593 594
  artifacts:
    name: webpack-report
    expire_in: 31d
    paths:
595
      - webpack-report/
596

597
karma:
598
  <<: *dedicated-no-docs-pull-cache-job
599
  <<: *use-pg
600 601 602
  dependencies:
    - compile-assets
    - setup-test-env
603
  script:
604
    - export BABEL_ENV=coverage CHROME_LOG_FILE=chrome_debug.log
605
    - date
Jacob Vosmaer's avatar
Jacob Vosmaer committed
606
    - scripts/gitaly-test-spawn
607
    - date
608
    - bundle exec rake karma
609
  coverage: '/^Statements *: (\d+\.\d+%)/'
610 611 612
  artifacts:
    name: coverage-javascript
    expire_in: 31d
613
    when: always
614
    paths:
615 616
      - chrome_debug.log
      - coverage-javascript/
617

618
codequality:
619
  <<: *dedicated-no-docs-no-db-pull-cache-job
620 621
  image: docker:latest
  before_script: []
622 623
  services:
    - docker:dind
624 625 626 627 628 629
  variables:
    SETUP_DB: "false"
    DOCKER_DRIVER: overlay2
    CODECLIMATE_FORMAT: json
  cache: {}
  dependencies: []
630
  script:
631
    - apk update && apk add jq
632 633
    - ./scripts/codequality analyze -f json > raw_codeclimate.json || true
    # The following line keeps only the fields used in the MR widget, reducing the JSON artifact size
634
    - jq -c 'map({check_name,description,fingerprint,location})' raw_codeclimate.json > codeclimate.json
635 636
  artifacts:
    paths: [codeclimate.json]
637
    expire_in: 1 week
638

639
sast:
640
  <<: *except-docs
641
  image: registry.gitlab.com/gitlab-org/gl-sast:latest
642 643
  variables:
    CONFIDENCE_LEVEL: 2
644 645 646 647 648 649
  before_script: []
  script:
    - /app/bin/run .
  artifacts:
    paths: [gl-sast-report.json]

650
qa:internal:
651
  <<: *dedicated-no-docs-no-db-pull-cache-job
652 653 654 655 656 657
  services: []
  script:
    - cd qa/
    - bundle install
    - bundle exec rspec

658
qa:selectors:
659
  <<: *dedicated-no-docs-no-db-pull-cache-job
660 661 662 663
  services: []
  script:
    - cd qa/
    - bundle install
664
    - bundle exec bin/qa Test::Sanity::Selectors
665

666
coverage:
667
  <<: *dedicated-no-docs-no-db-pull-cache-job
668
  stage: post-test
669 670
  script:
    - bundle exec scripts/merge-simplecov
671
  coverage: '/LOC \((\d+\.\d+%)\) covered.$/'
672 673 674 675 676 677 678
  artifacts:
    name: coverage
    expire_in: 31d
    paths:
    - coverage/index.html
    - coverage/assets/

679
lint:javascript:report:
680
  <<: *dedicated-no-docs-no-db-pull-cache-job
681
  stage: post-test
682
  dependencies:
683
    - compile-assets
684
    - setup-test-env
685
  before_script: []
686
  script:
687
    - date
688
    - find app/ spec/ -name '*.js' -exec sed --in-place 's|/\* eslint-disable .*\*/||' {} \; # run report over all files
689
    - date
690
    - yarn run eslint-report || true # ignore exit code
691 692 693 694
  artifacts:
    name: eslint-report
    expire_in: 31d
    paths:
695
      - eslint-report.html
696 697

pages:
698
  <<: *dedicated-no-docs-no-db-pull-cache-job
699 700 701 702
  before_script: []
  stage: pages
  dependencies:
    - coverage
703 704
    - karma
    - gitlab:assets:compile
705
    - lint:javascript:report
706 707 708
  script:
    - mv public/ .public/
    - mkdir public/
709
    - mv coverage/ public/coverage-ruby/ || true
710
    - mv coverage-javascript/ public/coverage-javascript/ || true
711
    - mv eslint-report.html public/ || true
712
    - mv webpack-report/ public/webpack-report/ || true
713 714 715 716
  artifacts:
    paths:
      - public
  only:
717
    - master@gitlab-org/gitlab-ce
718
    - master@gitlab-org/gitlab-ee
719 720 721 722

# Insurance in case a gem needed by one of our releases gets yanked from
# rubygems.org in the future.
cache gems:
723
  <<: *dedicated-no-docs-no-db-pull-cache-job
724 725 726 727 728
  script:
    - bundle package --all --all-platforms
  artifacts:
    paths:
      - vendor/cache
729 730
  only:
    - master@gitlab-org/gitlab-ce
731
    - master@gitlab-org/gitlab-ee
732
    - tags
733 734

gitlab_git_test:
735
  <<: *dedicated-runner
736
  <<: *except-docs-and-qa
737 738
  variables:
    SETUP_DB: "false"
739 740
  before_script: []
  cache: {}
741 742
  script:
    - spec/support/prepare-gitlab-git-test-for-commit --check-for-changes