gitlab-qa 7.24.6 → 7.25.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,1741 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ class GenerateQAJobs
4
+ def initialize(no_of_example_files)
5
+ @no_of_example_files = no_of_example_files
6
+ puts "no_of_example_files: #{@no_of_example_files}"
7
+ end
8
+
9
+ # rubocop:disable Metrics/AbcSize
10
+ # rubocop:disable Metrics/PerceivedComplexity
11
+ # rubocop:disable Metrics/CyclomaticComplexity
12
+ def execute
13
+ jobs = base
14
+
15
+ jobs.concat(sanity_framework)
16
+
17
+ jobs.concat(custom_parallel)
18
+
19
+ jobs.concat(instance) if should_run?('test_instance_all')
20
+
21
+ jobs.concat(relative_url) if should_run?('test_instance_all')
22
+
23
+ jobs.concat(repository_storage) if should_run?('test_instance_all_repository_storage')
24
+
25
+ jobs.concat(omnibus_image)
26
+
27
+ jobs.concat(update) if should_run?('test_instance_all')
28
+
29
+ jobs.concat(omnibus_upgrade)
30
+
31
+ jobs.concat(ee_previous_to_ce_update)
32
+
33
+ jobs.concat(mattermost) if should_run?('test_integration_mattermost')
34
+
35
+ jobs.concat(service_ping_disabled) if should_run?('test_integration_servicepingdisabled')
36
+
37
+ # Disabling geo jobs temporarily due to https://gitlab.com/gitlab-org/quality/team-tasks/-/issues/774
38
+ # base.concat(geo) if should_run?('scenario_test_geo')
39
+
40
+ jobs.concat(ldap_no_tls) if should_run?('test_integration_ldapnotls')
41
+
42
+ jobs.concat(ldap_tls) if should_run?('test_integration_ldaptls')
43
+
44
+ jobs.concat(ldap_no_server) if should_run?('test_integration_ldapnoserver')
45
+
46
+ jobs.concat(instance_saml) if should_run?('test_integration_instancesaml')
47
+
48
+ jobs.concat(group_saml) if should_run?('test_integration_groupsaml')
49
+
50
+ jobs.concat(object_storage) if should_run?('test_instance_all_object_storage')
51
+
52
+ jobs.concat(object_storage_aws) if should_run?('test_instance_all_object_storage')
53
+
54
+ jobs.concat(object_storage_gcs) if should_run?('test_instance_all_object_storage')
55
+
56
+ jobs.concat(object_storage_registry_tls) if should_run?('test_integration_registrytls')
57
+
58
+ jobs.concat(registry) if should_run?('test_integration_registry')
59
+
60
+ jobs.concat(packages) if should_run?('test_instance_all_packages')
61
+
62
+ jobs.concat(actioncable) if should_run?('test_instance_all_actioncable')
63
+
64
+ jobs.concat(elasticsearch) if should_run?('test_integration_elasticsearch')
65
+
66
+ jobs.concat(praefect) if should_run?('test_instance_all')
67
+
68
+ jobs.concat(gitaly_cluster) if should_run?('test_instance_all')
69
+
70
+ jobs.concat(mtls) if should_run?('test_instance_all_mtls')
71
+
72
+ jobs.concat(smtp) if should_run?('test_integration_smtp')
73
+
74
+ jobs.concat(jira) if should_run?('test_instance_all_jira')
75
+
76
+ jobs.concat(integrations) if should_run?('test_instance_all_integrations')
77
+
78
+ jobs.concat(large_setup) if should_run?('test_instance_all_can_use_large_setup')
79
+
80
+ jobs.concat(cloud_activation) if should_run?('test_instance_all_cloud_activation')
81
+
82
+ jobs.concat(registry_with_cdn) if should_run?('test_integration_registrywithcdn')
83
+
84
+ jobs.concat(staging)
85
+
86
+ jobs
87
+ end
88
+ # rubocop:enable Metrics/AbcSize
89
+ # rubocop:enable Metrics/PerceivedComplexity
90
+ # rubocop:enable Metrics/CyclomaticComplexity
91
+
92
+ private
93
+
94
+ def base
95
+ <<~YML
96
+ stages:
97
+ - test
98
+ - report
99
+ - notify
100
+
101
+ default:
102
+ image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-ruby-2.7
103
+ tags:
104
+ - gitlab-org
105
+ cache:
106
+ key:
107
+ files:
108
+ - Gemfile.lock
109
+ - gitlab-qa.gemspec
110
+ paths:
111
+ - vendor/ruby
112
+ before_script:
113
+ - export QA_ARTIFACTS_DIR=$CI_PROJECT_DIR
114
+ - bundle version
115
+ - bundle config path vendor
116
+ - bundle install --jobs=$(nproc) --retry=3 --quiet && bundle check
117
+ - export LANG=C.UTF-8
118
+ - echo $CI_MERGE_REQUEST_IID
119
+ - echo $CI_COMMIT_BRANCH
120
+ - echo $CI_COMMIT_TAG
121
+ - echo $CI_PIPELINE_SOURCE
122
+ - echo $CI_DEFAULT_BRANCH
123
+ - echo $CI_COMMIT_REF_NAME
124
+ - echo $CI_JOB_ID
125
+ - echo $CI_COMMIT_REF_PROTECTED
126
+ - echo $TOP_UPSTREAM_SOURCE_SHA
127
+ - echo $TOP_UPSTREAM_MERGE_REQUEST_IID
128
+ - echo $TOP_UPSTREAM_SOURCE_PROJECT
129
+ - echo $TOP_UPSTREAM_DEFAULT_BRANCH
130
+ - echo $TOP_UPSTREAM_SOURCE_REF
131
+ - echo $TOP_UPSTREAM_SOURCE_JOB
132
+ - echo $GITLAB_QA_OPTIONS
133
+ - echo $QA_TESTS
134
+ - echo $RSPEC_REPORT_OPTS
135
+ - echo $QA_RSPEC_TAGS
136
+ - echo $QA_TEST_RESULTS_ISSUES_PROJECT
137
+ - echo $QA_TESTCASES_REPORTING_PROJECT
138
+ - echo $DEFAULT_RELEASE
139
+ - echo $GITLAB_QA_OPTIONS_COMBINED
140
+ - echo $DISABLE_RELATING_FAILURE_ISSUES
141
+ - echo $QA_FAILURES_MAX_DIFF_RATIO
142
+ - echo $QA_FAILURES_REPORTER_OPTIONS
143
+ - echo $NOTIFY_CHANNEL
144
+ - echo $REPORT_ISSUE_URL
145
+ - echo $QA_TESTCASE_SESSIONS_PROJECT
146
+ - echo $QA_FAILURES_REPORTING_PROJECT
147
+ - echo $ALLURE_JOB_NAME
148
+ - echo $QA_IMAGE
149
+ - echo $RELEASE
150
+ - echo $TEST_LICENSE_MODE
151
+
152
+ workflow:
153
+ rules:
154
+ # For merge requests, create a pipeline.
155
+ - if: $CI_MERGE_REQUEST_IID
156
+ # For the default branch, create a pipeline (this includes on schedules, pushes, merges, etc.).
157
+ - if: $CI_COMMIT_BRANCH == "master"
158
+ # For tags, create a pipeline.
159
+ - if: $CI_COMMIT_TAG
160
+ # For triggers from GitLab MR pipelines (and pipelines from other projects or parent pipeline), create a pipeline
161
+ - if: $CI_PIPELINE_SOURCE == "pipeline" || $CI_PIPELINE_SOURCE == "parent_pipeline"
162
+ # When using Run pipeline button in the GitLab UI, from the project’s CI/CD > Pipelines section, create a pipeline.
163
+ - if: $CI_PIPELINE_SOURCE == "web"
164
+
165
+ variables:
166
+ DOCKER_DRIVER: overlay2
167
+ DOCKER_HOST: tcp://docker:2375
168
+ QA_CAN_TEST_GIT_PROTOCOL_V2: "true"
169
+ QA_CAN_TEST_PRAEFECT: "false"
170
+ QA_GENERATE_ALLURE_REPORT: "true"
171
+ QA_TESTCASES_REPORTING_PROJECT: "gitlab-org/gitlab"
172
+ QA_TEST_RESULTS_ISSUES_PROJECT: "gitlab-org/quality/testcases"
173
+ QA_TESTCASE_SESSIONS_PROJECT: "gitlab-org/quality/testcase-sessions"
174
+ # QA_DEFAULT_BRANCH is the default branch name of the instance under test.
175
+ QA_DEFAULT_BRANCH: "master"
176
+
177
+ .ce-variables:
178
+ variables:
179
+ DEFAULT_RELEASE: "CE"
180
+
181
+ .ee-variables:
182
+ variables:
183
+ DEFAULT_RELEASE: "EE"
184
+
185
+ .test:
186
+ stage: test
187
+ timeout: 1 hour 30 minutes
188
+ services:
189
+ - docker:20.10.5-dind
190
+ tags:
191
+ - gitlab-org
192
+ - docker
193
+ artifacts:
194
+ when: always
195
+ expire_in: 10d
196
+ paths:
197
+ - gitlab-qa-run-*
198
+ reports:
199
+ junit: gitlab-qa-run-*/**/rspec-*.xml
200
+ script:
201
+ - 'echo "QA_ARTIFACTS_DIR: $QA_ARTIFACTS_DIR"'
202
+ - 'echo "CI_PROJECT_DIR: $CI_PROJECT_DIR"'
203
+ - 'echo "Running: bundle exec exe/gitlab-qa ${QA_SCENARIO:=Test::Instance::Image} ${RELEASE:=$DEFAULT_RELEASE} $GITLAB_QA_OPTIONS -- $QA_TESTS $QA_RSPEC_TAGS $RSPEC_REPORT_OPTS"'
204
+ - bundle exec exe/gitlab-qa ${QA_SCENARIO:=Test::Instance::Image} ${RELEASE:=$DEFAULT_RELEASE} $GITLAB_QA_OPTIONS -- $QA_TESTS $QA_RSPEC_TAGS $RSPEC_REPORT_OPTS || test_run_exit_code=$?
205
+ - bundle exec exe/gitlab-qa-report --update-screenshot-path "gitlab-qa-run-*/**/rspec-*.xml"
206
+ - export GITLAB_QA_ACCESS_TOKEN="$GITLAB_QA_PRODUCTION_ACCESS_TOKEN"
207
+ - if [ "$TOP_UPSTREAM_SOURCE_REF" == $TOP_UPSTREAM_DEFAULT_BRANCH ] || [[ "$TOP_UPSTREAM_SOURCE_JOB" == https://ops.gitlab.net* ]]; then exe/gitlab-qa-report --report-results "gitlab-qa-run-*/**/rspec-*.json" --test-case-project "$QA_TESTCASES_REPORTING_PROJECT" --results-issue-project "$QA_TEST_RESULTS_ISSUES_PROJECT" || true; fi
208
+ - exit $test_run_exit_code
209
+
210
+ # For jobs that shouldn't report results in issues, e.g., manually run custom jobs
211
+ .no-issue-report-script:
212
+ script:
213
+ - 'echo "Running: bundle exec exe/gitlab-qa ${QA_SCENARIO:=Test::Instance::Image} ${RELEASE:=$DEFAULT_RELEASE} $GITLAB_QA_OPTIONS -- $QA_TESTS $QA_RSPEC_TAGS $RSPEC_REPORT_OPTS"'
214
+ - bundle exec exe/gitlab-qa ${QA_SCENARIO:=Test::Instance::Image} ${RELEASE:=$DEFAULT_RELEASE} $GITLAB_QA_OPTIONS -- $QA_TESTS $QA_RSPEC_TAGS $RSPEC_REPORT_OPTS
215
+
216
+ # For jobs that provide additional GITLAB_QA_OPTIONS, e.g., jobs that include --omnibus-config
217
+ .combined-gitlab-qa-options-script:
218
+ script:
219
+ - 'echo "Running: bundle exec exe/gitlab-qa ${QA_SCENARIO:=Test::Instance::Image} ${RELEASE:=$DEFAULT_RELEASE} $GITLAB_QA_OPTIONS_COMBINED -- $QA_TESTS $QA_RSPEC_TAGS $RSPEC_REPORT_OPTS"'
220
+
221
+ - bundle exec exe/gitlab-qa ${QA_SCENARIO:=Test::Instance::Image} ${RELEASE:=$DEFAULT_RELEASE} $GITLAB_QA_OPTIONS_COMBINED -- $QA_TESTS $QA_RSPEC_TAGS $RSPEC_REPORT_OPTS || test_run_exit_code=$?
222
+ - bundle exec exe/gitlab-qa-report --update-screenshot-path "gitlab-qa-run-*/**/rspec-*.xml"
223
+ - export GITLAB_QA_ACCESS_TOKEN="$GITLAB_QA_PRODUCTION_ACCESS_TOKEN"
224
+ - if [ "$TOP_UPSTREAM_SOURCE_REF" == $TOP_UPSTREAM_DEFAULT_BRANCH ] || [[ "$TOP_UPSTREAM_SOURCE_JOB" == https://ops.gitlab.net* ]]; then exe/gitlab-qa-report --report-results "gitlab-qa-run-*/**/rspec-*.json" --test-case-project "$QA_TESTCASES_REPORTING_PROJECT" --results-issue-project "$QA_TEST_RESULTS_ISSUES_PROJECT" || true; fi
225
+ - exit $test_run_exit_code
226
+
227
+ # The Test::Omnibus::Update scenarios require the release to be specified twice, which can't be done dynamically using the `variables` parameter
228
+ # So instead we can use this script with two release variables
229
+ .update-scenario-script:
230
+ script:
231
+ - 'echo "Running: bundle exec exe/gitlab-qa Test::Omnibus::Update ${RELEASE:=$DEFAULT_RELEASE} ${RELEASE:=$DEFAULT_RELEASE} $GITLAB_QA_OPTIONS -- $QA_TESTS $QA_RSPEC_TAGS $RSPEC_REPORT_OPTS"'
232
+ - bundle exec exe/gitlab-qa Test::Omnibus::Update ${RELEASE:=$DEFAULT_RELEASE} ${RELEASE:=$DEFAULT_RELEASE} $GITLAB_QA_OPTIONS -- $QA_TESTS $QA_RSPEC_TAGS $RSPEC_REPORT_OPTS || test_run_exit_code=$?
233
+ - bundle exec exe/gitlab-qa-report --update-screenshot-path "gitlab-qa-run-*/**/rspec-*.xml"
234
+ - export GITLAB_QA_ACCESS_TOKEN="$GITLAB_QA_PRODUCTION_ACCESS_TOKEN"
235
+ - if [ "$TOP_UPSTREAM_SOURCE_REF" == $TOP_UPSTREAM_DEFAULT_BRANCH ] || [[ "$TOP_UPSTREAM_SOURCE_JOB" == https://ops.gitlab.net* ]]; then exe/gitlab-qa-report --report-results "gitlab-qa-run-*/**/rspec-*.json" --test-case-project "$QA_TESTCASES_REPORTING_PROJECT" --results-issue-project "$QA_TEST_RESULTS_ISSUES_PROJECT" || true; fi
236
+ - exit $test_run_exit_code
237
+
238
+ .high-capacity:
239
+ tags:
240
+ - docker
241
+ - 7gb
242
+ - triggered-packages
243
+
244
+ .rspec-report-opts:
245
+ variables:
246
+ FILE_SAFE_JOB_NAME: $(echo $CI_JOB_NAME | sed 's/[ /]/_/g')
247
+ RSPEC_REPORT_OPTS: '--format QA::Support::JsonFormatter --out \"tmp/rspec-${CI_JOB_ID}.json\" --format RspecJunitFormatter --out \"tmp/rspec-${CI_JOB_ID}.xml\" --format html --out \"tmp/rspec-${FILE_SAFE_JOB_NAME}.htm\" --color --format documentation'
248
+
249
+ .quarantine:
250
+ allow_failure: true
251
+ variables:
252
+ QA_RSPEC_TAGS: "--tag quarantine"
253
+
254
+ generate_test_session:
255
+ stage: report
256
+ rules:
257
+ - if: '$TOP_UPSTREAM_SOURCE_JOB !=null && $TOP_UPSTREAM_SOURCE_JOB !="" && $TOP_UPSTREAM_SOURCE_REF == $TOP_UPSTREAM_DEFAULT_BRANCH'
258
+ when: always
259
+ - if: '$TOP_UPSTREAM_SOURCE_JOB =~ /\\Ahttps:\\/\\/ops.gitlab.net\\//'
260
+ when: always
261
+ artifacts:
262
+ when: always
263
+ expire_in: 10d
264
+ paths:
265
+ - REPORT_ISSUE_URL
266
+ script:
267
+ - export GITLAB_QA_ACCESS_TOKEN="$GITLAB_QA_PRODUCTION_ACCESS_TOKEN"
268
+ - bundle exec exe/gitlab-qa-report --generate-test-session "gitlab-qa-run-*/**/rspec-*.json" --project "$QA_TESTCASE_SESSIONS_PROJECT"
269
+
270
+ relate_test_failures:
271
+ stage: report
272
+ rules:
273
+ - if: '$DISABLE_RELATING_FAILURE_ISSUES != null && $DISABLE_RELATING_FAILURE_ISSUES != ""'
274
+ when: never
275
+ - if: '$TOP_UPSTREAM_SOURCE_JOB !=null && $TOP_UPSTREAM_SOURCE_JOB !="" && $TOP_UPSTREAM_SOURCE_REF == $TOP_UPSTREAM_DEFAULT_BRANCH'
276
+ when: always
277
+ - if: '$TOP_UPSTREAM_SOURCE_JOB =~ /\\Ahttps:\\/\\/ops.gitlab.net\\//'
278
+ when: always
279
+ variables:
280
+ QA_FAILURES_REPORTING_PROJECT: "gitlab-org/gitlab"
281
+ QA_FAILURES_MAX_DIFF_RATIO: "0.15"
282
+ # The --dry-run can be set to modify the behavior of `exe/gitlab-qa-report --relate-failure-issue` without releasing a new gem version.
283
+ QA_FAILURES_REPORTER_OPTIONS: ""
284
+ script:
285
+ - export GITLAB_QA_ACCESS_TOKEN="$GITLAB_QA_PRODUCTION_ACCESS_TOKEN"
286
+ - bundle exec exe/gitlab-qa-report --relate-failure-issue "gitlab-qa-run-*/**/rspec-*.json" --project "$QA_FAILURES_REPORTING_PROJECT" --max-diff-ratio "$QA_FAILURES_MAX_DIFF_RATIO" $QA_FAILURES_REPORTER_OPTIONS
287
+
288
+ .notify_upstream_commit:
289
+ stage: notify
290
+ image: ruby:3.0-alpine
291
+ before_script:
292
+ - gem install gitlab --no-document
293
+
294
+ notify_upstream_commit:success:
295
+ extends: .notify_upstream_commit
296
+ script:
297
+ - bin/notify_upstream_commit success
298
+ rules:
299
+ - if: '$TOP_UPSTREAM_SOURCE_PROJECT != null && $TOP_UPSTREAM_SOURCE_PROJECT != "" && $TOP_UPSTREAM_SOURCE_SHA != null && $TOP_UPSTREAM_SOURCE_SHA != ""'
300
+ when: on_success
301
+
302
+ notify_upstream_commit:failure:
303
+ extends: .notify_upstream_commit
304
+ script:
305
+ - bin/notify_upstream_commit failure
306
+ rules:
307
+ - if: '$TOP_UPSTREAM_SOURCE_PROJECT != null && $TOP_UPSTREAM_SOURCE_PROJECT != "" && $TOP_UPSTREAM_SOURCE_SHA != null && $TOP_UPSTREAM_SOURCE_SHA != ""'
308
+ when: on_failure
309
+
310
+ .notify_slack:
311
+ image: alpine
312
+ stage: notify
313
+ dependencies: ['generate_test_session']
314
+ cache: {}
315
+ before_script:
316
+ - apk update && apk add git curl bash
317
+
318
+ notify_slack:
319
+ extends:
320
+ - .notify_slack
321
+ rules:
322
+ - if: '$TOP_UPSTREAM_SOURCE_JOB !=null && $TOP_UPSTREAM_SOURCE_JOB !="" && $NOTIFY_CHANNEL !=null && $NOTIFY_CHANNEL !=""'
323
+ when: on_failure
324
+ - if: '$TOP_UPSTREAM_SOURCE_JOB !=null && $TOP_UPSTREAM_SOURCE_JOB !="" && $TOP_UPSTREAM_SOURCE_REF == $TOP_UPSTREAM_DEFAULT_BRANCH'
325
+ when: on_failure
326
+ script:
327
+ - export RELEASE=${TOP_UPSTREAM_SOURCE_REF:-$RELEASE}
328
+ - echo "NOTIFY_CHANNEL is ${NOTIFY_CHANNEL:=qa-$TOP_UPSTREAM_SOURCE_REF}"
329
+ - echo "RELEASE is ${RELEASE}"
330
+ - echo "CI_PIPELINE_URL is $CI_PIPELINE_URL"
331
+ - echo "TOP_UPSTREAM_SOURCE_JOB is $TOP_UPSTREAM_SOURCE_JOB"
332
+ - 'bin/slack $NOTIFY_CHANNEL "☠️ QA against $RELEASE failed! ☠️ See the test session report: $(cat REPORT_ISSUE_URL), and pipeline: $CI_PIPELINE_URL (triggered from $TOP_UPSTREAM_SOURCE_JOB)" ci_failing'
333
+
334
+ generate-allure-report:
335
+ extends: .generate-allure-report-base
336
+ stage: report
337
+ variables:
338
+ ALLURE_RESULTS_GLOB: gitlab-qa-run-*/**/allure-results/*
339
+ cache:
340
+ policy: pull
341
+ before_script:
342
+ # Override allure variables for upstream triggers
343
+ # Override default before script and don't push cache
344
+ - export STORAGE_CREDENTIALS=$QA_ALLURE_REPORT_GCS_CREDENTIALS
345
+ - export GITLAB_AUTH_TOKEN=$GITLAB_QA_MR_ALLURE_REPORT_TOKEN
346
+ - export ALLURE_PROJECT_PATH=$TOP_UPSTREAM_SOURCE_PROJECT
347
+ - export ALLURE_MERGE_REQUEST_IID=$TOP_UPSTREAM_MERGE_REQUEST_IID
348
+ - export ALLURE_COMMIT_SHA=$TOP_UPSTREAM_SOURCE_SHA
349
+ - export ALLURE_JOB_NAME="${ALLURE_JOB_NAME:-package-and-qa}"
350
+ rules:
351
+ # Don't run report generation on release pipelines
352
+ - if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab-qa" && $RELEASE == null'
353
+ changes: ["lib/**/version.rb"]
354
+ when: never
355
+ - if: '$CI_COMMIT_TAG'
356
+ when: never
357
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_PIPELINE_SOURCE == "parent_pipeline" || ($CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH)'
358
+ variables:
359
+ ALLURE_JOB_NAME: gitlab-qa
360
+ when: always
361
+ - if: '$TOP_UPSTREAM_SOURCE_PROJECT != null && $TOP_UPSTREAM_SOURCE_PROJECT != "" && $TOP_UPSTREAM_SOURCE_SHA != null && $TOP_UPSTREAM_SOURCE_SHA != ""'
362
+ when: always
363
+
364
+ generate-knapsack-report:
365
+ extends: .generate-knapsack-report-base
366
+ image:
367
+ name: ${QA_IMAGE}
368
+ stage: report
369
+
370
+ include:
371
+ - local: .gitlab/ci/rules.gitlab-ci.yml
372
+ - project: 'gitlab-org/quality/pipeline-common'
373
+ file:
374
+ - '/ci/allure-report.yml'
375
+ - '/ci/knapsack-report.yml'
376
+
377
+ YML
378
+ end
379
+
380
+ def sanity_framework
381
+ <<~YML
382
+ # Do not generate allure report since it always adds a failed test to the report. The job runs a test where 1 example would always fail and assert exit code via custom script bin/expect_exit_code_and_text
383
+ ce:sanity-framework:
384
+ variables:
385
+ QA_GENERATE_ALLURE_REPORT: "false"
386
+ QA_EXPORT_TEST_METRICS: "false"
387
+ script:
388
+ - ./bin/expect_exit_code_and_text "bundle exec exe/gitlab-qa Test::Instance::Image ${RELEASE:=CE} -- --tag framework" 1 "2 examples, 1 failure"
389
+ extends:
390
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
391
+ - .test
392
+ - .high-capacity
393
+ - .ce-variables
394
+
395
+ ee:sanity-framework:
396
+ variables:
397
+ QA_GENERATE_ALLURE_REPORT: "false"
398
+ QA_EXPORT_TEST_METRICS: "false"
399
+ script:
400
+ - ./bin/expect_exit_code_and_text "bundle exec exe/gitlab-qa Test::Instance::Image ${RELEASE:=EE} -- --tag framework" 1 "2 examples, 1 failure"
401
+ extends:
402
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
403
+ - .test
404
+ - .high-capacity
405
+ - .ee-variables
406
+
407
+ YML
408
+ end
409
+
410
+ def custom_parallel
411
+ <<~YML
412
+ ce:custom-parallel:
413
+ extends:
414
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
415
+ - .test
416
+ - .high-capacity
417
+ - .rspec-report-opts
418
+ - .no-issue-report-script
419
+ - .ce-variables
420
+ allow_failure: true
421
+ parallel: 10
422
+
423
+ ee:custom-parallel:
424
+ extends:
425
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
426
+ - .test
427
+ - .high-capacity
428
+ - .ee-variables
429
+ - .rspec-report-opts
430
+ - .no-issue-report-script
431
+ allow_failure: true
432
+ parallel: 10
433
+
434
+ YML
435
+ end
436
+
437
+ def instance
438
+ <<~YML
439
+ ce:instance-parallel:
440
+ extends:
441
+ - .rules:ce-never-when-qa-tests-specified
442
+ - .test
443
+ - .high-capacity
444
+ - .ce-variables
445
+ - .rspec-report-opts
446
+ parallel: 5
447
+
448
+ ee:instance-parallel:
449
+ extends:
450
+ - .rules:ee-never-when-qa-tests-specified
451
+ - .test
452
+ - .high-capacity
453
+ - .ee-variables
454
+ - .rspec-report-opts
455
+ parallel: 5
456
+
457
+ ce:instance:
458
+ extends:
459
+ - .rules:ce-never-when-qa-tests-not-specified
460
+ - .test
461
+ - .high-capacity
462
+ - .ce-variables
463
+ - .rspec-report-opts
464
+
465
+ ce:instance-quarantine:
466
+ extends:
467
+ - .rules:ce-qa
468
+ - .test
469
+ - .high-capacity
470
+ - .ce-variables
471
+ - .quarantine
472
+ - .rspec-report-opts
473
+ variables:
474
+ QA_RSPEC_TAGS: "--tag quarantine --tag ~orchestrated"
475
+
476
+ ee:instance:
477
+ extends:
478
+ - .rules:ee-never-when-qa-tests-not-specified
479
+ - .test
480
+ - .high-capacity
481
+ - .ee-variables
482
+ - .rspec-report-opts
483
+
484
+ ee:instance-quarantine:
485
+ extends:
486
+ - .rules:ee-qa
487
+ - .test
488
+ - .high-capacity
489
+ - .ee-variables
490
+ - .quarantine
491
+ - .rspec-report-opts
492
+ variables:
493
+ QA_RSPEC_TAGS: "--tag quarantine --tag ~orchestrated"
494
+
495
+ YML
496
+ end
497
+
498
+ def relative_url
499
+ <<~YML
500
+ ce:relative_url-parallel:
501
+ extends:
502
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-specified
503
+ - .test
504
+ - .high-capacity
505
+ - .ce-variables
506
+ - .rspec-report-opts
507
+ parallel: 5
508
+ variables:
509
+ QA_SCENARIO: "Test::Instance::RelativeUrl"
510
+
511
+ ee:relative_url-parallel:
512
+ extends:
513
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-specified
514
+ - .test
515
+ - .high-capacity
516
+ - .ee-variables
517
+ - .rspec-report-opts
518
+ parallel: 5
519
+ variables:
520
+ QA_SCENARIO: "Test::Instance::RelativeUrl"
521
+
522
+ ce:relative_url:
523
+ extends:
524
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-not-specified
525
+ - .test
526
+ - .high-capacity
527
+ - .ce-variables
528
+ - .rspec-report-opts
529
+ variables:
530
+ QA_SCENARIO: "Test::Instance::RelativeUrl"
531
+
532
+ ee:relative_url:
533
+ extends:
534
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-not-specified
535
+ - .test
536
+ - .high-capacity
537
+ - .ee-variables
538
+ - .rspec-report-opts
539
+ variables:
540
+ QA_SCENARIO: "Test::Instance::RelativeUrl"
541
+
542
+ ce:relative_url-quarantine:
543
+ extends:
544
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
545
+ - .test
546
+ - .high-capacity
547
+ - .ce-variables
548
+ - .quarantine
549
+ - .rspec-report-opts
550
+ variables:
551
+ QA_SCENARIO: "Test::Instance::RelativeUrl"
552
+ QA_RSPEC_TAGS: "--tag quarantine --tag ~orchestrated"
553
+
554
+ ee:relative_url-quarantine:
555
+ extends:
556
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
557
+ - .test
558
+ - .high-capacity
559
+ - .ee-variables
560
+ - .quarantine
561
+ - .rspec-report-opts
562
+ variables:
563
+ QA_SCENARIO: "Test::Instance::RelativeUrl"
564
+ QA_RSPEC_TAGS: "--tag quarantine --tag ~orchestrated"
565
+
566
+ YML
567
+ end
568
+
569
+ def repository_storage
570
+ <<~YML
571
+ ce:repository_storage:
572
+ extends:
573
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
574
+ - .test
575
+ - .high-capacity
576
+ - .ce-variables
577
+ - .rspec-report-opts
578
+ variables:
579
+ QA_SCENARIO: "Test::Instance::RepositoryStorage"
580
+
581
+ ce:repository_storage-quarantine:
582
+ extends:
583
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
584
+ - .test
585
+ - .high-capacity
586
+ - .ce-variables
587
+ - .quarantine
588
+ - .rspec-report-opts
589
+ variables:
590
+ QA_SCENARIO: "Test::Instance::RepositoryStorage"
591
+
592
+ ee:repository_storage:
593
+ extends:
594
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
595
+ - .test
596
+ - .high-capacity
597
+ - .ee-variables
598
+ - .rspec-report-opts
599
+ variables:
600
+ QA_SCENARIO: "Test::Instance::RepositoryStorage"
601
+
602
+ ee:repository_storage-quarantine:
603
+ extends:
604
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
605
+ - .test
606
+ - .high-capacity
607
+ - .ee-variables
608
+ - .quarantine
609
+ - .rspec-report-opts
610
+ variables:
611
+ QA_SCENARIO: "Test::Instance::RepositoryStorage"
612
+ YML
613
+ end
614
+
615
+ # The Test::Omnibus::Image scenarios don't run the E2E tests so they don't need to report test results
616
+ def omnibus_image
617
+ <<~YML
618
+ ce:image:
619
+ script:
620
+ - bundle exec exe/gitlab-qa Test::Omnibus::Image ${RELEASE:=CE}
621
+ extends:
622
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
623
+ - .test
624
+ - .ce-variables
625
+
626
+ ee:image:
627
+ script:
628
+ - bundle exec exe/gitlab-qa Test::Omnibus::Image ${RELEASE:=EE}
629
+ extends:
630
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
631
+ - .test
632
+ - .ee-variables
633
+
634
+ YML
635
+ end
636
+
637
+ def update
638
+ <<~YML
639
+ ce:update-parallel:
640
+ extends:
641
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-specified
642
+ - .test
643
+ - .high-capacity
644
+ - .ce-variables
645
+ - .rspec-report-opts
646
+ - .update-scenario-script
647
+ parallel: 5
648
+
649
+ ce:update:
650
+ extends:
651
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-not-specified
652
+ - .test
653
+ - .high-capacity
654
+ - .ce-variables
655
+ - .rspec-report-opts
656
+ - .update-scenario-script
657
+
658
+ ce:update-quarantine:
659
+ extends:
660
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
661
+ - .test
662
+ - .high-capacity
663
+ - .ce-variables
664
+ - .quarantine
665
+ - .rspec-report-opts
666
+ - .update-scenario-script
667
+ variables:
668
+ QA_RSPEC_TAGS: "--tag quarantine --tag ~orchestrated"
669
+
670
+ ee:update-parallel:
671
+ extends:
672
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-specified
673
+ - .test
674
+ - .high-capacity
675
+ - .ee-variables
676
+ - .rspec-report-opts
677
+ - .update-scenario-script
678
+ parallel: 10
679
+
680
+ ee:update:
681
+ extends:
682
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-not-specified
683
+ - .test
684
+ - .high-capacity
685
+ - .ee-variables
686
+ - .rspec-report-opts
687
+ - .update-scenario-script
688
+
689
+ ee:update-quarantine:
690
+ extends:
691
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
692
+ - .test
693
+ - .high-capacity
694
+ - .ee-variables
695
+ - .quarantine
696
+ - .rspec-report-opts
697
+ variables:
698
+ QA_RSPEC_TAGS: "--tag quarantine --tag ~orchestrated"
699
+ YML
700
+ end
701
+
702
+ # The Test::Omnibus::Upgrade scenario isn't run on master (because it always uses the latest CE/EE image) so we don't report the test results in issues
703
+ def omnibus_upgrade
704
+ <<~YML
705
+ ce:upgrade-parallel:
706
+ script:
707
+ - bundle exec exe/gitlab-qa Test::Omnibus::Upgrade CE -- $RSPEC_REPORT_OPTS
708
+ extends:
709
+ - .rules:only-qa-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-specified
710
+ - .test
711
+ - .high-capacity
712
+ - .rspec-report-opts
713
+ parallel: 5
714
+
715
+ ce:upgrade:
716
+ script:
717
+ - bundle exec exe/gitlab-qa Test::Omnibus::Upgrade CE -- $RSPEC_REPORT_OPTS
718
+ extends:
719
+ - .rules:only-qa-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-not-specified
720
+ - .test
721
+ - .high-capacity
722
+ - .rspec-report-opts
723
+
724
+ ce:upgrade-quarantine:
725
+ script:
726
+ - bundle exec exe/gitlab-qa Test::Omnibus::Upgrade CE -- --tag quarantine --tag ~orchestrated $RSPEC_REPORT_OPTS
727
+ extends:
728
+ - .rules:only-qa-never-when-triggered-by-feature-flag-definition-change
729
+ - .test
730
+ - .high-capacity
731
+ - .quarantine
732
+ - .rspec-report-opts
733
+
734
+ YML
735
+ end
736
+
737
+ def ee_previous_to_ce_update
738
+ <<~YML
739
+ ee-previous-to-ce:update:
740
+ script:
741
+ - bundle exec exe/gitlab-qa Test::Omnibus::Update EE CE -- $RSPEC_REPORT_OPTS
742
+ extends:
743
+ - .rules:only-qa-never-when-triggered-by-feature-flag-definition-change
744
+ - .test
745
+ - .high-capacity
746
+ - .rspec-report-opts
747
+
748
+ ee-previous-to-ce:update-quarantine:
749
+ script:
750
+ - bundle exec exe/gitlab-qa Test::Omnibus::Update EE CE -- --tag quarantine --tag ~orchestrated $RSPEC_REPORT_OPTS
751
+ extends:
752
+ - .rules:only-qa-never-when-triggered-by-feature-flag-definition-change
753
+ - .test
754
+ - .high-capacity
755
+ - .quarantine
756
+ - .rspec-report-opts
757
+
758
+ YML
759
+ end
760
+
761
+ def mattermost
762
+ <<~YML
763
+ ce:mattermost:
764
+ extends:
765
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
766
+ - .test
767
+ - .high-capacity
768
+ - .ce-variables
769
+ - .rspec-report-opts
770
+ variables:
771
+ QA_SCENARIO: "Test::Integration::Mattermost"
772
+
773
+ ce:mattermost-quarantine:
774
+ extends:
775
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
776
+ - .test
777
+ - .high-capacity
778
+ - .ce-variables
779
+ - .quarantine
780
+ - .rspec-report-opts
781
+ variables:
782
+ QA_SCENARIO: "Test::Integration::Mattermost"
783
+
784
+ ee:mattermost:
785
+ extends:
786
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
787
+ - .test
788
+ - .high-capacity
789
+ - .ee-variables
790
+ - .rspec-report-opts
791
+ variables:
792
+ QA_SCENARIO: "Test::Integration::Mattermost"
793
+
794
+ ee:mattermost-quarantine:
795
+ extends:
796
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
797
+ - .test
798
+ - .high-capacity
799
+ - .ee-variables
800
+ - .quarantine
801
+ - .rspec-report-opts
802
+ variables:
803
+ QA_SCENARIO: "Test::Integration::Mattermost"
804
+
805
+ YML
806
+ end
807
+
808
+ def service_ping_disabled
809
+ <<~YML
810
+ ce:service_ping_disabled:
811
+ extends:
812
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
813
+ - .test
814
+ - .high-capacity
815
+ - .ce-variables
816
+ - .rspec-report-opts
817
+ variables:
818
+ QA_SCENARIO: "Test::Integration::ServicePingDisabled"
819
+
820
+ ee:service_ping_disabled:
821
+ extends:
822
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
823
+ - .test
824
+ - .high-capacity
825
+ - .ee-variables
826
+ - .rspec-report-opts
827
+ variables:
828
+ QA_SCENARIO: "Test::Integration::ServicePingDisabled"
829
+
830
+ YML
831
+ end
832
+
833
+ def geo
834
+ <<~YML
835
+ ee:geo:
836
+ extends:
837
+ - .test
838
+ - .ee-variables
839
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
840
+ - .rspec-report-opts
841
+ variables:
842
+ QA_SCENARIO: "Test::Integration::Geo"
843
+
844
+ ee:geo-quarantine:
845
+ extends:
846
+ - .test
847
+ - .ee-variables
848
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
849
+ - .quarantine
850
+ - .rspec-report-opts
851
+ variables:
852
+ QA_SCENARIO: "Test::Integration::Geo"
853
+
854
+ YML
855
+ end
856
+
857
+ def ldap_no_tls
858
+ <<~YML
859
+ ce:ldap_no_tls:
860
+ extends:
861
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
862
+ - .test
863
+ - .high-capacity
864
+ - .ce-variables
865
+ - .rspec-report-opts
866
+ variables:
867
+ QA_SCENARIO: "Test::Integration::LDAPNoTLS"
868
+
869
+ ce:ldap_no_tls-quarantine:
870
+ extends:
871
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
872
+ - .test
873
+ - .high-capacity
874
+ - .ce-variables
875
+ - .quarantine
876
+ - .rspec-report-opts
877
+ variables:
878
+ QA_SCENARIO: "Test::Integration::LDAPNoTLS"
879
+
880
+ ee:ldap_no_tls:
881
+ extends:
882
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
883
+ - .test
884
+ - .high-capacity
885
+ - .ee-variables
886
+ - .rspec-report-opts
887
+ variables:
888
+ QA_SCENARIO: "Test::Integration::LDAPNoTLS"
889
+
890
+ ee:ldap_no_tls-quarantine:
891
+ extends:
892
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
893
+ - .test
894
+ - .high-capacity
895
+ - .ee-variables
896
+ - .quarantine
897
+ - .rspec-report-opts
898
+ variables:
899
+ QA_SCENARIO: "Test::Integration::LDAPNoTLS"
900
+
901
+ YML
902
+ end
903
+
904
+ def ldap_tls
905
+ <<~YML
906
+ ce:ldap_tls:
907
+ extends:
908
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
909
+ - .test
910
+ - .high-capacity
911
+ - .ce-variables
912
+ - .rspec-report-opts
913
+ variables:
914
+ QA_SCENARIO: "Test::Integration::LDAPTLS"
915
+
916
+ ce:ldap_tls-quarantine:
917
+ extends:
918
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
919
+ - .test
920
+ - .high-capacity
921
+ - .ce-variables
922
+ - .quarantine
923
+ - .rspec-report-opts
924
+ variables:
925
+ QA_SCENARIO: "Test::Integration::LDAPTLS"
926
+
927
+ ee:ldap_tls:
928
+ extends:
929
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
930
+ - .test
931
+ - .high-capacity
932
+ - .ee-variables
933
+ - .rspec-report-opts
934
+ variables:
935
+ QA_SCENARIO: "Test::Integration::LDAPTLS"
936
+
937
+ ee:ldap_tls-quarantine:
938
+ extends:
939
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
940
+ - .test
941
+ - .high-capacity
942
+ - .ee-variables
943
+ - .quarantine
944
+ - .rspec-report-opts
945
+ variables:
946
+ QA_SCENARIO: "Test::Integration::LDAPTLS"
947
+
948
+ YML
949
+ end
950
+
951
+ def ldap_no_server
952
+ <<~YML
953
+ ee:ldap_no_server:
954
+ extends:
955
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
956
+ - .test
957
+ - .high-capacity
958
+ - .ee-variables
959
+ - .rspec-report-opts
960
+ variables:
961
+ QA_SCENARIO: "Test::Integration::LDAPNoServer"
962
+
963
+ ee:ldap_no_server-quarantine:
964
+ extends:
965
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
966
+ - .test
967
+ - .high-capacity
968
+ - .ee-variables
969
+ - .quarantine
970
+ - .rspec-report-opts
971
+ variables:
972
+ QA_SCENARIO: "Test::Integration::LDAPNoServer"
973
+
974
+ YML
975
+ end
976
+
977
+ def instance_saml
978
+ <<~YML
979
+ ce:instance_saml:
980
+ extends:
981
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
982
+ - .test
983
+ - .high-capacity
984
+ - .ce-variables
985
+ - .rspec-report-opts
986
+ variables:
987
+ QA_SCENARIO: "Test::Integration::InstanceSAML"
988
+
989
+ ce:instance_saml-quarantine:
990
+ extends:
991
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
992
+ - .test
993
+ - .high-capacity
994
+ - .ce-variables
995
+ - .quarantine
996
+ - .rspec-report-opts
997
+ variables:
998
+ QA_SCENARIO: "Test::Integration::InstanceSAML"
999
+
1000
+ ee:instance_saml:
1001
+ extends:
1002
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1003
+ - .test
1004
+ - .high-capacity
1005
+ - .ee-variables
1006
+ - .rspec-report-opts
1007
+ variables:
1008
+ QA_SCENARIO: "Test::Integration::InstanceSAML"
1009
+
1010
+ ee:instance_saml-quarantine:
1011
+ extends:
1012
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1013
+ - .test
1014
+ - .high-capacity
1015
+ - .ee-variables
1016
+ - .quarantine
1017
+ - .rspec-report-opts
1018
+ variables:
1019
+ QA_SCENARIO: "Test::Integration::InstanceSAML"
1020
+
1021
+ YML
1022
+ end
1023
+
1024
+ def group_saml
1025
+ <<~YML
1026
+ ee:group_saml:
1027
+ extends:
1028
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1029
+ - .test
1030
+ - .high-capacity
1031
+ - .ee-variables
1032
+ - .rspec-report-opts
1033
+ variables:
1034
+ QA_SCENARIO: "Test::Integration::GroupSAML"
1035
+
1036
+ ee:group_saml-quarantine:
1037
+ extends:
1038
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1039
+ - .test
1040
+ - .high-capacity
1041
+ - .ee-variables
1042
+ - .quarantine
1043
+ - .rspec-report-opts
1044
+ variables:
1045
+ QA_SCENARIO: "Test::Integration::GroupSAML"
1046
+
1047
+ YML
1048
+ end
1049
+
1050
+ def object_storage
1051
+ <<~YML
1052
+ ce:object_storage:
1053
+ extends:
1054
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1055
+ - .test
1056
+ - .high-capacity
1057
+ - .ce-variables
1058
+ - .rspec-report-opts
1059
+ - .combined-gitlab-qa-options-script
1060
+ parallel: 2
1061
+ variables:
1062
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config object_storage"
1063
+
1064
+ ce:object_storage-quarantine:
1065
+ extends:
1066
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1067
+ - .test
1068
+ - .high-capacity
1069
+ - .ce-variables
1070
+ - .quarantine
1071
+ - .rspec-report-opts
1072
+ - .combined-gitlab-qa-options-script
1073
+ variables:
1074
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config object_storage"
1075
+
1076
+ ee:object_storage:
1077
+ extends:
1078
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1079
+ - .test
1080
+ - .high-capacity
1081
+ - .ee-variables
1082
+ - .rspec-report-opts
1083
+ - .combined-gitlab-qa-options-script
1084
+ parallel: 2
1085
+ variables:
1086
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config object_storage"
1087
+ QA_RSPEC_TAGS: "--tag object_storage"
1088
+
1089
+ ee:object_storage-quarantine:
1090
+ extends:
1091
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1092
+ - .test
1093
+ - .high-capacity
1094
+ - .ee-variables
1095
+ - .quarantine
1096
+ - .rspec-report-opts
1097
+ - .combined-gitlab-qa-options-script
1098
+ variables:
1099
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config object_storage"
1100
+ QA_RSPEC_TAGS: "--tag quarantine --tag object_storage"
1101
+
1102
+ YML
1103
+ end
1104
+
1105
+ def object_storage_aws
1106
+ <<~YML
1107
+ ee:object_storage_aws:
1108
+ extends:
1109
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1110
+ - .test
1111
+ - .high-capacity
1112
+ - .ee-variables
1113
+ - .rspec-report-opts
1114
+ - .combined-gitlab-qa-options-script
1115
+ parallel: 2
1116
+ variables:
1117
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config object_storage_aws"
1118
+ QA_RSPEC_TAGS: "--tag object_storage"
1119
+
1120
+ ee:object_storage_aws-quarantine:
1121
+ extends:
1122
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1123
+ - .test
1124
+ - .high-capacity
1125
+ - .ee-variables
1126
+ - .quarantine
1127
+ - .rspec-report-opts
1128
+ - .combined-gitlab-qa-options-script
1129
+ variables:
1130
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config object_storage_aws"
1131
+ QA_RSPEC_TAGS: "--tag quarantine --tag object_storage"
1132
+
1133
+ YML
1134
+ end
1135
+
1136
+ def object_storage_gcs
1137
+ <<~YML
1138
+ ee:object_storage_gcs:
1139
+ extends:
1140
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1141
+ - .test
1142
+ - .high-capacity
1143
+ - .ee-variables
1144
+ - .rspec-report-opts
1145
+ parallel: 2
1146
+ variables:
1147
+ GITLAB_QA_OPTS: "--omnibus-config object_storage_gcs"
1148
+ QA_RSPEC_TAGS: "--tag object_storage"
1149
+
1150
+ ee:object_storage_gcs-quarantine:
1151
+ extends:
1152
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1153
+ - .test
1154
+ - .high-capacity
1155
+ - .ee-variables
1156
+ - .quarantine
1157
+ - .rspec-report-opts
1158
+ variables:
1159
+ GITLAB_QA_OPTS: "--omnibus-config object_storage_gcs"
1160
+ QA_RSPEC_TAGS: "--tag quarantine --tag object_storage"
1161
+
1162
+ YML
1163
+ end
1164
+
1165
+ def object_storage_registry_tls
1166
+ <<~YML
1167
+ ce:object_storage_registry_tls:
1168
+ extends:
1169
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1170
+ - .test
1171
+ - .high-capacity
1172
+ - .ce-variables
1173
+ - .rspec-report-opts
1174
+ variables:
1175
+ QA_SCENARIO: "Test::Integration::RegistryTLS --omnibus-config registry_object_storage"
1176
+
1177
+ ce:object_storage_registry_tls-quarantine:
1178
+ extends:
1179
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1180
+ - .test
1181
+ - .high-capacity
1182
+ - .ce-variables
1183
+ - .quarantine
1184
+ - .rspec-report-opts
1185
+ variables:
1186
+ QA_SCENARIO: "Test::Integration::RegistryTLS --omnibus-config registry_object_storage"
1187
+
1188
+ ee:object_storage_registry_tls:
1189
+ extends:
1190
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1191
+ - .test
1192
+ - .ee-variables
1193
+ - .high-capacity
1194
+ - .rspec-report-opts
1195
+ variables:
1196
+ QA_SCENARIO: "Test::Integration::RegistryTLS --omnibus-config registry_object_storage"
1197
+
1198
+ ee:object_storage_registry_tls-quarantine:
1199
+ extends:
1200
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1201
+ - .test
1202
+ - .high-capacity
1203
+ - .ee-variables
1204
+ - .quarantine
1205
+ - .rspec-report-opts
1206
+ variables:
1207
+ QA_SCENARIO: "Test::Integration::RegistryTLS --omnibus-config registry_object_storage"
1208
+
1209
+ YML
1210
+ end
1211
+
1212
+ def registry
1213
+ <<~YML
1214
+ ce:registry:
1215
+ extends:
1216
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1217
+ - .test
1218
+ - .high-capacity
1219
+ - .ce-variables
1220
+ - .rspec-report-opts
1221
+ variables:
1222
+ QA_SCENARIO: "Test::Integration::Registry"
1223
+
1224
+ ce:registry-quarantine:
1225
+ extends:
1226
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1227
+ - .test
1228
+ - .high-capacity
1229
+ - .ce-variables
1230
+ - .quarantine
1231
+ - .rspec-report-opts
1232
+ variables:
1233
+ QA_SCENARIO: "Test::Integration::Registry"
1234
+
1235
+ ee:registry:
1236
+ extends:
1237
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1238
+ - .test
1239
+ - .high-capacity
1240
+ - .ee-variables
1241
+ - .rspec-report-opts
1242
+ variables:
1243
+ QA_SCENARIO: "Test::Integration::Registry"
1244
+
1245
+ ee:registry-quarantine:
1246
+ extends:
1247
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1248
+ - .test
1249
+ - .high-capacity
1250
+ - .ee-variables
1251
+ - .quarantine
1252
+ - .rspec-report-opts
1253
+ variables:
1254
+ QA_SCENARIO: "Test::Integration::Registry"
1255
+
1256
+ YML
1257
+ end
1258
+
1259
+ def packages
1260
+ <<~YML
1261
+ ee:packages-parallel:
1262
+ extends:
1263
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1264
+ - .test
1265
+ - .high-capacity
1266
+ - .ee-variables
1267
+ - .rspec-report-opts
1268
+ - .combined-gitlab-qa-options-script
1269
+ parallel: 2
1270
+ variables:
1271
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config packages"
1272
+ QA_RSPEC_TAGS: "--tag packages"
1273
+
1274
+ ee:packages-quarantine:
1275
+ extends:
1276
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1277
+ - .test
1278
+ - .high-capacity
1279
+ - .ee-variables
1280
+ - .quarantine
1281
+ - .rspec-report-opts
1282
+ - .combined-gitlab-qa-options-script
1283
+ variables:
1284
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --omnibus-config packages"
1285
+ QA_RSPEC_TAGS: "--tag quarantine --tag packages"
1286
+
1287
+ YML
1288
+ end
1289
+
1290
+ def actioncable
1291
+ <<~YML
1292
+ ce:actioncable:
1293
+ extends:
1294
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1295
+ - .test
1296
+ - .high-capacity
1297
+ - .ce-variables
1298
+ - .rspec-report-opts
1299
+ variables:
1300
+ QA_SCENARIO: "Test::Integration::Actioncable"
1301
+
1302
+ ce:actioncable-quarantine:
1303
+ extends:
1304
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1305
+ - .test
1306
+ - .high-capacity
1307
+ - .ce-variables
1308
+ - .quarantine
1309
+ - .rspec-report-opts
1310
+ variables:
1311
+ QA_SCENARIO: "Test::Integration::Actioncable"
1312
+
1313
+ ee:actioncable:
1314
+ extends:
1315
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1316
+ - .test
1317
+ - .high-capacity
1318
+ - .ee-variables
1319
+ - .rspec-report-opts
1320
+ variables:
1321
+ QA_SCENARIO: "Test::Integration::Actioncable"
1322
+
1323
+ ee:actioncable-quarantine:
1324
+ extends:
1325
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1326
+ - .test
1327
+ - .high-capacity
1328
+ - .ee-variables
1329
+ - .quarantine
1330
+ - .rspec-report-opts
1331
+ variables:
1332
+ QA_SCENARIO: "Test::Integration::Actioncable"
1333
+
1334
+ YML
1335
+ end
1336
+
1337
+ def elasticsearch
1338
+ <<~YML
1339
+ ee:elasticsearch:
1340
+ extends:
1341
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1342
+ - .test
1343
+ - .high-capacity
1344
+ - .ee-variables
1345
+ - .rspec-report-opts
1346
+ variables:
1347
+ QA_SCENARIO: "Test::Integration::Elasticsearch"
1348
+
1349
+ ee:elasticsearch-quarantine:
1350
+ extends:
1351
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1352
+ - .test
1353
+ - .high-capacity
1354
+ - .ee-variables
1355
+ - .quarantine
1356
+ - .rspec-report-opts
1357
+ variables:
1358
+ QA_SCENARIO: "Test::Integration::Elasticsearch"
1359
+
1360
+ YML
1361
+ end
1362
+
1363
+ def praefect
1364
+ <<~YML
1365
+ ce:praefect-parallel:
1366
+ extends:
1367
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-specified
1368
+ - .test
1369
+ - .high-capacity
1370
+ - .ce-variables
1371
+ - .rspec-report-opts
1372
+ parallel: 5
1373
+ variables:
1374
+ QA_SCENARIO: "Test::Integration::Praefect"
1375
+ QA_CAN_TEST_PRAEFECT: "true"
1376
+
1377
+ ce:praefect:
1378
+ extends:
1379
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-not-specified
1380
+ - .test
1381
+ - .high-capacity
1382
+ - .ce-variables
1383
+ - .rspec-report-opts
1384
+ variables:
1385
+ QA_SCENARIO: "Test::Integration::Praefect"
1386
+ QA_CAN_TEST_PRAEFECT: "true"
1387
+
1388
+ ce:praefect-quarantine:
1389
+ extends:
1390
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1391
+ - .test
1392
+ - .high-capacity
1393
+ - .ce-variables
1394
+ - .quarantine
1395
+ - .rspec-report-opts
1396
+ variables:
1397
+ QA_SCENARIO: "Test::Integration::Praefect"
1398
+ QA_CAN_TEST_PRAEFECT: "true"
1399
+ QA_RSPEC_TAGS: "--tag quarantine --tag ~orchestrated"
1400
+
1401
+ ee:praefect-parallel:
1402
+ extends:
1403
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-specified
1404
+ - .test
1405
+ - .high-capacity
1406
+ - .ee-variables
1407
+ - .rspec-report-opts
1408
+ parallel: 10
1409
+ variables:
1410
+ QA_SCENARIO: "Test::Integration::Praefect"
1411
+ QA_CAN_TEST_PRAEFECT: "true"
1412
+
1413
+ ee:praefect:
1414
+ extends:
1415
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change-and-never-when-qa-tests-not-specified
1416
+ - .test
1417
+ - .high-capacity
1418
+ - .ee-variables
1419
+ - .rspec-report-opts
1420
+ variables:
1421
+ QA_SCENARIO: "Test::Integration::Praefect"
1422
+ QA_CAN_TEST_PRAEFECT: "true"
1423
+
1424
+ ee:praefect-quarantine:
1425
+ extends:
1426
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1427
+ - .test
1428
+ - .high-capacity
1429
+ - .ee-variables
1430
+ - .quarantine
1431
+ - .rspec-report-opts
1432
+ variables:
1433
+ QA_SCENARIO: "Test::Integration::Praefect"
1434
+ QA_CAN_TEST_PRAEFECT: "true"
1435
+ QA_RSPEC_TAGS: "--tag quarantine --tag ~orchestrated"
1436
+
1437
+ YML
1438
+ end
1439
+
1440
+ def gitaly_cluster
1441
+ <<~YML
1442
+ ce:gitaly-cluster:
1443
+ extends:
1444
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1445
+ - .test
1446
+ - .high-capacity
1447
+ - .ce-variables
1448
+ - .rspec-report-opts
1449
+ variables:
1450
+ QA_SCENARIO: "Test::Integration::GitalyCluster"
1451
+ QA_LOG_PATH: "tmp/gitaly_cluster.log"
1452
+
1453
+ ce:gitaly-cluster-quarantine:
1454
+ extends:
1455
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1456
+ - .test
1457
+ - .high-capacity
1458
+ - .ce-variables
1459
+ - .quarantine
1460
+ - .rspec-report-opts
1461
+ variables:
1462
+ QA_SCENARIO: "Test::Integration::GitalyCluster"
1463
+ QA_LOG_PATH: "tmp/gitaly_cluster.log"
1464
+
1465
+ ee:gitaly-cluster:
1466
+ extends:
1467
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1468
+ - .test
1469
+ - .high-capacity
1470
+ - .ee-variables
1471
+ - .rspec-report-opts
1472
+ variables:
1473
+ QA_SCENARIO: "Test::Integration::GitalyCluster"
1474
+ QA_LOG_PATH: "tmp/gitaly_cluster.log"
1475
+
1476
+ ee:gitaly-cluster-quarantine:
1477
+ extends:
1478
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1479
+ - .test
1480
+ - .high-capacity
1481
+ - .ee-variables
1482
+ - .quarantine
1483
+ - .rspec-report-opts
1484
+ variables:
1485
+ QA_SCENARIO: "Test::Integration::GitalyCluster"
1486
+ QA_LOG_PATH: "tmp/gitaly_cluster.log"
1487
+
1488
+ YML
1489
+ end
1490
+
1491
+ def mtls
1492
+ <<~YML
1493
+ ce:mtls:
1494
+ extends:
1495
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1496
+ - .test
1497
+ - .ce-variables
1498
+ - .rspec-report-opts
1499
+ variables:
1500
+ QA_SCENARIO: "Test::Integration::MTLS"
1501
+
1502
+ ee:mtls:
1503
+ extends:
1504
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1505
+ - .test
1506
+ - .ee-variables
1507
+ - .rspec-report-opts
1508
+ variables:
1509
+ QA_SCENARIO: "Test::Integration::MTLS"
1510
+
1511
+ YML
1512
+ end
1513
+
1514
+ def smtp
1515
+ <<~YML
1516
+ ce:smtp:
1517
+ extends:
1518
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1519
+ - .test
1520
+ - .high-capacity
1521
+ - .ce-variables
1522
+ - .rspec-report-opts
1523
+ variables:
1524
+ QA_SCENARIO: "Test::Integration::SMTP"
1525
+
1526
+ ee:smtp:
1527
+ extends:
1528
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1529
+ - .test
1530
+ - .high-capacity
1531
+ - .ee-variables
1532
+ - .rspec-report-opts
1533
+ variables:
1534
+ QA_SCENARIO: "Test::Integration::SMTP"
1535
+
1536
+ YML
1537
+ end
1538
+
1539
+ def jira
1540
+ <<~YML
1541
+ ce:jira:
1542
+ extends:
1543
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1544
+ - .test
1545
+ - .high-capacity
1546
+ - .ce-variables
1547
+ - .rspec-report-opts
1548
+ variables:
1549
+ QA_SCENARIO: "Test::Integration::Jira"
1550
+
1551
+ ce:jira-quarantine:
1552
+ extends:
1553
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1554
+ - .test
1555
+ - .high-capacity
1556
+ - .ce-variables
1557
+ - .quarantine
1558
+ - .rspec-report-opts
1559
+ variables:
1560
+ QA_SCENARIO: "Test::Integration::Jira"
1561
+
1562
+ ee:jira:
1563
+ extends:
1564
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1565
+ - .test
1566
+ - .high-capacity
1567
+ - .ee-variables
1568
+ - .rspec-report-opts
1569
+ variables:
1570
+ QA_SCENARIO: "Test::Integration::Jira"
1571
+
1572
+ ee:jira-quarantine:
1573
+ extends:
1574
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1575
+ - .test
1576
+ - .high-capacity
1577
+ - .ee-variables
1578
+ - .quarantine
1579
+ - .rspec-report-opts
1580
+ variables:
1581
+ QA_SCENARIO: "Test::Integration::Jira"
1582
+
1583
+ YML
1584
+ end
1585
+
1586
+ def integrations
1587
+ <<~YML
1588
+ ce:integrations:
1589
+ extends:
1590
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1591
+ - .test
1592
+ - .high-capacity
1593
+ - .ce-variables
1594
+ - .rspec-report-opts
1595
+ variables:
1596
+ QA_SCENARIO: "Test::Integration::Integrations"
1597
+
1598
+ ce:integrations-quarantine:
1599
+ extends:
1600
+ - ce:integrations
1601
+ - .quarantine
1602
+
1603
+ YML
1604
+ end
1605
+
1606
+ def large_setup
1607
+ <<~YML
1608
+ ce:large-setup:
1609
+ extends:
1610
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1611
+ - .test
1612
+ - .high-capacity
1613
+ - .ce-variables
1614
+ - .rspec-report-opts
1615
+ variables:
1616
+ QA_RSPEC_TAGS: "--tag can_use_large_setup"
1617
+
1618
+ ee:large-setup:
1619
+ extends:
1620
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1621
+ - .test
1622
+ - .high-capacity
1623
+ - .ee-variables
1624
+ - .rspec-report-opts
1625
+ variables:
1626
+ QA_RSPEC_TAGS: "--tag can_use_large_setup"
1627
+
1628
+ YML
1629
+ end
1630
+
1631
+ def cloud_activation
1632
+ <<~YML
1633
+ ee:cloud-activation:
1634
+ before_script:
1635
+ - unset EE_LICENSE
1636
+ - !reference [default, before_script]
1637
+ extends:
1638
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1639
+ - .test
1640
+ - .high-capacity
1641
+ - .ee-variables
1642
+ - .rspec-report-opts
1643
+ - .combined-gitlab-qa-options-script
1644
+ variables:
1645
+ QA_RSPEC_TAGS: "--tag cloud_activation"
1646
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --seed-db license*.rb"
1647
+
1648
+ ee:cloud-activation-quarantine:
1649
+ before_script:
1650
+ - unset EE_LICENSE
1651
+ - !reference [default, before_script]
1652
+ extends:
1653
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1654
+ - .test
1655
+ - .high-capacity
1656
+ - .ee-variables
1657
+ - .quarantine
1658
+ - .rspec-report-opts
1659
+ - .combined-gitlab-qa-options-script
1660
+ variables:
1661
+ QA_RSPEC_TAGS: "--tag cloud_activation"
1662
+ GITLAB_QA_OPTIONS_COMBINED: "$GITLAB_QA_OPTIONS --seed-db license*.rb"
1663
+
1664
+ YML
1665
+ end
1666
+
1667
+ def registry_with_cdn
1668
+ <<~YML
1669
+ ce:registry_with_cdn:
1670
+ extends:
1671
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1672
+ - .test
1673
+ - .high-capacity
1674
+ - .ce-variables
1675
+ - .rspec-report-opts
1676
+ variables:
1677
+ QA_SCENARIO: "Test::Integration::RegistryWithCDN"
1678
+ allow_failure: true
1679
+
1680
+ ce:registry_with_cdn-quarantine:
1681
+ extends:
1682
+ - .rules:ce-never-when-triggered-by-feature-flag-definition-change
1683
+ - .test
1684
+ - .high-capacity
1685
+ - .ce-variables
1686
+ - .quarantine
1687
+ - .rspec-report-opts
1688
+ variables:
1689
+ QA_SCENARIO: "Test::Integration::RegistryWithCDN"
1690
+
1691
+ ee:registry_with_cdn:
1692
+ extends:
1693
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1694
+ - .test
1695
+ - .ee-variables
1696
+ - .high-capacity
1697
+ - .rspec-report-opts
1698
+ variables:
1699
+ QA_SCENARIO: "Test::Integration::RegistryWithCDN"
1700
+ allow_failure: true
1701
+
1702
+ ee:registry_with_cdn-quarantine:
1703
+ extends:
1704
+ - .rules:ee-never-when-triggered-by-feature-flag-definition-change
1705
+ - .test
1706
+ - .high-capacity
1707
+ - .ee-variables
1708
+ - .quarantine
1709
+ - .rspec-report-opts
1710
+ variables:
1711
+ QA_SCENARIO: "Test::Integration::RegistryWithCDN"
1712
+
1713
+ YML
1714
+ end
1715
+
1716
+ # This job requires the `GITLAB_QA_ACCESS_TOKEN` and `GITLAB_QA_DEV_ACCESS_TOKEN`
1717
+ # variable to be passed when triggered.
1718
+ def staging
1719
+ <<~YML
1720
+ staging:
1721
+ script:
1722
+ - unset EE_LICENSE
1723
+ - 'echo "Running: bundle exec exe/gitlab-qa Test::Instance::Staging ${RELEASE:=$DEFAULT_RELEASE} -- $QA_TESTS $QA_RSPEC_TAGS"'
1724
+ - bundle exec exe/gitlab-qa Test::Instance::Staging ${RELEASE:=$DEFAULT_RELEASE} -- $QA_TESTS $QA_RSPEC_TAGS
1725
+ extends:
1726
+ - .rules:only-qa-never-when-triggered-by-feature-flag-definition-change
1727
+ - .test
1728
+ - .high-capacity
1729
+ allow_failure: true
1730
+
1731
+ YML
1732
+ end
1733
+
1734
+ def should_run?(example_file_name)
1735
+ @no_of_example_files.include?(example_file_name)
1736
+ end
1737
+ end
1738
+
1739
+ jobs = GenerateQAJobs.new(Dir.glob('no_of_examples/*').map { |s| File.basename(s, '.*') }).execute
1740
+
1741
+ File.open('generated-qa-jobs.yml', 'w') { |f| f.write(jobs) }