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,32 +24,33 @@
|
||||||
- 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_projects and can_create_subgroups
|
||||||
- if 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' } }
|
= sprite_icon("chevron-down", css_class: "icon dropdown-btn-icon")
|
||||||
= sprite_icon("chevron-down", css_class: "icon dropdown-btn-icon")
|
%ul#new-project-or-subgroup-dropdown.dropdown-menu.dropdown-menu-right{ data: { dropdown: true } }
|
||||||
%ul#new-project-or-subgroup-dropdown.dropdown-menu.dropdown-menu-right{ data: { dropdown: true } }
|
%li.droplab-item-selected.qa-new-project-option{ role: "button", data: { value: "new-project", text: new_project_label } }
|
||||||
%li.droplab-item-selected.qa-new-project-option{ role: "button", data: { value: "new-project", text: new_project_label } }
|
.menu-item
|
||||||
|
.icon-container
|
||||||
|
= icon("check", class: "list-item-checkmark")
|
||||||
|
.description
|
||||||
|
%strong= new_project_label
|
||||||
|
%span= s_("GroupsTree|Create a project in this group.")
|
||||||
|
%li.divider.droplap-item-ignore
|
||||||
|
%li.qa-new-subgroup-option{ role: "button", data: { value: "new-subgroup", text: new_subgroup_label } }
|
||||||
.menu-item
|
.menu-item
|
||||||
.icon-container
|
.icon-container
|
||||||
= icon("check", class: "list-item-checkmark")
|
= icon("check", class: "list-item-checkmark")
|
||||||
.description
|
.description
|
||||||
%strong= new_project_label
|
%strong= new_subgroup_label
|
||||||
%span= s_("GroupsTree|Create a project in this group.")
|
%span= s_("GroupsTree|Create a subgroup in this group.")
|
||||||
%li.divider.droplap-item-ignore
|
- elsif can_create_projects
|
||||||
%li.qa-new-subgroup-option{ role: "button", data: { value: "new-subgroup", text: new_subgroup_label } }
|
= link_to new_project_label, new_project_path(namespace_id: @group.id), class: "btn btn-success prepend-top-default"
|
||||||
.menu-item
|
- elsif can_create_subgroups
|
||||||
.icon-container
|
= link_to new_subgroup_label, new_group_path(parent_id: @group.id), class: "btn btn-success prepend-top-default"
|
||||||
= icon("check", class: "list-item-checkmark")
|
|
||||||
.description
|
|
||||||
%strong= new_subgroup_label
|
|
||||||
%span= s_("GroupsTree|Create a subgroup in this group.")
|
|
||||||
- else
|
|
||||||
= link_to new_project_label, new_project_path(namespace_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