.gitlab-ci.yml 11 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:
Z.J. van de Weg's avatar
Z.J. van de Weg committed
209
    key: "ruby233-ee_compat_check_repo"
210 211 212 213
    paths:
      - ee_compat_check/repo/
      - vendor/ruby
  artifacts:
214
    name: "${CI_JOB_NAME}_${CI_COMIT_REF_NAME}_${CI_COMMIT_SHA}"
215 216 217 218 219 220 221 222
    when: on_failure
    expire_in: 10d
    paths:
      - ee_compat_check/patches/*.patch

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

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

235 236 237
rake db:seed_fu:
  stage: test
  <<: *use-db
238
  <<: *dedicated-runner
239 240 241 242 243 244 245 246 247 248 249 250 251 252
  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

253 254 255 256 257 258 259 260 261 262
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"
263 264 265 266 267 268 269 270
    WEBPACK_REPORT: "true"
  script:
    - bundle exec rake yarn:install gitlab:assets:compile
  artifacts:
    name: webpack-report
    expire_in: 31d
    paths:
    - webpack-report/
271

Clement Ho's avatar
Clement Ho committed
272
rake karma:
273 274 275
  cache:
    paths:
      - vendor/ruby
276
      - node_modules
277 278
  stage: test
  <<: *use-db
279
  <<: *dedicated-runner
280 281
  variables:
    BABEL_ENV: "coverage"
282
  script:
283
    - bundle exec rake karma
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 349 350 351 352 353 354 355
  variables:
    SETUP_DB: "false"
    USE_BUNDLE_INSTALL: "true"
  script:
    - bundle exec scripts/merge-simplecov
  artifacts:
    name: coverage
    expire_in: 31d
    paths:
    - coverage/index.html
    - coverage/assets/

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

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

# Trigger docs build
# https://gitlab.com/gitlab-com/doc-gitlab-com/blob/master/README.md#deployment-process
trigger_docs:
  stage: post-test
  image: "alpine"
387
  <<: *dedicated-runner
388 389 390 391 392 393 394
  before_script:
    - apk update && apk add curl
  variables:
    GIT_STRATEGY: none
  cache: {}
  artifacts: {}
  script:
395 396
    - "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
397 398
  only:
    - master@gitlab-org/gitlab-ce
399
    - master@gitlab-org/gitlab-ee
400 401 402 403

# Notify slack in the end
notify:slack:
  stage: post-test
404
  <<: *dedicated-runner
405 406 407 408
  variables:
    SETUP_DB: "false"
    USE_BUNDLE_INSTALL: "false"
  script:
409
    - ./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>"
410 411 412 413 414 415 416 417 418 419
  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
420
  <<: *dedicated-runner
421 422
  dependencies:
    - coverage
Clement Ho's avatar
Clement Ho committed
423
    - rake karma
424
    - rake gitlab:assets:compile
425
    - lint:javascript:report
426 427 428
  script:
    - mv public/ .public/
    - mkdir public/
429
    - mv coverage/ public/coverage-ruby/ || true
430
    - mv coverage-javascript/ public/coverage-javascript/ || true
431
    - mv eslint-report.html public/ || true
432
    - mv webpack-report/ public/webpack-report/ || true
433 434 435 436
  artifacts:
    paths:
      - public
  only:
437
    - master@gitlab-org/gitlab-ce
438
    - master@gitlab-org/gitlab-ee
439 440 441 442

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