Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									99454db49e
								
							
						
					
					
						commit
						0f59ad0c29
					
				|  | @ -1,5 +1,3 @@ | ||||||
| image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.5-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-10-graphicsmagick-1.3.34" |  | ||||||
| 
 |  | ||||||
| stages: | stages: | ||||||
|   - sync |   - sync | ||||||
|   - prepare |   - prepare | ||||||
|  | @ -16,6 +14,7 @@ stages: | ||||||
| # in cases where jobs require Docker-in-Docker, the job | # in cases where jobs require Docker-in-Docker, the job | ||||||
| # definition must be extended with `.use-docker-in-docker` | # definition must be extended with `.use-docker-in-docker` | ||||||
| default: | default: | ||||||
|  |   image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.5-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-9.6-graphicsmagick-1.3.34" | ||||||
|   tags: |   tags: | ||||||
|     - gitlab-org |     - gitlab-org | ||||||
|   # All jobs are interruptible by default |   # All jobs are interruptible by default | ||||||
|  |  | ||||||
|  | @ -3,9 +3,9 @@ | ||||||
|     - .default-retry |     - .default-retry | ||||||
|     - .default-cache |     - .default-cache | ||||||
|     - .default-before_script |     - .default-before_script | ||||||
|     - .use-pg11 |     - .use-pg9 | ||||||
|   stage: test |   stage: test | ||||||
|   needs: ["setup-test-env pg11"] |   needs: ["setup-test-env pg9"] | ||||||
|   variables: |   variables: | ||||||
|     FIXTURE_PATH: "db/fixtures/development" |     FIXTURE_PATH: "db/fixtures/development" | ||||||
|     SEED_CYCLE_ANALYTICS: "true" |     SEED_CYCLE_ANALYTICS: "true" | ||||||
|  | @ -26,7 +26,7 @@ run-dev-fixtures-ee: | ||||||
|   extends: |   extends: | ||||||
|     - .run-dev-fixtures |     - .run-dev-fixtures | ||||||
|     - .dev-fixtures:rules:ee-only |     - .dev-fixtures:rules:ee-only | ||||||
|     - .use-pg11-ee |     - .use-pg9-ee | ||||||
|   script: |   script: | ||||||
|     - scripts/gitaly-test-spawn |     - scripts/gitaly-test-spawn | ||||||
|     - cp ee/db/fixtures/development/* $FIXTURE_PATH |     - cp ee/db/fixtures/development/* $FIXTURE_PATH | ||||||
|  |  | ||||||
|  | @ -66,9 +66,9 @@ graphql-reference-verify: | ||||||
|     - .default-cache |     - .default-cache | ||||||
|     - .default-before_script |     - .default-before_script | ||||||
|     - .docs:rules:graphql-reference-verify |     - .docs:rules:graphql-reference-verify | ||||||
|     - .use-pg11 |     - .use-pg9 | ||||||
|   stage: test |   stage: test | ||||||
|   needs: ["setup-test-env pg11"] |   needs: ["setup-test-env pg9"] | ||||||
|   script: |   script: | ||||||
|     - bundle exec rake gitlab:graphql:check_docs |     - bundle exec rake gitlab:graphql:check_docs | ||||||
|     - bundle exec rake gitlab:graphql:check_schema |     - bundle exec rake gitlab:graphql:check_schema | ||||||
|  |  | ||||||
|  | @ -129,9 +129,9 @@ compile-assets pull-cache as-if-foss: | ||||||
|     - .default-retry |     - .default-retry | ||||||
|     - .default-cache |     - .default-cache | ||||||
|     - .default-before_script |     - .default-before_script | ||||||
|     - .use-pg11 |     - .use-pg9 | ||||||
|   stage: fixtures |   stage: fixtures | ||||||
|   needs: ["setup-test-env pg11", "compile-assets pull-cache"] |   needs: ["setup-test-env pg9", "compile-assets pull-cache"] | ||||||
|   script: |   script: | ||||||
|     - date |     - date | ||||||
|     - scripts/gitaly-test-spawn |     - scripts/gitaly-test-spawn | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ | ||||||
| memory-static: | memory-static: | ||||||
|   extends: .only-code-memory-job-base |   extends: .only-code-memory-job-base | ||||||
|   stage: test |   stage: test | ||||||
|   needs: ["setup-test-env pg11"] |   needs: ["setup-test-env pg9"] | ||||||
|   variables: |   variables: | ||||||
|     SETUP_DB: "false" |     SETUP_DB: "false" | ||||||
|   script: |   script: | ||||||
|  | @ -36,9 +36,9 @@ memory-static: | ||||||
| memory-on-boot: | memory-on-boot: | ||||||
|   extends: |   extends: | ||||||
|     - .only-code-memory-job-base |     - .only-code-memory-job-base | ||||||
|     - .use-pg11 |     - .use-pg9 | ||||||
|   stage: test |   stage: test | ||||||
|   needs: ["setup-test-env pg11", "compile-assets pull-cache"] |   needs: ["setup-test-env pg9", "compile-assets pull-cache"] | ||||||
|   variables: |   variables: | ||||||
|     NODE_ENV: "production" |     NODE_ENV: "production" | ||||||
|     RAILS_ENV: "production" |     RAILS_ENV: "production" | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| .rails:needs:setup-and-assets: | .rails:needs:setup-and-assets: | ||||||
|   needs: ["setup-test-env pg11", "compile-assets pull-cache"] |   needs: ["setup-test-env pg9", "compile-assets pull-cache"] | ||||||
| 
 | 
 | ||||||
| .rails-job-base: | .rails-job-base: | ||||||
|   extends: |   extends: | ||||||
|  | @ -7,8 +7,8 @@ | ||||||
|     - .default-cache |     - .default-cache | ||||||
|     - .default-before_script |     - .default-before_script | ||||||
| 
 | 
 | ||||||
| #################### | ####################################################### | ||||||
| # EE and FOSS jobs # | # EE/FOSS: default refs (MRs, master, schedules) jobs # | ||||||
| .base-setup-test-env: | .base-setup-test-env: | ||||||
|   extends: |   extends: | ||||||
|     - .rails-job-base |     - .rails-job-base | ||||||
|  | @ -28,19 +28,19 @@ | ||||||
| setup-test-env pg11: | setup-test-env pg11: | ||||||
|   extends: |   extends: | ||||||
|     - .base-setup-test-env |     - .base-setup-test-env | ||||||
|     - .rails:rules:default-refs-code-backstage-qa |     - .rails:rules:master-push--master-schedule-2-hourly--code-backstage | ||||||
|     - .use-pg11 |     - .use-pg11 | ||||||
| 
 | 
 | ||||||
| setup-test-env pg10: | setup-test-env pg10: | ||||||
|   extends: |   extends: | ||||||
|     - .base-setup-test-env |     - .base-setup-test-env | ||||||
|     - .rails:rules:master-refs-code-backstage |     - .rails:rules:master-schedule-nightly--code-backstage | ||||||
|     - .use-pg10 |     - .use-pg10 | ||||||
| 
 | 
 | ||||||
| setup-test-env pg9: | setup-test-env pg9: | ||||||
|   extends: |   extends: | ||||||
|     - .base-setup-test-env |     - .base-setup-test-env | ||||||
|     - .rails:rules:nightly-master-refs-code-backstage |     - .rails:rules:default-refs-code-backstage-qa | ||||||
|     - .use-pg9 |     - .use-pg9 | ||||||
| 
 | 
 | ||||||
| static-analysis: | static-analysis: | ||||||
|  | @ -55,7 +55,7 @@ static-analysis: | ||||||
|   script: |   script: | ||||||
|     - scripts/static-analysis |     - scripts/static-analysis | ||||||
|   cache: |   cache: | ||||||
|     key: "ruby-2.6.5-pg11-rubocop" |     key: "ruby-2.6.5-pg9-rubocop" | ||||||
|     paths: |     paths: | ||||||
|       - vendor/ruby |       - vendor/ruby | ||||||
|       - tmp/rubocop_cache |       - tmp/rubocop_cache | ||||||
|  | @ -75,7 +75,7 @@ downtime_check: | ||||||
| .rspec-base: | .rspec-base: | ||||||
|   extends: .rails-job-base |   extends: .rails-job-base | ||||||
|   stage: test |   stage: test | ||||||
|   needs: ["setup-test-env pg11", "retrieve-tests-metadata", "compile-assets pull-cache"] |   needs: ["setup-test-env pg9", "retrieve-tests-metadata", "compile-assets pull-cache"] | ||||||
|   script: |   script: | ||||||
|     - source scripts/rspec_helpers.sh |     - source scripts/rspec_helpers.sh | ||||||
|     - rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag ~level:migration" |     - rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag ~level:migration" | ||||||
|  | @ -93,37 +93,37 @@ downtime_check: | ||||||
|     reports: |     reports: | ||||||
|       junit: junit_rspec.xml |       junit: junit_rspec.xml | ||||||
| 
 | 
 | ||||||
| .rspec-base-pg11: | .rspec-base-pg9: | ||||||
|   extends: |   extends: | ||||||
|     - .rspec-base |     - .rspec-base | ||||||
|     - .rails:rules:ee-and-foss |     - .rails:rules:ee-and-foss | ||||||
|     - .use-pg11 |     - .use-pg9 | ||||||
| 
 | 
 | ||||||
| .rspec-base-migration: | .rspec-base-migration: | ||||||
|   script: |   script: | ||||||
|     - source scripts/rspec_helpers.sh |     - source scripts/rspec_helpers.sh | ||||||
|     - rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag level:migration" |     - rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag level:migration" | ||||||
| 
 | 
 | ||||||
| rspec migration pg11: | rspec migration pg9: | ||||||
|   extends: |   extends: | ||||||
|     - .rspec-base-pg11 |     - .rspec-base-pg9 | ||||||
|     - .rspec-base-migration |     - .rspec-base-migration | ||||||
|   parallel: 5 |   parallel: 5 | ||||||
| 
 | 
 | ||||||
| rspec unit pg11: | rspec unit pg9: | ||||||
|   extends: .rspec-base-pg11 |   extends: .rspec-base-pg9 | ||||||
|   parallel: 20 |   parallel: 20 | ||||||
| 
 | 
 | ||||||
| rspec integration pg11: | rspec integration pg9: | ||||||
|   extends: .rspec-base-pg11 |   extends: .rspec-base-pg9 | ||||||
|   parallel: 8 |   parallel: 8 | ||||||
| 
 | 
 | ||||||
| rspec system pg11: | rspec system pg9: | ||||||
|   extends: .rspec-base-pg11 |   extends: .rspec-base-pg9 | ||||||
|   parallel: 24 |   parallel: 24 | ||||||
| 
 | 
 | ||||||
| rspec fast_spec_helper: | rspec fast_spec_helper: | ||||||
|   extends: .rspec-base-pg11 |   extends: .rspec-base-pg9 | ||||||
|   script: |   script: | ||||||
|     - bin/rspec spec/fast_spec_helper.rb |     - bin/rspec spec/fast_spec_helper.rb | ||||||
| 
 | 
 | ||||||
|  | @ -131,9 +131,9 @@ rspec fast_spec_helper: | ||||||
|   extends: |   extends: | ||||||
|     - .rails-job-base |     - .rails-job-base | ||||||
|     - .rails:rules:ee-and-foss |     - .rails:rules:ee-and-foss | ||||||
|     - .use-pg11 |     - .use-pg9 | ||||||
|   stage: test |   stage: test | ||||||
|   needs: ["setup-test-env pg11"] |   needs: ["setup-test-env pg9"] | ||||||
| 
 | 
 | ||||||
| db:migrate:reset: | db:migrate:reset: | ||||||
|   extends: .db-job-base |   extends: .db-job-base | ||||||
|  | @ -202,18 +202,18 @@ rspec:coverage: | ||||||
|   # We cannot use needs since it would mean needing 84 jobs (since most are parallelized) |   # We cannot use needs since it would mean needing 84 jobs (since most are parallelized) | ||||||
|   # so we use `dependencies` here. |   # so we use `dependencies` here. | ||||||
|   dependencies: |   dependencies: | ||||||
|     - setup-test-env pg11 |     - setup-test-env pg9 | ||||||
|     - rspec migration pg11 |     - rspec migration pg9 | ||||||
|     - rspec unit pg11 |     - rspec unit pg9 | ||||||
|     - rspec integration pg11 |     - rspec integration pg9 | ||||||
|     - rspec system pg11 |     - rspec system pg9 | ||||||
|     - rspec-ee migration pg11 |     - rspec-ee migration pg9 | ||||||
|     - rspec-ee unit pg11 |     - rspec-ee unit pg9 | ||||||
|     - rspec-ee integration pg11 |     - rspec-ee integration pg9 | ||||||
|     - rspec-ee system pg11 |     - rspec-ee system pg9 | ||||||
|     - rspec-ee unit pg11 geo |     - rspec-ee unit pg9 geo | ||||||
|     - rspec-ee integration pg11 geo |     - rspec-ee integration pg9 geo | ||||||
|     - rspec-ee system pg11 geo |     - rspec-ee system pg9 geo | ||||||
|     - memory-static |     - memory-static | ||||||
|     - memory-on-boot |     - memory-on-boot | ||||||
|   variables: |   variables: | ||||||
|  | @ -231,15 +231,166 @@ rspec:coverage: | ||||||
|       - coverage/index.html |       - coverage/index.html | ||||||
|       - coverage/assets/ |       - coverage/assets/ | ||||||
|       - tmp/memory_test/ |       - tmp/memory_test/ | ||||||
| # EE and FOSS jobs # | # EE/FOSS: default refs (MRs, master, schedules) jobs # | ||||||
| #################### | ####################################################### | ||||||
| 
 | 
 | ||||||
| #################### | ################################################## | ||||||
| # master-only jobs # | # EE: default refs (MRs, master, schedules) jobs # | ||||||
|  | .rspec-base-ee: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base | ||||||
|  |     - .rails:rules:ee-only | ||||||
|  | 
 | ||||||
|  | .rspec-base-pg9-as-if-foss: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base-ee | ||||||
|  |     - .as-if-foss | ||||||
|  |     - .use-pg9 | ||||||
|  |   needs: ["setup-test-env pg9", "retrieve-tests-metadata", "compile-assets pull-cache as-if-foss"] | ||||||
|  | 
 | ||||||
|  | .rspec-ee-base-pg9: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base-ee | ||||||
|  |     - .use-pg9-ee | ||||||
|  | 
 | ||||||
|  | rspec migration pg9-as-if-foss: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base-pg9-as-if-foss | ||||||
|  |     - .rspec-base-migration | ||||||
|  |   parallel: 5 | ||||||
|  | 
 | ||||||
|  | rspec unit pg9-as-if-foss: | ||||||
|  |   extends: .rspec-base-pg9-as-if-foss | ||||||
|  |   parallel: 20 | ||||||
|  | 
 | ||||||
|  | rspec integration pg9-as-if-foss: | ||||||
|  |   extends: .rspec-base-pg9-as-if-foss | ||||||
|  |   parallel: 8 | ||||||
|  | 
 | ||||||
|  | rspec system pg9-as-if-foss: | ||||||
|  |   extends: .rspec-base-pg9-as-if-foss | ||||||
|  |   parallel: 24 | ||||||
|  | 
 | ||||||
|  | rspec-ee migration pg9: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg9 | ||||||
|  |     - .rspec-base-migration | ||||||
|  |   parallel: 2 | ||||||
|  | 
 | ||||||
|  | rspec-ee unit pg9: | ||||||
|  |   extends: .rspec-ee-base-pg9 | ||||||
|  |   parallel: 10 | ||||||
|  | 
 | ||||||
|  | rspec-ee integration pg9: | ||||||
|  |   extends: .rspec-ee-base-pg9 | ||||||
|  |   parallel: 4 | ||||||
|  | 
 | ||||||
|  | rspec-ee system pg9: | ||||||
|  |   extends: .rspec-ee-base-pg9 | ||||||
|  |   parallel: 6 | ||||||
|  | 
 | ||||||
|  | .rspec-ee-base-geo: | ||||||
|  |   extends: .rspec-base-ee | ||||||
|  |   script: | ||||||
|  |     - source scripts/rspec_helpers.sh | ||||||
|  |     - scripts/prepare_postgres_fdw.sh | ||||||
|  |     - rspec_paralellized_job "--tag ~quarantine --tag geo" | ||||||
|  | 
 | ||||||
|  | .rspec-ee-base-geo-pg9: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-geo | ||||||
|  |     - .use-pg9-ee | ||||||
|  | 
 | ||||||
|  | rspec-ee unit pg9 geo: | ||||||
|  |   extends: .rspec-ee-base-geo-pg9 | ||||||
|  |   parallel: 2 | ||||||
|  | 
 | ||||||
|  | rspec-ee integration pg9 geo: | ||||||
|  |   extends: .rspec-ee-base-geo-pg9 | ||||||
|  | 
 | ||||||
|  | rspec-ee system pg9 geo: | ||||||
|  |   extends: .rspec-ee-base-geo-pg9 | ||||||
|  | 
 | ||||||
|  | db:rollback geo: | ||||||
|  |   extends: | ||||||
|  |     - db:rollback | ||||||
|  |     - .rails:rules:ee-only | ||||||
|  |   script: | ||||||
|  |     - bundle exec rake geo:db:migrate VERSION=20170627195211 | ||||||
|  |     - bundle exec rake geo:db:migrate | ||||||
|  | # EE: default refs (MRs, master, schedules) jobs # | ||||||
|  | ################################################## | ||||||
|  | 
 | ||||||
|  | #################################################################### | ||||||
|  | # EE/FOSS: master non-scheduled and master 2-hourly scheduled jobs # | ||||||
|  | .rspec-base-pg11: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base | ||||||
|  |     - .rails:rules:master-push--master-schedule-2-hourly--code-backstage | ||||||
|  |     - .use-pg11 | ||||||
|  |   needs: ["setup-test-env pg11", "retrieve-tests-metadata", "compile-assets pull-cache"] | ||||||
|  | 
 | ||||||
|  | rspec migration pg11: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base-pg11 | ||||||
|  |     - .rspec-base-migration | ||||||
|  |   parallel: 5 | ||||||
|  | 
 | ||||||
|  | rspec unit pg11: | ||||||
|  |   extends: .rspec-base-pg11 | ||||||
|  |   parallel: 20 | ||||||
|  | 
 | ||||||
|  | rspec integration pg11: | ||||||
|  |   extends: .rspec-base-pg11 | ||||||
|  |   parallel: 8 | ||||||
|  | 
 | ||||||
|  | rspec system pg11: | ||||||
|  |   extends: .rspec-base-pg11 | ||||||
|  |   parallel: 24 | ||||||
|  | # EE/FOSS: master non-scheduled and master 2-hourly scheduled jobs # | ||||||
|  | #################################################################### | ||||||
|  | 
 | ||||||
|  | ############################################################### | ||||||
|  | # EE: master non-scheduled and master 2-hourly scheduled jobs # | ||||||
|  | .rspec-ee-base-pg11: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-base-ee | ||||||
|  |     - .use-pg11-ee | ||||||
|  |   needs: ["setup-test-env pg11", "retrieve-tests-metadata", "compile-assets pull-cache"] | ||||||
|  | 
 | ||||||
|  | rspec-ee migration pg11: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg11 | ||||||
|  |     - .rspec-base-migration | ||||||
|  |     - .rails:rules:master-push--master-schedule-2-hourly--code-backstage | ||||||
|  |   parallel: 2 | ||||||
|  | 
 | ||||||
|  | rspec-ee unit pg11: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg11 | ||||||
|  |     - .rails:rules:master-push--master-schedule-2-hourly--code-backstage | ||||||
|  |   parallel: 10 | ||||||
|  | 
 | ||||||
|  | rspec-ee integration pg11: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg11 | ||||||
|  |     - .rails:rules:master-push--master-schedule-2-hourly--code-backstage | ||||||
|  |   parallel: 4 | ||||||
|  | 
 | ||||||
|  | rspec-ee system pg11: | ||||||
|  |   extends: | ||||||
|  |     - .rspec-ee-base-pg11 | ||||||
|  |     - .rails:rules:master-push--master-schedule-2-hourly--code-backstage | ||||||
|  |   parallel: 6 | ||||||
|  | # EE: master non-scheduled and master 2-hourly scheduled jobs # | ||||||
|  | ############################################################### | ||||||
|  | 
 | ||||||
|  | ########################################## | ||||||
|  | # EE/FOSS: master nightly scheduled jobs # | ||||||
| .rspec-base-pg10: | .rspec-base-pg10: | ||||||
|   extends: |   extends: | ||||||
|     - .rspec-base |     - .rspec-base | ||||||
|     - .rails:rules:master-refs-code-backstage |     - .rails:rules:master-schedule-nightly--code-backstage | ||||||
|     - .use-pg10 |     - .use-pg10 | ||||||
|   needs: ["setup-test-env pg10", "retrieve-tests-metadata", "compile-assets pull-cache"] |   needs: ["setup-test-env pg10", "retrieve-tests-metadata", "compile-assets pull-cache"] | ||||||
| 
 | 
 | ||||||
|  | @ -260,177 +411,26 @@ rspec integration pg10: | ||||||
| rspec system pg10: | rspec system pg10: | ||||||
|   extends: .rspec-base-pg10 |   extends: .rspec-base-pg10 | ||||||
|   parallel: 24 |   parallel: 24 | ||||||
| # master-only jobs # | # EE/FOSS: master nightly scheduled jobs # | ||||||
| #################### | ########################################## | ||||||
| 
 | 
 | ||||||
| ###################### | ############################## | ||||||
| # nightly-only jobs # | # EE: nightly scheduled jobs # | ||||||
| .rspec-base-pg9: | .rspec-ee-base-geo-pg10: | ||||||
|   extends: |   extends: | ||||||
|     - .rspec-base |     - .rspec-ee-base-geo | ||||||
|     - .rails:rules:nightly-master-refs-code-backstage |  | ||||||
|     - .use-pg9 |  | ||||||
|   needs: ["setup-test-env pg9", "retrieve-tests-metadata", "compile-assets pull-cache"] |  | ||||||
| 
 |  | ||||||
| rspec migration pg9: |  | ||||||
|   extends: |  | ||||||
|     - .rspec-base-pg9 |  | ||||||
|     - .rspec-base-migration |  | ||||||
|   parallel: 5 |  | ||||||
| 
 |  | ||||||
| rspec unit pg9: |  | ||||||
|   extends: .rspec-base-pg9 |  | ||||||
|   parallel: 20 |  | ||||||
| 
 |  | ||||||
| rspec integration pg9: |  | ||||||
|   extends: .rspec-base-pg9 |  | ||||||
|   parallel: 8 |  | ||||||
| 
 |  | ||||||
| rspec system pg9: |  | ||||||
|   extends: .rspec-base-pg9 |  | ||||||
|   parallel: 24 |  | ||||||
| # nightly-only jobs # |  | ||||||
| ##################### |  | ||||||
| 
 |  | ||||||
| ####################### |  | ||||||
| # EE master-only jobs # |  | ||||||
| .rspec-ee-base-pg10: |  | ||||||
|   extends: |  | ||||||
|     - .rspec-base-ee |  | ||||||
|     - .use-pg10-ee |     - .use-pg10-ee | ||||||
|  |     - .rails:rules:master-schedule-nightly--code-backstage-ee-only | ||||||
|   needs: ["setup-test-env pg10", "retrieve-tests-metadata", "compile-assets pull-cache"] |   needs: ["setup-test-env pg10", "retrieve-tests-metadata", "compile-assets pull-cache"] | ||||||
| 
 | 
 | ||||||
| rspec-ee migration pg10: | rspec-ee unit pg10 geo: | ||||||
|   extends: |   extends: .rspec-ee-base-geo-pg10 | ||||||
|     - .rspec-ee-base-pg10 |  | ||||||
|     - .rspec-base-migration |  | ||||||
|     - .rails:rules:master-refs-code-backstage |  | ||||||
|   parallel: 2 |   parallel: 2 | ||||||
| 
 | 
 | ||||||
| rspec-ee unit pg10: | rspec-ee integration pg10 geo: | ||||||
|   extends: |   extends: .rspec-ee-base-geo-pg10 | ||||||
|     - .rspec-ee-base-pg10 |  | ||||||
|     - .rails:rules:master-refs-code-backstage |  | ||||||
|   parallel: 10 |  | ||||||
| 
 | 
 | ||||||
| rspec-ee integration pg10: | rspec-ee system pg10 geo: | ||||||
|   extends: |   extends: .rspec-ee-base-geo-pg10 | ||||||
|     - .rspec-ee-base-pg10 | # EE: nightly scheduled jobs # | ||||||
|     - .rails:rules:master-refs-code-backstage | ############################## | ||||||
|   parallel: 4 |  | ||||||
| 
 |  | ||||||
| rspec-ee system pg10: |  | ||||||
|   extends: |  | ||||||
|     - .rspec-ee-base-pg10 |  | ||||||
|     - .rails:rules:master-refs-code-backstage |  | ||||||
|   parallel: 6 |  | ||||||
| # EE master-only jobs # |  | ||||||
| ####################### |  | ||||||
| 
 |  | ||||||
| ################ |  | ||||||
| # EE-only jobs # |  | ||||||
| .rspec-base-ee: |  | ||||||
|   extends: |  | ||||||
|     - .rspec-base |  | ||||||
|     - .rails:rules:ee-only |  | ||||||
| 
 |  | ||||||
| .rspec-base-pg11-as-if-foss: |  | ||||||
|   extends: |  | ||||||
|     - .rspec-base-ee |  | ||||||
|     - .as-if-foss |  | ||||||
|     - .use-pg11 |  | ||||||
|   needs: ["setup-test-env pg11", "retrieve-tests-metadata", "compile-assets pull-cache as-if-foss"] |  | ||||||
| 
 |  | ||||||
| .rspec-ee-base-pg11: |  | ||||||
|   extends: |  | ||||||
|     - .rspec-base-ee |  | ||||||
|     - .use-pg11-ee |  | ||||||
| 
 |  | ||||||
| rspec migration pg11-as-if-foss: |  | ||||||
|   extends: |  | ||||||
|     - .rspec-base-pg11-as-if-foss |  | ||||||
|     - .rspec-base-migration |  | ||||||
|   parallel: 5 |  | ||||||
| 
 |  | ||||||
| rspec unit pg11-as-if-foss: |  | ||||||
|   extends: .rspec-base-pg11-as-if-foss |  | ||||||
|   parallel: 20 |  | ||||||
| 
 |  | ||||||
| rspec integration pg11-as-if-foss: |  | ||||||
|   extends: .rspec-base-pg11-as-if-foss |  | ||||||
|   parallel: 8 |  | ||||||
| 
 |  | ||||||
| rspec system pg11-as-if-foss: |  | ||||||
|   extends: .rspec-base-pg11-as-if-foss |  | ||||||
|   parallel: 24 |  | ||||||
| 
 |  | ||||||
| rspec-ee migration pg11: |  | ||||||
|   extends: |  | ||||||
|     - .rspec-ee-base-pg11 |  | ||||||
|     - .rspec-base-migration |  | ||||||
|   parallel: 2 |  | ||||||
| 
 |  | ||||||
| rspec-ee unit pg11: |  | ||||||
|   extends: .rspec-ee-base-pg11 |  | ||||||
|   parallel: 10 |  | ||||||
| 
 |  | ||||||
| rspec-ee integration pg11: |  | ||||||
|   extends: .rspec-ee-base-pg11 |  | ||||||
|   parallel: 4 |  | ||||||
| 
 |  | ||||||
| rspec-ee system pg11: |  | ||||||
|   extends: .rspec-ee-base-pg11 |  | ||||||
|   parallel: 6 |  | ||||||
| 
 |  | ||||||
| .rspec-ee-base-geo: |  | ||||||
|   extends: .rspec-base-ee |  | ||||||
|   script: |  | ||||||
|     - source scripts/rspec_helpers.sh |  | ||||||
|     - scripts/prepare_postgres_fdw.sh |  | ||||||
|     - rspec_paralellized_job "--tag ~quarantine --tag geo" |  | ||||||
| 
 |  | ||||||
| .rspec-ee-base-geo-pg11: |  | ||||||
|   extends: |  | ||||||
|     - .rspec-ee-base-geo |  | ||||||
|     - .use-pg11-ee |  | ||||||
| 
 |  | ||||||
| rspec-ee unit pg11 geo: |  | ||||||
|   extends: .rspec-ee-base-geo-pg11 |  | ||||||
|   parallel: 2 |  | ||||||
| 
 |  | ||||||
| rspec-ee integration pg11 geo: |  | ||||||
|   extends: .rspec-ee-base-geo-pg11 |  | ||||||
| 
 |  | ||||||
| rspec-ee system pg11 geo: |  | ||||||
|   extends: .rspec-ee-base-geo-pg11 |  | ||||||
| 
 |  | ||||||
| db:rollback geo: |  | ||||||
|   extends: |  | ||||||
|     - db:rollback |  | ||||||
|     - .rails:rules:ee-only |  | ||||||
|   script: |  | ||||||
|     - bundle exec rake geo:db:migrate VERSION=20170627195211 |  | ||||||
|     - bundle exec rake geo:db:migrate |  | ||||||
| # EE-only jobs # |  | ||||||
| ################ |  | ||||||
| 
 |  | ||||||
| ######################## |  | ||||||
| # EE nightly-only jobs # |  | ||||||
| .rspec-ee-base-geo-pg9: |  | ||||||
|   extends: |  | ||||||
|     - .rspec-ee-base-geo |  | ||||||
|     - .use-pg9-ee |  | ||||||
|     - .rails:rules:nightly-master-refs-code-backstage-ee-only |  | ||||||
|   needs: ["setup-test-env pg9", "retrieve-tests-metadata", "compile-assets pull-cache"] |  | ||||||
| 
 |  | ||||||
| rspec-ee unit pg9 geo: |  | ||||||
|   extends: .rspec-ee-base-geo-pg9 |  | ||||||
|   parallel: 2 |  | ||||||
| 
 |  | ||||||
| rspec-ee integration pg9 geo: |  | ||||||
|   extends: .rspec-ee-base-geo-pg9 |  | ||||||
| 
 |  | ||||||
| rspec-ee system pg9 geo: |  | ||||||
|   extends: .rspec-ee-base-geo-pg9 |  | ||||||
| # EE nightly-only jobs # |  | ||||||
| ######################## |  | ||||||
|  |  | ||||||
|  | @ -16,6 +16,15 @@ | ||||||
| .if-master-refs: &if-master-refs | .if-master-refs: &if-master-refs | ||||||
|   if: '$CI_COMMIT_REF_NAME == "master"' |   if: '$CI_COMMIT_REF_NAME == "master"' | ||||||
| 
 | 
 | ||||||
|  | .if-master-push: &if-master-push | ||||||
|  |   if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "push"' | ||||||
|  | 
 | ||||||
|  | .if-master-schedule-2-hourly: &if-master-schedule-2-hourly | ||||||
|  |   if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "2-hourly"' | ||||||
|  | 
 | ||||||
|  | .if-master-schedule-nightly: &if-master-schedule-nightly | ||||||
|  |   if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "nightly"' | ||||||
|  | 
 | ||||||
| .if-auto-deploy-branches: &if-auto-deploy-branches | .if-auto-deploy-branches: &if-auto-deploy-branches | ||||||
|   if: '$CI_COMMIT_BRANCH =~ /^\d+-\d+-auto-deploy-\d+$/' |   if: '$CI_COMMIT_BRANCH =~ /^\d+-\d+-auto-deploy-\d+$/' | ||||||
| 
 | 
 | ||||||
|  | @ -25,9 +34,6 @@ | ||||||
| .if-merge-request: &if-merge-request | .if-merge-request: &if-merge-request | ||||||
|   if: '$CI_MERGE_REQUEST_IID' |   if: '$CI_MERGE_REQUEST_IID' | ||||||
| 
 | 
 | ||||||
| .if-nightly-master-schedule: &if-nightly-master-schedule |  | ||||||
|   if: '$NIGHTLY && $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"' |  | ||||||
| 
 |  | ||||||
| .if-dot-com-gitlab-org-schedule: &if-dot-com-gitlab-org-schedule | .if-dot-com-gitlab-org-schedule: &if-dot-com-gitlab-org-schedule | ||||||
|   if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_PIPELINE_SOURCE == "schedule"' |   if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_PIPELINE_SOURCE == "schedule"' | ||||||
| 
 | 
 | ||||||
|  | @ -360,36 +366,33 @@ | ||||||
|   rules: |   rules: | ||||||
|     - <<: *if-default-refs |     - <<: *if-default-refs | ||||||
|       changes: *code-backstage-patterns |       changes: *code-backstage-patterns | ||||||
|       when: on_success |  | ||||||
| 
 | 
 | ||||||
| .rails:rules:default-refs-code-backstage-qa: | .rails:rules:default-refs-code-backstage-qa: | ||||||
|   rules: |   rules: | ||||||
|     - <<: *if-default-refs |     - <<: *if-default-refs | ||||||
|       changes: *code-backstage-qa-patterns |       changes: *code-backstage-qa-patterns | ||||||
|       when: on_success |  | ||||||
| 
 | 
 | ||||||
| .rails:rules:master-refs-code-backstage: | .rails:rules:master-push--master-schedule-2-hourly--code-backstage: | ||||||
|   rules: |   rules: | ||||||
|     - <<: *if-master-refs |     - <<: *if-master-push | ||||||
|       changes: *code-backstage-patterns |       changes: *code-backstage-patterns | ||||||
|       when: on_success |     - <<: *if-master-schedule-2-hourly | ||||||
|     - changes: [".gitlab/ci/rails.gitlab-ci.yml"] |     - <<: *if-merge-request | ||||||
|  |       changes: [".gitlab/ci/rails.gitlab-ci.yml"] | ||||||
| 
 | 
 | ||||||
| .rails:rules:nightly-master-refs-code-backstage: | .rails:rules:master-schedule-nightly--code-backstage: | ||||||
|   rules: |   rules: | ||||||
|     - <<: *if-nightly-master-schedule |     - <<: *if-master-schedule-nightly | ||||||
|       changes: *code-backstage-patterns |     - <<: *if-merge-request | ||||||
|       when: on_success |       changes: [".gitlab/ci/rails.gitlab-ci.yml"] | ||||||
|     - changes: [".gitlab/ci/rails.gitlab-ci.yml"] |  | ||||||
| 
 | 
 | ||||||
| .rails:rules:nightly-master-refs-code-backstage-ee-only: | .rails:rules:master-schedule-nightly--code-backstage-ee-only: | ||||||
|   rules: |   rules: | ||||||
|     - <<: *if-not-ee |     - <<: *if-not-ee | ||||||
|       when: never |       when: never | ||||||
|     - <<: *if-nightly-master-schedule |     - <<: *if-master-schedule-nightly | ||||||
|       changes: *code-backstage-patterns |     - <<: *if-merge-request | ||||||
|       when: on_success |       changes: [".gitlab/ci/rails.gitlab-ci.yml"] | ||||||
|     - changes: [".gitlab/ci/rails.gitlab-ci.yml"] |  | ||||||
| 
 | 
 | ||||||
| .rails:rules:ee-only: | .rails:rules:ee-only: | ||||||
|   rules: |   rules: | ||||||
|  | @ -397,7 +400,6 @@ | ||||||
|       when: never |       when: never | ||||||
|     - <<: *if-default-refs |     - <<: *if-default-refs | ||||||
|       changes: *code-backstage-patterns |       changes: *code-backstage-patterns | ||||||
|       when: on_success |  | ||||||
| 
 | 
 | ||||||
| .rails:rules:ee-mr-and-master-only: | .rails:rules:ee-mr-and-master-only: | ||||||
|   rules: |   rules: | ||||||
|  | @ -412,7 +414,6 @@ | ||||||
|   rules: |   rules: | ||||||
|     - <<: *if-merge-request |     - <<: *if-merge-request | ||||||
|       changes: *code-backstage-patterns |       changes: *code-backstage-patterns | ||||||
|       when: on_success |  | ||||||
| 
 | 
 | ||||||
| ################## | ################## | ||||||
| # Releases rules # | # Releases rules # | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ cache gems: | ||||||
|     - .default-before_script |     - .default-before_script | ||||||
|     - .setup:rules:cache-gems |     - .setup:rules:cache-gems | ||||||
|   stage: test |   stage: test | ||||||
|   needs: ["setup-test-env pg11"] |   needs: ["setup-test-env pg9"] | ||||||
|   variables: |   variables: | ||||||
|     SETUP_DB: "false" |     SETUP_DB: "false" | ||||||
|   script: |   script: | ||||||
|  |  | ||||||
|  | @ -32,18 +32,18 @@ update-tests-metadata: | ||||||
|     - .test-metadata:rules:update-tests-metadata |     - .test-metadata:rules:update-tests-metadata | ||||||
|   stage: post-test |   stage: post-test | ||||||
|   dependencies: |   dependencies: | ||||||
|     - setup-test-env pg11 |     - setup-test-env pg9 | ||||||
|     - rspec migration pg11 |     - rspec migration pg9 | ||||||
|     - rspec unit pg11 |     - rspec unit pg9 | ||||||
|     - rspec integration pg11 |     - rspec integration pg9 | ||||||
|     - rspec system pg11 |     - rspec system pg9 | ||||||
|     - rspec-ee migration pg11 |     - rspec-ee migration pg9 | ||||||
|     - rspec-ee unit pg11 |     - rspec-ee unit pg9 | ||||||
|     - rspec-ee integration pg11 |     - rspec-ee integration pg9 | ||||||
|     - rspec-ee system pg11 |     - rspec-ee system pg9 | ||||||
|     - rspec-ee unit pg11 geo |     - rspec-ee unit pg9 geo | ||||||
|     - rspec-ee integration pg11 geo |     - rspec-ee integration pg9 geo | ||||||
|     - rspec-ee system pg11 geo |     - rspec-ee system pg9 geo | ||||||
|   cache: |   cache: | ||||||
|     policy: push |     policy: push | ||||||
|   script: |   script: | ||||||
|  |  | ||||||
|  | @ -47,7 +47,8 @@ export default class PasteMarkdownTable { | ||||||
| 
 | 
 | ||||||
|     const htmlData = this.data.getData('text/html'); |     const htmlData = this.data.getData('text/html'); | ||||||
|     this.doc = new DOMParser().parseFromString(htmlData, 'text/html'); |     this.doc = new DOMParser().parseFromString(htmlData, 'text/html'); | ||||||
|     const tables = this.doc.querySelectorAll('table'); |     // Avoid formatting lines that were copied from a diff
 | ||||||
|  |     const tables = this.doc.querySelectorAll('table:not(.diff-wrap-lines)'); | ||||||
| 
 | 
 | ||||||
|     // We're only looking for exactly one table. If there happens to be
 |     // We're only looking for exactly one table. If there happens to be
 | ||||||
|     // multiple tables, it's possible an application copied data into
 |     // multiple tables, it's possible an application copied data into
 | ||||||
|  |  | ||||||
|  | @ -27,12 +27,13 @@ class Projects::EnvironmentsController < Projects::ApplicationController | ||||||
|       format.html |       format.html | ||||||
|       format.json do |       format.json do | ||||||
|         Gitlab::PollingInterval.set_header(response, interval: 3_000) |         Gitlab::PollingInterval.set_header(response, interval: 3_000) | ||||||
|  |         environments_count_by_state = project.environments.count_by_state | ||||||
| 
 | 
 | ||||||
|         render json: { |         render json: { | ||||||
|           environments: serialize_environments(request, response, params[:nested]), |           environments: serialize_environments(request, response, params[:nested]), | ||||||
|           review_app: serialize_review_app, |           review_app: serialize_review_app, | ||||||
|           available_count: project.environments.available.count, |           available_count: environments_count_by_state[:available], | ||||||
|           stopped_count: project.environments.stopped.count |           stopped_count: environments_count_by_state[:stopped] | ||||||
|         } |         } | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  | @ -152,6 +152,14 @@ class Environment < ApplicationRecord | ||||||
|                .preload(:user, :metadata, :deployment) |                .preload(:user, :metadata, :deployment) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |     def count_by_state | ||||||
|  |       environments_count_by_state = group(:state).count | ||||||
|  | 
 | ||||||
|  |       valid_states.each_with_object({}) do |state, count_hash| | ||||||
|  |         count_hash[state] = environments_count_by_state[state.to_s] || 0 | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|     private |     private | ||||||
| 
 | 
 | ||||||
|     def cte_for_deployments_with_stop_action |     def cte_for_deployments_with_stop_action | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ | ||||||
|           = _('Allow repository mirroring to be configured by project maintainers') |           = _('Allow repository mirroring to be configured by project maintainers') | ||||||
|       %span.form-text.text-muted |       %span.form-text.text-muted | ||||||
|         = _('If disabled, only admins will be able to configure repository mirroring.') |         = _('If disabled, only admins will be able to configure repository mirroring.') | ||||||
|         = link_to icon('question-circle'), help_page_path('workflow/repository_mirroring') |         = link_to icon('question-circle'), help_page_path('user/project/repository/repository_mirroring.md') | ||||||
| 
 | 
 | ||||||
|     = render_if_exists 'admin/application_settings/mirror_settings', form: f |     = render_if_exists 'admin/application_settings/mirror_settings', form: f | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| - can_create_subgroups = can?(current_user, :create_subgroup, @group) | - can_create_subgroups = can?(current_user, :create_subgroup, @group) | ||||||
|  | - can_create_projects = can?(current_user, :create_projects, @group) | ||||||
| - emails_disabled = @group.emails_disabled? | - emails_disabled = @group.emails_disabled? | ||||||
| 
 | 
 | ||||||
| .group-home-panel | .group-home-panel | ||||||
|  | @ -23,10 +24,9 @@ | ||||||
|       - if current_user |       - if current_user | ||||||
|         .group-buttons |         .group-buttons | ||||||
|           = render 'shared/notifications/new_button', notification_setting: @notification_setting, btn_class: 'btn', emails_disabled: emails_disabled |           = render 'shared/notifications/new_button', notification_setting: @notification_setting, btn_class: 'btn', emails_disabled: emails_disabled | ||||||
|           - if can? current_user, :create_projects, @group |  | ||||||
|           - new_project_label = _("New project") |           - new_project_label = _("New project") | ||||||
|           - new_subgroup_label = _("New subgroup") |           - new_subgroup_label = _("New subgroup") | ||||||
|             - if can_create_subgroups |           - if can_create_projects and can_create_subgroups | ||||||
|             .btn-group.new-project-subgroup.droplab-dropdown.home-panel-action-button.prepend-top-default.js-new-project-subgroup.qa-new-project-or-subgroup-dropdown{ data: { project_path: new_project_path(namespace_id: @group.id), subgroup_path: new_group_path(parent_id: @group.id) } } |             .btn-group.new-project-subgroup.droplab-dropdown.home-panel-action-button.prepend-top-default.js-new-project-subgroup.qa-new-project-or-subgroup-dropdown{ data: { project_path: new_project_path(namespace_id: @group.id), subgroup_path: new_group_path(parent_id: @group.id) } } | ||||||
|               %input.btn.btn-success.dropdown-primary.js-new-group-child.qa-new-in-group-button{ type: "button", value: new_project_label, data: { action: "new-project" } } |               %input.btn.btn-success.dropdown-primary.js-new-group-child.qa-new-in-group-button{ type: "button", value: new_project_label, data: { action: "new-project" } } | ||||||
|               %button.btn.btn-success.dropdown-toggle.js-dropdown-toggle.qa-new-project-or-subgroup-dropdown-toggle{ type: "button", data: { "dropdown-trigger" => "#new-project-or-subgroup-dropdown", 'display' => 'static' } } |               %button.btn.btn-success.dropdown-toggle.js-dropdown-toggle.qa-new-project-or-subgroup-dropdown-toggle{ type: "button", data: { "dropdown-trigger" => "#new-project-or-subgroup-dropdown", 'display' => 'static' } } | ||||||
|  | @ -47,8 +47,10 @@ | ||||||
|                       .description |                       .description | ||||||
|                         %strong= new_subgroup_label |                         %strong= new_subgroup_label | ||||||
|                         %span= s_("GroupsTree|Create a subgroup in this group.") |                         %span= s_("GroupsTree|Create a subgroup in this group.") | ||||||
|             - else |           - elsif can_create_projects | ||||||
|             = link_to new_project_label, new_project_path(namespace_id: @group.id), class: "btn btn-success prepend-top-default" |             = link_to new_project_label, new_project_path(namespace_id: @group.id), class: "btn btn-success prepend-top-default" | ||||||
|  |           - elsif can_create_subgroups | ||||||
|  |             = link_to new_subgroup_label, new_group_path(parent_id: @group.id), class: "btn btn-success prepend-top-default" | ||||||
| 
 | 
 | ||||||
|   - if @group.description.present? |   - if @group.description.present? | ||||||
|     .group-home-desc.mt-1 |     .group-home-desc.mt-1 | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ | ||||||
|       = expanded ? _('Collapse') : _('Expand') |       = expanded ? _('Collapse') : _('Expand') | ||||||
|     %p |     %p | ||||||
|       = _('Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically.') |       = _('Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically.') | ||||||
|       = link_to _('Read more'), help_page_path('workflow/repository_mirroring'), target: '_blank' |       = link_to _('Read more'), help_page_path('user/project/repository/repository_mirroring.md'), target: '_blank' | ||||||
| 
 | 
 | ||||||
|   .settings-content |   .settings-content | ||||||
|     - if mirror_settings_enabled |     - if mirror_settings_enabled | ||||||
|  |  | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | --- | ||||||
|  | title: Always display new subgroup button when permission is granted | ||||||
|  | merge_request: 28309 | ||||||
|  | author: Mattias Michaux | ||||||
|  | type: fixed | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | --- | ||||||
|  | title: Fix mirror repos docs link | ||||||
|  | merge_request: 30443 | ||||||
|  | author: | ||||||
|  | type: fixed | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | --- | ||||||
|  | title: Move prepend to last line in lib/gitlab files | ||||||
|  | merge_request: 30070 | ||||||
|  | author: Rajendra Kadam | ||||||
|  | type: fixed | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | --- | ||||||
|  | title: Move prepend to last line in lib/gitlab files | ||||||
|  | merge_request: 29938 | ||||||
|  | author: Rajendra | ||||||
|  | type: fixed | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | --- | ||||||
|  | title: Avoid copying diffs as Markdown tables | ||||||
|  | merge_request: 30572 | ||||||
|  | author: | ||||||
|  | type: fixed | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | --- | ||||||
|  | title: Refactor count queries to single query on Projects::EnvironmentsController | ||||||
|  | merge_request: 30073 | ||||||
|  | author: Sashi Kumar | ||||||
|  | type: other | ||||||
|  | @ -25,14 +25,21 @@ Server-side Git hooks are typically placed in the repository's `hooks` | ||||||
| subdirectory. In GitLab, hook directories are symlinked to the GitLab Shell | subdirectory. In GitLab, hook directories are symlinked to the GitLab Shell | ||||||
| `hooks` directory for ease of maintenance between GitLab Shell upgrades. | `hooks` directory for ease of maintenance between GitLab Shell upgrades. | ||||||
| Server hooks are implemented differently, but the behavior is exactly the same | Server hooks are implemented differently, but the behavior is exactly the same | ||||||
| once the hook is created. Follow the steps below to set up a server hook for a | once the hook is created. | ||||||
|  | 
 | ||||||
|  | NOTE: **Note:** | ||||||
|  | If you are not using [hashed storage](repository_storage_types.md#hashed-storage), the project's | ||||||
|  | repository directory might not exactly match the instructions below. In that case, | ||||||
|  | for an installation from source the path is usually `/home/git/repositories/<group>/<project>.git`. | ||||||
|  | For Omnibus installs the path is usually `/var/opt/gitlab/git-data/repositories/<group>/<project>.git`. | ||||||
|  | 
 | ||||||
|  | Follow the steps below to set up a server hook for a | ||||||
| repository: | repository: | ||||||
| 
 | 
 | ||||||
| 1. Pick a project that needs a server hook. | 1. Find that project's path on the GitLab server, by navigating to the | ||||||
| 1. On the GitLab server, navigate to the project's repository directory. |    **Admin area > Projects**. From there, select the project for which you | ||||||
|    For an installation from source the path is usually |    would like to add a hook. You can find the path to the project's repository | ||||||
|    `/home/git/repositories/<group>/<project>.git`. For Omnibus installs the path is |    under **Gitaly relative path** on that page. | ||||||
|    usually `/var/opt/gitlab/git-data/repositories/<group>/<project>.git`. |  | ||||||
| 1. Create a new directory in this location called `custom_hooks`. | 1. Create a new directory in this location called `custom_hooks`. | ||||||
| 1. Inside the new `custom_hooks` directory, create a file with a name matching | 1. Inside the new `custom_hooks` directory, create a file with a name matching | ||||||
|    the hook type. For a pre-receive hook the file name should be `pre-receive` |    the hook type. For a pre-receive hook the file name should be `pre-receive` | ||||||
|  | @ -43,8 +50,7 @@ repository: | ||||||
|    type. For example, if the script is in Ruby the shebang will probably be |    type. For example, if the script is in Ruby the shebang will probably be | ||||||
|    `#!/usr/bin/env ruby`. |    `#!/usr/bin/env ruby`. | ||||||
| 
 | 
 | ||||||
| That's it! Assuming the hook code is properly implemented the hook will fire | Assuming the hook code is properly implemented the hook will run as appropriate. | ||||||
| as appropriate. |  | ||||||
| 
 | 
 | ||||||
| ## Set a global server hook for all repositories | ## Set a global server hook for all repositories | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -151,15 +151,26 @@ request, be sure to start the `dont-interrupt-me` job before pushing. | ||||||
| 
 | 
 | ||||||
| ## PostgreSQL versions testing | ## PostgreSQL versions testing | ||||||
| 
 | 
 | ||||||
|  | ### Current versions testing | ||||||
|  | 
 | ||||||
|  | | Where? | PG version | | ||||||
|  | | ------ | ------ | | ||||||
|  | | MRs | 9.6 | | ||||||
|  | | `master` (non-scheduled pipelines) | 9.6 / 11 | | ||||||
|  | | 2-hourly scheduled pipelines | 9.6 / 11 | | ||||||
|  | | Nightly scheduled pipeline | 9.6 / 10 | | ||||||
|  | 
 | ||||||
|  | ### Long-term plan | ||||||
|  | 
 | ||||||
| We follow the [PostgreSQL versions shipped with Omnibus GitLab](https://docs.gitlab.com/omnibus/package-information/postgresql_versions.html): | We follow the [PostgreSQL versions shipped with Omnibus GitLab](https://docs.gitlab.com/omnibus/package-information/postgresql_versions.html): | ||||||
| 
 | 
 | ||||||
| |        | 12.10 (April 2020) | 13.0 (May 2020) | 13.1 (June 2020) | 13.2 (July 2020) | 13.3 (August 2020) | 13.4, 13.5   | 13.6 (November 2020) | 14.0 (May 2021?) | | | PG version | 12.10 (April 2020) | 13.0 (May 2020) | 13.1 (June 2020) | 13.2 (July 2020) | 13.3 (August 2020) | 13.4, 13.5   | 13.6 (November 2020) | 14.0 (May 2021?) | | ||||||
| | ------ | ------------------ | --------------- | ---------------- | ---------------- | ------------------ | ------------ | -------------------- | ---------------- | | | ------ | ------------------ | --------------- | ---------------- | ---------------- | ------------------ | ------------ | -------------------- | ---------------- | | ||||||
| | PG9.6  | nightly            | -               | -                | -                | -                  | -            | -                    | -                | | | PG9.6  | MRs/`master`/`2-hour`/`nightly` | -               | -                | -                | -                  | -            | -                    | -                | | ||||||
| | PG10   | `master`           | -               | -                | -                | -                  | -            | -                    | -                | | | PG10   | `nightly`           | -               | -                | -                | -                  | -            | -                    | -                | | ||||||
| | PG11   | MRs/`master`       | MRs/`master`    | MRs/`master`     | MRs/`master`     | MRs/`master`       | MRs/`master` | nightly              | -                | | | PG11   | `master`/`2-hour` | MRs/`master`/`2-hour`/`nightly` | MRs/`master`/`2-hour`/`nightly` | MRs/`master`/`2-hour`/`nightly` | MRs/`master`/`2-hour`/`nightly` | MRs/`master`/`2-hour`/`nightly` | `nightly`              | -                | | ||||||
| | PG12   | -                  | -               | -                | -                | `master`           | `master`     | MRs/`master`         | `master`         | | | PG12   | -                  | -               | -                | -                | `master`/`2-hour` | `master`/`2-hour` | MRs/`master`/`2-hour`/`nightly`         | `master`/`2-hour` | | ||||||
| | PG13   | -                  | -               | -                | -                | -                  | -            | -                    | MRs/`master`     | | | PG13   | -                  | -               | -                | -                | -                  | -            | -                    | MRs/`master`/`2-hour`/`nightly`     | | ||||||
| 
 | 
 | ||||||
| ## Pipeline types | ## Pipeline types | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -224,8 +224,8 @@ pip install --index-url https://__token__:<personal_access_token>@gitlab.com/api | ||||||
| Where: | Where: | ||||||
| 
 | 
 | ||||||
| - `<package_name>` is the package name. | - `<package_name>` is the package name. | ||||||
| - `<personal_access_token>` is your personal access token. | - `<personal_access_token>` is a personal access token with the `read_api` scope. | ||||||
| - `<project_id>` is your project id number. | - `<project_id>` is the project id number. | ||||||
| 
 | 
 | ||||||
| If you were following the guide above and want to test installing the | If you were following the guide above and want to test installing the | ||||||
| `MyPyPiPackage` package, you can run the following: | `MyPyPiPackage` package, you can run the following: | ||||||
|  |  | ||||||
|  | @ -29,8 +29,6 @@ module Gitlab | ||||||
| 
 | 
 | ||||||
|           private_constant :REASONS |           private_constant :REASONS | ||||||
| 
 | 
 | ||||||
|           prepend_if_ee('::EE::Gitlab::Ci::Status::Build::Failed') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
| 
 |  | ||||||
|           def status_tooltip |           def status_tooltip | ||||||
|             base_message |             base_message | ||||||
|           end |           end | ||||||
|  | @ -65,3 +63,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::Ci::Status::Build::Failed.prepend_if_ee('::EE::Gitlab::Ci::Status::Build::Failed') | ||||||
|  |  | ||||||
|  | @ -3,8 +3,6 @@ | ||||||
| module Gitlab | module Gitlab | ||||||
|   module Email |   module Email | ||||||
|     module Handler |     module Handler | ||||||
|       prepend_if_ee('::EE::Gitlab::Email::Handler') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
| 
 |  | ||||||
|       def self.handlers |       def self.handlers | ||||||
|         @handlers ||= load_handlers |         @handlers ||= load_handlers | ||||||
|       end |       end | ||||||
|  | @ -27,3 +25,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::Email::Handler.prepend_if_ee('::EE::Gitlab::Email::Handler') | ||||||
|  |  | ||||||
|  | @ -5,8 +5,6 @@ module Gitlab | ||||||
|     # The ParallelImporter schedules the importing of a GitHub project using |     # The ParallelImporter schedules the importing of a GitHub project using | ||||||
|     # Sidekiq. |     # Sidekiq. | ||||||
|     class ParallelImporter |     class ParallelImporter | ||||||
|       prepend_if_ee('::EE::Gitlab::GithubImport::ParallelImporter') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
| 
 |  | ||||||
|       attr_reader :project |       attr_reader :project | ||||||
| 
 | 
 | ||||||
|       def self.async? |       def self.async? | ||||||
|  | @ -41,3 +39,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::GithubImport::ParallelImporter.prepend_if_ee('::EE::Gitlab::GithubImport::ParallelImporter') | ||||||
|  |  | ||||||
|  | @ -4,8 +4,6 @@ module Gitlab | ||||||
|   module ImportExport |   module ImportExport | ||||||
|     module Project |     module Project | ||||||
|       class RelationFactory < Base::RelationFactory |       class RelationFactory < Base::RelationFactory | ||||||
|         prepend_if_ee('::EE::Gitlab::ImportExport::Project::RelationFactory') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
| 
 |  | ||||||
|         OVERRIDES = { snippets: :project_snippets, |         OVERRIDES = { snippets: :project_snippets, | ||||||
|                       ci_pipelines: 'Ci::Pipeline', |                       ci_pipelines: 'Ci::Pipeline', | ||||||
|                       pipelines: 'Ci::Pipeline', |                       pipelines: 'Ci::Pipeline', | ||||||
|  | @ -161,3 +159,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::ImportExport::Project::RelationFactory.prepend_if_ee('::EE::Gitlab::ImportExport::Project::RelationFactory') | ||||||
|  |  | ||||||
|  | @ -4,8 +4,6 @@ module Gitlab | ||||||
|   module Middleware |   module Middleware | ||||||
|     class ReadOnly |     class ReadOnly | ||||||
|       class Controller |       class Controller | ||||||
|         prepend_if_ee('EE::Gitlab::Middleware::ReadOnly::Controller') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
| 
 |  | ||||||
|         DISALLOWED_METHODS = %w(POST PATCH PUT DELETE).freeze |         DISALLOWED_METHODS = %w(POST PATCH PUT DELETE).freeze | ||||||
|         APPLICATION_JSON = 'application/json' |         APPLICATION_JSON = 'application/json' | ||||||
|         APPLICATION_JSON_TYPES = %W{#{APPLICATION_JSON} application/vnd.git-lfs+json}.freeze |         APPLICATION_JSON_TYPES = %W{#{APPLICATION_JSON} application/vnd.git-lfs+json}.freeze | ||||||
|  | @ -144,3 +142,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::Middleware::ReadOnly::Controller.prepend_if_ee('EE::Gitlab::Middleware::ReadOnly::Controller') | ||||||
|  |  | ||||||
|  | @ -2,8 +2,6 @@ | ||||||
| 
 | 
 | ||||||
| module Gitlab | module Gitlab | ||||||
|   class OmniauthInitializer |   class OmniauthInitializer | ||||||
|     prepend_if_ee('::EE::Gitlab::OmniauthInitializer') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
| 
 |  | ||||||
|     def initialize(devise_config) |     def initialize(devise_config) | ||||||
|       @devise_config = devise_config |       @devise_config = devise_config | ||||||
|     end |     end | ||||||
|  | @ -121,3 +119,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::OmniauthInitializer.prepend_if_ee('::EE::Gitlab::OmniauthInitializer') | ||||||
|  |  | ||||||
|  | @ -5,8 +5,6 @@ | ||||||
| module Gitlab | module Gitlab | ||||||
|   module Patch |   module Patch | ||||||
|     module DrawRoute |     module DrawRoute | ||||||
|       prepend_if_ee('EE::Gitlab::Patch::DrawRoute') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
| 
 |  | ||||||
|       RoutesNotFound = Class.new(StandardError) |       RoutesNotFound = Class.new(StandardError) | ||||||
| 
 | 
 | ||||||
|       def draw(routes_name) |       def draw(routes_name) | ||||||
|  | @ -38,3 +36,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::Patch::DrawRoute.prepend_if_ee('EE::Gitlab::Patch::DrawRoute') | ||||||
|  |  | ||||||
|  | @ -3,7 +3,6 @@ | ||||||
| module Gitlab | module Gitlab | ||||||
|   module Prometheus |   module Prometheus | ||||||
|     class MetricGroup |     class MetricGroup | ||||||
|       prepend_if_ee('EE::Gitlab::Prometheus::MetricGroup') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
|       include ActiveModel::Model |       include ActiveModel::Model | ||||||
| 
 | 
 | ||||||
|       attr_accessor :name, :priority, :metrics |       attr_accessor :name, :priority, :metrics | ||||||
|  | @ -31,3 +30,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::Prometheus::MetricGroup.prepend_if_ee('EE::Gitlab::Prometheus::MetricGroup') | ||||||
|  |  | ||||||
|  | @ -4,8 +4,6 @@ module Gitlab | ||||||
|   module Prometheus |   module Prometheus | ||||||
|     module Queries |     module Queries | ||||||
|       module QueryAdditionalMetrics |       module QueryAdditionalMetrics | ||||||
|         prepend_if_ee('EE::Gitlab::Prometheus::Queries::QueryAdditionalMetrics') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
| 
 |  | ||||||
|         def query_metrics(project, environment, query_context) |         def query_metrics(project, environment, query_context) | ||||||
|           matched_metrics(project).map(&query_group(query_context)) |           matched_metrics(project).map(&query_group(query_context)) | ||||||
|             .select(&method(:group_with_any_metrics)) |             .select(&method(:group_with_any_metrics)) | ||||||
|  | @ -99,3 +97,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::Prometheus::Queries::QueryAdditionalMetrics.prepend_if_ee('EE::Gitlab::Prometheus::Queries::QueryAdditionalMetrics') | ||||||
|  |  | ||||||
|  | @ -3,8 +3,6 @@ | ||||||
| module Gitlab | module Gitlab | ||||||
|   module Search |   module Search | ||||||
|     class ParsedQuery |     class ParsedQuery | ||||||
|       prepend_if_ee('EE::Gitlab::Search::ParsedQuery') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
| 
 |  | ||||||
|       attr_reader :term, :filters |       attr_reader :term, :filters | ||||||
| 
 | 
 | ||||||
|       def initialize(term, filters) |       def initialize(term, filters) | ||||||
|  | @ -25,3 +23,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::Search::ParsedQuery.prepend_if_ee('EE::Gitlab::Search::ParsedQuery') | ||||||
|  |  | ||||||
|  | @ -4,8 +4,6 @@ module Gitlab | ||||||
|   module SlashCommands |   module SlashCommands | ||||||
|     module Presenters |     module Presenters | ||||||
|       module IssueBase |       module IssueBase | ||||||
|         prepend_if_ee('EE::Gitlab::SlashCommands::Presenters::IssueBase') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
| 
 |  | ||||||
|         def color(issuable) |         def color(issuable) | ||||||
|           issuable.open? ? '#38ae67' : '#d22852' |           issuable.open? ? '#38ae67' : '#d22852' | ||||||
|         end |         end | ||||||
|  | @ -51,3 +49,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::SlashCommands::Presenters::IssueBase.prepend_if_ee('EE::Gitlab::SlashCommands::Presenters::IssueBase') | ||||||
|  |  | ||||||
|  | @ -2,8 +2,6 @@ | ||||||
| 
 | 
 | ||||||
| module Gitlab | module Gitlab | ||||||
|   class TreeSummary |   class TreeSummary | ||||||
|     prepend_if_ee('::EE::Gitlab::TreeSummary') # rubocop: disable Cop/InjectEnterpriseEditionModule |  | ||||||
| 
 |  | ||||||
|     include ::Gitlab::Utils::StrongMemoize |     include ::Gitlab::Utils::StrongMemoize | ||||||
| 
 | 
 | ||||||
|     CACHE_EXPIRE_IN = 1.hour |     CACHE_EXPIRE_IN = 1.hour | ||||||
|  | @ -135,3 +133,5 @@ module Gitlab | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Gitlab::TreeSummary.prepend_if_ee('::EE::Gitlab::TreeSummary') | ||||||
|  |  | ||||||
|  | @ -262,6 +262,42 @@ describe 'Group' do | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   describe 'new subgroup / project button' do | ||||||
|  |     let(:group) { create(:group, project_creation_level: Gitlab::Access::NO_ONE_PROJECT_ACCESS, subgroup_creation_level: Gitlab::Access::OWNER_SUBGROUP_ACCESS) } | ||||||
|  | 
 | ||||||
|  |     it 'new subgroup button is displayed without project creation permission' do | ||||||
|  |       visit group_path(group) | ||||||
|  | 
 | ||||||
|  |       page.within '.group-buttons' do | ||||||
|  |         expect(page).to have_link('New subgroup') | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     it 'new subgroup button is displayed together with new project button when having project creation permission' do | ||||||
|  |       group.update!(project_creation_level: Gitlab::Access::MAINTAINER_PROJECT_ACCESS) | ||||||
|  |       visit group_path(group) | ||||||
|  | 
 | ||||||
|  |       page.within '.group-buttons' do | ||||||
|  |         expect(page).to have_css("li[data-text='New subgroup']", visible: false) | ||||||
|  |         expect(page).to have_css("li[data-text='New project']", visible: false) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     it 'new project button is displayed without subgroup creation permission' do | ||||||
|  |       group.update!(project_creation_level: Gitlab::Access::MAINTAINER_PROJECT_ACCESS) | ||||||
|  |       user = create(:user) | ||||||
|  | 
 | ||||||
|  |       group.add_maintainer(user) | ||||||
|  |       sign_out(:user) | ||||||
|  |       sign_in(user) | ||||||
|  | 
 | ||||||
|  |       visit group_path(group) | ||||||
|  |       page.within '.group-buttons' do | ||||||
|  |         expect(page).to have_link('New project') | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def remove_with_confirm(button_text, confirm_with) |   def remove_with_confirm(button_text, confirm_with) | ||||||
|     click_button button_text |     click_button button_text | ||||||
|     fill_in 'confirm_name_input', with: confirm_with |     fill_in 'confirm_name_input', with: confirm_with | ||||||
|  |  | ||||||
|  | @ -57,6 +57,18 @@ describe('PasteMarkdownTable', () => { | ||||||
| 
 | 
 | ||||||
|       expect(new PasteMarkdownTable(data).isTable()).toBe(false); |       expect(new PasteMarkdownTable(data).isTable()).toBe(false); | ||||||
|     }); |     }); | ||||||
|  | 
 | ||||||
|  |     it('returns false when the table copy comes from a diff', () => { | ||||||
|  |       data.types = ['text/html', 'text/plain']; | ||||||
|  |       data.getData = jest.fn().mockImplementation(mimeType => { | ||||||
|  |         if (mimeType === 'text/html') { | ||||||
|  |           return '<table class="diff-wrap-lines"><tr><td>First</td><td>Second</td></tr></table>'; | ||||||
|  |         } | ||||||
|  |         return 'First\tSecond'; | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       expect(new PasteMarkdownTable(data).isTable()).toBe(false); | ||||||
|  |     }); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   describe('convertToTableMarkdown', () => { |   describe('convertToTableMarkdown', () => { | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ import Dashboard from '~/monitoring/components/dashboard.vue'; | ||||||
| import DateTimePicker from '~/vue_shared/components/date_time_picker/date_time_picker.vue'; | import DateTimePicker from '~/vue_shared/components/date_time_picker/date_time_picker.vue'; | ||||||
| import CustomMetricsFormFields from '~/custom_metrics/components/custom_metrics_form_fields.vue'; | import CustomMetricsFormFields from '~/custom_metrics/components/custom_metrics_form_fields.vue'; | ||||||
| import DashboardsDropdown from '~/monitoring/components/dashboards_dropdown.vue'; | import DashboardsDropdown from '~/monitoring/components/dashboards_dropdown.vue'; | ||||||
|  | import EmptyState from '~/monitoring/components/empty_state.vue'; | ||||||
| import GroupEmptyState from '~/monitoring/components/group_empty_state.vue'; | import GroupEmptyState from '~/monitoring/components/group_empty_state.vue'; | ||||||
| import DashboardPanel from '~/monitoring/components/dashboard_panel.vue'; | import DashboardPanel from '~/monitoring/components/dashboard_panel.vue'; | ||||||
| import { createStore } from '~/monitoring/stores'; | import { createStore } from '~/monitoring/stores'; | ||||||
|  | @ -33,9 +34,6 @@ describe('Dashboard', () => { | ||||||
|   const createShallowWrapper = (props = {}, options = {}) => { |   const createShallowWrapper = (props = {}, options = {}) => { | ||||||
|     wrapper = shallowMount(Dashboard, { |     wrapper = shallowMount(Dashboard, { | ||||||
|       propsData: { ...propsData, ...props }, |       propsData: { ...propsData, ...props }, | ||||||
|       methods: { |  | ||||||
|         fetchData: jest.fn(), |  | ||||||
|       }, |  | ||||||
|       store, |       store, | ||||||
|       ...options, |       ...options, | ||||||
|     }); |     }); | ||||||
|  | @ -44,9 +42,6 @@ describe('Dashboard', () => { | ||||||
|   const createMountedWrapper = (props = {}, options = {}) => { |   const createMountedWrapper = (props = {}, options = {}) => { | ||||||
|     wrapper = mount(Dashboard, { |     wrapper = mount(Dashboard, { | ||||||
|       propsData: { ...propsData, ...props }, |       propsData: { ...propsData, ...props }, | ||||||
|       methods: { |  | ||||||
|         fetchData: jest.fn(), |  | ||||||
|       }, |  | ||||||
|       store, |       store, | ||||||
|       stubs: ['graph-group', 'dashboard-panel'], |       stubs: ['graph-group', 'dashboard-panel'], | ||||||
|       ...options, |       ...options, | ||||||
|  | @ -56,14 +51,14 @@ describe('Dashboard', () => { | ||||||
|   beforeEach(() => { |   beforeEach(() => { | ||||||
|     store = createStore(); |     store = createStore(); | ||||||
|     mock = new MockAdapter(axios); |     mock = new MockAdapter(axios); | ||||||
|  |     jest.spyOn(store, 'dispatch').mockResolvedValue(); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   afterEach(() => { |   afterEach(() => { | ||||||
|     if (wrapper) { |  | ||||||
|       wrapper.destroy(); |  | ||||||
|       wrapper = null; |  | ||||||
|     } |  | ||||||
|     mock.restore(); |     mock.restore(); | ||||||
|  |     if (store.dispatch.mockReset) { | ||||||
|  |       store.dispatch.mockReset(); | ||||||
|  |     } | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   describe('no metrics are available yet', () => { |   describe('no metrics are available yet', () => { | ||||||
|  | @ -104,9 +99,7 @@ describe('Dashboard', () => { | ||||||
| 
 | 
 | ||||||
|   describe('request information to the server', () => { |   describe('request information to the server', () => { | ||||||
|     it('calls to set time range and fetch data', () => { |     it('calls to set time range and fetch data', () => { | ||||||
|       jest.spyOn(store, 'dispatch'); |       createShallowWrapper({ hasMetrics: true }); | ||||||
| 
 |  | ||||||
|       createShallowWrapper({ hasMetrics: true }, { methods: {} }); |  | ||||||
| 
 | 
 | ||||||
|       return wrapper.vm.$nextTick().then(() => { |       return wrapper.vm.$nextTick().then(() => { | ||||||
|         expect(store.dispatch).toHaveBeenCalledWith( |         expect(store.dispatch).toHaveBeenCalledWith( | ||||||
|  | @ -119,10 +112,13 @@ describe('Dashboard', () => { | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     it('shows up a loading state', () => { |     it('shows up a loading state', () => { | ||||||
|       createShallowWrapper({ hasMetrics: true }, { methods: {} }); |       store.state.monitoringDashboard.emptyState = 'loading'; | ||||||
|  | 
 | ||||||
|  |       createShallowWrapper({ hasMetrics: true }); | ||||||
| 
 | 
 | ||||||
|       return wrapper.vm.$nextTick().then(() => { |       return wrapper.vm.$nextTick().then(() => { | ||||||
|         expect(wrapper.vm.emptyState).toEqual('loading'); |         expect(wrapper.find(EmptyState).exists()).toBe(true); | ||||||
|  |         expect(wrapper.find(EmptyState).props('selectedState')).toBe('loading'); | ||||||
|       }); |       }); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  | @ -254,6 +250,10 @@ describe('Dashboard', () => { | ||||||
|       return wrapper.vm.$nextTick(); |       return wrapper.vm.$nextTick(); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  |     afterEach(() => { | ||||||
|  |       wrapper.destroy(); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|     it('renders a search input', () => { |     it('renders a search input', () => { | ||||||
|       expect(wrapper.find({ ref: 'monitorEnvironmentsDropdownSearch' }).exists()).toBe(true); |       expect(wrapper.find({ ref: 'monitorEnvironmentsDropdownSearch' }).exists()).toBe(true); | ||||||
|     }); |     }); | ||||||
|  | @ -322,8 +322,10 @@ describe('Dashboard', () => { | ||||||
|     const findRearrangeButton = () => wrapper.find('.js-rearrange-button'); |     const findRearrangeButton = () => wrapper.find('.js-rearrange-button'); | ||||||
| 
 | 
 | ||||||
|     beforeEach(() => { |     beforeEach(() => { | ||||||
|       createShallowWrapper({ hasMetrics: true }); |       // call original dispatch
 | ||||||
|  |       store.dispatch.mockRestore(); | ||||||
| 
 | 
 | ||||||
|  |       createShallowWrapper({ hasMetrics: true }); | ||||||
|       setupStoreWithData(wrapper.vm.$store); |       setupStoreWithData(wrapper.vm.$store); | ||||||
| 
 | 
 | ||||||
|       return wrapper.vm.$nextTick(); |       return wrapper.vm.$nextTick(); | ||||||
|  |  | ||||||
|  | @ -18,21 +18,11 @@ describe('Dashboard template', () => { | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   afterEach(() => { |   afterEach(() => { | ||||||
|     if (wrapper) { |  | ||||||
|       wrapper.destroy(); |  | ||||||
|       wrapper = null; |  | ||||||
|     } |  | ||||||
|     mock.restore(); |     mock.restore(); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   it('matches the default snapshot', () => { |   it('matches the default snapshot', () => { | ||||||
|     wrapper = shallowMount(Dashboard, { |     wrapper = shallowMount(Dashboard, { propsData: { ...propsData }, store }); | ||||||
|       propsData: { ...propsData }, |  | ||||||
|       methods: { |  | ||||||
|         fetchData: jest.fn(), |  | ||||||
|       }, |  | ||||||
|       store, |  | ||||||
|     }); |  | ||||||
| 
 | 
 | ||||||
|     expect(wrapper.element).toMatchSnapshot(); |     expect(wrapper.element).toMatchSnapshot(); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|  | @ -1311,4 +1311,25 @@ describe Environment, :use_clean_rails_memory_store_caching do | ||||||
|       expect { environment.destroy }.to change { project.commit(deployment.ref_path) }.to(nil) |       expect { environment.destroy }.to change { project.commit(deployment.ref_path) }.to(nil) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | 
 | ||||||
|  |   describe '.count_by_state' do | ||||||
|  |     context 'when environments are not empty' do | ||||||
|  |       let!(:environment1) { create(:environment, project: project, state: 'stopped') } | ||||||
|  |       let!(:environment2) { create(:environment, project: project, state: 'available') } | ||||||
|  |       let!(:environment3) { create(:environment, project: project, state: 'stopped') } | ||||||
|  | 
 | ||||||
|  |       it 'returns the environments count grouped by state' do | ||||||
|  |         expect(project.environments.count_by_state).to eq({ stopped: 2, available: 1 }) | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       it 'returns the environments count grouped by state with zero value' do | ||||||
|  |         environment2.update(state: 'stopped') | ||||||
|  |         expect(project.environments.count_by_state).to eq({ stopped: 3, available: 0 }) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     it 'returns zero state counts when environments are empty' do | ||||||
|  |       expect(project.environments.count_by_state).to eq({ stopped: 0, available: 0 }) | ||||||
|  |     end | ||||||
|  |   end | ||||||
| end | end | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue