.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
  variables:
    GIT_STRATEGY: none
269
  retry: 0
270 271 272 273 274 275 276
  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
277
  script:
278
    - ./trigger-build-omnibus
279 280 281 282
  only:
    - //@gitlab-org/gitlab-ce
    - //@gitlab-org/gitlab-ee

283 284 285 286 287 288 289
# 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
290 291
    # 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
292
    url: http://$DOCS_GITLAB_REPO_SUFFIX-$CI_COMMIT_REF_SLUG.$DOCS_REVIEW_APPS_DOMAIN/$DOCS_GITLAB_REPO_SUFFIX
293 294
    on_stop: review-docs-cleanup
  script:
295
    - ./trigger-build-docs deploy
296 297 298 299 300 301 302 303 304

# 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:
305
    - ./trigger-build-docs cleanup
306

307 308 309
# Retrieve knapsack and rspec_flaky reports
retrieve-tests-metadata:
  <<: *tests-metadata-state
310
  <<: *except-docs-and-qa
311
  stage: prepare
312
  cache:
313
    key: tests_metadata
314
    policy: pull
315
  script:
316
    - mkdir -p knapsack/${CI_PROJECT_NAME}/
317 318
    - 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
319 320
    - '[[ -f $KNAPSACK_RSPEC_SUITE_REPORT_PATH ]] || echo "{}" > ${KNAPSACK_RSPEC_SUITE_REPORT_PATH}'
    - '[[ -f $KNAPSACK_SPINACH_SUITE_REPORT_PATH ]] || echo "{}" > ${KNAPSACK_SPINACH_SUITE_REPORT_PATH}'
321
    - mkdir -p rspec_flaky/
322 323
    - 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}'
324

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

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

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

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:
404
      - tmp/tests
405
      - config/secrets.yml
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 469
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
470

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

619
codequality:
620
  <<: *dedicated-no-docs-no-db-pull-cache-job
621 622
  image: docker:latest
  before_script: []
623 624
  services:
    - docker:dind
625 626 627 628 629 630
  variables:
    SETUP_DB: "false"
    DOCKER_DRIVER: overlay2
    CODECLIMATE_FORMAT: json
  cache: {}
  dependencies: []
631
  script:
632
    - apk update && apk add jq
633 634
    - ./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
635
    - jq -c 'map({check_name,description,fingerprint,location})' raw_codeclimate.json > codeclimate.json
636 637
  artifacts:
    paths: [codeclimate.json]
638
    expire_in: 1 week
639

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

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

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

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

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

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

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

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