New upstream version 14.1.7+ds1

This commit is contained in:
Sruthi Chandran 2021-09-30 23:02:18 +05:30
parent 112e489d1c
commit bea6aeeaf6
6323 changed files with 197758 additions and 132259 deletions

View file

@ -1,16 +1,16 @@
#
# This list of browsers is a conservative first definition, based on
# This list of browsers is a conservative definition, based on
# https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers
# with the following reasoning:
#
# - Edge: Pick the last two major version before the Chrome switch
# - Rest: We should support the latest ESR of Firefox: 68, because it used quite a lot.
# For the rest, pick browser versions that have a similar age to Firefox 68.
# - We should support the latest ESR of Firefox: 78, because it used quite a lot.
# - We use Edge/Chrome >= 84 because 83 had an annoying bug which would mean we
# need to polyfill Array.reduce: https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
# - Safari 13.1 because it is the current minor version of the previous major version
#
# See also this follow-up epic:
# https://gitlab.com/groups/gitlab-org/-/epics/3957
# See also this epic: https://gitlab.com/groups/gitlab-org/-/epics/3957
#
chrome >= 73
edge >= 17
firefox >= 68
safari >= 12
chrome >= 84
edge >= 84
firefox >= 78
safari >= 13.1

View file

@ -7,3 +7,4 @@
/public/
/tmp/
/vendor/
/sitespeed-result/

View file

@ -107,3 +107,7 @@ overrides:
import/no-nodejs-modules: off
filenames/match-regex: off
no-console: off
- files:
- '*.stories.js'
rules:
filenames/match-regex: off

1
.gitignore vendored
View file

@ -45,7 +45,6 @@ eslint-report.html
/config/redis.trace_chunks.yml
/config/unicorn.rb
/config/puma.rb
/config/puma_actioncable.rb
/config/secrets.yml
/config/sidekiq.yml
/config/registry.key

View file

@ -18,6 +18,7 @@
/doc/administration/monitoring/ @ngaskill
/doc/administration/operations/ @axil @eread @marcia
/doc/administration/packages/ @ngaskill
/doc/administration/pages/ @axil @kpaizee
/doc/administration/postgresql/ @marcia
/doc/administration/raketasks/ @axil @eread
/doc/administration/redis/ @axil
@ -213,17 +214,20 @@ Dangerfile @gl-quality/eng-prod
# Secure & Threat Management ownership delineation
# https://about.gitlab.com/handbook/engineering/development/threat-management/delineate-secure-threat-management.html#technical-boundaries
[Threat Insights]
/app/finders/security/ @gitlab-org/secure/threat-insights-backend-team
/app/models/vulnerability.rb @gitlab-org/secure/threat-insights-backend-team
/ee/app/finders/security/ @gitlab-org/secure/threat-insights-backend-team
/ee/app/models/security/ @gitlab-org/secure/threat-insights-backend-team
/ee/app/models/vulnerabilities/ @gitlab-org/secure/threat-insights-backend-team
/ee/app/policies/vulnerabilities/ @gitlab-org/secure/threat-insights-backend-team
/ee/app/policies/vulnerability*.rb @gitlab-org/secure/threat-insights-backend-team
/ee/app/presenters/projects/security/ @gitlab-org/secure/threat-insights-backend-team
/ee/lib/api/vulnerabilit*.rb @gitlab-org/secure/threat-insights-backend-team
/ee/lib/gitlab/ci/reports/security/vulnerability_reports_comparer.rb @gitlab-org/secure/threat-insights-backend-team
/ee/spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb @gitlab-org/secure/threat-insights-backend-team
/ee/spec/policies/vulnerabilities/ @gitlab-org/secure/threat-insights-backend-team
/ee/spec/policies/vulnerability*.rb @gitlab-org/secure/threat-insights-backend-team
/ee/spec/presenters/projects/security/ @gitlab-org/secure/threat-insights-backend-team
[Secure]
/ee/lib/gitlab/ci/parsers/license_compliance/ @gitlab-org/secure/composition-analysis-be
@ -232,6 +236,7 @@ Dangerfile @gl-quality/eng-prod
/ee/lib/gitlab/ci/reports/dependency_list/ @gitlab-org/secure/composition-analysis-be
/ee/lib/gitlab/ci/reports/license_scanning/ @gitlab-org/secure/composition-analysis-be
/ee/lib/gitlab/ci/reports/security/ @gitlab-org/secure/composition-analysis-be @gitlab-org/secure/dynamic-analysis-be @gitlab-org/secure/static-analysis-be @gitlab-org/secure/fuzzing-be
/ee/app/services/ci/run_dast_scan_service.rb @gitlab-org/secure/dynamic-analysis-be
[Container Security]
/ee/app/views/projects/threat_monitoring/** @gitlab-org/protect/container-security-frontend

View file

@ -1,43 +1,48 @@
# This image is used by the `review-qa-*` jobs. The image name is also passed to the downstream `omnibus-gitlab-mirror` pipeline
# triggered by `package-and-qa` so that it doesn't have to rebuild it a second time. The downstream `omnibus-gitlab-mirror` pipeline
# itself passes the image name to the `gitlab-qa-mirror` pipeline so that it can use it instead of inferring an end-to-end image
# from the GitLab image built by the downstream `omnibus-gitlab-mirror` pipeline.
.base-image-build:
extends: .use-kaniko
script:
# With .git/hooks/post-checkout in place, Git tries to pull LFS objects, but the image doesn't have Git LFS, and we actually don't care about it for this specific so we just remove the file.
# Without removing the file, the error is as follows: "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/post-checkout."
- rm -f .git/hooks/post-checkout
- if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
echo "Checking out \$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA ($CI_MERGE_REQUEST_SOURCE_BRANCH_SHA) instead of \$CI_COMMIT_SHA (merge result commit $CI_COMMIT_SHA) so that GitLab image built in omnibus-gitlab-mirror and QA image are in sync.";
git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
else
echo "Building the image from \$CI_COMMIT_SHA ($CI_COMMIT_SHA) for this non-merge result pipeline.";
fi;
- echo "See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/index.html#with-pipeline-for-merged-results for more details.";
retry: 2
# This image is used by:
# - The `review-qa-*` jobs
# - The downstream `omnibus-gitlab-mirror` pipeline triggered by `package-and-qa` so that it doesn't have to rebuild it again.
# The downstream `omnibus-gitlab-mirror` pipeline itself passes the image name to the `gitlab-qa-mirror` pipeline so that
# it can use it instead of inferring an end-to-end imag from the GitLab image built by the downstream `omnibus-gitlab-mirror` pipeline.
# See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/index.html#testing-code-in-merge-requests for more details.
build-qa-image:
extends:
- .use-kaniko
- .base-image-build
- .build-images:rules:build-qa-image
stage: build-images
needs: []
variables:
QA_IMAGE: "${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_REF_SLUG}"
script:
# With .git/hooks/post-checkout in place, Git tries to pull LFS objects, but the image doesn't have Git LFS, and we actually don't care about it for this specific so we just remove the file.
# Without removing the file, the error is as follows: "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/post-checkout."
- rm .git/hooks/post-checkout
# Use $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA so that GitLab image built in omnibus-gitlab-mirror and QA image are in sync.
# This falls back to $CI_COMMIT_SHA (the default checked out commit) for the non-merged result pipelines.
# See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/index.html#with-pipeline-for-merged-results.
- if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
fi
- !reference [.base-image-build, script]
- /kaniko/executor --context=${CI_PROJECT_DIR} --dockerfile=${CI_PROJECT_DIR}/qa/Dockerfile --destination=${QA_IMAGE} --cache=true
retry: 2
# This image is used by:
# - The `CNG` pipelines (via the `review-build-cng` job): https://gitlab.com/gitlab-org/build/CNG/-/blob/cfc67136d711e1c8c409bf8e57427a644393da2f/.gitlab-ci.yml#L335
# - The `omnibus-gitlab` pipelines (via the `package-and-qa` job): https://gitlab.com/gitlab-org/omnibus-gitlab/-/blob/dfd1ad475868fc84e91ab7b5706aa03e46dc3a86/.gitlab-ci.yml#L130
build-assets-image:
extends:
- .use-kaniko
- .base-image-build
- .build-images:rules:build-assets-image
stage: build-images
needs: ["compile-production-assets"]
variables:
GIT_DEPTH: "1"
script:
- !reference [.base-image-build, script]
# TODO: Change the image tag to be the MD5 of assets files and skip image building if the image exists
# We'll also need to pass GITLAB_ASSETS_TAG to the trigerred omnibus-gitlab pipeline similarly to how we do it for trigerred CNG pipelines
# https://gitlab.com/gitlab-org/gitlab/issues/208389
- run_timed_command "scripts/build_assets_image"
retry: 2

View file

@ -53,7 +53,7 @@ docs-lint markdown:
docs-lint links:
extends:
- .docs:rules:docs-lint
image: registry.gitlab.com/gitlab-org/gitlab-docs/lint-html:alpine-3.13-ruby-2.7.2
image: registry.gitlab.com/gitlab-org/gitlab-docs/lint-html:alpine-3.13-ruby-2.7.2-d2b92621
stage: test
needs: []
script:

View file

@ -2,6 +2,10 @@
- source scripts/utils.sh
- run_timed_command "retry yarn install --frozen-lockfile"
.storybook-yarn-install: &storybook-yarn-install
- source scripts/utils.sh
- run_timed_command "retry yarn run storybook:install --frozen-lockfile"
.compile-assets-base:
extends:
- .default-retry
@ -38,6 +42,15 @@ compile-production-assets:
- public/assets/
- webpack-report/
when: always
before_script:
- if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
echo "Checking out \$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA ($CI_MERGE_REQUEST_SOURCE_BRANCH_SHA) instead of \$CI_COMMIT_SHA (merge result commit $CI_COMMIT_SHA) so that GitLab assets image tag actually reflect the commit for which assets were compiled.";
git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
else
echo "Building the image from \$CI_COMMIT_SHA ($CI_COMMIT_SHA) for this non-merge result pipeline.";
fi;
- echo "See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/index.html#with-pipeline-for-merged-results for more details.";
- !reference [.default-before_script, before_script]
after_script:
- rm -f /etc/apt/sources.list.d/google*.list # We don't need to update Chrome here
@ -83,6 +96,15 @@ update-yarn-cache:
script:
- *yarn-install
update-storybook-yarn-cache:
extends:
- .default-retry
- .storybook-yarn-cache-push
- .shared:rules:update-cache
stage: prepare
script:
- *storybook-yarn-install
.frontend-fixtures-base:
extends:
- .default-retry
@ -97,7 +119,7 @@ update-yarn-cache:
- run_timed_command "gem install knapsack --no-document"
- run_timed_command "scripts/gitaly-test-spawn"
- source ./scripts/rspec_helpers.sh
- rspec_paralellized_job "--tag frontend_fixture"
- rspec_paralellized_job
artifacts:
name: frontend-fixtures
expire_in: 31d
@ -351,3 +373,29 @@ startup-css-check as-if-foss:
needs:
- job: "compile-test-assets as-if-foss"
- job: "rspec frontend_fixture as-if-foss"
.compile-storybook-base:
extends:
- .frontend-test-base
- .storybook-yarn-cache
script:
- *yarn-install # storybook depends on the global webpack config, so we must install global deps.
- *storybook-yarn-install
- yarn run storybook:build
compile-storybook:
extends:
- .compile-storybook-base
- .frontend:rules:default-frontend-jobs
artifacts:
name: storybook
expire_in: 31d
when: always
paths:
- storybook/public
compile-storybook as-if-foss:
extends:
- .compile-storybook-base
- .as-if-foss
- .frontend:rules:default-frontend-jobs-as-if-foss

View file

@ -75,7 +75,7 @@
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.assets-cache: &assets-cache
key: "assets-${NODE_ENV}-v1"
key: "assets-${NODE_ENV}-v2"
paths:
- assets-hash.txt
- public/assets/webpack/
@ -88,6 +88,16 @@
<<: *assets-cache
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.storybook-node-modules-cache: &storybook-node-modules-cache
key: "storybook-node-modules-${NODE_ENV}-v1"
paths:
- storybook/node_modules/
policy: pull
.storybook-node-modules-cache-push: &storybook-node-modules-cache-push
<<: *storybook-node-modules-cache
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.rubocop-cache: &rubocop-cache
key: "rubocop-v1"
paths:
@ -181,6 +191,14 @@
- *node-modules-cache-push
- *assets-cache-push
.storybook-yarn-cache:
cache:
- *storybook-node-modules-cache
.storybook-yarn-cache-push:
cache:
- *storybook-node-modules-cache-push
.use-pg11:
image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-11-graphicsmagick-1.3.36"
services:
@ -199,6 +217,15 @@
variables:
POSTGRES_HOST_AUTH_METHOD: trust
.use-pg13:
image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-13-graphicsmagick-1.3.36"
services:
- name: postgres:13
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- name: redis:5.0-alpine
variables:
POSTGRES_HOST_AUTH_METHOD: trust
.use-pg11-ee:
image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-11-graphicsmagick-1.3.36"
services:
@ -221,6 +248,17 @@
variables:
POSTGRES_HOST_AUTH_METHOD: trust
.use-pg13-ee:
image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-13-graphicsmagick-1.3.36"
services:
- name: postgres:13
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- name: redis:5.0-alpine
- name: elasticsearch:7.11.1
command: ["elasticsearch", "-E", "discovery.type=single-node"]
variables:
POSTGRES_HOST_AUTH_METHOD: trust
.use-kaniko:
image:
name: registry.gitlab.com/gitlab-org/gitlab-build-images:kaniko

View file

@ -1,3 +1,7 @@
.compress-public: &compress-public
- find public -type f -regex '.*\.\(htm\|html\|txt\|text\|js\|json\|css\|svg\|xml\)$' -exec gzip -f -k {} \;
- find public -type f -regex '.*\.\(htm\|html\|txt\|text\|js\|json\|css\|svg\|xml\)$' -exec brotli -f -k {} \;
pages:
extends:
- .default-retry
@ -8,14 +12,18 @@ pages:
- coverage-frontend
- karma
- compile-production-assets
- compile-storybook
before_script:
- apt-get update && apt-get -y install brotli gzip
script:
- mv public/ .public/
- mkdir public/
- mv coverage/ public/coverage-ruby/ || true
- mv coverage-frontend/ public/coverage-frontend/ || true
- mv coverage-javascript/ public/coverage-javascript/ || true
- mv storybook/public public/storybook || true
- cp .public/assets/application-*.css public/application.css || true
- cp .public/assets/application-*.css.gz public/application.css.gz || true
- *compress-public
artifacts:
paths:
- public

View file

@ -47,7 +47,6 @@
- rspec_profiling/
- tmp/capybara/
- tmp/memory_test/
- tmp/feature_flags/
- log/*.log
reports:
junit: junit_rspec.xml
@ -75,6 +74,11 @@
- .use-pg12
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets as-if-foss", "detect-tests"]
.rspec-base-pg13:
extends:
- .rspec-base
- .use-pg13
.rspec-ee-base-pg11:
extends:
- .rspec-base
@ -85,6 +89,11 @@
- .rspec-base
- .use-pg12-ee
.rspec-ee-base-pg13:
extends:
- .rspec-base
- .use-pg13-ee
.rspec-ee-base-geo:
extends: .rspec-base
script:
@ -101,6 +110,11 @@
- .rspec-ee-base-geo
- .use-pg12-ee
.rspec-ee-base-geo-pg13:
extends:
- .rspec-ee-base-geo
- .use-pg13-ee
.db-job-base:
extends:
- .rails-job-base
@ -114,7 +128,7 @@
############################
# rspec job parallel configs
.rspec-migration-parallel:
parallel: 7
parallel: 9
.rspec-ee-migration-parallel:
parallel: 3
@ -123,7 +137,7 @@
parallel: 20
.rspec-ee-unit-parallel:
parallel: 10
parallel: 12
.rspec-ee-unit-geo-parallel:
parallel: 2
@ -149,13 +163,16 @@ setup-test-env:
- .rails-job-base
- .setup-test-env-cache
- .rails:rules:code-backstage-qa
- .use-pg12
stage: prepare
variables:
GITLAB_TEST_EAGER_LOAD: "0"
SETUP_DB: "false"
script:
- run_timed_command "bundle exec ruby -I. -e 'require \"config/environment\"; TestEnv.init'"
- run_timed_command "scripts/setup-test-env"
- echo -e "\e[0Ksection_start:`date +%s`:gitaly-test-build[collapsed=true]\r\e[0KCompiling Gitaly binaries"
- run_timed_command "scripts/gitaly-test-build" # Do not use 'bundle exec' here
- echo -e "\e[0Ksection_end:`date +%s`:gitaly-test-build\r\e[0K"
artifacts:
expire_in: 7d
paths:
@ -240,6 +257,11 @@ static-analysis:
script:
- run_timed_command "retry yarn install --frozen-lockfile"
- scripts/static-analysis
artifacts:
expire_in: 31d
when: always
paths:
- tmp/feature_flags/
static-analysis as-if-foss:
extends:
@ -247,6 +269,22 @@ static-analysis as-if-foss:
- .static-analysis:rules:as-if-foss
- .as-if-foss
zeitwerk-check:
extends:
- .rails-cache
- .default-before_script
- .rails:rules:ee-and-foss-unit
variables:
BUNDLE_WITHOUT: ""
SETUP_DB: "false"
needs: []
stage: test
script:
- sed -i -e "s/config\.autoloader = :classic/config\.autoloader = :zeitwerk/" config/application.rb
- RAILS_ENV=test bundle exec rake zeitwerk:check
- RAILS_ENV=development bundle exec rake zeitwerk:check
- RAILS_ENV=production bundle exec rake zeitwerk:check
rspec migration pg12:
extends:
- .rspec-base-pg12
@ -358,11 +396,10 @@ db:migrate-from-previous-major-version:
- sed -i -e "s/gem 'mimemagic', '~> 0.3.2'/gem 'ruby-magic', '~> 0.4.0'/" Gemfile
- run_timed_command "gem install bundler:1.17.3"
- run_timed_command "bundle update google-protobuf nokogiri grpc mimemagic bootsnap"
- run_timed_command "bundle install ${BUNDLE_INSTALL_FLAGS}"
- cp config/gitlab.yml.example config/gitlab.yml
- SETUP_DB=false USE_BUNDLE_INSTALL=true bash scripts/prepare_build.sh
- run_timed_command "bundle exec rake db:drop db:create db:structure:load db:migrate db:seed_fu"
- git checkout -f $CI_COMMIT_SHA
- run_timed_command "bundle install ${BUNDLE_INSTALL_FLAGS}"
- SETUP_DB=false USE_BUNDLE_INSTALL=true bash scripts/prepare_build.sh
- run_timed_command "bundle exec rake db:migrate"
db:rollback:
@ -490,23 +527,7 @@ rspec:feature-flags:
- .coverage-base
- .rails:rules:rspec-feature-flags
stage: post-test
# We cannot use needs since it would mean needing 84 jobs (since most are parallelized)
# so we use `dependencies` here.
dependencies:
- setup-test-env
- rspec migration pg12
- rspec unit pg12
- rspec integration pg12
- rspec system pg12
- rspec-ee migration pg12
- rspec-ee unit pg12
- rspec-ee integration pg12
- rspec-ee system pg12
- rspec-ee unit pg12 geo
- rspec-ee integration pg12 geo
- rspec-ee system pg12 geo
- memory-static
- memory-on-boot
needs: ["static-analysis"]
script:
- !reference [.minimal-bundle-install, script]
- if [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then
@ -667,6 +688,8 @@ db:rollback geo:
##########################################
# EE/FOSS: default branch nightly scheduled jobs #
# PG11
rspec migration pg11:
extends:
- .rspec-base-pg11
@ -691,11 +714,40 @@ rspec system pg11:
- .rspec-base-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage
- .rspec-system-parallel
# PG13
rspec migration pg13:
extends:
- .rspec-base-pg13
- .rspec-base-migration
- .rails:rules:default-branch-schedule-nightly--code-backstage
- .rspec-migration-parallel
rspec unit pg13:
extends:
- .rspec-base-pg13
- .rails:rules:default-branch-schedule-nightly--code-backstage
- .rspec-unit-parallel
rspec integration pg13:
extends:
- .rspec-base-pg13
- .rails:rules:default-branch-schedule-nightly--code-backstage
- .rspec-integration-parallel
rspec system pg13:
extends:
- .rspec-base-pg13
- .rails:rules:default-branch-schedule-nightly--code-backstage
- .rspec-system-parallel
# EE/FOSS: default branch nightly scheduled jobs #
##########################################
#####################################
# EE: default branch nightly scheduled jobs #
# PG11
rspec-ee migration pg11:
extends:
- .rspec-ee-base-pg11
@ -736,6 +788,48 @@ rspec-ee system pg11 geo:
extends:
- .rspec-ee-base-geo-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
# PG13
rspec-ee migration pg13:
extends:
- .rspec-ee-base-pg13
- .rspec-base-migration
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-migration-parallel
rspec-ee unit pg13:
extends:
- .rspec-ee-base-pg13
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-unit-parallel
rspec-ee integration pg13:
extends:
- .rspec-ee-base-pg13
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-integration-parallel
rspec-ee system pg13:
extends:
- .rspec-ee-base-pg13
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-system-parallel
rspec-ee unit pg13 geo:
extends:
- .rspec-ee-base-geo-pg13
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-unit-geo-parallel
rspec-ee integration pg13 geo:
extends:
- .rspec-ee-base-geo-pg13
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
rspec-ee system pg13 geo:
extends:
- .rspec-ee-base-geo-pg13
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
# EE: default branch nightly scheduled jobs #
#####################################

View file

@ -74,33 +74,35 @@ gemnasium-dependency_scanning:
- apk add jq
# Lower execa severity based on https://gitlab.com/gitlab-org/gitlab/-/issues/223859#note_452922390
- jq '(.vulnerabilities[] | select (.cve == "yarn.lock:execa:gemnasium:05cfa2e8-2d0c-42c1-8894-638e2f12ff3d")).severity = "Medium"' gl-dependency-scanning-report.json > temp.json && mv temp.json gl-dependency-scanning-report.json
rules: !reference [".reports:rules:dependency_scanning", rules]
rules: !reference [".reports:rules:gemnasium-dependency_scanning", rules]
bundler-audit-dependency_scanning:
rules: !reference [".reports:rules:dependency_scanning", rules]
rules: !reference [".reports:rules:bundler-audit-dependency_scanning", rules]
retire-js-dependency_scanning:
rules: !reference [".reports:rules:dependency_scanning", rules]
rules: !reference [".reports:rules:retire-js-dependency_scanning", rules]
gemnasium-python-dependency_scanning:
rules: !reference [".reports:rules:dependency_scanning", rules]
rules: !reference [".reports:rules:gemnasium-python-dependency_scanning", rules]
# Analyze dependencies for malicious behavior
# See https://gitlab.com/gitlab-com/gl-security/security-research/package-hunter
package_hunter:
.package_hunter-base:
extends:
- .default-retry
- .reports:rules:package_hunter
stage: test
image:
name: registry.gitlab.com/gitlab-com/gl-security/security-research/package-hunter-cli:latest
name: registry.gitlab.com/gitlab-com/gl-security/security-research/package-hunter-cli:1.1.0
entrypoint: [""]
variables:
DEBUG: '*'
HTR_user: '$PACKAGE_HUNTER_USER'
HTR_pass: '$PACKAGE_HUNTER_PASS'
needs: []
allow_failure: true
script:
before_script:
- rm -r spec locale .git app/assets/images doc/
- cd .. && tar -I "gzip --best" -cf gitlab.tgz gitlab/
- DEBUG=* HTR_user=$PACKAGE_HUNTER_USER HTR_pass=$PACKAGE_HUNTER_PASS node /usr/src/app/cli.js analyze --format gitlab gitlab.tgz | tee $CI_PROJECT_DIR/gl-dependency-scanning-report.json
artifacts:
paths:
- gl-dependency-scanning-report.json
@ -108,6 +110,20 @@ package_hunter:
dependency_scanning: gl-dependency-scanning-report.json
expire_in: 1 week
package_hunter-yarn:
extends:
- .package_hunter-base
- .reports:rules:package_hunter-yarn
script:
- node /usr/src/app/cli.js analyze --format gitlab --manager yarn gitlab.tgz | tee $CI_PROJECT_DIR/gl-dependency-scanning-report.json
package_hunter-bundler:
extends:
- .package_hunter-base
- .reports:rules:package_hunter-bundler
script:
- node /usr/src/app/cli.js analyze --format gitlab --manager bundler gitlab.tgz | tee $CI_PROJECT_DIR/gl-dependency-scanning-report.json
license_scanning:
extends: .default-retry
needs: []

View file

@ -2,7 +2,7 @@ review-cleanup:
extends:
- .default-retry
- .review:rules:review-cleanup
image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3-kubectl1.14
image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3.5-kubectl1.17
stage: prepare
environment:
name: review/auto-cleanup
@ -25,7 +25,7 @@ review-build-cng:
extends:
- .default-retry
- .review:rules:review-build-cng
image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine
image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine3.13
stage: review-prepare
before_script:
- source ./scripts/utils.sh
@ -54,7 +54,6 @@ review-deploy:
extends:
- .review-workflow-base
- .review:rules:review-deploy
retry: 2
stage: review
needs: ["review-build-cng"]
resource_group: "review/${CI_COMMIT_REF_NAME}"
@ -66,8 +65,6 @@ review-deploy:
- *base-before_script
script:
- check_kube_domain
- "ensure_namespace ${KUBE_NAMESPACE}"
- install_external_dns
- download_chart
- date
- deploy || (display_deployment_debug && exit 1)
@ -97,13 +94,13 @@ review-deploy:
before_script:
- *base-before_script
review-stop-failed-deployment:
review-delete-deployment:
extends:
- .review-stop-base
- .review:rules:review-stop-failed-deployment
- .review:rules:review-delete-deployment
stage: prepare
script:
- delete_failed_release
- delete_release
review-stop:
extends:
@ -111,18 +108,19 @@ review-stop:
- .review:rules:review-stop
stage: post-qa
script:
- delete_release
- delete_k8s_release_namespace
.review-qa-base:
extends:
- .use-docker-in-docker
image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-alpine-ruby-2.7
image:
name: ${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_REF_SLUG}
entrypoint: [""]
stage: qa
needs: ["review-deploy"]
needs: ["build-qa-image", "review-deploy"]
variables:
QA_ARTIFACTS_DIR: "${CI_PROJECT_DIR}/qa"
QA_CAN_TEST_GIT_PROTOCOL_V2: "false"
QA_DEBUG: "true"
QA_CAN_TEST_GIT_PROTOCOL_V2: "false"
QA_GENERATE_ALLURE_REPORT: "true"
GITLAB_USERNAME: "root"
GITLAB_PASSWORD: "${REVIEW_APPS_ROOT_PASSWORD}"
@ -132,21 +130,22 @@ review-stop:
EE_LICENSE: "${REVIEW_APPS_EE_LICENSE}"
SIGNUP_DISABLED: "true"
before_script:
- export QA_IMAGE="${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_REF_SLUG}"
# Use $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA so that GitLab image built in omnibus-gitlab-mirror and QA image are in sync.
- if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
fi
- export CI_ENVIRONMENT_URL="$(cat environment_url.txt)"
- echo "${CI_ENVIRONMENT_URL}"
- echo "${QA_IMAGE}"
- *base-before_script
- gem install gitlab-qa --no-document ${GITLAB_QA_VERSION:+ --version ${GITLAB_QA_VERSION}}
- cd qa
artifacts:
paths:
- ./qa/gitlab-qa-run-*
- qa/tmp
expire_in: 7 days
when: always
.allure-report-base:
image:
name: ${GITLAB_DEPENDENCY_PROXY}andrcuns/allure-report-publisher:0.3.2
name: ${GITLAB_DEPENDENCY_PROXY}andrcuns/allure-report-publisher:0.3.4
entrypoint: [""]
stage: post-qa
variables:
@ -157,7 +156,7 @@ review-stop:
script:
- |
allure-report-publisher upload gcs \
--results-glob="qa/gitlab-qa-run-*/**/allure-results/*" \
--results-glob="qa/tmp/allure-results/*" \
--bucket="gitlab-qa-allure-reports" \
--prefix="$ALLURE_REPORT_PATH_PREFIX/$CI_COMMIT_REF_SLUG" \
--update-pr="comment" \
@ -171,7 +170,7 @@ review-qa-smoke:
- .review:rules:review-qa-smoke
retry: 1 # This is confusing but this means "2 runs at max".
script:
- gitlab-qa Test::Instance::Smoke "${QA_IMAGE}" "${CI_ENVIRONMENT_URL}"
- bin/test Test::Instance::Smoke "${CI_ENVIRONMENT_URL}"
review-qa-all:
extends:
@ -181,7 +180,14 @@ review-qa-all:
script:
- export KNAPSACK_REPORT_PATH=knapsack/master_report.json
- export KNAPSACK_TEST_FILE_PATTERN=qa/specs/features/**/*_spec.rb
- gitlab-qa Test::Instance::Any "${QA_IMAGE}" "${CI_ENVIRONMENT_URL}" -- --format RspecJunitFormatter --out tmp/rspec-${CI_JOB_ID}.xml --format html --out tmp/rspec.htm --color --format documentation
- |
bin/test Test::Instance::All "${CI_ENVIRONMENT_URL}" \
-- \
--color --format documentation \
--format RspecJunitFormatter --out tmp/rspec.xml
artifacts:
reports:
junit: qa/tmp/rspec.xml
review-performance:
extends:
@ -209,32 +215,6 @@ review-performance:
performance: performance.json
expire_in: 31d
parallel-spec-reports:
extends:
- .review:rules:review-qa-all
image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine
stage: post-qa
needs: ["review-qa-all"]
variables:
NEW_PARALLEL_SPECS_REPORT: qa/report-new.html
BASE_ARTIFACT_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/file/qa/"
script:
- apk add --update build-base libxml2-dev libxslt-dev && rm -rf /var/cache/apk/*
- gem install nokogiri --no-document
- cd qa/gitlab-qa-run-*/gitlab-*
- ARTIFACT_DIRS=$(pwd |rev| awk -F / '{print $1,$2}' | rev | sed s_\ _/_)
- cd -
- '[[ -f $NEW_PARALLEL_SPECS_REPORT ]] || echo "{}" > ${NEW_PARALLEL_SPECS_REPORT}'
- scripts/merge-html-reports ${NEW_PARALLEL_SPECS_REPORT} ${BASE_ARTIFACT_URL}${ARTIFACT_DIRS} qa/gitlab-qa-run-*/**/rspec.htm
artifacts:
when: always
paths:
- qa/report-new.html
- qa/gitlab-qa-run-*
reports:
junit: qa/gitlab-qa-run-*/**/rspec-*.xml
expire_in: 31d
allure-report-qa-smoke:
extends:
- .allure-report-base
@ -267,10 +247,14 @@ danger-review:
script:
- >
if [ -z "$DANGER_GITLAB_API_TOKEN" ]; then
# Force danger to skip CI source GitLab and fallback to "local only git repo".
unset GITLAB_CI
# We need to base SHA to help danger determine the base commit for this shallow clone.
run_timed_command "bundle exec danger dry_run --fail-on-errors=true --verbose --base='$CI_MERGE_REQUEST_DIFF_BASE_SHA'"
run_timed_command danger_as_local
else
run_timed_command "bundle exec danger --fail-on-errors=true --verbose"
fi
danger-review-local:
extends:
- danger-review
- .review:rules:danger-local
script:
- run_timed_command danger_as_local

View file

@ -131,6 +131,30 @@
- ".markdownlint.yml"
- "scripts/lint-doc.sh"
.bundler-patterns: &bundler-patterns
- '{Gemfile.lock,*/Gemfile.lock,*/*/Gemfile.lock}'
.nodejs-patterns: &nodejs-patterns
- '{package.json,*/package.json,*/*/package.json}'
.python-patterns: &python-patterns
- '{requirements.txt,*/requirements.txt,*/*/requirements.txt}'
- '{requirements.pip,*/requirements.pip,*/*/requirements.pip}'
- '{Pipfile,*/Pipfile,*/*/Pipfile}'
- '{requires.txt,*/requires.txt,*/*/requires.txt}'
- '{setup.py,*/setup.py,*/*/setup.py}'
.dependency-patterns: &dependency-patterns
- '{Gemfile.lock,*/Gemfile.lock,*/*/Gemfile.lock}'
- '{composer.lock,*/composer.lock,*/*/composer.lock}'
- '{gems.locked,*/gems.locked,*/*/gems.locked}'
- '{go.sum,*/go.sum,*/*/go.sum}'
- '{npm-shrinkwrap.json,*/npm-shrinkwrap.json,*/*/npm-shrinkwrap.json}'
- '{package-lock.json,*/package-lock.json,*/*/package-lock.json}'
- '{yarn.lock,*/yarn.lock,*/*/yarn.lock}'
- '{packages.lock.json,*/packages.lock.json,*/*/packages.lock.json}'
- '{conan.lock,*/conan.lock,*/*/conan.lock}'
.frontend-dependency-patterns: &frontend-dependency-patterns
- "{package.json,yarn.lock}"
- "config/webpack.config.js"
@ -138,6 +162,7 @@
.frontend-build-patterns: &frontend-build-patterns
- "{package.json,yarn.lock}"
- ".browserslistrc"
- "babel.config.js"
- "config/webpack.config.js"
- "config/**/*.js"
@ -146,6 +171,7 @@
.frontend-patterns: &frontend-patterns
- "{package.json,yarn.lock}"
- ".browserslistrc"
- "babel.config.js"
- "jest.config.{base,integration,unit}.js"
- ".csscomb.json"
@ -163,7 +189,7 @@
- "config.ru"
# List explicitly all the app/ dirs that are backend (i.e. all except app/assets).
- "{,ee/,jh/}{app/channels,app/controllers,app/finders,app/graphql,app/helpers,app/mailers,app/models,app/policies,app/presenters,app/serializers,app/services,app/uploaders,app/validators,app/views,app/workers}/**/*"
- "{,ee/,jh/}{bin,cable,config,db,lib}/**/*"
- "{,ee/,jh/}{bin,cable,config,db,generator_templates,lib}/**/*"
- "{,ee/,jh/}spec/**/*.rb"
# CI changes
- ".gitlab-ci.yml"
@ -198,6 +224,7 @@
.code-patterns: &code-patterns
- "{package.json,yarn.lock}"
- ".browserslistrc"
- "babel.config.js"
- "jest.config.{base,integration,unit}.js"
- ".csscomb.json"
@ -213,7 +240,7 @@
- "Rakefile"
- "tests.yml"
- "config.ru"
- "{,ee/,jh/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- "data/whats_new/*.yml"
@ -223,6 +250,7 @@
.code-backstage-patterns: &code-backstage-patterns
- "{package.json,yarn.lock}"
- ".browserslistrc"
- "babel.config.js"
- "jest.config.{base,integration,unit}.js"
- ".csscomb.json"
@ -238,7 +266,7 @@
- "Rakefile"
- "tests.yml"
- "config.ru"
- "{,ee/,jh/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- "data/whats_new/*.yml"
# Backstage changes
@ -251,6 +279,7 @@
.code-qa-patterns: &code-qa-patterns
- "{package.json,yarn.lock}"
- ".browserslistrc"
- "babel.config.js"
- "jest.config.{base,integration,unit}.js"
- ".csscomb.json"
@ -266,7 +295,7 @@
- "Rakefile"
- "tests.yml"
- "config.ru"
- "{,ee/,jh/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- "data/whats_new/*.yml"
# QA changes
@ -275,6 +304,7 @@
.code-backstage-qa-patterns: &code-backstage-qa-patterns
- "{package.json,yarn.lock}"
- ".browserslistrc"
- "babel.config.js"
- "jest.config.{base,integration,unit}.js"
- ".csscomb.json"
@ -290,7 +320,7 @@
- "Rakefile"
- "tests.yml"
- "config.ru"
- "{,ee/,jh/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- "data/whats_new/*.yml"
# Backstage changes
@ -304,6 +334,12 @@
- ".dockerignore"
- "qa/**/*"
.code-backstage-danger-patterns: &code-backstage-danger-patterns
# Backstage changes
- "Dangerfile"
- "danger/**/*"
- "tooling/danger/**/*"
################
# Shared rules #
################
@ -932,14 +968,6 @@
- <<: *if-merge-request-title-run-all-rspec
when: always
.rails:rules:rspec-feature-flags:
rules:
- <<: *if-not-ee
when: never
- <<: *if-default-branch-schedule-2-hourly
allow_failure: true
- <<: *if-merge-request-title-run-all-rspec
.rails:rules:default-branch-schedule-nightly--code-backstage:
rules:
- <<: *if-default-branch-schedule-nightly
@ -954,6 +982,12 @@
- <<: *if-merge-request
changes: [".gitlab/ci/rails.gitlab-ci.yml"]
.rails:rules:rspec-feature-flags:
rules:
- <<: *if-not-ee
when: never
- changes: *code-backstage-patterns
#########################
# Static analysis rules #
#########################
@ -1005,7 +1039,6 @@
rules:
- if: '$CODE_QUALITY_DISABLED'
when: never
# - <<: *if-default-branch-refs # To be done in a later iteration: https://gitlab.com/gitlab-org/gitlab/issues/31160#note_278188255
- <<: *if-default-refs
changes: *code-backstage-patterns
allow_failure: true
@ -1014,7 +1047,6 @@
rules:
- if: '$SAST_DISABLED || $GITLAB_FEATURES !~ /\bsast\b/'
when: never
# - <<: *if-default-branch-refs # To be done in a later iteration: https://gitlab.com/gitlab-org/gitlab/issues/31160#note_278188255
- <<: *if-default-refs
changes: *code-backstage-qa-patterns
allow_failure: true
@ -1025,17 +1057,39 @@
when: never
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # The Secret-Detection template already has a `secret_detection_default_branch` job
when: never
# - <<: *if-default-branch-refs # To be done in a later iteration: https://gitlab.com/gitlab-org/gitlab/issues/31160#note_278188255
- changes: *code-backstage-qa-patterns
allow_failure: true
.reports:rules:dependency_scanning:
.reports:rules:gemnasium-dependency_scanning:
rules:
- if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/'
- if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium([^-]|$)/'
when: never
# - <<: *if-default-branch-refs # To be done in a later iteration: https://gitlab.com/gitlab-org/gitlab/issues/31160#note_278188255
- <<: *if-default-refs
changes: *code-backstage-qa-patterns
changes: *dependency-patterns
allow_failure: true
.reports:rules:bundler-audit-dependency_scanning:
rules:
- if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /bundler-audit/'
when: never
- <<: *if-default-refs
changes: *bundler-patterns
allow_failure: true
.reports:rules:retire-js-dependency_scanning:
rules:
- if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /retire.js/'
when: never
- <<: *if-default-refs
changes: *nodejs-patterns
allow_failure: true
.reports:rules:gemnasium-python-dependency_scanning:
rules:
- if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium-python/'
when: never
- <<: *if-default-refs
changes: *python-patterns
allow_failure: true
.reports:rules:dast:
@ -1057,12 +1111,22 @@
- <<: *if-default-branch-schedule-nightly
allow_failure: true
.reports:rules:package_hunter:
.reports:rules:package_hunter-yarn:
rules:
- if: "$PACKAGE_HUNTER_USER == null || $PACKAGE_HUNTER_USER == ''"
when: never
- <<: *if-default-branch-schedule-2-hourly
- <<: *if-merge-request
changes: ["yarn.lock"]
.reports:rules:package_hunter-bundler:
rules:
- if: "$PACKAGE_HUNTER_USER == null || $PACKAGE_HUNTER_USER == ''"
when: never
- <<: *if-default-branch-schedule-2-hourly
- <<: *if-merge-request
changes: ["Gemfile.lock"]
.reports:rules:license_scanning:
rules:
- if: '$LICENSE_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\blicense_scanning\b/'
@ -1126,7 +1190,7 @@
- <<: *if-dot-com-gitlab-org-schedule
allow_failure: true
.review:rules:review-stop-failed-deployment:
.review:rules:review-delete-deployment:
rules:
- <<: *if-not-ee
when: never
@ -1146,19 +1210,31 @@
changes: *code-qa-patterns
allow_failure: true
# The rule needs to be duplicated between `on_success` and `on_failure`
# because the jobs `needs` the previous job to complete.
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63844#note_599012559
.review:rules:review-qa-smoke-report:
rules:
- <<: *if-not-ee
when: never
- <<: *if-dot-com-gitlab-org-merge-request
changes: *ci-review-patterns
when: always
when: on_success
- <<: *if-dot-com-gitlab-org-merge-request
changes: *ci-review-patterns
when: on_failure
- <<: *if-dot-com-gitlab-org-merge-request
changes: *frontend-patterns
when: always
when: on_success
- <<: *if-dot-com-gitlab-org-merge-request
changes: *frontend-patterns
when: on_failure
- <<: *if-dot-com-gitlab-org-merge-request
changes: *code-qa-patterns
when: always
when: on_success
- <<: *if-dot-com-gitlab-org-merge-request
changes: *code-qa-patterns
when: on_failure
.review:rules:review-qa-all:
rules:
@ -1172,6 +1248,9 @@
changes: *qa-patterns
allow_failure: true
# The rule needs to be duplicated between `on_success` and `on_failure`
# because the jobs `needs` the previous job to complete.
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63844#note_599012559
.review:rules:review-qa-all-report:
rules:
- <<: *if-not-ee
@ -1183,7 +1262,11 @@
- <<: *if-dot-com-gitlab-org-merge-request
changes: *qa-patterns
allow_failure: true
when: always
when: on_success
- <<: *if-dot-com-gitlab-org-merge-request
changes: *qa-patterns
allow_failure: true
when: on_failure
.review:rules:review-cleanup:
rules:
@ -1211,6 +1294,11 @@
rules:
- if: '$CI_MERGE_REQUEST_IID'
.review:rules:danger-local:
rules:
- if: '$CI_MERGE_REQUEST_IID'
changes: *code-backstage-danger-patterns
###############
# Setup rules #
###############

View file

@ -52,7 +52,7 @@ no_ee_check:
verify-tests-yml:
extends:
- .setup:rules:verify-tests-yml
image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine
image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine3.13
stage: test
needs: []
script:

View file

@ -0,0 +1,50 @@
<!-- Use this template as a starting point for deprecations. -->
### Deprecation Summary
<!--
This should contain a brief description of the feature or functionality that is deprecated. The description should clearly state the potential impact of the deprecation to end users.
It is recommended that you link to the documentation.
The description of the deprecation should state what actions the user should take to rectify the behavior. If the deprecation is scheduled for an upcoming release, the content should remain in the deprecations documentation page until it has been completed. For example, if a deprecation is announced in 14.9 and scheduled to be completed in 15.0, the same content would be included in the documentation for 14.9, 14.10, and 15.0.
-->
### Breaking Change
<!-- Is this a breaking change or not? If so, please add instructions for how users can update their workflow. -->
### Affected Topology
<!--
Who is affected by this deprecation, Self-managed users, SaaS users, or both? This is especially important when nearing the annual major release where breaking changes and removals are typically introduced. These changes might be seen on GitLab.com before the official release date.
-->
### Affected Tier
<!--
Which tier is this feature available in?
* Free
* Premium
* Ultimate
-->
### Checklist
- [ ] @mention your stage's stable counterparts on this issue. For example, Customer Support, Customer Success (Technical Account Manager), Product Marketing Manager.
- To see who the stable counterparts are for a product team visit [product categories](https://about.gitlab.com/handbook/product/categories/)
- If there is no stable counterpart listed for Sales/CS please mention `@timtams`
- If there is no stable counterpart listed for Support please @mention `@gitlab-com/support/managers`
- If there is no stable counterpart listed for Marketing please mention `@williamchia`
- [ ] @mention your GPM so that they are aware of planned deprecations. The goal is to have reviews happen at least two releases before the final removal of the feature or introduction of a breaking change.
### Deprecation Milestone
<!-- In which milestone will this deprecation happen? -->
### Links
<!--
Add links to any relevant documentation or code that will provide additional details or clarity regarding the planned change. Also, include a link to the removal issue if relevant.
-->

View file

@ -98,6 +98,7 @@ If you enjoy taking notes using post-it notes make sure you have available some
- [ ] Finalise participant list - `decider` and `facilitator`
- [ ] Create [participation form](https://docs.google.com/forms/d/e/1FAIpQLSc0_BNltvRW8yXXaJd8sIKzgDmrSGqILMfkoCJrAj6sFcsMcg/viewform?usp=sf_link) and send to participants (**deadline**: [date]) - `facilitator`
- [ ] Create a dedicated Slack channel and add participants - `facilitator`
- [ ] Promote this issue to an epic - `facilitator`
- [ ] Create issues under the epic for the pre-workshop tasks: Expert interviews ([example](https://gitlab.com/groups/gitlab-org/configure/-/epics/3#note_332412524)), Lightning walkthroughs and How might we.. notetaking assignment ([example](https://gitlab.com/gitlab-org/configure/general/-/issues/52)), Voting How might we... notes assignment ([example](https://gitlab.com/gitlab-org/configure/general/-/issues/54)) - `facilitator`
- [ ] Create sync meetings in calendar and invite all participants (**deadline**: [date]) - `decider` or `facilitator`

View file

@ -78,6 +78,7 @@ Are there any other stages or teams involved that need to be kept in the loop?
If a different developer will be covering, or an exception is needed, please inform the oncall SRE by using the `@sre-oncall` Slack alias.
- [ ] Ensure that documentation has been updated ([More info](https://docs.gitlab.com/ee/development/documentation/feature_flags.html#features-that-became-enabled-by-default)).
- [ ] Announce on [the feature issue](ISSUE LINK) an estimated time this will be enabled on GitLab.com.
- [ ] If the feature might impact the user experience, notify `#support_gitlab-com` and your team channel ([more guidance when this is necessary in the dev docs](https://docs.gitlab.com/ee/development/feature_flags/controls.html#communicate-the-change)).
- [ ] If the feature flag in code has [an actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), enable it on GitLab.com for [testing groups/projects](#testing-groupsprojectsusers).
- [ ] `/chatops run feature set --<actor-type>=<actor> <feature-flag-name> true`
- [ ] Verify that the feature works as expected. Posting the QA result in this issue is preferable.
@ -92,8 +93,6 @@ Are there any other stages or teams involved that need to be kept in the loop?
- Enable the feature globally on production environment.
- [ ] `/chatops run feature set <feature-flag-name> true`
- [ ] Announce on [the feature issue](ISSUE LINK) that the feature has been globally enabled.
- [ ] Cross-post chatops slack command to `#support_gitlab-com`.
([more guidance when this is necessary in the dev docs](https://docs.gitlab.com/ee/development/feature_flags/controls.html#communicate-the-change)) and in your team channel
- [ ] Wait for [at least one day for the verification term](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#including-a-feature-behind-feature-flag-in-the-final-release).
### (Optional) Release the feature with the feature flag
@ -105,10 +104,10 @@ To do so, follow these steps:
- [ ] Create a merge request with the following changes. Ask for review and merge it.
- [ ] Set the `default_enabled` attribute in [the feature flag definition](https://docs.gitlab.com/ee/development/feature_flags/#feature-flag-definition-and-validation) to `true`.
- [ ] Create [a changelog entry](https://docs.gitlab.com/ee/development/feature_flags/#changelog).
- [ ] Ensure that the above MR has been deployed to both production and canary.
- [ ] Ensure that the default-enabling MR has been deployed to both production and canary.
If the merge request was deployed before [the code cutoff](https://about.gitlab.com/handbook/engineering/releases/#self-managed-releases-1),
the feature can be officially announced in a release blog post.
- [ ] `/chatops run auto_deploy status <merge-commit>`
- [ ] `/chatops run auto_deploy status <merge-commit-of-default-enabling-mr>`
- [ ] Close [the feature issue](ISSUE LINK) to indicate the feature will be released in the current milestone.
- [ ] Set the next milestone to this rollout issue for scheduling [the flag removal](#release-the-feature).
- [ ] (Optional) You can create a separate issue for scheduling the steps below to [Release the feature](#release-the-feature).
@ -136,10 +135,10 @@ codebase.
- [ ] Remove all references to the feature flag from the codebase.
- [ ] Remove the YAML definitions for the feature from the repository.
- [ ] Create [a changelog entry](https://docs.gitlab.com/ee/development/feature_flags/#changelog).
- [ ] Ensure that the above MR has been deployed to both production and canary.
- [ ] Ensure that the cleanup MR has been deployed to both production and canary.
If the merge request was deployed before [the code cutoff](https://about.gitlab.com/handbook/engineering/releases/#self-managed-releases-1),
the feature can be officially announced in a release blog post.
- [ ] `/chatops run auto_deploy status <merge-commit>`
- [ ] `/chatops run auto_deploy status <merge-commit-of-cleanup-mr>`
- [ ] Close [the feature issue](ISSUE LINK) to indicate the feature will be released in the current milestone.
- [ ] Clean up the feature flag from all environments by running these chatops command in `#production` channel:
- [ ] `/chatops run feature delete <feature-flag-name> --dev`

View file

@ -5,7 +5,6 @@
<!-- Use this section to explain the feature and how it will work. It can be helpful to add technical details, design proposals, and links to related epics or issues. -->
<!-- Consider adding related issues and epics to this issue. You can also reference the Feature Proposal Template (https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20proposal%20-%20detailed.md) for additional details to consider adding to this issue. Additionally, as a data oriented organization, when your feature exits planning breakdown, consider adding the `What does success look like, and how can we measure that?` section.
/label ~"group::" ~"section::" ~"Category::" ~"GitLab Core"/~"GitLab Premium"/~"GitLab Ultimate"
-->
/label ~feature::addition ~"group::" ~"section::" ~"Category:" ~"GitLab Core"/~"GitLab Premium"/~"GitLab Ultimate"

View file

@ -1,6 +1,6 @@
<!--
This template is based on a model named `CoolWidget`.
This template is based on a model named `CoolWidget`.
To adapt this template, find and replace the following tokens:
@ -34,6 +34,9 @@ There are three main sections below. It is a good idea to structure your merge r
It is also a good idea to first open a proof-of-concept merge request. It can be helpful for working out kinks and getting initial support and feedback from the Geo team. As an example, see the [Proof of Concept to replicate Pipeline Artifacts](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56423).
You can look into the following example for implementing replication/verification for a new Git repository type:
- [Add snippet repository verification](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56596)
### Modify database schemas to prepare to add Geo support for Cool Widgets
You might do this section in its own merge request, but it is not required.
@ -342,39 +345,6 @@ That's all of the required database changes.
- [ ] Implement `CoolWidget.replicables_for_current_secondary` above.
- [ ] Ensure `CoolWidget.replicables_for_current_secondary` is well-tested. Search the codebase for `replicables_for_current_secondary` to find examples of parameterized table specs. You may need to add more `FactoryBot` traits.
- [ ] If you are using a separate table `cool_widget_states` to track verification state on the Geo primary site, then:
- [ ] Do not include `::Gitlab::Geo::VerificationState` on the `CoolWidget` class.
- [ ] Add the following lines to the `cool_widget_state.rb` model:
```ruby
class CoolWidgetState < ApplicationRecord
...
self.primary_key = :cool_widget_id
include ::Gitlab::Geo::VerificationState
belongs_to :cool_widget, inverse_of: :cool_widget_state
...
end
```
- [ ] Add the following lines to the `cool_widget` model:
```ruby
class CoolWidget < ApplicationRecord
...
has_one :cool_widget_state, inverse_of: :cool_widget
delegate :verification_retry_at, :verification_retry_at=,
:verified_at, :verified_at=,
:verification_checksum, :verification_checksum=,
:verification_failure, :verification_failure=,
:verification_retry_count, :verification_retry_count=,
to: :cool_widget_state
...
end
```
- [ ] Create `ee/app/replicators/geo/cool_widget_replicator.rb`. Implement the `#repository` method which should return a `<Repository>` instance, and implement the class method `.model` to return the `CoolWidget` class:
```ruby
@ -383,6 +353,7 @@ That's all of the required database changes.
module Geo
class CoolWidgetReplicator < Gitlab::Geo::Replicator
include ::Geo::RepositoryReplicatorStrategy
extend ::Gitlab::Utils::Override
def self.model
::CoolWidget
@ -493,7 +464,7 @@ That's all of the required database changes.
FactoryBot.define do
factory :geo_cool_widget_registry, class: 'Geo::CoolWidgetRegistry' do
cool_widget
cool_widget # This association should have data, like a file or repository
state { Geo::CoolWidgetRegistry.state_value(:pending) }
trait :synced do
@ -542,6 +513,119 @@ That's all of the required database changes.
end
```
- [ ] Add the following to `spec/factories/cool_widgets.rb`:
```ruby
trait(:verification_succeeded) do
with_file
verification_checksum { 'abc' }
verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
end
trait(:verification_failed) do
with_file
verification_failure { 'Could not calculate the checksum' }
verification_state { CoolWidget.verification_state_value(:verification_failed) }
end
```
- [ ] Make sure the factory also allows setting a `project` attribute. If the model does not have a direct relation to a project, you can use a `transient` attribute. Check out `spec/factories/merge_request_diffs.rb` for an example.
##### If you added verification state fields to a separate table (option 2 above), then you need to make additional model and factory changes
If you did not add verification state fields to a separate table, `cool_widget_states`, then skip to [Step 2. Implement metrics gathering](#step-2-implement-metrics-gathering).
Otherwise, you can follow [the example of Merge Request Diffs](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63309).
- [ ] Add a `Geo::CoolWidgetState` model in `ee/app/models/ee/geo/cool_widget_state.rb`:
``` ruby
module Geo
class CoolWidgetState < ApplicationRecord
self.primary_key = :cool_widget_id
belongs_to :cool_widget, inverse_of: :cool_widget_state
end
end
```
- [ ] Add a `factory` for `cool_widget_state`, in `ee/spec/factories/geo/cool_widget_states.rb`:
``` ruby
# frozen_string_literal: true
FactoryBot.define do
factory :geo_cool_widget_state, class: 'Geo::CoolWidgetState' do
cool_widget
trait(:checksummed) do
verification_checksum { 'abc' }
end
trait(:checksum_failure) do
verification_failure { 'Could not calculate the checksum' }
end
end
end
```
- [ ] Add the following lines to the `cool_widget` model to accomplish some important tasks:
- Include the `::Gitlab::Geo::VerificationState` concern.
- Delegate verification related methods to the `cool_widget_state` model.
- Override some scopes to use the `cool_widget_states` table instead of the model table, for verification.
- Override some methods to use the `cool_widget_states` table in verification related queries.
```ruby
class CoolWidget < ApplicationRecord
...
include ::Gitlab::Geo::VerificationState
has_one :cool_widget_state, autosave: true, inverse_of: :cool_widget, class_name: 'Geo::CoolWidgetState'
delegate :verification_retry_at, :verification_retry_at=,
:verified_at, :verified_at=,
:verification_checksum, :verification_checksum=,
:verification_failure, :verification_failure=,
:verification_retry_count, :verification_retry_count=,
:verification_state=, :verification_state,
:verification_started_at=, :verification_started_at,
to: :cool_widget_state
...
scope :with_verification_state, ->(state) { joins(:cool_widget_state).where(cool_widget_states: { verification_state: verification_state_value(state) }) }
scope :checksummed, -> { joins(:cool_widget_state).where.not(cool_widget_states: { verification_checksum: nil } ) }
scope :not_checksummed, -> { joins(:cool_widget_state).where(cool_widget_states: { verification_checksum: nil } ) }
...
class_methods do
extend ::Gitlab::Utils::Override
...
override :verification_state_table_name
def verification_state_table_name
'cool_widget_states'
end
override :verification_state_model_key
def verification_state_model_key
'cool_widget_id'
end
override :verification_arel_table
def verification_arel_table
CoolWidgetState.arel_table
end
end
...
def cool_widget_state
super || build_cool_widget_state
end
...
end
```
#### Step 2. Implement metrics gathering
Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus` for display in the UI, and sent to Prometheus:
@ -578,24 +662,6 @@ Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus`
Geo::CoolWidgetReplicator | :cool_widget | :geo_cool_widget_registry
```
- [ ] Add the following to `spec/factories/cool_widgets.rb`:
```ruby
trait(:verification_succeeded) do
with_file
verification_checksum { 'abc' }
verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
end
trait(:verification_failed) do
with_file
verification_failure { 'Could not calculate the checksum' }
verification_state { CoolWidget.verification_state_value(:verification_failed) }
end
```
- [ ] Make sure the factory also allows setting a `project` attribute. If the model does not have a direct relation to a project, you can use a `transient` attribute. Check out `spec/factories/merge_request_diffs.rb` for an example.
Cool Widget replication and verification metrics should now be available in the API, the `Admin > Geo > Nodes` view, and Prometheus.
#### Step 3. Implement the GraphQL API
@ -736,6 +802,8 @@ Individual Cool Widget replication and verification data should now be available
module Geo
class CoolWidgetReplicator < Gitlab::Geo::Replicator
...
# REMOVE THIS LINE IF IT IS NO LONGER NEEDED
extend ::Gitlab::Utils::Override
# REMOVE THIS METHOD
def self.replication_enabled_by_default?

View file

@ -1,6 +1,6 @@
<!--
This template is based on a model named `CoolWidget`.
This template is based on a model named `CoolWidget`.
To adapt this template, find and replace the following tokens:
@ -34,6 +34,10 @@ There are three main sections below. It is a good idea to structure your merge r
It is also a good idea to first open a proof-of-concept merge request. It can be helpful for working out kinks and getting initial support and feedback from the Geo team. As an example, see the [Proof of Concept to replicate Pipeline Artifacts](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56423).
You can look into the following examples of MRs for implementing replication/verification for a new blob type:
- [Add db changes](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60935) and [add verification for MR diffs using SSF](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63309)
- [Verify Terraform state versions](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/58800)
### Modify database schemas to prepare to add Geo support for Cool Widgets
You might do this section in its own merge request, but it is not required.
@ -331,39 +335,6 @@ That's all of the required database changes.
- [ ] Implement `CoolWidget.replicables_for_current_secondary` above.
- [ ] Ensure `CoolWidget.replicables_for_current_secondary` is well-tested. Search the codebase for `replicables_for_current_secondary` to find examples of parameterized table specs. You may need to add more `FactoryBot` traits.
- [ ] If you are using a separate table `cool_widget_states` to track verification state on the Geo primary site, then:
- [ ] Do not include `::Gitlab::Geo::VerificationState` on the `CoolWidget` class.
- [ ] Add the following lines to the `cool_widget_state.rb` model:
```ruby
class CoolWidgetState < ApplicationRecord
...
self.primary_key = :cool_widget_id
include ::Gitlab::Geo::VerificationState
belongs_to :cool_widget, inverse_of: :cool_widget_state
...
end
```
- [ ] Add the following lines to the `cool_widget` model:
```ruby
class CoolWidget < ApplicationRecord
...
has_one :cool_widget_state, inverse_of: :cool_widget
delegate :verification_retry_at, :verification_retry_at=,
:verified_at, :verified_at=,
:verification_checksum, :verification_checksum=,
:verification_failure, :verification_failure=,
:verification_retry_count, :verification_retry_count=,
to: :cool_widget_state
...
end
```
- [ ] Create `ee/app/replicators/geo/cool_widget_replicator.rb`. Implement the `#carrierwave_uploader` method which should return a `CarrierWave::Uploader`, and implement the class method `.model` to return the `CoolWidget` class:
```ruby
@ -372,6 +343,7 @@ That's all of the required database changes.
module Geo
class CoolWidgetReplicator < Gitlab::Geo::Replicator
include ::Geo::BlobReplicatorStrategy
extend ::Gitlab::Utils::Override
def self.model
::CoolWidget
@ -459,7 +431,7 @@ That's all of the required database changes.
FactoryBot.define do
factory :geo_cool_widget_registry, class: 'Geo::CoolWidgetRegistry' do
cool_widget
cool_widget # This association should have data, like a file or repository
state { Geo::CoolWidgetRegistry.state_value(:pending) }
trait :synced do
@ -508,6 +480,119 @@ That's all of the required database changes.
end
```
- [ ] Add the following to `spec/factories/cool_widgets.rb`:
```ruby
trait(:verification_succeeded) do
with_file
verification_checksum { 'abc' }
verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
end
trait(:verification_failed) do
with_file
verification_failure { 'Could not calculate the checksum' }
verification_state { CoolWidget.verification_state_value(:verification_failed) }
end
```
- [ ] Make sure the factory also allows setting a `project` attribute. If the model does not have a direct relation to a project, you can use a `transient` attribute. Check out `spec/factories/merge_request_diffs.rb` for an example.
##### If you added verification state fields to a separate table (option 2 above), then you need to make additional model and factory changes
If you did not add verification state fields to a separate table, `cool_widget_states`, then skip to [Step 2. Implement metrics gathering](#step-2-implement-metrics-gathering).
Otherwise, you can follow [the example of Merge Request Diffs](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63309).
- [ ] Add a `Geo::CoolWidgetState` model in `ee/app/models/ee/geo/cool_widget_state.rb`:
``` ruby
module Geo
class CoolWidgetState < ApplicationRecord
self.primary_key = :cool_widget_id
belongs_to :cool_widget, inverse_of: :cool_widget_state
end
end
```
- [ ] Add a `factory` for `cool_widget_state`, in `ee/spec/factories/geo/cool_widget_states.rb`:
``` ruby
# frozen_string_literal: true
FactoryBot.define do
factory :geo_cool_widget_state, class: 'Geo::CoolWidgetState' do
cool_widget
trait(:checksummed) do
verification_checksum { 'abc' }
end
trait(:checksum_failure) do
verification_failure { 'Could not calculate the checksum' }
end
end
end
```
- [ ] Add the following lines to the `cool_widget` model to accomplish some important tasks:
- Include the `::Gitlab::Geo::VerificationState` concern.
- Delegate verification related methods to the `cool_widget_state` model.
- Override some scopes to use the `cool_widget_states` table instead of the model table, for verification.
- Override some methods to use the `cool_widget_states` table in verification related queries.
```ruby
class CoolWidget < ApplicationRecord
...
include ::Gitlab::Geo::VerificationState
has_one :cool_widget_state, autosave: true, inverse_of: :cool_widget, class_name: 'Geo::CoolWidgetState'
delegate :verification_retry_at, :verification_retry_at=,
:verified_at, :verified_at=,
:verification_checksum, :verification_checksum=,
:verification_failure, :verification_failure=,
:verification_retry_count, :verification_retry_count=,
:verification_state=, :verification_state,
:verification_started_at=, :verification_started_at,
to: :cool_widget_state
...
scope :with_verification_state, ->(state) { joins(:cool_widget_state).where(cool_widget_states: { verification_state: verification_state_value(state) }) }
scope :checksummed, -> { joins(:cool_widget_state).where.not(cool_widget_states: { verification_checksum: nil } ) }
scope :not_checksummed, -> { joins(:cool_widget_state).where(cool_widget_states: { verification_checksum: nil } ) }
...
class_methods do
extend ::Gitlab::Utils::Override
...
override :verification_state_table_name
def verification_state_table_name
'cool_widget_states'
end
override :verification_state_model_key
def verification_state_model_key
'cool_widget_id'
end
override :verification_arel_table
def verification_arel_table
CoolWidgetState.arel_table
end
end
...
def cool_widget_state
super || build_cool_widget_state
end
...
end
```
#### Step 2. Implement metrics gathering
Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus` for display in the UI, and sent to Prometheus:
@ -544,24 +629,6 @@ Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus`
Geo::CoolWidgetReplicator | :cool_widget | :geo_cool_widget_registry
```
- [ ] Add the following to `spec/factories/cool_widgets.rb`:
```ruby
trait(:verification_succeeded) do
with_file
verification_checksum { 'abc' }
verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
end
trait(:verification_failed) do
with_file
verification_failure { 'Could not calculate the checksum' }
verification_state { CoolWidget.verification_state_value(:verification_failed) }
end
```
- [ ] Make sure the factory also allows setting a `project` attribute. If the model does not have a direct relation to a project, you can use a `transient` attribute. Check out `spec/factories/merge_request_diffs.rb` for an example.
Cool Widget replication and verification metrics should now be available in the API, the `Admin > Geo > Nodes` view, and Prometheus.
#### Step 3. Implement the GraphQL API
@ -702,7 +769,10 @@ Individual Cool Widget replication and verification data should now be available
module Geo
class CoolWidgetReplicator < Gitlab::Geo::Replicator
...
# REMOVE THIS LINE IF IT IS NO LONGER NEEDED
extend ::Gitlab::Utils::Override
...
# REMOVE THIS METHOD
def self.replication_enabled_by_default?
false

View file

@ -10,10 +10,11 @@ Set the title to: `Description of the original issue`
- [ ] Read the [security process for developers] if you are not familiar with it.
- Verify if the issue you're working on `gitlab-org/gitlab` is confidential, if it's public fix should be placed on GitLab canonical and no backports are required.
- [ ] Mark this [issue as linked] to the Security Release Tracking Issue. You can find it on the topic of the `#releases` Slack channel.
- [ ] **IMPORTANT**: Mark this [issue as linked] to the Security Release Tracking Issue. You can find it on the topic of the `#releases` Slack channel. This issue
MUST be linked for the release bot to know that the associated merge requests should be merged for this security release.
- Fill out the [Links section](#links):
- [ ] Next to **Issue on GitLab**, add a link to the `gitlab-org/gitlab` issue that describes the security vulnerability.
- [ ] Add one of the `~severity::x` labels to the issue and all associated merge requests.
- [ ] Add one of the `~severity::x` labels to the issue and all associated merge requests.
## Development

View file

@ -4,7 +4,7 @@
* Snowplow is currently not used for self-hosted instances of GitLab - Self-hosted still rely on usage ping for product analytics - Snowplow is used for GitLab SaaS
* You do not need to create an issue to track generic front-end events, such as All page views, sessions, link clicks, some button clicks, etc.
* What you should capture are specific events with defined business logic. For example, when a user creates an incident by escalating an existing alert, or when a user creates and pushes up a new Node package to the NPM registry.
* For more details read https://about.gitlab.com/handbook/business-ops/data-team/programs/data-for-product-managers/
* For more details read https://about.gitlab.com/handbook/business-technology/data-team/programs/data-for-product-managers/
-->
<!--

View file

@ -13,62 +13,29 @@
<!-- Link related issues below. -->
## Author's checklist (required)
## Author's checklist
- [ ] Follow the [Documentation Guidelines](https://docs.gitlab.com/ee/development/documentation/) and [Style Guide](https://docs.gitlab.com/ee/development/documentation/styleguide/).
- If you have **Developer** permissions or higher:
- [ ] Ensure that the [product tier badge](https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#product-tier-badges) is added to doc's `h1`.
- [ ] Apply the ~documentation label, plus:
- The corresponding DevOps stage and group labels, if applicable.
- ~"development guidelines" when changing docs under `doc/development/*`, `CONTRIBUTING.md`, or `README.md`.
- ~"development guidelines" and ~"Documentation guidelines" when changing docs under `development/documentation/*`.
- ~"development guidelines" and ~"Description templates (.gitlab/\*)" when creating/updating issue and MR description templates.
- [ ] [Request a review](https://docs.gitlab.com/ee/development/code_review.html#dogfooding-the-reviewers-feature)
from the [designated Technical Writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments).
- [ ] Ensure that the [product tier badge](https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#product-tier-badges) is added to doc's `h1`.
- [ ] [Request a review](https://docs.gitlab.com/ee/development/code_review.html#dogfooding-the-reviewers-feature) based on the documentation page's metadata and [associated Technical Writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments).
/label ~documentation
/assign me
Do not add the ~"feature", ~"frontend", ~"backend", ~"bug", or ~"database" labels if you are only updating documentation. These labels will cause the MR to be added to code verification QA issues.
When applicable:
- [ ] Update the [permissions table](https://docs.gitlab.com/ee/user/permissions.html).
- [ ] Link docs to and from the higher-level index page, plus other related docs where helpful.
- [ ] Add the [product tier badge](https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#product-tier-badges) accordingly.
- [ ] Add [GitLab's version history note(s)](https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#gitlab-versions).
- [ ] Add/update the [feature flag section](https://docs.gitlab.com/ee/development/documentation/feature_flags.html).
To avoid having this MR be added to code verification QA issues, don't add these labels: ~"feature", ~"frontend", ~"backend", ~"bug", or ~"database"
## Review checklist
All reviewers can help ensure accuracy, clarity, completeness, and adherence to the [Documentation Guidelines](https://docs.gitlab.com/ee/development/documentation/) and [Style Guide](https://docs.gitlab.com/ee/development/documentation/styleguide/).
Documentation-related MRs should be reviewed by a Technical Writer for a non-blocking review, based on [Documentation Guidelines](https://docs.gitlab.com/ee/development/documentation/) and the [Style Guide](https://docs.gitlab.com/ee/development/documentation/styleguide/).
**1. Primary Reviewer**
- [ ] If the content requires it, ensure the information is reviewed by a subject matter expert.
- Technical writer review items:
- [ ] Ensure docs metadata is present and up-to-date.
- [ ] Ensure the appropriate [labels](https://about.gitlab.com/handbook/engineering/ux/technical-writing/workflow/#labels) are added to this MR.
- If relevant to this MR, ensure [content topic type](https://docs.gitlab.com/ee/development/documentation/structure.html) principles are in use, including:
- [ ] The headings should be something you'd do a Google search for. Instead of `Default behavior`, say something like `Default behavior when you close an issue`.
- [ ] The headings (other than the page title) should be active. Instead of `Configuring GDK`, say something like `Configure GDK`.
- [ ] Any task steps should be written as a numbered list.
- If the content still needs to be edited for topic types, you can create a follow-up issue with the ~"docs-technical-debt" label.
- [ ] Review by assigned maintainer, who can always request/require the above reviews. Maintainer's review can occur before or after a technical writer review.
- [ ] Ensure a release milestone is set.
* [ ] Review by a code reviewer or other selected colleague to confirm accuracy, clarity, and completeness. This can be skipped for minor fixes without substantive content changes.
**2. Technical Writer**
- [ ] Technical writer review. If not requested for this MR, must be scheduled post-merge. To request for this MR, assign the writer listed for the applicable [DevOps stage](https://about.gitlab.com/handbook/product/categories/#devops-stages).
- [ ] Ensure docs metadata are present and up-to-date.
- [ ] Ensure ~"Technical Writing" and ~"documentation" are added.
- [ ] Add the corresponding `docs::` [scoped label](https://gitlab.com/groups/gitlab-org/-/labels?subscribed=&search=docs%3A%3A).
- [ ] If working on UI text, add the corresponding `UI Text` [scoped label](https://gitlab.com/groups/gitlab-org/-/labels?subscribed=&search=ui+text).
- [ ] Add ~"tw::doing" when starting work on the MR.
- [ ] Add ~"tw::finished" if Technical Writing team work on the MR is complete but it remains open.
For more information about labels, see [Technical Writing workflows - Labels](https://about.gitlab.com/handbook/engineering/ux/technical-writing/workflow/#labels).
For suggestions that you are confident don't need to be reviewed, change them locally
and push a commit directly to save others from unneeded reviews. For example:
- Clear typos, like `this is a typpo`.
- Minor issues, like single quotes instead of double quotes, Oxford commas, and periods.
For more information, see our documentation on [Merging a merge request](https://docs.gitlab.com/ee/development/code_review.html#merging-a-merge-request).
**3. Maintainer**
1. [ ] Review by assigned maintainer, who can always request/require the above reviews. Maintainer's review can occur before or after a technical writer review.
1. [ ] Ensure a release milestone is set.
1. [ ] If there has not been a technical writer review, [create an issue for one using the Doc Review template](https://gitlab.com/gitlab-org/gitlab/issues/new?issuable_template=Doc%20Review).
/label ~documentation
/assign me

View file

@ -21,7 +21,7 @@ the noise (due to constantly failing tests, flaky tests, and so on) so that new
- [ ] Quarantine test check-list
- [ ] Follow the [Quarantining Tests guide](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantining-tests).
- [ ] Confirm the test has a [`quarantine:` tag with the specified quarantine type](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantined-test-types).
- [ ] Note if the test should be [quarantined for a specific environment](https://docs.gitlab.com/ee/development/testing_guide/end_to_end/environment_selection.html#quarantining-a-test-for-a-specific-environment).
- [ ] Note if the test should be [quarantined for a specific environment](https://docs.gitlab.com/ee/development/testing_guide/end_to_end/execution_context_selection.html#quarantine-a-test-for-a-specific-environment).
- [ ] Dequarantine test check-list
- [ ] Follow the [Dequarantining Tests guide](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#dequarantining-tests).
- [ ] Confirm the test consistently passes on the target GitLab environment(s).

View file

@ -30,8 +30,8 @@ See [the general developer security release guidelines](https://gitlab.com/gitla
## Maintainer checklist
- [ ] Correct milestone is applied and the title is matching across all backports
- [ ] Assigned to `@gitlab-release-tools-bot` with passing CI pipelines and **when all backports including the MR targeting master are ready.**
- [ ] Correct milestone is applied and the title is matching across all backports.
- [ ] Assigned to `@gitlab-release-tools-bot` with passing CI pipelines.
/label ~security

View file

@ -78,9 +78,9 @@ ports:
vscode:
extensions:
- rebornix.ruby@0.27.0:QyGBeRyslOfdRgOPRGm6PQ==
- wingrunr21.vscode-ruby@0.27.0:beIqQUhLRuJ5Vao4B2Lyng==
- karunamurti.haml@1.1.0:twCwOYt3/Ttfb3+iwblPDA==
- octref.vetur@0.25.0:UofirBhedyhdx/jCnPeJDg==
- dbaeumer.vscode-eslint@2.1.3:1NRvj3UKNTNwmYjptmUmIw==
- GitLab.gitlab-workflow@3.3.0:50q1byIi4M01G9qrTCCAYQ==
- rebornix.ruby@0.28.0
- wingrunr21.vscode-ruby@0.27.0
- karunamurti.haml@1.3.1
- octref.vetur@0.34.1
- dbaeumer.vscode-eslint@2.1.8
- gitlab.gitlab-workflow@3.24.0

View file

@ -1,3 +1,4 @@
---
# Base Markdownlint configuration
# Extended Markdownlint configuration in doc/.markdownlint/
"default": true
@ -66,6 +67,7 @@
"Grafana",
"Gzip",
"Helm",
"HipChat",
"ID",
"Ingress",
"jasmine-jquery",
@ -130,6 +132,7 @@
"Ubuntu",
"Ultra Auth",
"Unicorn",
"unicorn-worker-killer",
"URL",
"WebdriverIO",
"YAML",

View file

@ -4,6 +4,7 @@
/public/
/vendor/
/tmp/
/sitespeed-result/
# ignore stylesheets for now as this clashes with our linter
*.css

View file

@ -123,6 +123,7 @@ Naming/FileName:
- 'ee/lib/generators/**/*'
- 'qa/qa/scenario/test/integration/ldap_no_tls.rb'
- 'qa/qa/scenario/test/integration/ldap_tls.rb'
- 'qa/tasks/*'
IgnoreExecutableScripts: true
AllowedAcronyms:
@ -280,6 +281,22 @@ GitlabSecurity/PublicSend:
- 'ee/lib/**/*.rake'
- 'ee/spec/**/*'
Database/MultipleDatabases:
Enabled: true
Include:
- 'app/**/*.rb'
- 'ee/app/**/*.rb'
- 'lib/**/*.rb'
- 'ee/lib/**/*.rb'
- 'spec/**/*.rb'
- 'ee/spec/**/*.rb'
Exclude:
- 'ee/db/**/*.rb'
- 'spec/migrations/**/*.rb'
- 'lib/gitlab/background_migration/**/*.rb'
- 'spec/lib/gitlab/background_migration/**/*.rb'
- 'spec/lib/gitlab/database/**/*.rb'
Gitlab/DuplicateSpecLocation:
Enabled: true
@ -607,6 +624,12 @@ Migration/CreateTableWithForeignKeys:
Exclude:
- !ruby/regexp /\Adb\/(?:post_)?migrate\/(?:201[0-9]\d+|20200[0-8][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])_.+\.rb\z/
Migration/PreventIndexCreation:
Exclude:
- !ruby/regexp /\Adb\/(post_)?migrate\/201.*\.rb\z/
- !ruby/regexp /\Adb\/(post_)?migrate\/2020.*\.rb\z/
- !ruby/regexp /\Adb\/(post_)?migrate\/20210[1-6].*\.rb\z/
Gitlab/RailsLogger:
Exclude:
- 'spec/**/*.rb'

File diff suppressed because it is too large Load diff

View file

@ -440,7 +440,7 @@ Rails/ApplicationController:
- 'app/controllers/health_controller.rb'
- 'app/controllers/metrics_controller.rb'
- 'ee/app/controllers/oauth/geo_auth_controller.rb'
- 'ee/spec/helpers/ee/services_helper_spec.rb'
- 'ee/spec/helpers/ee/integrations_helper_spec.rb'
- 'lib/gitlab/base_doorkeeper_controller.rb'
- 'lib/gitlab/request_forgery_protection.rb'
- 'spec/controllers/concerns/continue_params_spec.rb'
@ -660,23 +660,6 @@ Style/BisectedAttrAccessor:
Style/CaseLikeIf:
Enabled: false
# Offense count: 10
# Cop supports --auto-correct.
# Configuration parameters: IgnoredMethods.
# IgnoredMethods: ==, equal?, eql?
Style/ClassEqualityComparison:
Exclude:
- 'app/finders/security/jobs_finder.rb'
- 'app/services/projects/overwrite_project_service.rb'
- 'app/uploaders/dependency_proxy/file_uploader.rb'
- 'ee/app/graphql/resolvers/vulnerabilities/issue_links_resolver.rb'
- 'lib/gitlab/background_migration/user_mentions/models/note.rb'
- 'lib/gitlab/diff/file.rb'
- 'lib/gitlab/git.rb'
- 'lib/gitlab/import_export/relation_tree_restorer.rb'
- 'spec/requests/api/services_spec.rb'
- 'spec/support/shared_examples/lib/gitlab/import_export/relation_factory_shared_examples.rb'
# Offense count: 13
Style/CombinableLoops:
Exclude:

View file

@ -2,69 +2,681 @@
documentation](doc/development/changelog.md) for instructions on adding your own
entry.
## 14.0.10 (2021-09-02)
## 14.1.7 (2021-09-30)
No changes.
### Security (28 changes)
## 14.0.9 (2021-08-31)
- [Require password param for 2FA changes](gitlab-org/security/gitlab@4e16401a77264ef3127f0bb314fa0abab11216c7) ([merge request](gitlab-org/security/gitlab!1816))
- [Fix permissions check on project members import](gitlab-org/security/gitlab@be54b3f4890fa89d58cb02be79c65025f606bd6c) ([merge request](gitlab-org/security/gitlab!1860))
- [Respect disabled import sources when initiating import via API](gitlab-org/security/gitlab@b76b6229c93447954efc5719e6dd61eb601afdc4) ([merge request](gitlab-org/security/gitlab!1848))
- [Return 404 if model id wasn't passed to UploadsController](gitlab-org/security/gitlab@8ab1cfaafba21a9e90ef41677993af2afdcd920a) ([merge request](gitlab-org/security/gitlab!1845))
- [Scrub artifacts signed URL in SendEntry logs](gitlab-org/security/gitlab@5bae93b2f085d5dac58e411bffb5ca518fe7df98) ([merge request](gitlab-org/security/gitlab!1842))
- [Prevent double-impersonation and impersonation breakout](gitlab-org/security/gitlab@7c82d0f2a1dbfb0a23d6a5cdaee448307ffc6972) ([merge request](gitlab-org/security/gitlab!1836))
- [Clear session access tokens when starting/stopping impersonation](gitlab-org/security/gitlab@a4d529eb7c8eeb3e9c42ae3d81514d79a905cdb7) ([merge request](gitlab-org/security/gitlab!1833))
- [Use validated URL when sending request to Gitea Importer](gitlab-org/security/gitlab@b30536e6c9aa969c76bcd167f00db5a0e07ace7a) ([merge request](gitlab-org/security/gitlab!1820))
- [Fix XSS in Jira link](gitlab-org/security/gitlab@9ace10c46744ee220c649d2da0eeb3e99216ee7d) ([merge request](gitlab-org/security/gitlab!1625)) **GitLab Enterprise Edition**
- [Fix fogbugz importer DNS Rebind SSRF](gitlab-org/security/gitlab@9d7107665d6ed931ef4b2feeb0287bc71b89232c) ([merge request](gitlab-org/security/gitlab!1682))
- [Remove related project access tokens when a project is deleted](gitlab-org/security/gitlab@b86096865949f07f6a2020603959117d9c84877b) ([merge request](gitlab-org/security/gitlab!1812))
- [Require group admin access to list pending invites](gitlab-org/security/gitlab@404b344edd61b2f13c3498cd545c2b40165ee536) ([merge request](gitlab-org/security/gitlab!1721))
- [Do not export and import repository_size_limit](gitlab-org/security/gitlab@56f563980f944f1a5e3935ad82070e6719cd5a0c) ([merge request](gitlab-org/security/gitlab!1768))
- [Escapes MR approval rule names correctly](gitlab-org/security/gitlab@ea64f981ce70a0e1e6ee58e64a6007e82f48e071) ([merge request](gitlab-org/security/gitlab!1809))
- [Filter shared groups autocomplete by permitted](gitlab-org/security/gitlab@59999ab27cba402589b27d204cf29678100e948b) ([merge request](gitlab-org/security/gitlab!1806)) **GitLab Enterprise Edition**
- [Require access token for git when 2fa is required](gitlab-org/security/gitlab@6a4a75efd7685a69ffa7cc4c027c7058013cca45) ([merge request](gitlab-org/security/gitlab!1796))
- [Disable exporting pipeline triggers on project export](gitlab-org/security/gitlab@8a8c78ed054def210013a849195939d7888fcf65) ([merge request](gitlab-org/security/gitlab!1790))
- [Add pagination to dependencies API](gitlab-org/security/gitlab@2a963ad670c60d1f3078fdf446ea755c5862fa26) ([merge request](gitlab-org/security/gitlab!1725)) **GitLab Enterprise Edition**
- [Permission check issuable template API data](gitlab-org/security/gitlab@9d95d13bc714e46b5e3697288c4b398cb5aee88b) ([merge request](gitlab-org/security/gitlab!1787)) **GitLab Enterprise Edition**
- [Apply account locking to password reset page](gitlab-org/security/gitlab@47ee79b1983de886f5ebe04b2975c2e37aa938ce) ([merge request](gitlab-org/security/gitlab!1784))
- [Enforce configured scopes for Oauth applications](gitlab-org/security/gitlab@acf2d894c91aa7fb72ea32b10e50e94441885399) ([merge request](gitlab-org/security/gitlab!1781))
- [Verify state before using errors from OAuth2 OmniAuth providers](gitlab-org/security/gitlab@20073576508aa239e52d8ff911c1dfd3df8af670) ([merge request](gitlab-org/security/gitlab!1778))
- [Prevent moving epic issues to different group hierarchy](gitlab-org/security/gitlab@93c6ec69b7bc6c9124a2a5350cebebb57f63a28f) ([merge request](gitlab-org/security/gitlab!1774)) **GitLab Enterprise Edition**
- [Prevent showing not allowed subgroup epics](gitlab-org/security/gitlab@72a11e72425a033f3464d6ff12b4d06e12ec9faf) ([merge request](gitlab-org/security/gitlab!1766)) **GitLab Enterprise Edition**
- [Do not allow status checks to exist with external protected branches](gitlab-org/security/gitlab@8f96c013ccbbe9c52b3f03fb0d247debb1b157a8) ([merge request](gitlab-org/security/gitlab!1763)) **GitLab Enterprise Edition**
- [Fix GFM autocomplete xss](gitlab-org/security/gitlab@fd92dabddff5ae5d67a98aef5d858438520a2f06) ([merge request](gitlab-org/security/gitlab!1748))
- [Prohibit anonymous access for specific user API endpoint](gitlab-org/security/gitlab@2e8a386430309a931dbbd47fba7540a53399ad64) ([merge request](gitlab-org/security/gitlab!1737))
- [Fix denial-of-service attack in Markdown parser](gitlab-org/security/gitlab@5b6ed5212f880e2397dbea9ffc74cf0a35bd4411) ([merge request](gitlab-org/security/gitlab!1728))
### Security (9 changes)
- [Update apollo_upload_server dependency](gitlab-org/security/gitlab@ced741d93fa664f0c152f524949258bf969b7667) ([merge request](gitlab-org/security/gitlab!1701))
- [Ensure shared group members lose project access after group deletion](gitlab-org/security/gitlab@3a41f4e29c01188aaaf01ab5e3deec2a9eeed18e) ([merge request](gitlab-org/security/gitlab!1685))
- [Fix stored XSS vulnerability in Datadog settings form](gitlab-org/security/gitlab@269e5bf96b5e97c3b8e6f6b8b3f593d958de2ecb) ([merge request](gitlab-org/security/gitlab!1672))
- [Inherit user external status while creating project bots](gitlab-org/security/gitlab@5bae4e53bd4c363270b2fc2e308b81d2a2a388a6) ([merge request](gitlab-org/security/gitlab!1666))
- [Escape issue reference and title for Jira issues](gitlab-org/security/gitlab@0397f2b393d563559c49c39c0ba1d192d08a10d7) ([merge request](gitlab-org/security/gitlab!1663)) **GitLab Enterprise Edition**
- [Require sign in for .keys endpoint on non-public instances](gitlab-org/security/gitlab@13a7f6001f663b3745159fa37b518ba4a43355bd) ([merge request](gitlab-org/security/gitlab!1659))
- [Update Import/Export to use public email when mapping users](gitlab-org/security/gitlab@f3d1b800af55986cef83aeaf4df1312e3070f0c5) ([merge request](gitlab-org/security/gitlab!1654)) **GitLab Enterprise Edition**
- [Only create jira connect NS subscriptions for admins](gitlab-org/security/gitlab@34bdcd45f24eaa051702834fb6c3568e45721004) ([merge request](gitlab-org/security/gitlab!1647))
- [Prevent non-admins from configuring Jira connect app](gitlab-org/security/gitlab@4af692246224b1cd1e2fe3c6d0ac2613c0f8fe39) ([merge request](gitlab-org/security/gitlab!1643))
## 14.0.8 (2021-08-25)
## 14.1.6 (2021-09-27)
### Fixed (1 change)
- [Fix: Sidekiq workers delete each other's metrics](gitlab-org/gitlab@98a85fcbcdf2f8dfef83e552a850591e8952c057) ([merge request](gitlab-org/gitlab!68761))
- [Fix Elastic::MigrationWorker current_migration (2nd attempt)](gitlab-org/gitlab@f07c7a5f173a2fc053247664f21c03d29df543a4) ([merge request](gitlab-org/gitlab!71187)) **GitLab Enterprise Edition**
## 14.1.5 (2021-09-02)
### Fixed (1 change)
- [Geo: Replicate multi-arch containers](gitlab-org/gitlab@4f74fe9fb6f53cd877d8f793e2ef74c4177006d1) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67624)) **GitLab Enterprise Edition**
## 14.1.4 (2021-08-31)
### Security (8 changes)
- [Update apollo_upload_server dependency](gitlab-org/security/gitlab@34e7e3b7590fd76d0f618091551651e8065edfd2) ([merge request](gitlab-org/security/gitlab!1700))
- [Ensure shared group members lose project access after group deletion](gitlab-org/security/gitlab@4a7b8203776b719c06186c1b189a8cf21572fcd4) ([merge request](gitlab-org/security/gitlab!1684))
- [Fix stored XSS vulnerability in Datadog settings form](gitlab-org/security/gitlab@0906814af604e7fcab54a96bccadcba11207387d) ([merge request](gitlab-org/security/gitlab!1671))
- [Inherit user external status while creating project bots](gitlab-org/security/gitlab@d5a26c4145d917b5b49e207e03669d2b7e4ee617) ([merge request](gitlab-org/security/gitlab!1665))
- [Escape issue reference and title for Jira issues](gitlab-org/security/gitlab@4153444b76421ddf3a7fd21f1fc0500700a4e263) ([merge request](gitlab-org/security/gitlab!1662)) **GitLab Enterprise Edition**
- [Require sign in for .keys endpoint on non-public instances](gitlab-org/security/gitlab@b090b3f6dee6d21d93595c5e46e6c5c7fc30f1fb) ([merge request](gitlab-org/security/gitlab!1658))
- [Only create jira connect NS subscriptions for admins](gitlab-org/security/gitlab@3f2040c0e2c90f3fcafdbf0f86bd2591bd458dff) ([merge request](gitlab-org/security/gitlab!1648))
- [Prevent non-admins from configuring Jira connect app](gitlab-org/security/gitlab@fa864c0a2eaf450033f4c594cea07d9f24144cd6) ([merge request](gitlab-org/security/gitlab!1644))
## 14.1.3 (2021-08-17)
### Fixed (2 changes)
- [Geo 2.0 Regression - Add ability to remove primary](gitlab-org/gitlab@1635f3d07d421edd2a83be109d7c54635aa4f58c) ([merge request](gitlab-org/gitlab!68383)) **GitLab Enterprise Edition**
- [[RUN AS-IF-FOSS] AS Fix SAML SSO login redirects not working](gitlab-org/gitlab@7b551e3d2a4ba6127549c613ee95e2c12c014b90) ([merge request](gitlab-org/gitlab!68383)) **GitLab Enterprise Edition**
### Changed (1 change)
- [Resolve "operator does not exist: integer[] || bigint in...](gitlab-org/gitlab@273cc43f7928e89fd11237b58fdfdfb8a24e5493) ([merge request](gitlab-org/gitlab!68761))
- [Resolve "operator does not exist: integer[] || bigint in...](gitlab-org/gitlab@99e6457b6d9d39805dc7758c47091cf6ad0f2bdd) ([merge request](gitlab-org/gitlab!68383))
## 14.1.2 (2021-08-03)
### Security (19 changes)
- [Add project member validation for domain limitation](gitlab-org/security/gitlab@d17016dde463811c81a22c07aeab817ff7b5757c) ([merge request](gitlab-org/security/gitlab!1564))
- [Hide project-level CI/CD Analytics for Guests](gitlab-org/security/gitlab@ce3b41daadd795e906b5bbbec424a494c491a1d4) ([merge request](gitlab-org/security/gitlab!1600))
- [Only allow invite to be accepted by user with matching email](gitlab-org/security/gitlab@9d9e439c6a923fa4791a056e599c7b7e76de59a1) ([merge request](gitlab-org/security/gitlab!1632))
- [Add html escaping for default branch name](gitlab-org/security/gitlab@549101007452bd43d866d314b1c787120cfcb36a) ([merge request](gitlab-org/security/gitlab!1630))
- [Configure OmniAuth to use GitLab AppLogger](gitlab-org/security/gitlab@0b234f0058bbaa0415ab43182761757c332764d1) ([merge request](gitlab-org/security/gitlab!1615))
- [Add permissions check to pipelines#show action](gitlab-org/security/gitlab@6901d52d5265d126419e78848344ae9a886ee1a7) ([merge request](gitlab-org/security/gitlab!1612))
- [Prevent impersonation in gitlab-shell SSH certs](gitlab-org/security/gitlab@82a878ba276c6500af5aa3d951819240535127de) ([merge request](gitlab-org/security/gitlab!1609))
- [Fix Protected Environment Accesses Cleanup](gitlab-org/security/gitlab@0c954547dbdee6a47fc755eebef0882852080579) ([merge request](gitlab-org/security/gitlab!1606)) **GitLab Enterprise Edition**
- [Use oauth_app id instead of uid](gitlab-org/security/gitlab@9c49cbbbc730eb16ef109c1f1fc1b167768d5dd3) ([merge request](gitlab-org/security/gitlab!1603)) **GitLab Enterprise Edition**
- [Block impersonation token use if it is not permitted](gitlab-org/security/gitlab@1a73b228549dfe1fe98f44a8cee8e3ebcc36d841) ([merge request](gitlab-org/security/gitlab!1583))
- [Fix XSS in Mermaid Markdown rendering](gitlab-org/security/gitlab@6bff57b10739c42d177371dbf44143d92de1e595) ([merge request](gitlab-org/security/gitlab!1488))
- [Do not show email address in error message](gitlab-org/security/gitlab@fdee78b193d9744253c7b7d671247cc50175c643) ([merge request](gitlab-org/security/gitlab!1596)) **GitLab Enterprise Edition**
- [Updates oauth to 0.5.6](gitlab-org/security/gitlab@bfa3de880659b0156cf8c2a7085b1705596380a4) ([merge request](gitlab-org/security/gitlab!1592))
- [Fix tag ref detection for pipelines](gitlab-org/security/gitlab@87a03ffd263ad153a911e14512cb7776b98a435d) ([merge request](gitlab-org/security/gitlab!1591))
- [Disallow non-members to set issue metadata on issue create](gitlab-org/security/gitlab@abe9d660ce3314c1540ec20b3a0640e623c56ecc) ([merge request](gitlab-org/security/gitlab!1586))
- [Prevent guests from linking issues with errors](gitlab-org/security/gitlab@4a74667407b725176c4722e86bba3f942ffc9487) ([merge request](gitlab-org/security/gitlab!1587))
- [Filter todos whose target users no longer have access to](gitlab-org/security/gitlab@a05dd90c43ae84bb37956217d9cf4effd1edae50) ([merge request](gitlab-org/security/gitlab!1556))
- [Remove impersonation token from api response for non-admin user](gitlab-org/security/gitlab@928eaf1b82d45fbfa0d82b6515d192453b944ab9) ([merge request](gitlab-org/security/gitlab!1565))
- [Restrict access to instance-level security features for reporters](gitlab-org/security/gitlab@d4097341cede050e0066fa2a5445cbf51a1cc1bd) ([merge request](gitlab-org/security/gitlab!1561)) **GitLab Enterprise Edition**
## 14.1.1 (2021-07-28)
### Added (1 change)
- [RackAttack: extend basic authentication detection for rate limiting](gitlab-org/gitlab@ad521c88bfa8da185380397aa2e6e8972a28b04e) ([merge request](gitlab-org/gitlab!66726))
### Fixed (3 changes)
- [Prevent terms from being created if blank](gitlab-org/gitlab@29e5ebe23869cfe1325d8f7ab2ec17a3a8670f61) ([merge request](gitlab-org/gitlab!66726))
- [Fix: Sidekiq workers delete each other's metrics](gitlab-org/gitlab@d6d8ed55392a90cc55aa6213ebae80008d0df3e0) ([merge request](gitlab-org/gitlab!66726))
- [Resolve "Bulk dismissal checkboxes don't appear on group vulnerability report"](gitlab-org/gitlab@77b2cf8b935aba08f23c00cf5fdc746849a65e74) ([merge request](gitlab-org/gitlab!66726)) **GitLab Enterprise Edition**
### Other (1 change)
- [Revert backfill on ci_build_trace_sections](gitlab-org/gitlab@10a5ad9dce9014eb8af6493402dcdd1658dbd62a) ([merge request](gitlab-org/gitlab!68761))
- [Revert backfill on ci_build_trace_sections](gitlab-org/gitlab@a67a8d734440d50c5fdbb0c559b5d2a2f6e48fae) ([merge request](gitlab-org/gitlab!66726))
## 14.0.7 (2021-08-03)
## 14.1.0 (2021-07-21)
### Security (18 changes)
### Added (123 changes)
- [Add project member validation for domain limitation](gitlab-org/security/gitlab@f9a0e78111cbbfe93b6f8ca27bd9f064e146d005) ([merge request](gitlab-org/security/gitlab!1563))
- [Hide project-level CI/CD Analytics for Guests](gitlab-org/security/gitlab@56a17ae80c1f179bcdf939d6b8e71737f9501949) ([merge request](gitlab-org/security/gitlab!1574))
- [Only allow invite to be accepted by user with matching email](gitlab-org/security/gitlab@a79d0e6dbbc32247c10c4928a04f0149071eb5fe) ([merge request](gitlab-org/security/gitlab!1633))
- [Add html escaping for default branch name](gitlab-org/security/gitlab@d26f0c4d5ef386100d40e92f815b7e754fccacc3) ([merge request](gitlab-org/security/gitlab!1631))
- [Configure OmniAuth to use GitLab AppLogger](gitlab-org/security/gitlab@dfcff90cb86fac0dff05d8bd5f25f46da2cc8ce0) ([merge request](gitlab-org/security/gitlab!1616))
- [Add permissions check to pipelines#show action](gitlab-org/security/gitlab@c611a8154dc5776a0767b4153ff8963d46e7f39a) ([merge request](gitlab-org/security/gitlab!1613))
- [Prevent impersonation in gitlab-shell SSH certs](gitlab-org/security/gitlab@320457b16cbfd5dec4e05937c4d61b96aba4c290) ([merge request](gitlab-org/security/gitlab!1610))
- [Fix Protected Environment Accesses Cleanup](gitlab-org/security/gitlab@99846cdeda6acf6223fb0ee5364e375765d3cbb1) ([merge request](gitlab-org/security/gitlab!1607)) **GitLab Enterprise Edition**
- [Do not show email address in error message](gitlab-org/security/gitlab@5c4adf419e38f0fd9d540d2f7cd9d14888bc6b96) ([merge request](gitlab-org/security/gitlab!1597)) **GitLab Enterprise Edition**
- [Disallow non-members to set issue metadata on issue create](gitlab-org/security/gitlab@0bb4499e5f4514beb647d0e6ac3f9b15720c42ce) ([merge request](gitlab-org/security/gitlab!1581))
- [Prevent guests from linking issues with errors](gitlab-org/security/gitlab@94462a56e9490ddd85ec7d1d869b6fda2042fb99) ([merge request](gitlab-org/security/gitlab!1588))
- [Block impersonation token use if it is not permitted](gitlab-org/security/gitlab@31b8bc506dd89a576a2cda094c711c22be764398) ([merge request](gitlab-org/security/gitlab!1584))
- [Updates oauth to 0.5.6](gitlab-org/security/gitlab@c839b6107c41bcd02e048d0ae0499c140bfbec1c) ([merge request](gitlab-org/security/gitlab!1568))
- [Remove impersonation token from api response for non-admin user](gitlab-org/security/gitlab@845dc284cc8ee8736e4f65740d61ffeb197f7b7c) ([merge request](gitlab-org/security/gitlab!1566))
- [Filter todos whose target users no longer have access to](gitlab-org/security/gitlab@a6c81e5cadb277f80d1b9565700f8b1f201cfb05) ([merge request](gitlab-org/security/gitlab!1554))
- [Fix tag ref detection for pipelines](gitlab-org/security/gitlab@cd5f61dc50c44d69896b38f3bd44129a8f1f01d8) ([merge request](gitlab-org/security/gitlab!1548))
- [Restrict access to instance-level security features for reporters](gitlab-org/security/gitlab@c8a75e8032c68065524a85f7030960b614a915bd) ([merge request](gitlab-org/security/gitlab!1539)) **GitLab Enterprise Edition**
- [Fix XSS in Mermaid Markdown rendering](gitlab-org/security/gitlab@86139e79c13cf87183cdec9f84ec114cdfc6d215) ([merge request](gitlab-org/security/gitlab!1489))
- [Add ability to set `squash_option` in the Project API](gitlab-org/gitlab@0cd893d72f410351411563e54af9e1d3f6fd789f) ([merge request](gitlab-org/gitlab!66122))
- [Add ref to pipeline graphql schema](gitlab-org/gitlab@4f4f2ec9adf86f841828b87f39639684ee2051f0) ([merge request](gitlab-org/gitlab!66241))
- [Upsell the GitLab Managed Terraform state if the repo contains `.tf` files](gitlab-org/gitlab@e2763f345fde0232092e6b099550c715c503e03e) ([merge request](gitlab-org/gitlab!65870))
- [Add mailgun endpoint for receiveing permanent failures](gitlab-org/gitlab@af2a6a81b92110c27da08528c5ed5dfe1ebf3f7d) ([merge request](gitlab-org/gitlab!65078))
- [Add error tracking collector](gitlab-org/gitlab@90e16440fc02e74d426a8c023a2e6a0f9d430990) ([merge request](gitlab-org/gitlab!65767))
- [Add Vulnerability Management metric for Devops Adoption API](gitlab-org/gitlab@4ef341255b5620a68a9ee3b4f8a570bac0bb1202) ([merge request](gitlab-org/gitlab!66081))
- [Allow immediate deletion of projects](gitlab-org/gitlab@1752841832fcbe88bd9da3b3720697bcce2be9dc) ([merge request](gitlab-org/gitlab!65522)) **GitLab Enterprise Edition**
- [Make database changes to persist false_positive information](gitlab-org/gitlab@10ff49e8bca5a0510fc2599bf378f1aecbe16394) ([merge request](gitlab-org/gitlab!65573))
- [Added user_cap to setting update service](gitlab-org/gitlab@f88b2f61621c4177adbd3ac68fa7e53f95aab811) ([merge request](gitlab-org/gitlab!65542))
- [Audit successful GPG key creation and removal](gitlab-org/gitlab@f32cc873fac3b730af86bb8095862190770174ff) ([merge request](gitlab-org/gitlab!65973)) **GitLab Enterprise Edition**
- [Enable sidekiq load balancing by default](gitlab-org/gitlab@a36a0b84264738c942363798a9dab3a6b51895a7) ([merge request](gitlab-org/gitlab!65669))
- [Add Pipeline Editor branch selector](gitlab-org/gitlab@13b69f776686e98fa0752c303aebb8c64320c264) ([merge request](gitlab-org/gitlab!61793))
- [Introduce multiple oncall schedules feature](gitlab-org/gitlab@643a821b2314347b6932a36642ab9a77271652e8) ([merge request](gitlab-org/gitlab!65827)) **GitLab Enterprise Edition**
- [Track secure scans](gitlab-org/gitlab@4e38000304a5f900bf9049fdf5e5a4de488f8bfb) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64578)) **GitLab Enterprise Edition**
- [Redirect to the new default branch from a deleted default branch](gitlab-org/gitlab@3ab93d237c5ef8bf9be2a17d7b177dcf9aaca674) ([merge request](gitlab-org/gitlab!65469))
- [Add button to insert images in content editor](gitlab-org/gitlab@359961ca833e3b0f1f31b03dec68ab5efb2dfabe) ([merge request](gitlab-org/gitlab!63939))
- [Add support for rendering tables in content editor](gitlab-org/gitlab@51035cfad7a5b51427b4bf7f9d8398049f473dee) ([merge request](gitlab-org/gitlab!63945))
- [Release the Helm charts registry](gitlab-org/gitlab@ff3de432b40b91173490084c56092fe0178736c9) ([merge request](gitlab-org/gitlab!65768))
- [Allow configuring Redis trace chunks instance](gitlab-org/gitlab@607f6703c5136d9684a9d7176eba85bf7b3d5f19) ([merge request](gitlab-org/gitlab!65871))
- [Add warning when import url does not ends with .git](gitlab-org/gitlab@2d909b1b1477bdb5228576d46fdc4eccb0afd61b) ([merge request](gitlab-org/gitlab!65739))
- [Adds ID to group, stage, and detailed status](gitlab-org/gitlab@326a4a9d21de0ac4b29225d86f793452d7168057) ([merge request](gitlab-org/gitlab!64630))
- [Removed the compliance_dashboard_drawer feature flag](gitlab-org/gitlab@0351c9db623f5965d2015091b7bcde902c8fd740) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65943)) **GitLab Enterprise Edition**
- [Upgrade GitLab Pages to 1.41.0](gitlab-org/gitlab@18c7524a21e8abf53f59d39aa333a6e67e5e13f5) ([merge request](gitlab-org/gitlab!66033))
- [Enable GraphQL Runner API](gitlab-org/gitlab@e6d9456e6730b21bb167b52f736a7026ba906ee5) ([merge request](gitlab-org/gitlab!65942))
- [Add Collected Data Categories Service Ping metric](gitlab-org/gitlab@ff900fe685fae48c77174598cc98247c9c144057) ([merge request](gitlab-org/gitlab!65336))
- [Show progress of an epic on epic board cards](gitlab-org/gitlab@788e814331973744e48862b4f8878b4f63dc5bf8) ([merge request](gitlab-org/gitlab!64622)) **GitLab Enterprise Edition**
- [Add graphql mutation to enable dependency scanning](gitlab-org/gitlab@b342443ef2e9cd11ca258d335f7cc12a1877d30e) ([merge request](gitlab-org/gitlab!64710)) **GitLab Enterprise Edition**
- [Enable sec_dependency_scanning_ui_enable by default](gitlab-org/gitlab@132a5d6fdb71921733d6bd0c08a2dc3d577398af) ([merge request](gitlab-org/gitlab!58363)) **GitLab Enterprise Edition**
- [Add policy type filter](gitlab-org/gitlab@2a791915afc4afe061f1be42c5f7bb3386c1f0fc) ([merge request](gitlab-org/gitlab!65500)) **GitLab Enterprise Edition**
- [Adds audit event when compliance framework changed](gitlab-org/gitlab@6f7186c52af863637d445ac3c8f8f3005622effb) ([merge request](gitlab-org/gitlab!65343)) **GitLab Enterprise Edition**
- [Allow copying Epic reference from sidebar](gitlab-org/gitlab@442aa2b51b46490ccfd6cb0bd2b8c133da5d48b7) ([merge request](gitlab-org/gitlab!65550)) **GitLab Enterprise Edition**
- [Audit successful key destroy action](gitlab-org/gitlab@e2943e7199d3139f8d279c95a21ed5621412480d) ([merge request](gitlab-org/gitlab!65615)) **GitLab Enterprise Edition**
- [Add observability to Snowplow tracking](gitlab-org/gitlab@fd135d450a1b9a2bbc56ae7f0383605975010574) ([merge request](gitlab-org/gitlab!65664))
- [Support providing kind to internal Network Policies edit API](gitlab-org/gitlab@b007a9ba5311b27983f34db9e1ac9122b7e223bf) ([merge request](gitlab-org/gitlab!65476)) **GitLab Enterprise Edition**
- [Add Running Container Scanning CI Template](gitlab-org/gitlab@f22a8edfe14d47597e02e42dca095356805e007a) ([merge request](gitlab-org/gitlab!64220)) **GitLab Enterprise Edition**
- [Add pause and resume to background migrations](gitlab-org/gitlab@32f6ba0477c42e5ec7acb47c137c2170440a7abf) ([merge request](gitlab-org/gitlab!65512))
- [Display Helm packages in the package registry](gitlab-org/gitlab@e14e343debcc31ab0a8258fd986fae9f766b7377) ([merge request](gitlab-org/gitlab!65688))
- [Feat(Blob): Add CSV render support for Blob Viewer](gitlab-org/gitlab@ccc0d8ae4892f8ee87e9ba2ae5ff91d7fab70f43) ([merge request](gitlab-org/gitlab!65050))
- [Added user_cap column to namespace_settings](gitlab-org/gitlab@672c54a0b6b49f2aa49bd5af9837ae0156f1f2b8) ([merge request](gitlab-org/gitlab!65470))
- [Wiki repositories use default branch when creating the repo](gitlab-org/gitlab@e1743a5e79b1c1e43390a4794f4ee1a817dacd22) ([merge request](gitlab-org/gitlab!65221))
- [Allow sort by popularity for issues via GraphQL](gitlab-org/gitlab@89de38a6bbb8efdb4ec088782c885b3027ea05f7) ([merge request](gitlab-org/gitlab!65323))
- [Allow sort by blocking issues via GraphQL](gitlab-org/gitlab@552576ffe9659ce790f8e10f8423b5adba7e1234) ([merge request](gitlab-org/gitlab!65323)) **GitLab Enterprise Edition**
- [Expose GraphQL query complexity score](gitlab-org/gitlab@8eefd99c0ae9d9fdc94148a090695fb2458bd4b8) ([merge request](gitlab-org/gitlab!52448))
- [Extend NetworkPolicy GraphQL API with `Environments` field](gitlab-org/gitlab@77a1cab8963fbfbcfc9cca2837800c021e2f0b29) ([merge request](gitlab-org/gitlab!65314)) **GitLab Enterprise Edition**
- [Remove ff_external_status_checks feature flag](gitlab-org/gitlab@22cccda58751a0e3aad78ee2fbe4bb43927fbce7) ([merge request](gitlab-org/gitlab!65053)) **GitLab Enterprise Edition**
- [Accept GitHub source highlight URL argument format](gitlab-org/gitlab@c87dfa3fcf89f23f756a18fd178c9bde82169e19) ([merge request](gitlab-org/gitlab!65453))
- [Add emoji name to tooltip](gitlab-org/gitlab@9022559ef4a0465c51d67175d3f61ddd02f19f8b) ([merge request](gitlab-org/gitlab!65439))
- [Do not export certain models when using Relations Export API](gitlab-org/gitlab@7c5cef46687ec0fb2a4344509d393c46399b52c4) ([merge request](gitlab-org/gitlab!65347))
- [Add Coverage fuzzing to DevopsAdoption API](gitlab-org/gitlab@f1d4e0c5dde9a8b6934e61f527227746d2c314c4) ([merge request](gitlab-org/gitlab!65253))
- [Extend Plan limits API with `terraform_module_max_file_size`](gitlab-org/gitlab@07804f5472e897ae7d70465b33e2a0282d42f5b0) ([merge request](gitlab-org/gitlab!65425))
- [Add dependency scanning to DevopsAdoption API](gitlab-org/gitlab@0b0198255f3b10606458f4d0996c1550b9d4a790) ([merge request](gitlab-org/gitlab!64624))
- [Add Bulk Imports API to view user initiated imports](gitlab-org/gitlab@c10058e690c2de140805baa4a08a15c47e5a381a) ([merge request](gitlab-org/gitlab!64335))
- [Allow sort and expose expired field for milestones](gitlab-org/gitlab@771d9576f5dc27e30fbc2df990b22764bfb028f8) ([merge request](gitlab-org/gitlab!64572))
- [Add group-level DORA metrics to GraphQL endpoint](gitlab-org/gitlab@b23f814969a4691a3651030483558d334641f0bc) ([merge request](gitlab-org/gitlab!65279)) **GitLab Enterprise Edition**
- [Make the variable type for the GitLab CI secret configurable](gitlab-org/gitlab@0ff59c782a585ad3a2b9a2bdf6626a31c5ea145b) ([merge request](gitlab-org/gitlab!54858)) **GitLab Enterprise Edition**
- [Add GitLab revision to Prometheus metric](gitlab-org/gitlab@36046c63b2dea241070c91a07a7650a3b65bec55) ([merge request](gitlab-org/gitlab!65276))
- [Add project-level DORA metrics to GraphQL endpoint](gitlab-org/gitlab@ef0cffc8119734c6639e2ab8d8671e019b508d50) ([merge request](gitlab-org/gitlab!64961)) **GitLab Enterprise Edition**
- [Remove project from Job Token Scope via GraphQL](gitlab-org/gitlab@c20de7a97f482e312ddf842e45a5098f8455a4f3) ([merge request](gitlab-org/gitlab!64522))
- [Add timezone to web operations](gitlab-org/gitlab@868f0c45a9dbdd6d110f9f7d637946981971aa6d) ([merge request](gitlab-org/gitlab!64084))
- [Add CIJobToken project allow list resolver](gitlab-org/gitlab@08e8188af04a8f2fafe86190a7dc90a252d23ad1) ([merge request](gitlab-org/gitlab!64095))
- [Add ability to search for cluster image scanning jobs](gitlab-org/gitlab@3579088ee97b2d1a26e3d2dbba726c3a9b7f61a6) ([merge request](gitlab-org/gitlab!64616)) **GitLab Enterprise Edition**
- [Add target branch in pipeline editor for blank projects](gitlab-org/gitlab@c9e9a6254dc35cd5892a3885c1284f0f0fa06fa2) ([merge request](gitlab-org/gitlab!64575))
- [Add jobCount and projectCount to GraphQL CiRunner](gitlab-org/gitlab@af9e0ea5e9a532b373d89db29edf5899eaec88e6) ([merge request](gitlab-org/gitlab!64117))
- [Remove gitlab_experiment_middleware feature flag](gitlab-org/gitlab@62d5345c70cad5a2db32042d1898716e611d8dcd) ([merge request](gitlab-org/gitlab!65081))
- [Add instance-level audit event when admin status changes](gitlab-org/gitlab@6724b3e03cc3a9aca261cec28b9e3db92a1517a6) ([merge request](gitlab-org/gitlab!65168)) **GitLab Enterprise Edition**
- [Add link to admin area on project view and group view](gitlab-org/gitlab@ded9a9d5716f3e1c63f39f2d73ca16134ed0210e) ([merge request](gitlab-org/gitlab!63410))
- [Add support for legacy blob viewers](gitlab-org/gitlab@440dd4f481a2a52776a04f263d1c49822e633890) ([merge request](gitlab-org/gitlab!64839))
- [Preserve user authorship during bulk imports](gitlab-org/gitlab@31245e13593a3e57385e3384877c0aa3696372ad) ([merge request](gitlab-org/gitlab!64908))
- [Add usage ping features frontend checkboxes](gitlab-org/gitlab@295bd62308977822e2fecdf6e5d518f5bcb99024) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64186))
- [Remove kubernetes_agent_on_gitlab_com feature flag](gitlab-org/gitlab@dfdf249cb7943bcbbbf7e03983253554960812e1) ([merge request](gitlab-org/gitlab!60081))
- [Add system note when escalating to users](gitlab-org/gitlab@6bd709f4a1e4bc674d095c6b7941bc93bd323b3e) ([merge request](gitlab-org/gitlab!64899)) **GitLab Enterprise Edition**
- [Remove project_finder_similarity_sort feature flag](gitlab-org/gitlab@abb677ddbe651da7d04c876cc9a4667ca94b58e3) ([merge request](gitlab-org/gitlab!64361))
- [Track usage data for Network Policies UI](gitlab-org/gitlab@4a15309619053a4e20f2f32003d6a8444e9821ba) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64731)) **GitLab Enterprise Edition**
- [Add compliance_frameworks_with_pipeline to usage ping](gitlab-org/gitlab@fd420b4799d32066d0896a5f6e3747a60b3c0958) ([merge request](gitlab-org/gitlab!64601)) **GitLab Enterprise Edition**
- [Remove ci_quota_check_on_retries feature flag](gitlab-org/gitlab@0ab0678dc1a0a1a934b66948770d49b725511b5b) ([merge request](gitlab-org/gitlab!65044)) **GitLab Enterprise Edition**
- [Add scan execution policies to the policy list](gitlab-org/gitlab@aa2cf5e2afd6c23a37aa9340b82dc4312007b80f) ([merge request](gitlab-org/gitlab!64783)) **GitLab Enterprise Edition**
- [Allow passing PAT name and scopes via the URL](gitlab-org/gitlab@e4e1292d8cd4c38fa0e5332ed7debdf7b7639b74) ([merge request](gitlab-org/gitlab!64897))
- [Add summary to timelogs](gitlab-org/gitlab@3f649999296a6314aadd99676ea324b2063f3225) ([merge request](gitlab-org/gitlab!64552))
- [Allow specifying an access level for Project Access Tokens](gitlab-org/gitlab@962c6b39c32a86ef4896112e5b47886747a14708) ([merge request](gitlab-org/gitlab!63725))
- [Send purchase source to customers API](gitlab-org/gitlab@49237198c8a72abf679ceda15b1608434bb78e7e) ([merge request](gitlab-org/gitlab!64905)) **GitLab Enterprise Edition**
- [Sync destruction between requirements and issues](gitlab-org/gitlab@1c18084384954d6d3bdf1a41a9424d94a1896a09) ([merge request](gitlab-org/gitlab!64291)) **GitLab Enterprise Edition**
- [Add CI/CD templates picker for empty pipelines page](gitlab-org/gitlab@7aefdbc42ce4c10a9c1cbaf1d7584ebaa4a074a0) ([merge request](gitlab-org/gitlab!64200))
- [Save last_synced_at on licenses table](gitlab-org/gitlab@116158c93f8839688cb2f69b1f4c606d1e91cbfa) ([merge request](gitlab-org/gitlab!64656))
- [Add validate account button on CI/CD shared runners page](gitlab-org/gitlab@1ac97dcf31f72a3e8cbb4b3e5c01d87beea798cc) ([merge request](gitlab-org/gitlab!64861)) **GitLab Enterprise Edition**
- [Relate issues and requirements](gitlab-org/gitlab@a9c39abbf219cc0d73676df316e94ee299c581ae) ([merge request](gitlab-org/gitlab!64189))
- [Add present_on_default_branch to Vulnerabilites](gitlab-org/gitlab@8f7c762b0e153438459bf8299db7fa4277e1b47d) ([merge request](gitlab-org/gitlab!64704))
- [Helm charts index API endpoint](gitlab-org/gitlab@6fd633c24f7d7e8a79e57439ab6056afb22db39a) ([merge request](gitlab-org/gitlab!62757))
- [Add backup logger class](gitlab-org/gitlab@820d264e8d0a7ae564ad825ccd4442ade5242a17) ([merge request](gitlab-org/gitlab!63832))
- [Add configuration for locating gitaly-backup](gitlab-org/gitlab@abc8d061a375e268805df27c2e8a1cc0693f9ecb) ([merge request](gitlab-org/gitlab!64834))
- [Adding raw_plain_data type to snippets](gitlab-org/gitlab@d7cb66c01ddfd22f9962cca5402addd230367451) ([merge request](gitlab-org/gitlab!64243))
- [Allow to query discussion design on GraphQL](gitlab-org/gitlab@25613d74ac74a9f1b697e00d89499fe2f21e746c) ([merge request](gitlab-org/gitlab!64550))
- [Converts the diff row component into a functional component](gitlab-org/gitlab@61b90085ef4d39c5280cc7939c0e5f0c83e281e4) ([merge request](gitlab-org/gitlab!63854))
- [Add `state` argument for the PipelineSecurityReportFindingsResolver](gitlab-org/gitlab@d550e65acc7526ad94938ac329f07991d58f9f1c) ([merge request](gitlab-org/gitlab!64762)) **GitLab Enterprise Edition**
- [Add NOT filtering to epic roadmap filtered search](gitlab-org/gitlab@8b62510509261edf35725d114b7003bc9e426a85) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64483)) **GitLab Enterprise Edition**
- [Show access level of Project Access Token in UI and API](gitlab-org/gitlab@1df3db0851c333b055deca10079a721265ee2763) ([merge request](gitlab-org/gitlab!64681))
- [Add CI variable CI_MERGE_REQUEST_APPROVED](gitlab-org/gitlab@dff9601fa5b641831d266ffa8a299d5ac8f4057f) ([merge request](gitlab-org/gitlab!64677)) **GitLab Enterprise Edition**
- [Add compliance framework label to compliance dashboard](gitlab-org/gitlab@83d33fe5b54ce5c03d21db49a08ff3f6eefeda89) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64283)) **GitLab Enterprise Edition**
- [Display Feature Flags Related to Issues](gitlab-org/gitlab@5b79efa72311d3846f003566123115d71e61369c) ([merge request](gitlab-org/gitlab!64538)) **GitLab Enterprise Edition**
- [Update styling on policy editor page](gitlab-org/gitlab@5a8461052e305484920e2a349f1385215bba0c96) ([merge request](gitlab-org/gitlab!62970)) **GitLab Enterprise Edition**
- [Remove ci_drop_new_builds_when_ci_quota_exceeded feature flag](gitlab-org/gitlab@9dcfedfe8dc97531a67b203e70d5f146f70c8e62) ([merge request](gitlab-org/gitlab!64709)) **GitLab Enterprise Edition**
- [Adds sha argument to lint](gitlab-org/gitlab@a728acee92cfb89945b3255230016045dd39cc95) ([merge request](gitlab-org/gitlab!64415))
- [Add Debian API endpoint for Packages files](gitlab-org/gitlab@8d33f75e2554b550be04ca646fcfbee55a30278d) ([merge request](gitlab-org/gitlab!64068))
- [Add option to order epics by title on list page](gitlab-org/gitlab@4474d1a6fba3efcc4374509eff072b4c3ad351d5) ([merge request](gitlab-org/gitlab!63767)) **GitLab Enterprise Edition**
- [Add wal cached counter metric](gitlab-org/gitlab@a146fc0dba73b3b193dc484c7ee43de7b8ec620f) ([merge request](gitlab-org/gitlab!64210))
- [Accept repository_update_events in SystemHooks API](gitlab-org/gitlab@d629b1a2556d73a9bbc7d6dd8149028d202041df) ([merge request](gitlab-org/gitlab!64670))
- [Added omniauth_user check when verifying user cap](gitlab-org/gitlab@21cafcbdcce25424cfcaca5356fa1fef3d43a902) **GitLab Enterprise Edition**
- [Add the ability to deep link into group/project member tabs](gitlab-org/gitlab@db589f28af5f997068da2a6f75e27b3cf9611298) ([merge request](gitlab-org/gitlab!64365))
- [Allow changing AdditionalPack namespace](gitlab-org/gitlab@d8d3b217f72f75a3332163d2ac4a90be00621492) ([merge request](gitlab-org/gitlab!64212)) **GitLab Enterprise Edition**
- [BulkImports: Import Group Avatar](gitlab-org/gitlab@0f1d882377147e1977beceb34f19cfee42f9acea) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62714))
- [Allow admins to limit registration of project and group runners](gitlab-org/gitlab@6309e13bdbb8fbe42849a8e2f78012944302f45a) ([merge request](gitlab-org/gitlab!61407))
- [Populate `latest_pipeline_id` values for `vulnerability_statistics`](gitlab-org/gitlab@917d469e906ff2d050048005d90341b17b0e49a8) ([merge request](gitlab-org/gitlab!63451)) **GitLab Enterprise Edition**
- [Add support for horizontal rule in content editor](gitlab-org/gitlab@d4b66969d6dcc52d8adbdb574c03120faee45602) ([merge request](gitlab-org/gitlab!63943))
- [Add state of merge request diff to the entity](gitlab-org/gitlab@ac2e38224f0b67684d3ddf5f35de041f815e4ef8) ([merge request](gitlab-org/gitlab!64195))
- [Associate Build with DAST Site and Scanner profile](gitlab-org/gitlab@0c8757624e68fd90c25f1e1b26152c1f4d2c25a7) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63362))
- [Show pronouns in user popover](gitlab-org/gitlab@7513e38b8badcf14d5a40252895e64a3dfb6c0b0) ([merge request](gitlab-org/gitlab!63611))
- [Create API to update upcoming reconciliations](gitlab-org/gitlab@217e570c5691f683171e55fa17edaba1a4b3618b) ([merge request](gitlab-org/gitlab!63047)) **GitLab Enterprise Edition**
- [Add layout for "first mile"](gitlab-org/gitlab@82d09f270836a2cb843cfa2694bcfaa5317bbefe) ([merge request](gitlab-org/gitlab!62965))
- [Adds status to StageType in gql](gitlab-org/gitlab@ce690aaf94132b3f584cc2de892b2af684d797a9) ([merge request](gitlab-org/gitlab!61177))
- [Expose SAST & DAST devops adoption metrics](gitlab-org/gitlab@430037a8ebe2104000c7c2b1a24127e1227a17f9) ([merge request](gitlab-org/gitlab!63868)) **GitLab Enterprise Edition**
- [Allow sorting by title in REST/GraphQL API](gitlab-org/gitlab@cec733fe115b2a8ee3479ea0195b20e677741e2a) ([merge request](gitlab-org/gitlab!63756)) **GitLab Enterprise Edition**
- [Add in-product marketing emails](gitlab-org/gitlab@bf1b79e99157adfec0e605654700ad8db43afc71) ([merge request](gitlab-org/gitlab!64109))
- [Commit registration invite page to product](gitlab-org/gitlab@9fef92d31c71a2711b3a47c419339447591866dd) ([merge request](gitlab-org/gitlab!64001))
- [Support specifying a milestone for MR via push options](gitlab-org/gitlab@be94b8a3c57405115802cfc8cec71a6eacf9ca3c) ([merge request](gitlab-org/gitlab!63960))
## 14.0.6 (2021-07-20)
### Fixed (150 changes)
### Fixed (4 changes)
- [Fix error when creating or deleting a board list](gitlab-org/gitlab@5b348fb06bd81719629b2a960addce38334ac15b) ([merge request](gitlab-org/gitlab!66297))
- [Skip LFS fragment on redirect](gitlab-org/gitlab@559e7a5c1ce499eb98e1ec183159b13d0437d2fe) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65751))
- [Fix scanner comparison error](gitlab-org/gitlab@e582ef4f33fcdab9e133e1cc42e4677534b688c4) ([merge request](gitlab-org/gitlab!66322))
- [Fix background color of markdown code in dark mode](gitlab-org/gitlab@fc328c70613f849a27cec7b3ac4ea0611d4fdb19) ([merge request](gitlab-org/gitlab!66254))
- [Fix transposed rows and cols](gitlab-org/gitlab@a1f3afb43df702a4040604e1930f9110ccd2854b) ([merge request](gitlab-org/gitlab!66287))
- [Fix wiki repositories with wrong HEAD](gitlab-org/gitlab@4bb1d0e17713c993594882f1cf15c31838a83b06) ([merge request](gitlab-org/gitlab!66232))
- [Fix public selection of pages permissions](gitlab-org/gitlab@3333b06161a9200ecc8d0af9ee8b0ecf8939f833) ([merge request](gitlab-org/gitlab!66238))
- [Geo: Replicate the HEAD ref](gitlab-org/gitlab@30667e5d9ca4b83916ad539e0c2dc5245637d2d1) ([merge request](gitlab-org/gitlab!65783)) **GitLab Enterprise Edition**
- [Remove useless delete button in group settings](gitlab-org/gitlab@feaf24e7c656c7ef418f0ec478f8401e4acfcd0a) ([merge request](gitlab-org/gitlab!66067)) **GitLab Enterprise Edition**
- [Allow cleartext communication with KAS in production](gitlab-org/gitlab@81c5fdae75585897b1a3c8a6b9da55363a2c3c23) ([merge request](gitlab-org/gitlab!66135))
- [Automatically create integration webhooks when missing](gitlab-org/gitlab@c2259e5e3129e0e9dc9c00a996f4fa956596c8cb) ([merge request](gitlab-org/gitlab!65577))
- [Fix snippet url helper when repository is not present](gitlab-org/gitlab@e702e4c91d836e331dc0022d319159c0448609e6) ([merge request](gitlab-org/gitlab!66149))
- [Adjust Groups API call used in Search Group Projects select](gitlab-org/gitlab@4bb8c88e894d16ef69fb30bf894964aaeee5926d) ([merge request](gitlab-org/gitlab!66172))
- [Fix snippets display issues on mobile devices](gitlab-org/gitlab@8986231996e52334eb913d9b7ab05b255cf729e4) ([merge request](gitlab-org/gitlab!65685))
- [Fixed the header color in fly-outs for Dark mode](gitlab-org/gitlab@c0f932411ac4c537e5c6c8165a2585f305f3e619) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66138))
- [Fixed association between Finding, Finding Links](gitlab-org/gitlab@2b5ac0a8d5e242c03ac0eafc76e59ea8383a32ca) ([merge request](gitlab-org/gitlab!66103)) **GitLab Enterprise Edition**
- [Correct check for displaying SubEpic counts on boards](gitlab-org/gitlab@b9f4933910b5cce9ace8b0b99e6e415505608b5f) ([merge request](gitlab-org/gitlab!65756)) **GitLab Enterprise Edition**
- [Preload correct latest test report for requirements](gitlab-org/gitlab@d7f4636639c122ab5e6ac1f8eac5bdded22e1d76) ([merge request](gitlab-org/gitlab!66091))
- [Fix "Confirm user" button on tabs other than "Account"](gitlab-org/gitlab@d1f311c119f92222af88e2867736df78a93cb5b1) ([merge request](gitlab-org/gitlab!66004))
- [Add trigger_source for empty page tracking event](gitlab-org/gitlab@938003e8e271b3769ca03dd8e75ca8da00c43d81) ([merge request](gitlab-org/gitlab!66083))
- [Fix GET requests from graphql client when using relative url](gitlab-org/gitlab@19ec2c8da4c92a1354701e58b86947d57b1e844e) ([merge request](gitlab-org/gitlab!66053))
- [Ensure pages visibility levels are correct](gitlab-org/gitlab@0e5493b618f12b243a90725423447ec40c376fe9) ([merge request](gitlab-org/gitlab!65723))
- [Fix the write permission of the Releases with Protected Tag](gitlab-org/gitlab@229009d4bf23bab1b8b8972757952edaf945900a) ([merge request](gitlab-org/gitlab!66042))
- [Fix labelFilterParam value in issuable_list_root](gitlab-org/gitlab@a683a0f82816c70b911ccdb7d03c6b89cd1ac81a) ([merge request](gitlab-org/gitlab!65949)) **GitLab Enterprise Edition**
- [Fix filePath not being stored in GraphQL log tree cache](gitlab-org/gitlab@f8d175ef7a6384d1a424ecde786ae8b0798e4804) ([merge request](gitlab-org/gitlab!66029))
- [Fix user popovers in design management discussions](gitlab-org/gitlab@61b5dce3aef97fa46b063b971e53881925301633) ([merge request](gitlab-org/gitlab!66027))
- [Update confirmation button text in edit modals](gitlab-org/gitlab@2f159fd7180d248b17608ce4d81c6f3028fed6f4) ([merge request](gitlab-org/gitlab!65991)) **GitLab Enterprise Edition**
- [Revert to use merge requests count for group view](gitlab-org/gitlab@6ac1224121cd58599735b9ef9578ce0285d9508c) ([merge request](gitlab-org/gitlab!64640))
- [Remove transaction when migrating diff commits](gitlab-org/gitlab@650a6dee0aab0fa76fa19d0ba4f9ac67682e2772) ([merge request](gitlab-org/gitlab!65746))
- [Replace `deprecated_project_avatar` in `create_issue_form.vue`](gitlab-org/gitlab@2423c5c2f745e5eeacca9903d9029c04738c8d02) ([merge request](gitlab-org/gitlab!65842)) **GitLab Enterprise Edition**
- [Fix validation method regarding MIME type keys](gitlab-org/gitlab@0b4e1788d14edaf16e3ce999fd0520b3d2467e01) ([merge request](gitlab-org/gitlab!65954))
- [Replace the success btn to the confirm btn in the preferences page](gitlab-org/gitlab@4958268382f93f78e0e3afaa0d3934d59739fba2) ([merge request](gitlab-org/gitlab!65836))
- [Use ProjectAvatar in `frequent_items_list_item.vue`](gitlab-org/gitlab@651b52efc70d761c95e465ad8ac1712177b3fb98) ([merge request](gitlab-org/gitlab!65857))
- [Strip whitespace from GraphQL queries using GET](gitlab-org/gitlab@d88abce55e9cc61f531e77aa3a6d6930d052c767) ([merge request](gitlab-org/gitlab!65564))
- [Make job_token_scope_enabled project setting false by default](gitlab-org/gitlab@024ec9e077cc26a58b3ef1c5ad8fc5d1f0b941b4) ([merge request](gitlab-org/gitlab!64962))
- [Use namespaced security report type for Cluster Image Scanning](gitlab-org/gitlab@9e4b3bc018fa7d27ab2e1eaca9bda4fd687a9237) ([merge request](gitlab-org/gitlab!65802)) **GitLab Enterprise Edition**
- [Fix race condition on container repository create](gitlab-org/gitlab@f8ae33ca2ae2f15b2e78b4d29329700f733304b4) ([merge request](gitlab-org/gitlab!65358))
- [Fix WebIDE image being base64](gitlab-org/gitlab@89256d4df66e1cc34ad6b4c5789b7e2dd59da329) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65165))
- [Fix Issue check_for_spam? for bots](gitlab-org/gitlab@bf0bad9d9f9f403b79676cf77f7a2b3fbe7bc716) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65661))
- [Fix scan execution policy selection](gitlab-org/gitlab@203618037e1ed848cb0b912fd03c0dbf1f38d71a) ([merge request](gitlab-org/gitlab!65553)) **GitLab Enterprise Edition**
- [Advanced Search: Fix inaccessible ES server error](gitlab-org/gitlab@31e6e995a6f287ea08e12d18c933dcebef223cc7) ([merge request](gitlab-org/gitlab!65731)) **GitLab Enterprise Edition**
- [Migrate drawer titles to title slot](gitlab-org/gitlab@efc552c893c919234f6a8018d9f50f08572cde2f) ([merge request](gitlab-org/gitlab!65587))
- [Fix timebox charts events computing](gitlab-org/gitlab@d6d9c48b8e2d88545c7cd885eb0c88788ecb4f78) ([merge request](gitlab-org/gitlab!65737)) **GitLab Enterprise Edition**
- [Fix bug in DORA GraphQL endpoint](gitlab-org/gitlab@5d6ad2c0624e1a59e6670d9648a4de5c34bb2cd2) ([merge request](gitlab-org/gitlab!65653)) **GitLab Enterprise Edition**
- [Correctly positioned the is-above flyouts](gitlab-org/gitlab@8d11496482852aa16c0d3bfa95a466fe13111eaf) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65735))
- [Add another guard clause to password_expired_if_applicable](gitlab-org/gitlab@366b1d7457e12f1454c1001f93d7d43330ddd59d) ([merge request](gitlab-org/gitlab!65575))
- [Allow Bulk Import to use relative GitLab URL](gitlab-org/gitlab@8b871c337bcbebff0924ca80ec4a8ec71fd1dadb) ([merge request](gitlab-org/gitlab!65444))
- [Hide Renew button if less than 15 days for term end date](gitlab-org/gitlab@2fbdc5f2e88d9d1a0049c8f4acec8da2689d9d89) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65070)) **GitLab Enterprise Edition**
- [Fix default url for Monitor sidebar menu](gitlab-org/gitlab@9129adb35ffe0f88c2dc3732f7547fd0cf2fb849) ([merge request](gitlab-org/gitlab!65639))
- [Fix vulnerability report filter dropdown button text truncation](gitlab-org/gitlab@a65218b7f710868aca5cf21d87b38532315a8681) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65634)) **GitLab Enterprise Edition**
- [Fixed broken ui link](gitlab-org/gitlab@991e9149b59a1490d18f673c15a90c7526bece85) ([merge request](gitlab-org/gitlab!65682))
- [Fix icon size for usage quotas and billing](gitlab-org/gitlab@0eb1ddd005256befb5d5a7f46c3fca81c011d452) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65650)) **GitLab Enterprise Edition**
- [Fix LFS objects not downloading from Bitbucket](gitlab-org/gitlab@e2268e41fd457672a85722cde3b914088726fa47) ([merge request](gitlab-org/gitlab!65380))
- [Fix CAPTCHA modal for setting issue non-confidential](gitlab-org/gitlab@07416fdf1a8013fa57b25bee26a375a9814a5a84) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65659))
- [Fix typo for dismissible](gitlab-org/gitlab@a218ceaf110acf2787d1a389059aa3625ca4141c) ([merge request](gitlab-org/gitlab!65656))
- [Display correct label for named-list report types](gitlab-org/gitlab@648dc48a87804e5127e2d696a229851e13fa1c60) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65507)) **GitLab Enterprise Edition**
- [Handle git exceptions in wiki create and update services](gitlab-org/gitlab@1dd451933d9304cb3eb1b8a33f2e2a6b6520257b) ([merge request](gitlab-org/gitlab!64873))
- [Do not create audit event for failed logins on read-only DB](gitlab-org/gitlab@d073e7326aeaadfa8b38cdc170cb5ae6a8d48696) ([merge request](gitlab-org/gitlab!65504)) **GitLab Enterprise Edition**
- [Fix git clone for projects with a trailing dot over HTTP](gitlab-org/gitlab@0391bf572fb12d1c54aa155d529d7dc6fa5a1653) ([merge request](gitlab-org/gitlab!65489))
- [Always encode group path for labels API](gitlab-org/gitlab@ec59ce97c3d334ad359e460857c8c2db3293159e) ([merge request](gitlab-org/gitlab!65350)) **GitLab Enterprise Edition**
- [Return empty strings for Jira links when URL is not set](gitlab-org/gitlab@746cfabfb414ce349d36ee9b6a7127bd2c26adee) ([merge request](gitlab-org/gitlab!65547))
- [Fix pipeline count on merge request tab](gitlab-org/gitlab@014927f06255b3ea0d34f97eeef2ca6ce30b2628) ([merge request](gitlab-org/gitlab!65536))
- [Define deduplication strategy in Resource Group Worker](gitlab-org/gitlab@d26139b3d2f13a508ab9bc137031bf090513cd50) ([merge request](gitlab-org/gitlab!65233))
- [Allow users to setup Jenkins without username](gitlab-org/gitlab@9213f4935c1617e94dff360cf63397ac9ff4b18f) ([merge request](gitlab-org/gitlab!65525))
- [Hide group-level DORA charts if not licensed](gitlab-org/gitlab@672747385fb4dcbe3e522187ec72c1e4cf1d5ddd) ([merge request](gitlab-org/gitlab!65478)) **GitLab Enterprise Edition**
- [Fix uninitialized constant Audit::UpdateService](gitlab-org/gitlab@38c9fb90a4b0505aaa78e0360d7cdeadfaa810b8) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65519)) **GitLab Enterprise Edition**
- [Add prefix to autocomplete path](gitlab-org/gitlab@c4c246d18d2c982d3327bcb811572ec2fdbaf829) ([merge request](gitlab-org/gitlab!65508))
- [Fix cache update for schedules and policies](gitlab-org/gitlab@16e8c26103334a40e5fc9224bbe3eb23fc48ceba) ([merge request](gitlab-org/gitlab!65491)) **GitLab Enterprise Edition**
- [Fix WebIDE dropdown background color](gitlab-org/gitlab@c484c192754076e904958c656160dfd80abce1ca) ([merge request](gitlab-org/gitlab!65412))
- [Add option to force notification on expired subscriptions](gitlab-org/gitlab@5a6b865695b51492bfb965564502b826b17fc16c) ([merge request](gitlab-org/gitlab!64838)) **GitLab Enterprise Edition**
- [Fix alignment issues](gitlab-org/gitlab@27b7fca56e1103adf5208024af5317f1ea8252d8) ([merge request](gitlab-org/gitlab!65351))
- [Reduce noisy code quality diff errors on MR page](gitlab-org/gitlab@f3e0148b42e448151fa56694f77c7bce96dec40a) ([merge request](gitlab-org/gitlab!64661)) **GitLab Enterprise Edition**
- [Only disable pause indexing when migration running needs indexing paused](gitlab-org/gitlab@879558dca6bb050b2381088b4a7fc577c95263b6) ([merge request](gitlab-org/gitlab!65281)) **GitLab Enterprise Edition**
- [Fix caching for pagination headers](gitlab-org/gitlab@3f4b3514cb915b3cc70b4029c312e5835f0f651c) ([merge request](gitlab-org/gitlab!64723))
- [Catch Git::CommandError in Branches::CreateService](gitlab-org/gitlab@f0e2eef5f5d58450d1b240b74fe867939b5bc9c2) ([merge request](gitlab-org/gitlab!64727))
- [Bugfix: Disable the ability from the FE to use Approver != in MR search](gitlab-org/gitlab@a85a5f55194767b064821c6979f21356bd910e7c) ([merge request](gitlab-org/gitlab!56310))
- [Raise the error when repository storage move fails](gitlab-org/gitlab@8f5a54736cc0fa0840972bcfee955e7c36c2d794) ([merge request](gitlab-org/gitlab!65292))
- [Fix PopulateLatestPipelineIds background migration](gitlab-org/gitlab@81d14eacc2fc154e7ca0df6312fd407d912c1e61) ([merge request](gitlab-org/gitlab!65280)) **GitLab Enterprise Edition**
- [Add license check to status checks rendering](gitlab-org/gitlab@f9f6f513d4defce5230be28425efb4614658b67d) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65246)) **GitLab Enterprise Edition**
- [Fix create issue dropdown button wrapping](gitlab-org/gitlab@2e7de65c66e7dd47d1c0973d3cf7865ecabbc23c) ([merge request](gitlab-org/gitlab!65254))
- [Fix plans cards width on lg screens](gitlab-org/gitlab@77aabb5c924888ffca0b5228a21093c71218d1a9) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65222)) **GitLab Enterprise Edition**
- [Return issue feedback from loader when there is no issue link](gitlab-org/gitlab@b8f44623bc55a3ed1abf2e6144c467e457452896) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65191)) **GitLab Enterprise Edition**
- [Fix deploy keys not working with LFS auth check](gitlab-org/gitlab@3e4a574906486e7a9fb6fd119296810d5994a8fe) ([merge request](gitlab-org/gitlab!65205))
- [Fix review-bar-component height](gitlab-org/gitlab@1386605add9adb7a01d4c7933b4ee5e36c38c120) ([merge request](gitlab-org/gitlab!64668))
- [Use small ellipsis button in DAST saved scans and profiles](gitlab-org/gitlab@6f2f61393c1da1f06caf4bffdbede325819f5342) ([merge request](gitlab-org/gitlab!65176)) **GitLab Enterprise Edition**
- [Update a user highest role when removed from group](gitlab-org/gitlab@e443da4b8611b9cb2bd1b2f37e6c33a68b9612db) ([merge request](gitlab-org/gitlab!65164))
- [Fix wiki encoding error creating event](gitlab-org/gitlab@1d35b844bed585a3c6fcc54271c5bc86ea3446e9) ([merge request](gitlab-org/gitlab!65132))
- [Update connect_instance_spec.rb](gitlab-org/gitlab@0f88d420a65757fe5c126d2aa94bcf3d5dbf3506) ([merge request](gitlab-org/gitlab!65153))
- [Default cableBackend to authBackend](gitlab-org/gitlab@ff9bd308ebece371baef1387d4bd6aebe91af9d1) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65068))
- [Fix double scrollbar in some dropdowns](gitlab-org/gitlab@ad8c22de839212158e6f2345437ea0bee19ff557) ([merge request](gitlab-org/gitlab!64969))
- [Wrap Labels and Members menu items with access levels checks](gitlab-org/gitlab@e3165a4d998af0717e8c00795aee6c26389770f0) ([merge request](gitlab-org/gitlab!65005))
- [Takes per page setting into account when paginate](gitlab-org/gitlab@c5c32ad2c8c52294a651de664ec93d0b0797a2c7) ([merge request](gitlab-org/gitlab!64285))
- [Show create-jira-issue when gitlab issues disabled](gitlab-org/gitlab@bcee661f9e770517ec72334d5b9e4c107e9163ca) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64889)) **GitLab Enterprise Edition**
- [Guard Compliance CI evaluation against blank path](gitlab-org/gitlab@9706ba3a371b53958995863080b727824ac0430c) ([merge request](gitlab-org/gitlab!64994)) **GitLab Enterprise Edition**
- [Skip saving the diffs whitespace setting if the user isn't logged in](gitlab-org/gitlab@e07458f045b32dbf8a11ee11a9e749a4966d69e7) ([merge request](gitlab-org/gitlab!65094))
- [Fix Group avatar API endpoint](gitlab-org/gitlab@ea3f7bd4dcf20cedbdc2ca2543f99fc5f02fa1f1) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64804))
- [Allow nil for remaining ci cd settings](gitlab-org/gitlab@672fc080709f158b05a7ed5a1dce4aabac12d7dd) ([merge request](gitlab-org/gitlab!64472))
- [Fix 2FA Download codes button](gitlab-org/gitlab@24fa6d1f1a2eca571362a03ed56a2ee9c1fe6760) ([merge request](gitlab-org/gitlab!64963))
- [Fix breadcrumbs and page title for 2FA page](gitlab-org/gitlab@bcabebbcb56707c30b4bbcb035b70f13adf3ef03) ([merge request](gitlab-org/gitlab!64938))
- [Fix return codes for getting an inexisting release](gitlab-org/gitlab@8e011e6674cd6d4fbb7b820aaa89baaac439352f) ([merge request](gitlab-org/gitlab!64591))
- [Show the default "default branch" in the API for empty projects](gitlab-org/gitlab@5ce07d4974b068499c85d159de2513aac3dde6be) ([merge request](gitlab-org/gitlab!64944))
- [Persist Direct Asset Path on Release Updates](gitlab-org/gitlab@6c29da3eb6b515c3d8f7ea19188b1f881f48a2f0) ([merge request](gitlab-org/gitlab!64719))
- [Fix svg logos for empty pipeline templates](gitlab-org/gitlab@d07e2ab050f4eedea6da75e618309fb98248a25f) ([merge request](gitlab-org/gitlab!64428))
- [Ensure displayNamespaceID is included](gitlab-org/gitlab@ff142eadadabf9050451f925276ea5482bf470ae) ([merge request](gitlab-org/gitlab!64904)) **GitLab Enterprise Edition**
- [Drone hook API endpoint](gitlab-org/gitlab@dd42fd2957fb10afcf10c24c0e2254dc103454fa) ([merge request](gitlab-org/gitlab!64871))
- [Fix NuGet installs with symbol packages](gitlab-org/gitlab@246b31a94ddf1ad7be87510f7b30efa3ec532e89) ([merge request](gitlab-org/gitlab!64803))
- [Change PHP template for PHP 8](gitlab-org/gitlab@c4b5950da351aad479f9515e8699eca9257f1f07) ([merge request](gitlab-org/gitlab!64863))
- [Update embedded snippet file links to open in new tab](gitlab-org/gitlab@55c6def595b1ecc640c6b713db24ebdd13277bc4) ([merge request](gitlab-org/gitlab!64219))
- [Fix typo with credit card](gitlab-org/gitlab@ac0b29c6cca7ab912460e95e1fd8f8991772f58e) ([merge request](gitlab-org/gitlab!64817)) **GitLab Enterprise Edition**
- [Fix error when loading incident issue with alert](gitlab-org/gitlab@0678a49a0cff494370d631a5f53629566ac69fcd) ([merge request](gitlab-org/gitlab!64827))
- [Fix state value in the lfs_object_registry table](gitlab-org/gitlab@6231e52db37818f56efa1f0aa19153da39ffbb14) ([merge request](gitlab-org/gitlab!64801)) **GitLab Enterprise Edition**
- [Fix broken Time Tracking Reports on Issuables](gitlab-org/gitlab@d69d0f9ceaa5589bed4f00eacbff43db2521b204) ([merge request](gitlab-org/gitlab!64797))
- [Fix frequent items timestamps not updated](gitlab-org/gitlab@2a3335566b6b3c65f92508cf3ec2b8ee5ac34256) ([merge request](gitlab-org/gitlab!64737))
- [Fix bug where Milestone page led to console error](gitlab-org/gitlab@e720e677d008a006292040d026a4393a89fc2471) ([merge request](gitlab-org/gitlab!64775))
- [Include hours into elapsed time in jobs](gitlab-org/gitlab@280ab3a2e66429105788d55e0fd430efd6a8cc8a) ([merge request](gitlab-org/gitlab!64721))
- [Fix retry-lock problem on pipeline cancel](gitlab-org/gitlab@85c299819121e6f3d372d3685a83df05455c6e41) ([merge request](gitlab-org/gitlab!63080))
- [Fix link for commit-type security report items](gitlab-org/gitlab@a7098dbbb6f271f1a3168d0b539424578d798fad) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64565)) **GitLab Enterprise Edition**
- [Fix submit button not being clickable](gitlab-org/gitlab@845cb6473e3e187c6c880cf42a73426821044253) ([merge request](gitlab-org/gitlab!64315)) **GitLab Enterprise Edition**
- [Fix top position on board sidebar](gitlab-org/gitlab@52d8c768af4cf9a6b6e2d84cca4eb989bb912bd3) ([merge request](gitlab-org/gitlab!62051))
- [Carry line_range info forward on unchanged positions](gitlab-org/gitlab@1e5301204e3fc236d4dc11cfc14f8dc06d5999a7) ([merge request](gitlab-org/gitlab!64267))
- [Force ASCII-8BIT encodings in CI job trace](gitlab-org/gitlab@f0d3c6905e029ac55b2aff4cf860c63522afecd0) ([merge request](gitlab-org/gitlab!64631))
- [Fix pages deployment storage migration](gitlab-org/gitlab@55f8b0129d8e54a532e93881fe1a29eebfc51131) ([merge request](gitlab-org/gitlab!64697))
- [Show warning when files are hidden in an MR](gitlab-org/gitlab@791e1975def8bf2ddee6bdb42b3f868cbcb0a688) ([merge request](gitlab-org/gitlab!64515))
- [Allow ancestor milestones to be set to an MR via push options](gitlab-org/gitlab@dd36ee326c16a8c1e1648b17142d6e695663f0f5) ([merge request](gitlab-org/gitlab!64678))
- [Group Avatar API: ensure to send the remote filename](gitlab-org/gitlab@7edcf42a53212b94195ff1c6d9c6749342cc510c) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64650))
- [Bump the sys-filesystem version to prevent errors in System Info](gitlab-org/gitlab@613ee9051f5128de85fda5c35c0b047a4e5a81f2) ([merge request](gitlab-org/gitlab!64638))
- [Fix missing attributes on token audit events](gitlab-org/gitlab@a7713e44271e3f0c0c0073414febbafc77fcf48c) ([merge request](gitlab-org/gitlab!63958)) **GitLab Enterprise Edition**
- [Fix Zuora frame size after client-side error](gitlab-org/gitlab@1dc1e3e5cb9947480488655f311172a362dd2c55) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64595)) **GitLab Enterprise Edition**
- [Fix infrastructure menu link to the first visible menu item](gitlab-org/gitlab@2ed7e99ebd4d44d8b628975314aa21bd332361bc) ([merge request](gitlab-org/gitlab!64592))
- [Upgrade omniauth-azure-activedirectory-v2 to v1.0.0](gitlab-org/gitlab@eee74a26887ebfd52049fae0637b4eac784673b5) ([merge request](gitlab-org/gitlab!64559))
- [GithubImporter: Avoid failing when PullRequest has empty body](gitlab-org/gitlab@2e5585ac07d4064ca955646b6cef391215ecf6d3) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64558))
- [Update margin-left on widget attachment to match content start](gitlab-org/gitlab@b054719340ce39346d0d967f974d66b35f6092ec) ([merge request](gitlab-org/gitlab!64079))
- [Allow Projects with Freeze Periods to be Deleted](gitlab-org/gitlab@a9a9f0b6cf5093d896bacf09596c902a5a9195ed) ([merge request](gitlab-org/gitlab!64338))
- [Fix expiring subscription message on subgroups](gitlab-org/gitlab@5627974d0a0aa4313550cf078d24632e5d3b5fe9) ([merge request](gitlab-org/gitlab!64507)) **GitLab Enterprise Edition**
- [Constraint status checks to protected branches](gitlab-org/gitlab@bb838dc6ecb580e632f991c6e80ad6e9c7e56e25) ([merge request](gitlab-org/gitlab!63422)) **GitLab Enterprise Edition**
- [Enable deep linking on environments page for tabs](gitlab-org/gitlab@d905945c9bc9f919b7282cc01d95a15ad1c5de98) ([merge request](gitlab-org/gitlab!64331))
- [Fix sidekiq:migrate_jobs tasks in production mode](gitlab-org/gitlab@9971da5d6ae65e98e403ff429e6bc91ec6bcb88d) ([merge request](gitlab-org/gitlab!64414))
- [Fix a bug where the displayNamespaceId](gitlab-org/gitlab@0b8959670bf6c061199c9c077407fd5a057d6b0a) ([merge request](gitlab-org/gitlab!64397)) **GitLab Enterprise Edition**
- [Remove add button from Devops Adoption](gitlab-org/gitlab@7c30991b53efb1478c06cbcee1ea80625a2d3449) ([merge request](gitlab-org/gitlab!64400)) **GitLab Enterprise Edition**
- [Create close issue event on issue move](gitlab-org/gitlab@46d221927ce4c28df467b0c13f5fc9b16eea3200) ([merge request](gitlab-org/gitlab!64197)) **GitLab Enterprise Edition**
- [Fix missing "Clear" button on namespace search](gitlab-org/gitlab@a0596df386c4878ae90c59fc6809c7a5336e7073) ([merge request](gitlab-org/gitlab!64378))
- [Remove disable_composer_callback feature flag](gitlab-org/gitlab@99c36e440b29f3e23a2b707d39ac49aafef21679) ([merge request](gitlab-org/gitlab!64336))
- [Fix group avatar API](gitlab-org/gitlab@f8573b56c4cdfa6a4733311f6c495b7be707e899) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63934))
- [Fix environment folder broken layout](gitlab-org/gitlab@6b8fe36c6b4dfbfa97bca39f86a9be312f637caa) ([merge request](gitlab-org/gitlab!64280))
- [Fix redirection for DAST Scanner Profile](gitlab-org/gitlab@d6dbe84562f0da1b5056acf3ce3dea10bbcd2a4b) ([merge request](gitlab-org/gitlab!64175)) **GitLab Enterprise Edition**
- [Fix visibility of issue enforcement setting](gitlab-org/gitlab@4f99af95dee23e1d07dd7af73f6c77ac1729f1d6) ([merge request](gitlab-org/gitlab!64073)) **GitLab Enterprise Edition**
- [Fix too many redirects during Geo check task](gitlab-org/gitlab@6d80e6a82454f6cd4626b60f16cdad605ec7089f) ([merge request](gitlab-org/gitlab!64265)) **GitLab Enterprise Edition**
- [Format network policies update time](gitlab-org/gitlab@6020f38c9561bc8e5aa1758ebd7075370205c3f6) ([merge request](gitlab-org/gitlab!64205)) **GitLab Enterprise Edition**
- [Use user permissions](gitlab-org/gitlab@ad434a48ea74a065b53d390077d720c7cdf607b6) ([merge request](gitlab-org/gitlab!64125))
- [Display license start date without special format](gitlab-org/gitlab@64e34537ac84713eacc823da4f048bc90e395906) ([merge request](gitlab-org/gitlab!64022)) **GitLab Enterprise Edition**
- [Fix validation method regarding MIME type keys](gitlab-org/gitlab@2cc6d89cc77368b9472c8ec22e97bb3481409fb3) ([merge request](gitlab-org/gitlab!66403))
- [Geo: Fix snippet verification by replicating the HEAD ref](gitlab-org/gitlab@4dbf36af8553775603c170784ad8bfcdc436a669) ([merge request](gitlab-org/gitlab!66403)) **GitLab Enterprise Edition**
- [Fix LFS objects not downloading with Bitbucket](gitlab-org/gitlab@161776f9a4975dfeb2760b06e83160def902c61f) ([merge request](gitlab-org/gitlab!66403))
- [Replace Excon with Faraday for requesting object storage](gitlab-org/gitlab@a223d526d5b97f248c8810ef0b968d2c3b0323e0) ([merge request](gitlab-org/gitlab!66403))
### Changed (137 changes)
- [Move admin user actions from cards to a dropdown](gitlab-org/gitlab@f77a237d60114f95777c7b01060708c4a3b6a680) ([merge request](gitlab-org/gitlab!64648))
- [Use configured browser locales for date formatting](gitlab-org/gitlab@ce46da1b791f930ac8e7d7780d2cc4678eec1532) ([merge request](gitlab-org/gitlab!65740))
- [Update GraphQL project type field container_registry_enabled](gitlab-org/gitlab@5370ae995cc2c6ffea5e15b39a8ef7b2af1fdc9b) ([merge request](gitlab-org/gitlab!66059))
- [Enable load balancing for Jira Connect workers](gitlab-org/gitlab@299b7e29da831829630dacedac5d1e66bfdc3172) ([merge request](gitlab-org/gitlab!66286))
- [ContainerRepositoriesFinder now checks container registry visibility](gitlab-org/gitlab@383359466c4c9519ea9f5f9bb3df7130db9c5f90) ([merge request](gitlab-org/gitlab!66157))
- [Drop support for Safari 13.0](gitlab-org/gitlab@a66265a17f695dd480128e7b927cdbe86b53497d) ([merge request](gitlab-org/gitlab!66231))
- [Add Finding Evidence Assets](gitlab-org/gitlab@54b0a25e55ccc7ce5a6d395dd063214d837abfa5) ([merge request](gitlab-org/gitlab!65675))
- [Search epic by title in issues](gitlab-org/gitlab@2f08c27c220e3720c7afb429a233f93b01460d13) ([merge request](gitlab-org/gitlab!66024))
- [Migrate Add To Do button to widget](gitlab-org/gitlab@6cfa6b8ee1537695d5751f6f23d262613937d1b1) ([merge request](gitlab-org/gitlab!65709))
- [Makes the feature_name field for UserCallout nullable](gitlab-org/gitlab@69a1222205f74507d6bccbfaaacd7242ad18ed3b) ([merge request](gitlab-org/gitlab!66237))
- [Add a runner cost factor for new public projects](gitlab-org/gitlab@6ef0fa86a39dc5f768797b5fcec9dd142dd6fdc0) ([merge request](gitlab-org/gitlab!65155)) **GitLab Enterprise Edition**
- [Create environment column in policies list](gitlab-org/gitlab@8054ddac18be39a7425069f9a66b557d7f752a9e) ([merge request](gitlab-org/gitlab!65866)) **GitLab Enterprise Edition**
- [Filter service ping payload by category](gitlab-org/gitlab@8406a84441ee33bc8e61d3f339c24a8fdc25a7bb) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65944))
- [Schedule MergeRequestCleanupRefsWorker more efficiently](gitlab-org/gitlab@0080186adfc96a196ba259b619e7dac23aff395b) ([merge request](gitlab-org/gitlab!65647))
- [Update urlParams on Jira issues list page](gitlab-org/gitlab@5179afecaea91a7e68b5b8994dd9c98340cbba02) ([merge request](gitlab-org/gitlab!66054)) **GitLab Enterprise Edition**
- [Remove snippet_spam feature flag](gitlab-org/gitlab@1304f57ca84fdc8edad1aec76e612f892ad6f3d5) ([merge request](gitlab-org/gitlab!66118))
- [Update DevOps Score doc and callout](gitlab-org/gitlab@a9079bb147f6d0851367f03850eb623db5ae63c6) ([merge request](gitlab-org/gitlab!64786))
- [Add sort by popularity to issues](gitlab-org/gitlab@5cc63c5d58c342e4722ea933bf04760630a8cac1) ([merge request](gitlab-org/gitlab!65452))
- [Rename project / group removal to deletion](gitlab-org/gitlab@b45cf6ff0e738fcfadd3162388b15a8e7dd98d3e) ([merge request](gitlab-org/gitlab!66064)) **GitLab Enterprise Edition**
- [Swimlanes - Fetch more epics button](gitlab-org/gitlab@0b9519b3be30a595ae39e73f2ea9d61a7ac23cf1) ([merge request](gitlab-org/gitlab!65121))
- [Change style of add button on License Compliance page](gitlab-org/gitlab@f4ee8502ad77b0cacbaa80b09cba81e74b42823f) ([merge request](gitlab-org/gitlab!66000)) **GitLab Enterprise Edition**
- [Change success color](gitlab-org/gitlab@40a54471a3c56151bed5428eaae8442b6832dcea) ([merge request](gitlab-org/gitlab!65987))
- [Optimized blob view loading in repository](gitlab-org/gitlab@d1e175f89a1eb8fec9c9bc18dccb4e80c3cf24d6) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65859))
- [Require encryption on builds tokens](gitlab-org/gitlab@e704102921ad3c0248044d678003dc8452482782) ([merge request](gitlab-org/gitlab!65166))
- [GithubImporter: Count fetched/import objects globally and by project](gitlab-org/gitlab@de4fd2ce3825ac6d2fe7adc4bbbfe86251d4aa93) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65700))
- [Improve Error Tracking models](gitlab-org/gitlab@a92eb02c4e577cf94af8e2a415d11d0512f887a6) ([merge request](gitlab-org/gitlab!65753))
- [Ignore cloud_license_enabled in ApplicationSetting](gitlab-org/gitlab@d3b0239ff0430f3638db9958ac4131b2f83ca0a8) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65951)) **GitLab Enterprise Edition**
- [Extracted Admin E-mail notification code from EE to core](gitlab-org/gitlab@181ebaa8e5ee94f80a7d26a9166f1e1b008a1c6c) ([merge request](gitlab-org/gitlab!64931))
- [Update Admin Area's Runner Details Page UI](gitlab-org/gitlab@4b18738e2749db8d9ee1a223ca6a05f8055bf820) ([merge request](gitlab-org/gitlab!65948))
- [Add upvotes_count to issues](gitlab-org/gitlab@aeaf3eb433412915fc4b57516a69159446b1102c) ([merge request](gitlab-org/gitlab!65250))
- [Update Admin Area's Runners Page UI](gitlab-org/gitlab@f3ef2a3257da0f7eb6316f969fee1bffb34b3b78) ([merge request](gitlab-org/gitlab!65901))
- [Increment DAST_VERSION in on-demand DAST template](gitlab-org/gitlab@672757e51ea8f739b7b55a3b3c16bd2f2d662e1d) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65218)) **GitLab Enterprise Edition**
- [Update the Discord integration embed](gitlab-org/gitlab@e4f38f3f72a46c19a4917b59f71b9f5251060153) ([merge request](gitlab-org/gitlab!65893))
- [Update UI text for CI token scope setting](gitlab-org/gitlab@cdd383041e09c4947489c5f6d8597636c34b7508) ([merge request](gitlab-org/gitlab!65744))
- [Optimised the hash retrieval from URL](gitlab-org/gitlab@e76fa57d5022012fa27f6e16c94047f66eadd3e8) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65854))
- [Update warnings for ci minute quotas](gitlab-org/gitlab@de82b75a26d21d96384398844741bab8608edbf3) ([merge request](gitlab-org/gitlab!65818)) **GitLab Enterprise Edition**
- [Update gitlab-labkit to v0.20.0](gitlab-org/gitlab@e22930f32a5aca7b77d224b1e4862df14161b128) ([merge request](gitlab-org/gitlab!65809))
- [Update requirement import modal to show focus](gitlab-org/gitlab@ab161f59d6fffa59882c80e79ca1597f4b474c38) ([merge request](gitlab-org/gitlab!65447)) **GitLab Enterprise Edition**
- [Mask runner registration](gitlab-org/gitlab@ddc541bb444ccdba4be077211609c603f57eda61) ([merge request](gitlab-org/gitlab!65551))
- [Update DAST version for offline environments](gitlab-org/gitlab@11eac5eb81936bb248db227f8da5f05d69d9bc39) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65603)) **GitLab Enterprise Edition**
- [Add Finding Evidence Supporting Messages](gitlab-org/gitlab@065416b87421ea3e276b95d95677b820ce582c18) ([merge request](gitlab-org/gitlab!65686))
- [Update buildkite.rb](gitlab-org/gitlab@2425955cfe720955f481917a825d25f3345ab8ba) ([merge request](gitlab-org/gitlab!65658))
- [Use load balancing for Jira Connect workers](gitlab-org/gitlab@1b0b3d253d44f15ad519e492e646bc6e98f967d0) ([merge request](gitlab-org/gitlab!64715))
- [Start reading project_features.container_registry_access_level](gitlab-org/gitlab@aeff2cf9f841076ee6a1e2bb3d45a1689e38205a) ([merge request](gitlab-org/gitlab!65540))
- [Rearrange milestone form](gitlab-org/gitlab@36542b1d528d8c9fd8f0164279d092007025bd99) ([merge request](gitlab-org/gitlab!65718))
- [Update license compliance icons](gitlab-org/gitlab@d75c43ee01d86d169ffb4cee50f47289075848d2) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64584)) **GitLab Enterprise Edition**
- [Improve consistency of admin user dropdown actions](gitlab-org/gitlab@5547886a61bb2330139446bbc68e6ce098f8674c) ([merge request](gitlab-org/gitlab!65668))
- [Remove cloud_license_enabled application setting](gitlab-org/gitlab@d598d2a85a7e262f1f0a25ef7e6566d9de3cde37) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65538)) **GitLab Enterprise Edition**
- [Remove date from Seat Link data fields](gitlab-org/gitlab@8fa98066bdc82e3b9039029fac7e0fe2fbdc2105) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65190)) **GitLab Enterprise Edition**
- [Update dot style for DORA lead time graphs](gitlab-org/gitlab@b7d5c68c51d93b9681647fa21710617349b1856c) ([merge request](gitlab-org/gitlab!65555)) **GitLab Enterprise Edition**
- [Schedule devops adoption calculation only for pending namespaces](gitlab-org/gitlab@9193e19ed055814b3ab6df4aa6b2ed83d64be70c) ([merge request](gitlab-org/gitlab!65443)) **GitLab Enterprise Edition**
- [Move "Show latest version" button to the left](gitlab-org/gitlab@d1c4e90e3d8588693178122ab10a3438d52f1e46) ([merge request](gitlab-org/gitlab!65338))
- [Allow wiki pages to be empty](gitlab-org/gitlab@2bc6eefbedc3015d9b49e34e20fdb2d3be1f7ec7) ([merge request](gitlab-org/gitlab!65521))
- [Bump Nokogiri from v1.11.4 to v1.11.5](gitlab-org/gitlab@4c49f6980fd1aadfe622fa7a13db3ffe487be591) ([merge request](gitlab-org/gitlab!65597))
- [Log and advise about push-rule-rejected commit](gitlab-org/gitlab@ae30a545cd7fcd34c59531bccf3ebbaaf9e2ec09) ([merge request](gitlab-org/gitlab!64933)) **GitLab Enterprise Edition**
- [Update supported browser versions](gitlab-org/gitlab@0849d34993c01805e794a64f2d1e4bde15d8f788) ([merge request](gitlab-org/gitlab!63994))
- [Merge branch '334976-fix-misleading-upgrade-cta-jira-issues' into 'master'](gitlab-org/gitlab@b7a38de74932e04248ec77d0bd750433acf3d312) ([merge request](gitlab-org/gitlab!65302))
- [Update timestamp fields to Standard](gitlab-org/gitlab@28d9eb2afd64e7fd1d0cd211c48a28a47eec562b) ([merge request](gitlab-org/gitlab!65523))
- [Update copy and type for sync subscription banner](gitlab-org/gitlab@36474d85fc9a6f0bdaa5f77bd27d852f43c3c63e) ([merge request](gitlab-org/gitlab!65316))
- [Upgraded Monaco to 0.25.2](gitlab-org/gitlab@281b581885f23e7e311c7ca19f7bc140acbedb7a) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63400)) **GitLab Enterprise Edition**
- [Reintroduce lfs_link_existing_object feature flag](gitlab-org/gitlab@b9bd7169450001edde4946f48c90446965e6c34b) ([merge request](gitlab-org/gitlab!65437))
- [Show 'Delete' button to developers in Wiki](gitlab-org/gitlab@8babca59505c323ad739f335a337fa1a71f8f003) ([merge request](gitlab-org/gitlab!65420))
- [Switch back to pg_query](gitlab-org/gitlab@5a6b009504317c6bcbd4c36171cd74f961ed63a9) ([merge request](gitlab-org/gitlab!65416))
- [Use Gitaly long timeout for resolving conflicts](gitlab-org/gitlab@2afa172683dc8257e2f28d70ecaf3ffadfdfece2) ([merge request](gitlab-org/gitlab!65394))
- [Add upvotes field to issues index](gitlab-org/gitlab@3431b3ef3df2a214a773b449cc7b8de284ca228c) ([merge request](gitlab-org/gitlab!64683)) **GitLab Enterprise Edition**
- [Identicon - Align GitLab UI Colors](gitlab-org/gitlab@b05e2e2b0a4aee57d968b90737b69a2ae31c5c6f) ([merge request](gitlab-org/gitlab!65058)) **GitLab Enterprise Edition**
- [Update color scheme of createFlash](gitlab-org/gitlab@355659cf1ef25465edb5228d6bac7c147f193719) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65315))
- [Fix misleading upgrade CTA in Jira configuration](gitlab-org/gitlab@703c55429e659a4ecdf50864fa1e9adc62e39a95) ([merge request](gitlab-org/gitlab!65302))
- [Sort fork form namespaces alphabetically](gitlab-org/gitlab@727106f000c40f0963cb2549ecb45260222720fa) ([merge request](gitlab-org/gitlab!65178))
- [Present error when DAST profile not found](gitlab-org/gitlab@d6d35d573136eacad2775825ca5a60d221b79dc0) ([merge request](gitlab-org/gitlab!64679))
- [Add selected to description](gitlab-org/gitlab@650eac6656704667e62253164957aecb967a7775) ([merge request](gitlab-org/gitlab!65184))
- [Remove the sec_secret_detection_ui_enable feature flag](gitlab-org/gitlab@7d3cb546730fd644ec5e14a0a9aa712cc11f5f19) ([merge request](gitlab-org/gitlab!65055)) **GitLab Enterprise Edition**
- [Block external pull mirrors for forks](gitlab-org/gitlab@ea13d159356916dfc8c37a9c8fb06104d396f327) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60735))
- [DRY deactivate dormant user worker spec](gitlab-org/gitlab@826f278a7918d1cc24a390f5c2ffcc4a5844f3c7) ([merge request](gitlab-org/gitlab!65226))
- [Fix sorting bug in dependency list](gitlab-org/gitlab@bf0849ac3290e747e4c3d8efbf806f60ce9ed954) ([merge request](gitlab-org/gitlab!63500)) **GitLab Enterprise Edition**
- [Create or update a cloud license on sync/activate](gitlab-org/gitlab@ab3dd3913695945b49e920e3c86f32ffdd2a5c20) ([merge request](gitlab-org/gitlab!64825)) **GitLab Enterprise Edition**
- [Truncate body length](gitlab-org/gitlab@fd3480dec9e5dd28e4b813168a1bac635a83bb35) ([merge request](gitlab-org/gitlab!65195)) **GitLab Enterprise Edition**
- [Update dictionary renderer to include data category](gitlab-org/gitlab@b4559327085e3e2b5a8ccdcdd9656c99d26bb55c) ([merge request](gitlab-org/gitlab!64641))
- [Add policy type column](gitlab-org/gitlab@b7d8ca57f8bc7114e578f9b90e31f4ef861b609d) ([merge request](gitlab-org/gitlab!65075)) **GitLab Enterprise Edition**
- [Trial CTA source split](gitlab-org/gitlab@dd7cde6028eaed91abcadc0ace40c4d4f8e1f56f) ([merge request](gitlab-org/gitlab!64848)) **GitLab Enterprise Edition**
- [Change the number of pipelines per page to 15](gitlab-org/gitlab@02da71f3cd22173c65d1063f0a87a1bce1f12443) ([merge request](gitlab-org/gitlab!64285))
- [Revise the navbar to use sentence case](gitlab-org/gitlab@9e677ac05dc994bdcc5eb3a2e44e056bfccee85b) ([merge request](gitlab-org/gitlab!60324))
- [Update status column in Threat Monitoring](gitlab-org/gitlab@4c6499712f26ea649b8fbfa1644adf40f73a2eb6) ([merge request](gitlab-org/gitlab!64959)) **GitLab Enterprise Edition**
- [Bump import job status expiration to 24h](gitlab-org/gitlab@d6c0b2a55518c490782468d3f7170c4bca52c622) ([merge request](gitlab-org/gitlab!65066))
- [Promote new_repo experiment](gitlab-org/gitlab@06da8d4cdc98f71311d419f6c986a6e739fedc9b) ([merge request](gitlab-org/gitlab!64651))
- [Re-named the remaining EditorLite files](gitlab-org/gitlab@00c3f33effc2cf40dbea42ec94ede1e432d3f98d) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64909))
- [Update compliance dashboard empty state](gitlab-org/gitlab@92278867fb87c9d65329a9f9f9a6d9cdb68c36ab) ([merge request](gitlab-org/gitlab!64936)) **GitLab Enterprise Edition**
- [Polish formatted_stage_count for analytics](gitlab-org/gitlab@035db94f1193130c304e8fb73bfe8c578b48e174) ([merge request](gitlab-org/gitlab!64960))
- [VSA: Change item count to 1000+](gitlab-org/gitlab@4af12b457c1a7a7ea2bb60a56ae54409bd52539c) ([merge request](gitlab-org/gitlab!64789)) **GitLab Enterprise Edition**
- [Move Scan PORO to CE [RUN AS-IF-FOSS]](gitlab-org/gitlab@bd817787d1dc88e45526b92c3e48e1a6a34da6d7) ([merge request](gitlab-org/gitlab!64790))
- [Enable ci_job_trace_force_encode feature flag by default](gitlab-org/gitlab@3b2396ddb1de8504e8611741a4c9c6cdd1c903a8) ([merge request](gitlab-org/gitlab!64955))
- [Move migration to a pre-deployment migration](gitlab-org/gitlab@2050852f3f5adcf252c81c606f5e2de5dee85b03) ([merge request](gitlab-org/gitlab!64948)) **GitLab Enterprise Edition**
- [Remove access request controls in admin area](gitlab-org/gitlab@b7faa327eb8553d04366f3f3e4a9297d3131461c) ([merge request](gitlab-org/gitlab!64659))
- [Revise UI text for third-party offers](gitlab-org/gitlab@294b85eb7c83cdff3950322ee7a06c68b9523651) ([merge request](gitlab-org/gitlab!64943))
- [Add documentation for billable member sorting](gitlab-org/gitlab@c3487a06ac93454040f385692c4b3e61bddda11e) ([merge request](gitlab-org/gitlab!64911))
- [Add confirmation modal to "Sync now" LDAP button](gitlab-org/gitlab@9c316cc35879410a2c4d75ae9c545d67393a5bc1) ([merge request](gitlab-org/gitlab!64555)) **GitLab Enterprise Edition**
- [Add correct extension to dotnet CI template](gitlab-org/gitlab@ab15294353a6b78de99153e1a8cab108c63e32d9) ([merge request](gitlab-org/gitlab!64901))
- [Rename ci examples readmes to index](gitlab-org/gitlab@c9a96e20dbf3aa2aeaec5f027ce3e3d4d2e31429) ([merge request](gitlab-org/gitlab!64885))
- [Update copy for DAST code snippet modal](gitlab-org/gitlab@9e782ede13a2cd78ea15fcc986e9aa1284455e3e) ([merge request](gitlab-org/gitlab!64788)) **GitLab Enterprise Edition**
- [Add source version check to Bulk Import](gitlab-org/gitlab@80c22fd67bd8e60babd3752f91de8f618f578320) ([merge request](gitlab-org/gitlab!63886))
- [Fix deprecated GlIcon size and property](gitlab-org/gitlab@72163f87f634b33195258a7a5b1435c31ba3493a) ([merge request](gitlab-org/gitlab!63003))
- [Rename usage ping to service ping](gitlab-org/gitlab@db8e2c3ba5c829c83b993616b07c21ab908fde2c) ([merge request](gitlab-org/gitlab!64732))
- [Use minimal layout in trial flow](gitlab-org/gitlab@c0ba92fa4fa40de6f85a25edd2179d635ab14117) ([merge request](gitlab-org/gitlab!63588))
- [Fix admin mode when authenticating with LDAP](gitlab-org/gitlab@a87172353c8c7aa688f1895222ee6b652908b02c) ([merge request](gitlab-org/gitlab!64823))
- [Simplify the sign in page after confirmation](gitlab-org/gitlab@8c7d3a45e8001eef9f0c7be75ce5534624a8a99d) ([merge request](gitlab-org/gitlab!64370))
- [Enable FF ci_reset_bridge_with_subsequent_jobs by default](gitlab-org/gitlab@838875292f010d00f1bbaad631ec3b95069c73ad) ([merge request](gitlab-org/gitlab!64778))
- [Sort milestones by due date in filtered search](gitlab-org/gitlab@df5f2741a53123e05445e42cf076996f9383d211) ([merge request](gitlab-org/gitlab!64617))
- [Add searchability to ci template dropdown](gitlab-org/gitlab@361633ca1410e044b708de9fec0f039e9f080b50) ([merge request](gitlab-org/gitlab!63268)) **GitLab Enterprise Edition**
- [Remove deprecated API elements](gitlab-org/gitlab@0d4615ce2287429dd06770d6d13939a5d6628fcf) ([merge request](gitlab-org/gitlab!64752))
- [Remove unncessary type options](gitlab-org/gitlab@0d97d1e9e28a271c15bbfbd009a23309d3fb099f) ([merge request](gitlab-org/gitlab!63919))
- [Migrate top-centered toasts to bottom-left](gitlab-org/gitlab@b74175ca02761751e7f18c3936eb4d571a9d2a71) ([merge request](gitlab-org/gitlab!63919)) **GitLab Enterprise Edition**
- [Upgrade @gitlab/ui to v30.0.0](gitlab-org/gitlab@39b9d1c9d0b155fbcb86690d2402d3e568db9585) ([merge request](gitlab-org/gitlab!63919))
- [Remove web_hooks_rate_limit feature flag](gitlab-org/gitlab@9bd9d414afe3cae800ba0b93a5ffa91891809a11) ([merge request](gitlab-org/gitlab!64708))
- [Default-enable :update_remote_mirror_inmemory feature flag](gitlab-org/gitlab@bfdf0dc256aa0e747e94b09a12f1f2d8b5ab6a75) ([merge request](gitlab-org/gitlab!64702))
- [Default-enable :fetch_remote_params feature flag](gitlab-org/gitlab@877a101ac6fcf924b2428fd256bed3982854c4b2) ([merge request](gitlab-org/gitlab!64701))
- [Remove the regulated tab from compliance frameworks list](gitlab-org/gitlab@d1d9cdb68ae7732dbdb67008db724ba95f95b57d) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64690)) **GitLab Enterprise Edition**
- [Move Debian regexp to ::Packages::Debian](gitlab-org/gitlab@f836ae221c5eff7dc77be2d6663643daa1638784) ([merge request](gitlab-org/gitlab!64068))
- [Add Pending Alert Escalations table](gitlab-org/gitlab@e5cc867503dfbd54f99df90cce6be39bc4fde712) ([merge request](gitlab-org/gitlab!64274))
- [Add parameters to in app purchase links](gitlab-org/gitlab@07533e376295cbfc8dcfe529cc1ef5ea5ce87a3f) ([merge request](gitlab-org/gitlab!64395))
- [Search: add ability to sort epics](gitlab-org/gitlab@df6a2a949e84896af9d32aa5558ad5fe387d25de) ([merge request](gitlab-org/gitlab!64402)) **GitLab Enterprise Edition**
- [Support repository moved message with all container types](gitlab-org/gitlab@6c612d69bb26d51a0decb830add384161844cc28) ([merge request](gitlab-org/gitlab!64012))
- [Allow billable member sorting by last activity](gitlab-org/gitlab@fb491cef0630d0da90f6ff1c3a613d465a95b153) ([merge request](gitlab-org/gitlab!64620)) **GitLab Enterprise Edition**
- [Render confidential icon in epic tree for epics](gitlab-org/gitlab@df4415158e06a4e827cf9c417c8848000a8d91e6) ([merge request](gitlab-org/gitlab!64567))
- [Sort epic list in issue sidebar by title](gitlab-org/gitlab@3dc5b05e4fc541471d77026983a7ddc3ee977770) ([merge request](gitlab-org/gitlab!63730)) **GitLab Enterprise Edition**
- [GithubImporter: Count and log each object imported](gitlab-org/gitlab@decb7bfb0aac26dc5d5c2f7e15421302c57a2cf6) ([merge request](gitlab-org/gitlab!64256))
- [Standardize UI text for protected branches and protected tags](gitlab-org/gitlab@9134784ebd9ac61665ed38f525c662b62e21964b) ([merge request](gitlab-org/gitlab!63959))
- [Allow to promote confidential issues into confidential epics](gitlab-org/gitlab@aa8034b927f3ca8dd3c69626b8fa05318b930a92) ([merge request](gitlab-org/gitlab!64253))
- [Sort by similarity in Search Group's Project dropdown](gitlab-org/gitlab@dd4b1a1b5963d3c13026804ce6ee00d53b5f90a3) ([merge request](gitlab-org/gitlab!64241))
- [Refactor db selection in SidekiqServerMiddleware](gitlab-org/gitlab@18501e372c2dd3bd0c4d43120afd756aed04bcff) ([merge request](gitlab-org/gitlab!63304))
- [Renamed EditorLite to SourceEditor](gitlab-org/gitlab@849b4aac6e7d7a228d383f2042f9496c5365528f) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64302)) **GitLab Enterprise Edition**
- [Remove job dependency for Vulnerability-Check](gitlab-org/gitlab@76551c13ead5ae01be2f2118f07fde6d2e2db558) ([merge request](gitlab-org/gitlab!64333)) **GitLab Enterprise Edition**
- [Reduce horizontal padding in new top nav](gitlab-org/gitlab@400b4200940d13049a0dbc040ebd0f3b725d3b6b) ([merge request](gitlab-org/gitlab!64357))
- [Add descriptions for EpicStateEnum](gitlab-org/gitlab@6a5b63e4c9405d744abda67ac1e6e54ca56e9a15) ([merge request](gitlab-org/gitlab!63915)) **GitLab Enterprise Edition**
- [Relabel access token fields](gitlab-org/gitlab@53180d13efd7411ec8194a25b4e8578bed5e8353) ([merge request](gitlab-org/gitlab!62616))
- [Pajamas-compliant dismiss button for HAML alerts](gitlab-org/gitlab@edf4fec49d8bc6d4c12fb1a3b6a73720693996d2) ([merge request](gitlab-org/gitlab!63792))
- [Add validation to additional pack purchase_xid](gitlab-org/gitlab@1647549088bed44b12388deb82828695dc290c7a) ([merge request](gitlab-org/gitlab!63866)) **GitLab Enterprise Edition**
- [Use standard filter for scanner filter on non-project level vuln report](gitlab-org/gitlab@f5d989895af22827c7f4be3e1d2cef3e552f8d41) ([merge request](gitlab-org/gitlab!63940)) **GitLab Enterprise Edition**
### Deprecated (1 change)
- [Deprecate GraphQL PrometheusServiceID argument](gitlab-org/gitlab@b86b6f90fad607ac058bec59e40568752a724ca9) ([merge request](gitlab-org/gitlab!62645))
### Removed (24 changes)
- [Remove securityScansSucceeded from DevOps Adoption](gitlab-org/gitlab@eac43a025ccb01b1502dad2542985686cdada1de) ([merge request](gitlab-org/gitlab!66291)) **GitLab Enterprise Edition**
- [Remove old license page logic](gitlab-org/gitlab@a90ec139423285cd8046a6373603c4b79d85e46d) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65978)) **GitLab Enterprise Edition**
- [Remove trace_memory_allocations FF](gitlab-org/gitlab@aac6b96b7e46895e4221bae2033c7686ba3c9926) ([merge request](gitlab-org/gitlab!66022))
- [Undo CTE fix for PG11](gitlab-org/gitlab@d8daab8c792e4c1b4cdbd166414ceeebd85a23ca) ([merge request](gitlab-org/gitlab!58499))
- [Delete framework column from project_compliance_framework_settings](gitlab-org/gitlab@89dbf6592975fc8cec8949669a0f63a7083dd891) ([merge request](gitlab-org/gitlab!65546))
- [Removed ff sidebar_refactor from views](gitlab-org/gitlab@6c3da94333ca25b629fd2d259249386a5ee1d842) ([merge request](gitlab-org/gitlab!64384))
- [Remove productivity_analytics_scatterplot flag](gitlab-org/gitlab@86047a245f868867b27830ea4dae0c7a2ee20650) ([merge request](gitlab-org/gitlab!65456)) **GitLab Enterprise Edition**
- [Remove cycle analytics scatterplot ff](gitlab-org/gitlab@12d74f0e309488e057e9a091215be0e8fddf7c89) ([merge request](gitlab-org/gitlab!65515)) **GitLab Enterprise Edition**
- [Remove the approvals_commented_by feature flag](gitlab-org/gitlab@7e1715d0b857c638756fb851d5e78ca258ae2f47) ([merge request](gitlab-org/gitlab!65319))
- [Remove the use_workhorse_s3_client feature flag](gitlab-org/gitlab@152f6ad7ede46eb0fc7205b921ae290be174c4e3) ([merge request](gitlab-org/gitlab!65321))
- [Remove the use_distinct_in_shas_cte FF](gitlab-org/gitlab@4068bbd9b0e5f219444fa3bfe63c75b468b081f4) ([merge request](gitlab-org/gitlab!65027))
- [Remove un-used Event archived action](gitlab-org/gitlab@3351661fd57e704d89602b789948bf801fb252d4) ([merge request](gitlab-org/gitlab!64543))
- [Remove Frontend to Edit Legacy Flags](gitlab-org/gitlab@21c7e932706643c2d768fa7f6cec991a13c01e6e) ([merge request](gitlab-org/gitlab!64005))
- [Removes pipeline_filter_jobs feature flag](gitlab-org/gitlab@34b1a2285b84be61bf61f4dd7d932150322b1c24) ([merge request](gitlab-org/gitlab!64919))
- [Remove Clusters Applications Fluentd Table](gitlab-org/gitlab@6d6e6cf4a9eb6c7ab9bd47c453a05676217c30d9) ([merge request](gitlab-org/gitlab!63758))
- [Drop deprecated Prometheus settings in gitlab.yml](gitlab-org/gitlab@0e3e4062ee5db1d09f6929883aa9f86204184d77) ([merge request](gitlab-org/gitlab!64264))
- [Remove ability to enable/disable seat link from settings](gitlab-org/gitlab@ae9b4072befbb882cb75afdbead5b96d013625d3) ([merge request](gitlab-org/gitlab!64160)) **GitLab Enterprise Edition**
- [Drop index_ci_builds_on_protected index](gitlab-org/gitlab@baa41860d52495b7f35e5b49025b55b0c5147f5d) ([merge request](gitlab-org/gitlab!64229))
- [Remove Legacy Flags from Feature Flag Table](gitlab-org/gitlab@f7097cf1c1b3dd6d3bec67a4e3717ae32defc5e8) ([merge request](gitlab-org/gitlab!64007))
- [Enable the new project sidebar](gitlab-org/gitlab@8aafc4b18bc42628aa8f19552dae811f0d5eaef6) ([merge request](gitlab-org/gitlab!63850))
- [Remove omit_commit_sha feature flag](gitlab-org/gitlab@05b4762c3a36fd1b457f79e587ee9218dcdcc5a3) ([merge request](gitlab-org/gitlab!64421))
- [Drop LB FF for ExpirePipelineCacheWorker](gitlab-org/gitlab@170984c79395707ab9cd4dfc060ff83d8efe3ca6) ([merge request](gitlab-org/gitlab!64181))
- [Remove new_release_page feature flag](gitlab-org/gitlab@abc9814684792e8f8d62846b36f46e4622906487) ([merge request](gitlab-org/gitlab!64153))
- [Drop load-balancing FF in PipelineHooksWorker](gitlab-org/gitlab@eae1cf34cb6e58393d6f74caf9b9541e5e29fcfc) ([merge request](gitlab-org/gitlab!64107))
### Security (17 changes)
- [Update addressable gem to v2.8.0](gitlab-org/gitlab@62b7b1d3f28a98019fde619bde4e0e0530e821ef) ([merge request](gitlab-org/gitlab!66202))
- [Disable file and network premailer strategies](gitlab-org/gitlab@c194597ae04e812f3b5be7339412413a04703ae4)
- [Add total http read timeout](gitlab-org/gitlab@5d7b5696955c2928d82adaf50ed73f53cb1939bf)
- [Update rdoc to 6.3.1](gitlab-org/gitlab@20d56f81f9aa282cb2e195a916f4c5e0fcb8084d)
- [Forbid GET requests with mutations](gitlab-org/gitlab@7d16feb31fb360123c4b8ddaa85de6ddb5ddf119)
- [Prevent GraphQL API access by deactivated users](gitlab-org/gitlab@414b5fb0b34fd6640369314013924c5524aa16a5)
- [Add sanitizing for name field](gitlab-org/gitlab@5fee1e3d52934f770e6f0334a0fbee5b891de5b6)
- [Fix XSS on audit log for feature flag actions](gitlab-org/gitlab@70e0b2630f5e439017931b196e5ebcf2ff4e9cdb)
- [Copy feature visibility settings to a fork](gitlab-org/gitlab@c2ef1c24770b024e0cb5a1d3346b8743aec28e47)
- [Avoid disclosing project in web IDE](gitlab-org/gitlab@09324e21488351e0c09806ad727b4c1e957ad288)
- [Allow only same-origin URLs for Edit Release Cancel button](gitlab-org/gitlab@cfff402646e95d30183168efdbda8d114c5f89c0)
- [Add new username validation](gitlab-org/gitlab@b14210fd775c1f384191410bd327a318a5293ffb)
- [Removes security_ci_lint_authorization code](gitlab-org/gitlab@8a69d1f03947e3f85f48dd920c1bff3639609875) ([merge request](gitlab-org/gitlab!64092))
- [Update Nokogiri to 1.11.4](gitlab-org/gitlab@dcf26b79caa46ee31bd5e3ad7ca95bec7e59e5be)
- [Fix deploy key fallback issue in protected branch](gitlab-org/gitlab@58d1df0c6a3149c5c07825036be5e8fe3f1edd1c)
- [Sanitize input on pasteGFM](gitlab-org/gitlab@a5fcd806ff4e6e7510f9981c5d8eacab571a64d7)
- [Fix merge request diff display issue with unsupported encoding](gitlab-org/gitlab@7fa23a8854aed205af22fc904db117dbecec389f)
### Performance (31 changes)
- [Update anscestor deduplication in pipeline graph](gitlab-org/gitlab@12790c458eac27bda671e609ca9b07d2bb6cad4e) ([merge request](gitlab-org/gitlab!66283))
- [Enqueue async, non-blocking jobs for group-group share actions](gitlab-org/gitlab@dc475336c83a324eaafe105864cb8b569a307447) ([merge request](gitlab-org/gitlab!66349))
- [Immediately show parent row](gitlab-org/gitlab@f5f66238b66656138f6411b8af43d978a192b0dd) ([merge request](gitlab-org/gitlab!66176))
- [Improve sort by popularity for issues board](gitlab-org/gitlab@e87edb6bccd20d37b4f424ca195aad3f57017d51) ([merge request](gitlab-org/gitlab!66140))
- [Adjustments to compare caching](gitlab-org/gitlab@9b2f6917b7512720897c2a1f7b4c18945c75dc2d) ([merge request](gitlab-org/gitlab!65839))
- [Move link icon to CSS](gitlab-org/gitlab@9fb7127e8dfd351652d5c3a5930c7fbfd9da04b5) ([merge request](gitlab-org/gitlab!65835))
- [Lazy load avatars](gitlab-org/gitlab@b8efcdf7cf3ec9760c1ff468549de5982bcbe284) ([merge request](gitlab-org/gitlab!65745))
- [Increase page size exponentially](gitlab-org/gitlab@0175d9c776f3c6890fe87e807882a19adc32c9ae) ([merge request](gitlab-org/gitlab!65654))
- [Reduce space needed for merge request diff commits](gitlab-org/gitlab@43a3ce63af857909f3dd6051ca686e3254613086) ([merge request](gitlab-org/gitlab!63669))
- [Preload project user authorizations on REST API](gitlab-org/gitlab@f0b0358b27cc9a153d0a6452bf37ab456b51d003) ([merge request](gitlab-org/gitlab!65602))
- [Remove replica selection change FF](gitlab-org/gitlab@3848ff313b41e52d5ab2ad3c47f4d91a9c352a57) ([merge request](gitlab-org/gitlab!65545))
- [Remove redundant call to RenderService](gitlab-org/gitlab@9b8af9c7505aea0442ba87ab170f0a43ca4fc378) ([merge request](gitlab-org/gitlab!65494))
- [Cache rendered compare entity](gitlab-org/gitlab@b49afc54b836ce9fc053a34a9d931b17872b14a9) ([merge request](gitlab-org/gitlab!64418))
- [Use linear root_ancestor when possible](gitlab-org/gitlab@0b1bd65439992857c5725425f0d44668fdd93887) ([merge request](gitlab-org/gitlab!65401))
- [Schedule requirements processing conditionally](gitlab-org/gitlab@b1ba1aa7a945226a3d24dc96371686bd9381a27f) ([merge request](gitlab-org/gitlab!65322)) **GitLab Enterprise Edition**
- [Fix Namespace#all_projects performance](gitlab-org/gitlab@e0cc0fc67ca41caa9e0b7f67814414f56ad51a2c) ([merge request](gitlab-org/gitlab!65296))
- [Improve LoadBalancer#all_caught_up? logic](gitlab-org/gitlab@c5dd0858774a712ab4ea2f7f039530c013d8e4f8) ([merge request](gitlab-org/gitlab!65248))
- [Drop full index on ci_builds.token](gitlab-org/gitlab@e7f43db607d70b4cb3c042cb84d671ee0fc29287) ([merge request](gitlab-org/gitlab!65025))
- [Linear traversal query for Namespace#self_and_ancestors](gitlab-org/gitlab@c26e1ae1bebbe31ed47d5e16bdfe0f348b17c41a) ([merge request](gitlab-org/gitlab!61163))
- [Use async job when creating/updating EpicIssue](gitlab-org/gitlab@03c651f6b0a7d714e0f267302d39313161d9f709) ([merge request](gitlab-org/gitlab!64524)) **GitLab Enterprise Edition**
- [Enable milestone reference caching](gitlab-org/gitlab@619c21e3b02f526c19ebb59df1596f6598a67c71) ([merge request](gitlab-org/gitlab!62742))
- [git_access: Use batched new blobs check](gitlab-org/gitlab@f73f0c7bfb080384d2f9f8f4a139f353a62a0830) ([merge request](gitlab-org/gitlab!64503))
- [Eliminate some N+1 queries on project-pipeline GraphQL endpoint](gitlab-org/gitlab@82099148697c6d2de854d5af1df58dfb29551c8a) ([merge request](gitlab-org/gitlab!64700))
- [Improve the performance of project/users API](gitlab-org/gitlab@5b7f3608c191fcaece081d3e67b4f128cb4d848a) ([merge request](gitlab-org/gitlab!64528))
- [Replacement partial index for ci_builds.token](gitlab-org/gitlab@0205c7d01c192235447b3fe4ccf0a99eb34a5c26) ([merge request](gitlab-org/gitlab!64221))
- [Use materialied CTE to improve builds fair scheduling](gitlab-org/gitlab@8fbbcb87137f7693ecd9833fa5df238af35a1436) ([merge request](gitlab-org/gitlab!64605))
- [Speed up initial page load on Releases page](gitlab-org/gitlab@efb7212fa71ad570bd3e32b5c7374efc54228f34) ([merge request](gitlab-org/gitlab!63914))
- [Remove replica selection change FF for LB](gitlab-org/gitlab@cb8d9048ea5e7da265941e2702ed945182e4e1ec) ([merge request](gitlab-org/gitlab!64300))
- [Remove duplicate where condition](gitlab-org/gitlab@f968729aee1dc062161247df05786a98a5f5e4c2) ([merge request](gitlab-org/gitlab!64214))
- [Implement pending builds queue builder in a separate class](gitlab-org/gitlab@e9368df2d44c54ef965bac6d37c4d5b35c86e024) ([merge request](gitlab-org/gitlab!64093))
- [Utilize load balancing for BuildQueueWorker](gitlab-org/gitlab@57a35133e18c43c0c110371c4b3e6012af215a11) ([merge request](gitlab-org/gitlab!64180))
### Other (58 changes)
- [Support reindexing unique indexes](gitlab-org/gitlab@982f22573b9975f6097834ecf76c62915f68dda6) ([merge request](gitlab-org/gitlab!65966))
- [Revise group Pages size UI text](gitlab-org/gitlab@526a8ca626c063a32b8d9fd0d9abba5b22be9535) ([merge request](gitlab-org/gitlab!65862)) **GitLab Enterprise Edition**
- [First run for events dictionary for backend](gitlab-org/gitlab@2f2e27cb53a3509387216d7fc99e0bf35501524f) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62422)) **GitLab Enterprise Edition**
- [Record message size transmitted over action cable](gitlab-org/gitlab@31407b25c1f77ab57b4e000e4f82ae4d6d8cdf0a) ([merge request](gitlab-org/gitlab!65286))
- [Migrate the deprecated "urlParamsToObject" to "queryToObject"](gitlab-org/gitlab@8c321d20d47230e9925abb1e151c9e6006a5440f) ([merge request](gitlab-org/gitlab!65898)) **GitLab Enterprise Edition**
- [Rename License.usage_ping to License.customer_service_enabled](gitlab-org/gitlab@63ed6908275668d2aeb48328b5dfec121b15442a) ([merge request](gitlab-org/gitlab!65834)) **GitLab Enterprise Edition**
- [Remove codequality_mr_diff_annotations flag](gitlab-org/gitlab@74b47ffe5bb656af9cd4acc4be23d218c634f6e7) ([merge request](gitlab-org/gitlab!65960)) **GitLab Enterprise Edition**
- [Remove temporary feature flags](gitlab-org/gitlab@d7049bc4e817a07b64659469dd48e6a6894610e7) ([merge request](gitlab-org/gitlab!65544))
- [Remove the codequality_mr_diff feature flag](gitlab-org/gitlab@3d29d6688ea82163c93a198071d15a4c206ee604) ([merge request](gitlab-org/gitlab!63461)) **GitLab Enterprise Edition**
- [Add troubleshooting section to batched migrations docs](gitlab-org/gitlab@354021bcf53db7148e2a809e1e5c5de5596683e4) ([merge request](gitlab-org/gitlab!65513))
- [Migrate the deprecated "urlParamsToObject" to "queryToObject"](gitlab-org/gitlab@b09ea9f2ce741f1c716bbd26a329b57bb22cfee1) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65894))
- [Fix security scan query timeout](gitlab-org/gitlab@bda826eb4191b728b8a5e1066992df1cff7bd7fd) ([merge request](gitlab-org/gitlab!65742))
- [Index batched migration jobs by max value](gitlab-org/gitlab@2d5ef1590c5838288c49098916c38ddc8d5d51fa) ([merge request](gitlab-org/gitlab!65838))
- [Delete legacy operations feature flags](gitlab-org/gitlab@f8b0938512861b3587cd4d3f639497b61ca9403d) ([merge request](gitlab-org/gitlab!63742))
- [Avoid splitting strings in repository maintenance UI](gitlab-org/gitlab@9991ad6bb0c1c9695815cb30268f19c3fd375ebd) ([merge request](gitlab-org/gitlab!65717))
- [Fix GLIcon size property](gitlab-org/gitlab@4db2830055a87cfad119b81f25feb85c09557843) ([merge request](gitlab-org/gitlab!63014))
- [Only reindex btree and gist indexes](gitlab-org/gitlab@ef4d7992c7499a741cc1c06ae19da8fec04d7e23) ([merge request](gitlab-org/gitlab!65655))
- [Refactoring string literals used for snowplow tracking in the sidebar](gitlab-org/gitlab@de218bbea3ae074b02600e92b6afdb7890a8cbee) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65646)) **GitLab Enterprise Edition**
- [Refactor health status widget to use Apollo](gitlab-org/gitlab@90a2f8c15e10e97e7d20159e3a4647e4c81ec33a) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6498)) **GitLab Enterprise Edition**
- [Migrate the deprecated "urlParamsToObject" to "queryToObject"](gitlab-org/gitlab@5c8c65cff8402a001374d29ef36d4cfca52df374) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65398))
- [Improve gradle QA scenario](gitlab-org/gitlab@85558babfcd274db51c001a64e24c55966b4a69b) ([merge request](gitlab-org/gitlab!64419))
- [Update help for renamed documentation index](gitlab-org/gitlab@5a633772d51cdd7b9ece984a65a3601ef1cb5e2a) ([merge request](gitlab-org/gitlab!65624))
- [Improves repository storage-related UI and documentation](gitlab-org/gitlab@c75a61989f1460e871e0b6a8a55ee5946e84fd4f) ([merge request](gitlab-org/gitlab!65424))
- [Refactor health status widget to use Apollo](gitlab-org/gitlab@7374bf930c60c135909c26a4c8a839a89d003d8e) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6498)) **GitLab Enterprise Edition**
- [Add rel property to help link](gitlab-org/gitlab@5e190f2f014ceb1ca00ae4963edc5a12cb50c6f5) ([merge request](gitlab-org/gitlab!65428))
- [Initialize conversion of ci_builds_metadata.id for bigint migration](gitlab-org/gitlab@af8c85075ce35cfe6578b1f761f11aec4c05693c) ([merge request](gitlab-org/gitlab!65477))
- [Remove project_statistics_sync feature flag](gitlab-org/gitlab@bc97e4b4a9f55a8826cc0f918a4d208cca0364d6) ([merge request](gitlab-org/gitlab!65435))
- [Improve repository maintenance UI and documentation](gitlab-org/gitlab@17a8bd10cb78fd7116eaf80c76d766175f1714ba) ([merge request](gitlab-org/gitlab!65117))
- [Migrate push_event_payloads.event_id back to integer (GitLab.com only)](gitlab-org/gitlab@dff68f62feebeffad35cf0f91b4e38f605495c79) ([merge request](gitlab-org/gitlab!65112))
- [Remove cached_markdown_blob feature flag](gitlab-org/gitlab@6d73a189cda67eaab7e2c78b5d730bbaabf06f69) ([merge request](gitlab-org/gitlab!65306))
- [Remove sort_dependency_vulnerabilities feature flag](gitlab-org/gitlab@b9e6510d14a92c76f1957a3f21976edb75285563) ([merge request](gitlab-org/gitlab!65295)) **GitLab Enterprise Edition**
- [Move prometheus service creation to the background job](gitlab-org/gitlab@a17b3d270c481dad35fe63905fa45f5f97845bbc) ([merge request](gitlab-org/gitlab!63539))
- [Add BG migration to delete orphaned deployments](gitlab-org/gitlab@098dd2f613346a189b25e56a4c1331bb536e7b6d) ([merge request](gitlab-org/gitlab!64588))
- [Remove by default enabled feature flag](gitlab-org/gitlab@41863bad8f0d0364d0caaa2b04d59dc1cfc85cdd) ([merge request](gitlab-org/gitlab!65151))
- [Enable new Rails connection handling](gitlab-org/gitlab@bbd1d564f971d749e89feabbfb3cc957f26cae92) ([merge request](gitlab-org/gitlab!65107))
- [Review and revise Audit Events UI text](gitlab-org/gitlab@4e4d6ecb6e3a9c5257a268e5f6efcdf83c6a1b36) ([merge request](gitlab-org/gitlab!60703)) **GitLab Enterprise Edition**
- [Add service desk project key validation error message](gitlab-org/gitlab@e022f59bf66e29724914cc65ad188a8b6ff424b8) ([merge request](gitlab-org/gitlab!64352))
- [Remove FF ci_fix_pipeline_status_for_dag_needs_manual](gitlab-org/gitlab@9dd55ed41f256b63c265d08506dfe8e6cdb6a3ef) ([merge request](gitlab-org/gitlab!64777))
- [Add FK for deployments.environment_id to environments table](gitlab-org/gitlab@343591ed3e8c304062ce0551699d2bfad25a33bf) ([merge request](gitlab-org/gitlab!64585))
- [Remove ci_artifacts_exclude feature flag](gitlab-org/gitlab@703711e4f5d097c00ca9cb13a5d1d41dc388a89b) ([merge request](gitlab-org/gitlab!64227))
- [Finalize conversion to bigint for push_event_payloads](gitlab-org/gitlab@b4def6d47dfb2648851f31d2ab83f1310a4628ef) ([merge request](gitlab-org/gitlab!64577))
- [Log WaitableWorker inline job executions](gitlab-org/gitlab@91ec53627907303b69951fc30cbe615da5c1494d) ([merge request](gitlab-org/gitlab!63997))
- [Remove default-enabled cascading_namespace_settings feature flag](gitlab-org/gitlab@ef2c2c8d1b68eff57a2b3ceea27bb265502ae645) ([merge request](gitlab-org/gitlab!64347))
- [Track finished_at timestamp for schema migrations](gitlab-org/gitlab@be15d17a8c84e7f09d5f413c43a177b679e08b0a) ([merge request](gitlab-org/gitlab!64204))
- [Drop remove_on_close column from labels table in envs where it exists](gitlab-org/gitlab@5fdca55006f089a4f01c1cf74f4c81e299e4e89e) ([merge request](gitlab-org/gitlab!62839))
- [Toggle codequality diff annotations flag](gitlab-org/gitlab@ba8277b89ffd762aa3cf368b893e6656e9f1e68e) ([merge request](gitlab-org/gitlab!64536))
- [Remove usage_data_code_review_aggregation feature flag](gitlab-org/gitlab@a7413e4284216cda36e26c90edcf6ab8c9a00521) ([merge request](gitlab-org/gitlab!64626))
- [Remove FF ci_workflow_rules_variables](gitlab-org/gitlab@3e25217fa3ce91da557275df41f4124dd7142e63) ([merge request](gitlab-org/gitlab!64557))
- [Cleanup group_devops_adoption feature flag](gitlab-org/gitlab@0783e2984f62fbc74612257bb44fb00d6959e510) ([merge request](gitlab-org/gitlab!64498)) **GitLab Enterprise Edition**
- [Remove ci_pipeline_latest feature flag](gitlab-org/gitlab@196edc110bb973cb29cc933e0343bba3326271d4) ([merge request](gitlab-org/gitlab!64423))
- [Remove ci_runners_tokens_optional_encryption ff](gitlab-org/gitlab@66c514ec56a1ffeba6a3a999c1cfb9bcfdc4ca5a) ([merge request](gitlab-org/gitlab!64425))
- [Update GitLab Runner Helm Chart to 0.30.0](gitlab-org/gitlab@d6bc1474cb288b8a234cda55ec427f831ce31bda) ([merge request](gitlab-org/gitlab!64462))
- [Decrease epic issues and child epics page size](gitlab-org/gitlab@4542ea3217d257a1f5c26cda5f2ee8d607950e86) ([merge request](gitlab-org/gitlab!63563)) **GitLab Enterprise Edition**
- [Remove invite_signup_page_interaction experiment](gitlab-org/gitlab@9fa990747351f1f8fbd1d323fe48c67c5e783735) ([merge request](gitlab-org/gitlab!63798))
- [Add internal docs for changing CI minute namespace](gitlab-org/gitlab@50d5ecf1dc2ebb9f6c2a3b6dcd5aa4b8161561de) ([merge request](gitlab-org/gitlab!64409)) **GitLab Enterprise Edition**
- [Add more logging to track encoding errors appending CI traces](gitlab-org/gitlab@6f240a53fe0d56910347a0615d575ac8c3e7215e) ([merge request](gitlab-org/gitlab!63920))
- [Remove diffs gradual load feature flag](gitlab-org/gitlab@027d7c4327b5b6205a84281239027273517bf81b) ([merge request](gitlab-org/gitlab!55478))
- [Remove partial index for Hashed Storage migration](gitlab-org/gitlab@3ed017a1023d7b0941a7606b69e6caee8d22f15c) ([merge request](gitlab-org/gitlab!62920))
## 14.0.5 (2021-07-08)
@ -767,6 +1379,54 @@ No changes.
- [Add missing metrics information](gitlab-org/gitlab@89cd7fe3b95323e635b2d73e08549b2e6153dc4d) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61772/edit))
- [Track usage of the resolve UI](gitlab-org/gitlab@35c8e30fce288cecefcf2f7c0077d4608e696519) ([merge request](gitlab-org/gitlab!61654))
## 13.12.8 (2021-07-07)
### Security (1 change)
- [Disable file and network premailer strategies](gitlab-org/security/gitlab@ee69d6d6950bb116cb31523ca805e78af431c25c) ([merge request](gitlab-org/security/gitlab!1545))
## 13.12.7 (2021-07-05)
### Fixed (2 changes)
- [Fix state value in the lfs_object_registry table](gitlab-org/gitlab@feca70558108299a9b7b499e4461b59b7c140ef7) ([merge request](gitlab-org/gitlab!65466)) **GitLab Enterprise Edition**
- [Fix pages deployment storage migration](gitlab-org/gitlab@4e806a7b5e0eef8d88bcdb68724c6b7bf3c08293) ([merge request](gitlab-org/gitlab!65366))
### Changed (1 change)
- [Move migration to a pre-deployment migration](gitlab-org/gitlab@d02fcd44b3dd797e18221e4e91ab913372bdf18a) ([merge request](gitlab-org/gitlab!65466)) **GitLab Enterprise Edition**
## 13.12.6 (2021-07-01)
### Added (1 change)
- [Added omniauth_user check when verifying user cap](gitlab-org/security/gitlab@a61062501630c35820301e9f79a036219d1e3074) ([merge request](gitlab-org/security/gitlab!1502)) **GitLab Enterprise Edition**
### Security (14 changes)
- [Bump rails gem version to 6.0.3.7](gitlab-org/security/gitlab@58d27ba819867baadf535e0d8d91d0cb818dc8b6) ([merge request](gitlab-org/security/gitlab!1515))
- [Update rdoc to 6.3.1](gitlab-org/security/gitlab@ead11a6974576b0b1a974985493c75143e3bd575) ([merge request](gitlab-org/security/gitlab!1534))
- [Add sanitizing for name field](gitlab-org/security/gitlab@2c5672eae4323c2682245485b327850e68e7e5b4) ([merge request](gitlab-org/security/gitlab!1490))
- [Forbid GET requests with mutations](gitlab-org/security/gitlab@2b01d6dc310451fa3022f1865470ca004bbd4c33) ([merge request](gitlab-org/security/gitlab!1529))
- [Copy feature visibility settings to a fork](gitlab-org/security/gitlab@5ee923ba64fb34fc38f831fc206a153d8f7eae91) ([merge request](gitlab-org/security/gitlab!1523))
- [Avoid disclosing project in web IDE](gitlab-org/security/gitlab@759d1361e7f359d681c4f55ea2b6f7e1d0bb1e53) ([merge request](gitlab-org/security/gitlab!1512))
- [Add new username validation](gitlab-org/security/gitlab@e79625541d04b0d6c94614f2afc6aaeb2ef40083) ([merge request](gitlab-org/security/gitlab!1495))
- [Allow only same-origin URLs for Edit Release Cancel button](gitlab-org/security/gitlab@e5bda0a7e03978afee494616e2054b8650b61d3e) ([merge request](gitlab-org/security/gitlab!1486))
- [Update Nokogiri to 1.11.4](gitlab-org/security/gitlab@d71973da1850df059b1ec1422d50bbccace21ff2) ([merge request](gitlab-org/security/gitlab!1479))
- [Fix deploy key fallback issue in protected branch](gitlab-org/security/gitlab@0411bc45885e1122c06dbff084b48bf03d78c6a8) ([merge request](gitlab-org/security/gitlab!1478))
- [Fix XSS on audit log for feature flag actions](gitlab-org/security/gitlab@22e2f903c821e54ce6d4b4b749a009d14abc4a13) ([merge request](gitlab-org/security/gitlab!1474))
- [Sanitize input on pasteGFM](gitlab-org/security/gitlab@7dc511ebc2e77c3d22cd34ca87449f32120a5229) ([merge request](gitlab-org/security/gitlab!1453))
- [Add total http read timeout](gitlab-org/security/gitlab@37c24c82d5dfa57fad03f265e7ba92f6ef250c30) ([merge request](gitlab-org/security/gitlab!1427))
- [Fix merge request diff display issue with unsupported encoding](gitlab-org/security/gitlab@7d05892daa6aaf951b941628e2af41e17977b140) ([merge request](gitlab-org/security/gitlab!1424))
## 13.12.5 (2021-06-21)
### Fixed (3 changes)
- [Fix failing spec](gitlab-org/gitlab@7d1a9b0155195eb082f5b33ba1310deed742a7a4) ([merge request](gitlab-org/gitlab!64488))
- [Advanced Search Settings page does not load if the ES url is unreachable](gitlab-org/gitlab@80b262f0e79f02a89724ed4e3988e686f53c959c) ([merge request](gitlab-org/gitlab!64488)) **GitLab Enterprise Edition**
- [Fix Password expired error on git fetch via SSH for LDAP user](gitlab-org/gitlab@19a7d7a6d3cd43f1c7559c729532ad3b9dafb75c) ([merge request](gitlab-org/gitlab!64488))
## 13.12.4 (2021-06-14)
### Fixed (3 changes)
@ -1398,6 +2058,36 @@ No changes.
- Change wording for design management upload. !61782
## 13.11.7 (2021-07-07)
### Security (1 change)
- [Disable file and network premailer strategies](gitlab-org/security/gitlab@511ed3746b48a26e95c851f76ac6fdcd44c28fd8) ([merge request](gitlab-org/security/gitlab!1546))
## 13.11.6 (2021-07-01)
### Added (1 change)
- [Added omniauth_user check when verifying user cap](gitlab-org/security/gitlab@60bc8ff36c41871271dbd4e07db960d09204607d) ([merge request](gitlab-org/security/gitlab!1503)) **GitLab Enterprise Edition**
### Security (15 changes)
- [Bump rails gem version to 6.0.3.7](gitlab-org/security/gitlab@23e4317622532de2564b7a7b0efb0812e5601a2e) ([merge request](gitlab-org/security/gitlab!1516))
- [Update rdoc to 6.3.1](gitlab-org/security/gitlab@452f9c7370c844ea728cda7ae96f990d10c32ca2) ([merge request](gitlab-org/security/gitlab!1535))
- [Prevent GraphQL API access by deactivated users](gitlab-org/security/gitlab@fdedb77bc2190dd87988171396bbb335fd8c47cd) ([merge request](gitlab-org/security/gitlab!1527))
- [Add sanitizing for name field](gitlab-org/security/gitlab@d49da0e57d91fcc59f0732eb978f68b68619a761) ([merge request](gitlab-org/security/gitlab!1491))
- [Copy feature visibility settings to a fork](gitlab-org/security/gitlab@5fd56f01c69edaefb64143ea593d680a0477cb28) ([merge request](gitlab-org/security/gitlab!1524))
- [Avoid disclosing project in web IDE](gitlab-org/security/gitlab@6cba97cef6fa1ab0808db98c64baa33597e54979) ([merge request](gitlab-org/security/gitlab!1513))
- [Add new username validation](gitlab-org/security/gitlab@9a5f5264f4c30248e83747e4ac79e2c2396461dd) ([merge request](gitlab-org/security/gitlab!1497))
- [Allow only same-origin URLs for Edit Release Cancel button](gitlab-org/security/gitlab@b959550cf4cd057d42b4a1ae76aee968cc9133b4) ([merge request](gitlab-org/security/gitlab!1485))
- [Limit creation of issues based on issue type](gitlab-org/security/gitlab@e8713df5341a6c54a4607d6eef0fbb70f93a375f) ([merge request](gitlab-org/security/gitlab!1481))
- [Update Nokogiri to 1.11.4](gitlab-org/security/gitlab@ac29afd195e19cd5c38d9030ecf7fabdea9214d1) ([merge request](gitlab-org/security/gitlab!1480))
- [Fix deploy key fallback issue in protected branch](gitlab-org/security/gitlab@bb0c95595c2b0db98af1feb882aa09870cee3600) ([merge request](gitlab-org/security/gitlab!1477))
- [Fix XSS on audit log for feature flag actions](gitlab-org/security/gitlab@e0140c81b2d7eea963248f2c2bd103b1b5a908ee) ([merge request](gitlab-org/security/gitlab!1475))
- [Sanitize input on pasteGFM](gitlab-org/security/gitlab@b47f364dfe82e59d480bb42adccc24ce691b18b1) ([merge request](gitlab-org/security/gitlab!1452))
- [Add total http read timeout](gitlab-org/security/gitlab@2179f835eadec3afa3233d649fbcdad6125a92c5) ([merge request](gitlab-org/security/gitlab!1393))
- [Fix merge request diff display issue with unsupported encoding](gitlab-org/security/gitlab@33971ea6fba1c493b2d8da4a82c8a0af71ef7e0f) ([merge request](gitlab-org/security/gitlab!1425))
## 13.11.4 (2021-05-14)
### Fixed (3 changes)

View file

@ -1 +1 @@
14.0.10
14.1.7

View file

@ -1 +1 @@
14.0.1
14.1.1

View file

@ -1 +1 @@
1.40.0
1.41.0

46
Gemfile
View file

@ -35,7 +35,7 @@ gem 'rexml', '~> 3.2.5'
gem 'ruby-saml', '~> 1.12.1'
gem 'omniauth', '~> 1.8'
gem 'omniauth-auth0', '~> 2.0.0'
gem 'omniauth-azure-activedirectory-v2', '~> 0.1'
gem 'omniauth-azure-activedirectory-v2', '~> 1.0'
gem 'omniauth-azure-oauth2', '~> 0.0.9' # Deprecated v1 version
gem 'omniauth-cas3', '~> 1.1.4'
gem 'omniauth-facebook', '~> 4.0.0'
@ -124,7 +124,7 @@ gem 'fog-aws', '~> 3.9'
# Locked until fog-google resolves https://github.com/fog/fog-google/issues/421.
# Also see config/initializers/fog_core_patch.rb.
gem 'fog-core', '= 2.1.0'
gem 'gitlab-fog-google', '~> 1.13', require: 'fog/google'
gem 'fog-google', '~> 1.15', require: 'fog/google'
gem 'fog-local', '~> 0.6'
gem 'fog-openstack', '~> 1.0'
gem 'fog-rackspace', '~> 0.1.1'
@ -157,14 +157,14 @@ gem 'github-markup', '~> 1.7.0', require: 'github/markup'
gem 'commonmarker', '~> 0.21'
gem 'kramdown', '~> 2.3.1'
gem 'RedCloth', '~> 4.3.2'
gem 'gitlab-rdoc', '~> 6.3.2', require: 'rdoc' # We need this fork until rdoc releases a new version. See https://gitlab.com/gitlab-org/gitlab/-/issues/334695
gem 'rdoc', '~> 6.3.2'
gem 'org-ruby', '~> 0.9.12'
gem 'creole', '~> 0.5.0'
gem 'wikicloth', '0.8.1'
gem 'asciidoctor', '~> 2.0.10'
gem 'asciidoctor-include-ext', '~> 0.3.1', require: false
gem 'asciidoctor-plantuml', '~> 0.0.12'
gem 'asciidoctor-kroki', '~> 0.4.0', require: false
gem 'asciidoctor-kroki', '~> 0.5.0', require: false
gem 'rouge', '~> 3.26.0'
gem 'truncato', '~> 0.7.11'
gem 'bootstrap_form', '~> 4.2.0'
@ -197,7 +197,7 @@ gem 'acts-as-taggable-on', '~> 7.0'
# Background jobs
gem 'sidekiq', '~> 5.2.7'
gem 'sidekiq-cron', '~> 1.0'
gem 'redis-namespace', '~> 1.7.0'
gem 'redis-namespace', '~> 1.8.1'
gem 'gitlab-sidekiq-fetcher', '0.5.6', require: 'sidekiq-reliable-fetch'
# Cron Parser
@ -229,7 +229,7 @@ gem 'js_regex', '~> 3.4'
gem 'device_detector'
# Redis
gem 'redis', '~> 4.0'
gem 'redis', '~> 4.1.4'
gem 'connection_pool', '~> 2.0'
# Redis session store
@ -258,7 +258,7 @@ gem 'asana', '~> 0.10.3'
gem 'ruby-fogbugz', '~> 0.2.1'
# Kubernetes integration
gem 'kubeclient', '~> 4.9.1'
gem 'kubeclient', '~> 4.9.2'
# Sanitize user input
gem 'sanitize', '~> 5.2.1'
@ -286,16 +286,16 @@ gem 'gitlab_chronic_duration', '~> 0.10.6.2'
gem 'rack-proxy', '~> 0.6.0'
gem 'sassc-rails', '~> 2.1.0'
gem 'autoprefixer-rails', '10.2.0.0'
gem 'autoprefixer-rails', '10.2.5.1'
gem 'terser', '1.0.2'
gem 'addressable', '~> 2.7'
gem 'addressable', '~> 2.8'
gem 'gemojione', '~> 3.3'
gem 'gon', '~> 6.4.0'
gem 'request_store', '~> 1.5'
gem 'base32', '~> 0.3.0'
gem 'gitlab-license', '~> 1.5'
gem 'gitlab-license', '~> 2.0'
# Protect against bruteforcing
gem 'rack-attack', '~> 6.3.0'
@ -305,16 +305,12 @@ gem 'sentry-raven', '~> 3.1'
# PostgreSQL query parsing
#
# We need this fork until https://github.com/pganalyze/pg_query/pull/212
# and https://github.com/pganalyze/pg_query/pull/213 are
# released. gitlab-labkit will need to be updated to use the pg_query
# version.
gem 'gitlab-pg_query', '~> 2.0.4', require: 'pg_query'
gem 'pg_query', '~> 2.1'
gem 'premailer-rails', '~> 1.10.3'
# LabKit: Tracing and Correlation
gem 'gitlab-labkit', '~> 0.18.0'
gem 'gitlab-labkit', '~> 0.20.0'
# Thrift is a dependency of gitlab-labkit, we want a version higher than 0.14.0
# because of https://gitlab.com/gitlab-org/gitlab/-/issues/321900
gem 'thrift', '>= 0.14.0'
@ -335,13 +331,9 @@ gem 'peek', '~> 1.1'
gem 'snowplow-tracker', '~> 0.6.1'
# Metrics
group :metrics do
gem 'method_source', '~> 1.0', require: false
gem 'webrick', '~> 1.6.1', require: false
# Prometheus
gem 'prometheus-client-mmap', '~> 0.12.0'
end
gem 'method_source', '~> 1.0', require: false
gem 'webrick', '~> 1.6.1', require: false
gem 'prometheus-client-mmap', '~> 0.12.0', require: 'prometheus/client'
group :development do
gem 'lefthook', '~> 0.7.0', require: false
@ -402,7 +394,7 @@ group :development, :test do
end
group :development, :test, :danger do
gem 'gitlab-dangerfiles', '~> 2.1.2', require: false
gem 'gitlab-dangerfiles', '~> 2.2.2', require: false
end
group :development, :test, :coverage do
@ -480,7 +472,7 @@ end
gem 'spamcheck', '~> 0.1.0'
# Gitaly GRPC protocol definitions
gem 'gitaly', '~> 14.0.0.pre.rc2'
gem 'gitaly', '~> 14.1.0.pre.rc3'
# KAS GRPC protocol definitions
gem 'kas-grpc', '~> 0.0.2'
@ -489,14 +481,14 @@ gem 'grpc', '~> 1.30.2'
gem 'google-protobuf', '~> 3.17.1'
gem 'toml-rb', '~> 1.0.0'
gem 'toml-rb', '~> 2.0'
# Feature toggles
gem 'flipper', '~> 0.21.0'
gem 'flipper-active_record', '~> 0.21.0'
gem 'flipper-active_support_cache_store', '~> 0.21.0'
gem 'unleash', '~> 0.1.5'
gem 'gitlab-experiment', '~> 0.5.4'
gem 'gitlab-experiment', '~> 0.6.1'
# Structured logging
gem 'lograge', '~> 0.5'

View file

@ -79,7 +79,7 @@ GEM
adamantium (0.2.0)
ice_nine (~> 0.11.0)
memoizable (~> 0.4.0)
addressable (2.7.0)
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
aes_key_wrap (1.1.0)
akismet (3.0.0)
@ -92,10 +92,10 @@ GEM
faraday_middleware (~> 1.0)
faraday_middleware-multi_json (~> 0.0)
oauth2 (~> 1.4)
asciidoctor (2.0.12)
asciidoctor (2.0.15)
asciidoctor-include-ext (0.3.1)
asciidoctor (>= 1.5.6, < 3.0.0)
asciidoctor-kroki (0.4.0)
asciidoctor-kroki (0.5.0)
asciidoctor (~> 2.0)
asciidoctor-plantuml (0.0.12)
asciidoctor (>= 1.5.6, < 3.0.0)
@ -105,9 +105,9 @@ GEM
attr_encrypted (3.1.0)
encryptor (~> 3.0.0)
attr_required (1.0.1)
autoprefixer-rails (10.2.0.0)
execjs
awesome_print (1.8.0)
autoprefixer-rails (10.2.5.1)
execjs (> 0)
awesome_print (1.9.2)
awrence (1.1.1)
aws-eventstream (1.1.0)
aws-partitions (1.345.0)
@ -229,7 +229,7 @@ GEM
css_parser (1.7.0)
addressable
daemons (1.3.1)
danger (8.2.3)
danger (8.3.1)
claide (~> 1.0)
claide-plugins (>= 0.9.2)
colored2 (~> 3.1)
@ -343,7 +343,7 @@ GEM
tzinfo
eventmachine (1.2.7)
excon (0.71.1)
execjs (2.7.0)
execjs (2.8.1)
expression_parser (0.9.0)
extended-markdown-filter (0.6.0)
html-pipeline (~> 2.0)
@ -381,7 +381,7 @@ GEM
fast_blank (1.0.0)
fast_gettext (1.6.0)
ffaker (2.10.0)
ffi (1.15.1)
ffi (1.15.3)
ffi-compiler (1.0.1)
ffi (>= 1.0.0)
rake
@ -412,6 +412,12 @@ GEM
excon (~> 0.58)
formatador (~> 0.2)
mime-types
fog-google (1.15.0)
fog-core (<= 2.1.0)
fog-json (~> 1.2)
fog-xml (~> 0.1.0)
google-api-client (>= 0.44.2, < 0.51)
google-cloud-env (~> 1.2)
fog-json (1.2.0)
fog-core
multi_json (~> 1.10)
@ -454,7 +460,7 @@ GEM
rails (>= 3.2.0)
git (1.7.0)
rchardet (~> 1.8)
gitaly (14.0.0.pre.rc2)
gitaly (14.1.0.pre.rc3)
grpc (~> 1.0)
github-markup (1.7.0)
gitlab (4.16.1)
@ -462,9 +468,10 @@ GEM
terminal-table (~> 1.5, >= 1.5.1)
gitlab-chronic (0.10.5)
numerizer (~> 0.2)
gitlab-dangerfiles (2.1.2)
danger-gitlab
gitlab-experiment (0.5.4)
gitlab-dangerfiles (2.2.2)
danger (>= 8.3.1)
danger-gitlab (>= 8.0.0)
gitlab-experiment (0.6.1)
activesupport (>= 3.0)
request_store (>= 1.0)
scientist (~> 1.6, >= 1.6.0)
@ -475,22 +482,15 @@ GEM
fog-json (~> 1.2.0)
mime-types
ms_rest_azure (~> 0.12.0)
gitlab-fog-google (1.13.0)
addressable (>= 2.7.0)
fog-core (<= 2.1.0)
fog-json (~> 1.2)
fog-xml (~> 0.1.0)
google-api-client (>= 0.44.2, < 0.51)
google-cloud-env (~> 1.2)
gitlab-labkit (0.18.0)
gitlab-labkit (0.20.0)
actionpack (>= 5.0.0, < 7.0.0)
activesupport (>= 5.0.0, < 7.0.0)
gitlab-pg_query (~> 2.0)
grpc (~> 1.19)
jaeger-client (~> 1.1)
opentracing (~> 0.4)
pg_query (~> 2.1)
redis (> 3.0.0, < 5.0.0)
gitlab-license (1.5.0)
gitlab-license (2.0.0)
gitlab-mail_room (0.0.9)
gitlab-markup (1.7.1)
gitlab-net-dns (0.9.1)
@ -498,9 +498,6 @@ GEM
addressable (~> 2.7)
omniauth (~> 1.9)
openid_connect (~> 1.2)
gitlab-pg_query (2.0.4)
google-protobuf (>= 3.17.1)
gitlab-rdoc (6.3.2)
gitlab-sidekiq-fetcher (0.5.6)
sidekiq (~> 5)
gitlab-styles (6.2.0)
@ -532,7 +529,7 @@ GEM
retriable (>= 2.0, < 4.0)
rexml
signet (~> 0.12)
google-cloud-env (1.4.0)
google-cloud-env (1.5.0)
faraday (>= 0.17.3, < 2.0)
google-protobuf (3.17.1)
googleapis-common-protos-types (1.0.6)
@ -618,7 +615,7 @@ GEM
hana (1.3.6)
hangouts-chat (0.0.5)
hashdiff (1.0.1)
hashie (3.6.0)
hashie (4.1.0)
hashie-forbidden_attributes (0.1.1)
hashie (>= 3.0)
health_check (3.0.0)
@ -678,9 +675,8 @@ GEM
hana (~> 1.3)
regexp_parser (~> 1.5)
uri_template (~> 0.7)
jsonpath (1.0.5)
jsonpath (1.1.0)
multi_json
to_regexp (~> 0.2.1)
jwt (2.1.0)
kaminari (1.2.1)
activesupport (>= 4.1.0)
@ -702,7 +698,7 @@ GEM
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
kubeclient (4.9.1)
kubeclient (4.9.2)
http (>= 3.0, < 5.0)
jsonpath (~> 1.0)
recursive-open-struct (~> 1.1, >= 1.1.1)
@ -762,7 +758,7 @@ GEM
mini_histogram (0.3.1)
mini_magick (4.10.1)
mini_mime (1.0.2)
mini_portile2 (2.5.0)
mini_portile2 (2.5.1)
minitest (5.11.3)
mixlib-cli (2.1.8)
mixlib-config (3.0.9)
@ -800,7 +796,7 @@ GEM
netrc (0.11.0)
nio4r (2.5.4)
no_proxy_fix (0.1.2)
nokogiri (1.11.4)
nokogiri (1.11.5)
mini_portile2 (~> 2.5.0)
racc (~> 1.4)
nokogumbo (2.0.2)
@ -810,7 +806,7 @@ GEM
shellany (~> 0.0)
numerizer (0.2.0)
oauth (0.5.6)
oauth2 (1.4.4)
oauth2 (1.4.7)
faraday (>= 0.8, < 2.0)
jwt (>= 1.0, < 3.0)
multi_json (~> 1.3)
@ -833,8 +829,8 @@ GEM
train-core
wmi-lite (~> 1.0)
oj (3.10.6)
omniauth (1.9.0)
hashie (>= 3.4.6, < 3.7.0)
omniauth (1.9.1)
hashie (>= 3.4.6)
rack (>= 1.6.2, < 3)
omniauth-atlassian-oauth2 (0.2.0)
omniauth (>= 1.1.1)
@ -844,8 +840,8 @@ GEM
omniauth-authentiq (0.3.3)
jwt (>= 1.5)
omniauth-oauth2 (>= 1.5)
omniauth-azure-activedirectory-v2 (0.1.1)
omniauth-oauth2
omniauth-azure-activedirectory-v2 (1.0.0)
omniauth-oauth2 (~> 1.7)
omniauth-azure-oauth2 (0.0.10)
jwt (>= 1.0, < 3.0)
omniauth (~> 1.0)
@ -874,9 +870,9 @@ GEM
omniauth-oauth (1.1.0)
oauth
omniauth (~> 1.0)
omniauth-oauth2 (1.6.0)
oauth2 (~> 1.1)
omniauth (~> 1.9)
omniauth-oauth2 (1.7.1)
oauth2 (~> 1.4)
omniauth (>= 1.9, < 3)
omniauth-oauth2-generic (0.2.2)
omniauth-oauth2 (~> 1.0)
omniauth-salesforce (1.0.5)
@ -922,6 +918,8 @@ GEM
peek (1.1.0)
railties (>= 4.0.0)
pg (1.2.3)
pg_query (2.1.0)
google-protobuf (>= 3.17.1)
plist (3.6.0)
png_quantizator (0.2.1)
po_to_json (1.0.1)
@ -1025,11 +1023,12 @@ GEM
msgpack (>= 0.4.3)
optimist (>= 3.0.0)
rchardet (1.8.0)
rdoc (6.3.2)
re2 (1.2.0)
recaptcha (4.13.1)
json
recursive-open-struct (1.1.2)
redis (4.1.3)
recursive-open-struct (1.1.3)
redis (4.1.4)
redis-actionpack (5.2.0)
actionpack (>= 5, < 7)
redis-rack (>= 2.1.0, < 3)
@ -1037,7 +1036,7 @@ GEM
redis-activesupport (5.2.0)
activesupport (>= 3, < 7)
redis-store (>= 1.3, < 2)
redis-namespace (1.7.0)
redis-namespace (1.8.1)
redis (>= 3.0.4)
redis-rack (2.1.2)
rack (>= 2.0.8, < 3)
@ -1263,7 +1262,7 @@ GEM
activesupport (>= 3)
attr_required (>= 0.0.5)
httpclient (>= 2.4)
sys-filesystem (1.1.6)
sys-filesystem (1.1.9)
ffi
sysexits (1.2.0)
temple (0.8.2)
@ -1286,10 +1285,9 @@ GEM
timecop (0.9.1)
timeliness (0.3.10)
timfel-krb5-auth (0.8.3)
to_regexp (0.2.1)
toml (0.2.0)
parslet (~> 1.8.0)
toml-rb (1.0.0)
toml-rb (2.0.1)
citrus (~> 3.0, > 3.0)
tomlrb (1.3.0)
tpm-key_attestation (0.9.0)
@ -1402,17 +1400,17 @@ DEPENDENCIES
acme-client (~> 2.0, >= 2.0.6)
activerecord-explain-analyze (~> 0.1)
acts-as-taggable-on (~> 7.0)
addressable (~> 2.7)
addressable (~> 2.8)
akismet (~> 3.0)
apollo_upload_server (~> 2.1.0)
asana (~> 0.10.3)
asciidoctor (~> 2.0.10)
asciidoctor-include-ext (~> 0.3.1)
asciidoctor-kroki (~> 0.4.0)
asciidoctor-kroki (~> 0.5.0)
asciidoctor-plantuml (~> 0.0.12)
atlassian-jwt (~> 0.2.0)
attr_encrypted (~> 3.1.0)
autoprefixer-rails (= 10.2.0.0)
autoprefixer-rails (= 10.2.5.1)
awesome_print
aws-sdk-cloudformation (~> 1)
aws-sdk-core (~> 3)
@ -1474,6 +1472,7 @@ DEPENDENCIES
fog-aliyun (~> 0.3)
fog-aws (~> 3.9)
fog-core (= 2.1.0)
fog-google (~> 1.15)
fog-local (~> 0.6)
fog-openstack (~> 1.0)
fog-rackspace (~> 0.1.1)
@ -1483,21 +1482,18 @@ DEPENDENCIES
gettext (~> 3.3)
gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.3)
gitaly (~> 14.0.0.pre.rc2)
gitaly (~> 14.1.0.pre.rc3)
github-markup (~> 1.7.0)
gitlab-chronic (~> 0.10.5)
gitlab-dangerfiles (~> 2.1.2)
gitlab-experiment (~> 0.5.4)
gitlab-dangerfiles (~> 2.2.2)
gitlab-experiment (~> 0.6.1)
gitlab-fog-azure-rm (~> 1.1.1)
gitlab-fog-google (~> 1.13)
gitlab-labkit (~> 0.18.0)
gitlab-license (~> 1.5)
gitlab-labkit (~> 0.20.0)
gitlab-license (~> 2.0)
gitlab-mail_room (~> 0.0.9)
gitlab-markup (~> 1.7.1)
gitlab-net-dns (~> 0.9.1)
gitlab-omniauth-openid-connect (~> 0.4.0)
gitlab-pg_query (~> 2.0.4)
gitlab-rdoc (~> 6.3.2)
gitlab-sidekiq-fetcher (= 0.5.6)
gitlab-styles (~> 6.2.0)
gitlab_chronic_duration (~> 0.10.6.2)
@ -1538,7 +1534,7 @@ DEPENDENCIES
kas-grpc (~> 0.0.2)
knapsack (~> 1.21.1)
kramdown (~> 2.3.1)
kubeclient (~> 4.9.1)
kubeclient (~> 4.9.2)
lefthook (~> 0.7.0)
letter_opener_web (~> 1.4.0)
license_finder (~> 6.0)
@ -1567,7 +1563,7 @@ DEPENDENCIES
omniauth-atlassian-oauth2 (~> 0.2.0)
omniauth-auth0 (~> 2.0.0)
omniauth-authentiq (~> 0.3.3)
omniauth-azure-activedirectory-v2 (~> 0.1)
omniauth-azure-activedirectory-v2 (~> 1.0)
omniauth-azure-oauth2 (~> 0.0.9)
omniauth-cas3 (~> 1.1.4)
omniauth-facebook (~> 4.0.0)
@ -1586,6 +1582,7 @@ DEPENDENCIES
parslet (~> 1.8)
peek (~> 1.1)
pg (~> 1.1)
pg_query (~> 2.1)
png_quantizator (~> 0.2.1)
premailer-rails (~> 1.10.3)
prometheus-client-mmap (~> 0.12.0)
@ -1606,10 +1603,11 @@ DEPENDENCIES
rainbow (~> 3.0)
rblineprof (~> 0.3.6)
rbtrace (~> 0.4)
rdoc (~> 6.3.2)
re2 (~> 1.2.0)
recaptcha (~> 4.11)
redis (~> 4.0)
redis-namespace (~> 1.7.0)
redis (~> 4.1.4)
redis-namespace (~> 1.8.1)
redis-rails (~> 5.0.2)
request_store (~> 1.5)
responders (~> 3.0)
@ -1659,7 +1657,7 @@ DEPENDENCIES
thin (~> 1.8.0)
thrift (>= 0.14.0)
timecop (~> 0.9.1)
toml-rb (~> 1.0.0)
toml-rb (~> 2.0)
truncato (~> 0.7.11)
u2f (~> 0.2.1)
unf (~> 0.1.4)

View file

@ -4,6 +4,7 @@ Portions of this software are licensed as follows:
* All content residing under the "doc/" directory of this repository is licensed under "Creative Commons: CC BY-SA 4.0 license".
* All content that resides under the "ee/" directory of this repository, if that directory exists, is licensed under the license defined in "ee/LICENSE".
* All content that resides under the "jh/" directory of this repository, if that directory exists, is licensed under the license defined in "jh/LICENSE".
* All client-side JavaScript (when served directly or after being compiled, arranged, augmented, or combined), is licensed under the "MIT Expat" license.
* All third party components incorporated into the GitLab Software are licensed under the original license provided by the owner of the applicable component.
* Content outside of the above mentioned directories or restrictions above is available under the "MIT Expat" license as defined below.

View file

@ -23,10 +23,11 @@ To see how GitLab looks please see the [features page on our website](https://ab
## Editions
There are two editions of GitLab:
There are three editions of GitLab:
- GitLab Community Edition (CE) is available freely under the MIT Expat license.
- GitLab Enterprise Edition (EE) includes [extra features](https://about.gitlab.com/pricing/#compare-options) that are more useful for organizations with more than 100 users. To use EE and get official support please [become a subscriber](https://about.gitlab.com/pricing/).
- JiHu Edition (JH) tailored specifically for the [Chinese market](https://about.gitlab.cn/).
## Licensing

View file

@ -1 +1 @@
14.0.10
14.1.7

View file

@ -42,7 +42,7 @@ export default class Activities {
}
updateTooltips() {
localTimeAgo($('.js-timeago', '.content_list'));
localTimeAgo(document.querySelectorAll('.content_list .js-timeago'));
}
reloadActivities() {

View file

@ -1,3 +1,4 @@
import initSetHelperText from '~/pages/admin/application_settings/metrics_and_profiling/usage_statistics';
import PayloadPreviewer from '~/pages/admin/application_settings/payload_previewer';
export default () => {
@ -5,3 +6,5 @@ export default () => {
new PayloadPreviewer(trigger).init();
});
};
initSetHelperText();

View file

@ -1,6 +1,16 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
import { sprintf, s__ } from '~/locale';
import { sprintf, s__, __ } from '~/locale';
import { I18N_USER_ACTIONS } from '../../constants';
// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
const messageHtml = `
<p>${s__('AdminUsers|Reactivating a user will:')}</p>
<ul>
<li>${s__('AdminUsers|Restore user access to the account, including web, Git and API.')}</li>
</ul>
<p>${s__('AdminUsers|You can always deactivate their account again if needed.')}</p>
`;
export default {
components: {
@ -25,9 +35,14 @@ export default {
title: sprintf(s__('AdminUsers|Activate user %{username}?'), {
username: this.username,
}),
message: s__('AdminUsers|You can always deactivate their account again if needed.'),
okVariant: 'confirm',
okTitle: s__('AdminUsers|Activate'),
messageHtml,
actionCancel: {
text: __('Cancel'),
},
actionPrimary: {
text: I18N_USER_ACTIONS.activate,
attributes: [{ variant: 'confirm' }],
},
}),
};
},
@ -36,9 +51,7 @@ export default {
</script>
<template>
<div class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<gl-dropdown-item>
<slot></slot>
</gl-dropdown-item>
</div>
<gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<slot></slot>
</gl-dropdown-item>
</template>

View file

@ -1,21 +1,60 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
import { sprintf, s__, __ } from '~/locale';
import { I18N_USER_ACTIONS } from '../../constants';
// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
const messageHtml = `
<p>${s__('AdminUsers|Approved users can:')}</p>
<ul>
<li>${s__('AdminUsers|Log in')}</li>
<li>${s__('AdminUsers|Access Git repositories')}</li>
<li>${s__('AdminUsers|Access the API')}</li>
<li>${s__('AdminUsers|Be added to groups and projects')}</li>
</ul>
`;
export default {
components: {
GlDropdownItem,
},
props: {
username: {
type: String,
required: true,
},
path: {
type: String,
required: true,
},
},
computed: {
attributes() {
return {
'data-path': this.path,
'data-method': 'put',
'data-modal-attributes': JSON.stringify({
title: sprintf(s__('AdminUsers|Approve user %{username}?'), {
username: this.username,
}),
actionCancel: {
text: __('Cancel'),
},
actionPrimary: {
text: I18N_USER_ACTIONS.approve,
attributes: [{ variant: 'confirm', 'data-qa-selector': 'approve_user_confirm_button' }],
},
messageHtml,
}),
'data-qa-selector': 'approve_user_button',
};
},
},
};
</script>
<template>
<gl-dropdown-item :href="path" data-method="put">
<gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...attributes }">
<slot></slot>
</gl-dropdown-item>
</template>

View file

@ -0,0 +1,69 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
import { helpPagePath } from '~/helpers/help_page_helper';
import { sprintf, s__, __ } from '~/locale';
import { I18N_USER_ACTIONS } from '../../constants';
// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
const messageHtml = `
<p>${s__('AdminUsers|When banned, users:')}</p>
<ul>
<li>${s__("AdminUsers|Can't log in.")}</li>
<li>${s__("AdminUsers|Can't access Git repositories.")}</li>
</ul>
<p>${s__('AdminUsers|You can unban their account in the future. Their data remains intact.')}</p>
<p>${sprintf(
s__('AdminUsers|Learn more about %{link_start}banned users.%{link_end}'),
{
link_start: `<a href="${helpPagePath('user/admin_area/moderate_users', {
anchor: 'ban-a-user',
})}" target="_blank">`,
link_end: '</a>',
},
false,
)}</p>
`;
export default {
components: {
GlDropdownItem,
},
props: {
username: {
type: String,
required: true,
},
path: {
type: String,
required: true,
},
},
computed: {
modalAttributes() {
return {
'data-path': this.path,
'data-method': 'put',
'data-modal-attributes': JSON.stringify({
title: sprintf(s__('AdminUsers|Ban user %{username}?'), {
username: this.username,
}),
actionCancel: {
text: __('Cancel'),
},
actionPrimary: {
text: I18N_USER_ACTIONS.ban,
attributes: [{ variant: 'confirm' }],
},
messageHtml,
}),
};
},
},
};
</script>
<template>
<gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<slot></slot>
</gl-dropdown-item>
</template>

View file

@ -1,6 +1,7 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
import { sprintf, s__ } from '~/locale';
import { sprintf, s__, __ } from '~/locale';
import { I18N_USER_ACTIONS } from '../../constants';
// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
const messageHtml = `
@ -11,6 +12,7 @@ const messageHtml = `
<li>${s__('AdminUsers|Personal projects will be left')}</li>
<li>${s__('AdminUsers|Owned groups will be left')}</li>
</ul>
<p>${s__('AdminUsers|You can always unblock their account, their data will remain intact.')}</p>
`;
export default {
@ -34,8 +36,13 @@ export default {
'data-method': 'put',
'data-modal-attributes': JSON.stringify({
title: sprintf(s__('AdminUsers|Block user %{username}?'), { username: this.username }),
okVariant: 'confirm',
okTitle: s__('AdminUsers|Block'),
actionCancel: {
text: __('Cancel'),
},
actionPrimary: {
text: I18N_USER_ACTIONS.block,
attributes: [{ variant: 'confirm' }],
},
messageHtml,
}),
};
@ -45,9 +52,7 @@ export default {
</script>
<template>
<div class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<gl-dropdown-item>
<slot></slot>
</gl-dropdown-item>
</div>
<gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<slot></slot>
</gl-dropdown-item>
</template>

View file

@ -1,6 +1,7 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
import { sprintf, s__ } from '~/locale';
import { sprintf, s__, __ } from '~/locale';
import { I18N_USER_ACTIONS } from '../../constants';
// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
const messageHtml = `
@ -16,6 +17,9 @@ const messageHtml = `
)}</li>
<li>${s__('AdminUsers|Personal projects, group and user history will be left intact')}</li>
</ul>
<p>${s__(
'AdminUsers|You can always re-activate their account, their data will remain intact.',
)}</p>
`;
export default {
@ -41,8 +45,13 @@ export default {
title: sprintf(s__('AdminUsers|Deactivate user %{username}?'), {
username: this.username,
}),
okVariant: 'confirm',
okTitle: s__('AdminUsers|Deactivate'),
actionCancel: {
text: __('Cancel'),
},
actionPrimary: {
text: I18N_USER_ACTIONS.deactivate,
attributes: [{ variant: 'confirm' }],
},
messageHtml,
}),
};
@ -52,9 +61,7 @@ export default {
</script>
<template>
<div class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<gl-dropdown-item>
<slot></slot>
</gl-dropdown-item>
</div>
<gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<slot></slot>
</gl-dropdown-item>
</template>

View file

@ -1,20 +1,24 @@
import Activate from './activate.vue';
import Approve from './approve.vue';
import Ban from './ban.vue';
import Block from './block.vue';
import Deactivate from './deactivate.vue';
import Delete from './delete.vue';
import DeleteWithContributions from './delete_with_contributions.vue';
import Reject from './reject.vue';
import Unban from './unban.vue';
import Unblock from './unblock.vue';
import Unlock from './unlock.vue';
export default {
Activate,
Approve,
Ban,
Block,
Deactivate,
Delete,
DeleteWithContributions,
Unban,
Unblock,
Unlock,
Reject,

View file

@ -1,21 +1,70 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
import { helpPagePath } from '~/helpers/help_page_helper';
import { sprintf, s__, __ } from '~/locale';
import { I18N_USER_ACTIONS } from '../../constants';
// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
const messageHtml = `
<p>${s__('AdminUsers|Rejected users:')}</p>
<ul>
<li>${s__('AdminUsers|Cannot sign in or access instance information')}</li>
<li>${s__('AdminUsers|Will be deleted')}</li>
</ul>
<p>${sprintf(
s__(
'AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}',
),
{
link_start: `<a href="${helpPagePath('user/profile/account/delete_account', {
anchor: 'associated-records',
})}" target="_blank">`,
link_end: '</a>',
},
false,
)}</p>
`;
export default {
components: {
GlDropdownItem,
},
props: {
username: {
type: String,
required: true,
},
path: {
type: String,
required: true,
},
},
computed: {
modalAttributes() {
return {
'data-path': this.path,
'data-method': 'delete',
'data-modal-attributes': JSON.stringify({
title: sprintf(s__('AdminUsers|Reject user %{username}?'), {
username: this.username,
}),
actionCancel: {
text: __('Cancel'),
},
actionPrimary: {
text: I18N_USER_ACTIONS.reject,
attributes: [{ variant: 'danger' }],
},
messageHtml,
}),
};
},
},
};
</script>
<template>
<gl-dropdown-item :href="path" data-method="delete">
<gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<slot></slot>
</gl-dropdown-item>
</template>

View file

@ -0,0 +1,53 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
import { sprintf, s__, __ } from '~/locale';
import { I18N_USER_ACTIONS } from '../../constants';
// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
const messageHtml = `<p>${s__(
'AdminUsers|You can ban their account in the future if necessary.',
)}</p>`;
export default {
components: {
GlDropdownItem,
},
props: {
username: {
type: String,
required: true,
},
path: {
type: String,
required: true,
},
},
computed: {
modalAttributes() {
return {
'data-path': this.path,
'data-method': 'put',
'data-modal-attributes': JSON.stringify({
title: sprintf(s__('AdminUsers|Unban user %{username}?'), {
username: this.username,
}),
actionCancel: {
text: __('Cancel'),
},
actionPrimary: {
text: I18N_USER_ACTIONS.unban,
attributes: [{ variant: 'confirm' }],
},
messageHtml,
}),
};
},
},
};
</script>
<template>
<gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<slot></slot>
</gl-dropdown-item>
</template>

View file

@ -1,6 +1,7 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
import { sprintf, s__ } from '~/locale';
import { sprintf, s__, __ } from '~/locale';
import { I18N_USER_ACTIONS } from '../../constants';
export default {
components: {
@ -24,8 +25,13 @@ export default {
'data-modal-attributes': JSON.stringify({
title: sprintf(s__('AdminUsers|Unblock user %{username}?'), { username: this.username }),
message: s__('AdminUsers|You can always block their account again if needed.'),
okVariant: 'confirm',
okTitle: s__('AdminUsers|Unblock'),
actionCancel: {
text: __('Cancel'),
},
actionPrimary: {
text: I18N_USER_ACTIONS.unblock,
attributes: [{ variant: 'confirm' }],
},
}),
};
},
@ -34,9 +40,7 @@ export default {
</script>
<template>
<div class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<gl-dropdown-item>
<slot></slot>
</gl-dropdown-item>
</div>
<gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<slot></slot>
</gl-dropdown-item>
</template>

View file

@ -1,6 +1,7 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
import { sprintf, s__, __ } from '~/locale';
import { I18N_USER_ACTIONS } from '../../constants';
export default {
components: {
@ -24,8 +25,13 @@ export default {
'data-modal-attributes': JSON.stringify({
title: sprintf(s__('AdminUsers|Unlock user %{username}?'), { username: this.username }),
message: __('Are you sure?'),
okVariant: 'confirm',
okTitle: s__('AdminUsers|Unlock'),
actionCancel: {
text: __('Cancel'),
},
actionPrimary: {
text: I18N_USER_ACTIONS.unlock,
attributes: [{ variant: 'confirm' }],
},
}),
};
},
@ -34,9 +40,7 @@ export default {
</script>
<template>
<div class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<gl-dropdown-item>
<slot></slot>
</gl-dropdown-item>
</div>
<gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<slot></slot>
</gl-dropdown-item>
</template>

View file

@ -58,7 +58,7 @@ export default {
},
computed: {
modalTitle() {
return sprintf(this.title, { username: this.username });
return sprintf(this.title, { username: this.username }, false);
},
secondaryButtonLabel() {
return s__('AdminUsers|Block user');
@ -112,7 +112,7 @@ export default {
</gl-sprintf>
</p>
<oncall-schedules-list v-if="schedules.length" :schedules="schedules" />
<oncall-schedules-list v-if="schedules.length" :schedules="schedules" :user-name="username" />
<p>
<gl-sprintf :message="s__('AdminUsers|To confirm, type %{username}')">

View file

@ -5,6 +5,7 @@ import {
GlDropdownItem,
GlDropdownSectionHeader,
GlDropdownDivider,
GlTooltipDirective,
} from '@gitlab/ui';
import { convertArrayToCamelCase } from '~/lib/utils/common_utils';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
@ -21,6 +22,9 @@ export default {
GlDropdownDivider,
...Actions,
},
directives: {
GlTooltip: GlTooltipDirective,
},
props: {
user: {
type: Object,
@ -30,6 +34,11 @@ export default {
type: Object,
required: true,
},
showButtonLabels: {
type: Boolean,
required: false,
default: false,
},
},
computed: {
userActions() {
@ -56,6 +65,13 @@ export default {
userPaths() {
return generateUserPaths(this.paths, this.user.username);
},
editButtonAttrs() {
return {
'data-testid': 'edit',
icon: 'pencil-square',
href: this.userPaths.edit,
};
},
},
methods: {
isLdapAction(action) {
@ -70,51 +86,68 @@ export default {
</script>
<template>
<div class="gl-display-flex gl-justify-content-end" :data-testid="`user-actions-${user.id}`">
<gl-button v-if="hasEditAction" data-testid="edit" :href="userPaths.edit">{{
$options.i18n.edit
}}</gl-button>
<div
class="gl-display-flex gl-justify-content-end gl-my-n2 gl-mx-n2"
:data-testid="`user-actions-${user.id}`"
>
<div v-if="hasEditAction" class="gl-p-2">
<gl-button v-if="showButtonLabels" v-bind="editButtonAttrs">{{
$options.i18n.edit
}}</gl-button>
<gl-button
v-else
v-gl-tooltip="$options.i18n.edit"
v-bind="editButtonAttrs"
:aria-label="$options.i18n.edit"
/>
</div>
<gl-dropdown
v-if="hasDropdownActions"
data-testid="dropdown-toggle"
right
class="gl-ml-2"
icon="settings"
>
<gl-dropdown-section-header>{{ $options.i18n.settings }}</gl-dropdown-section-header>
<div v-if="hasDropdownActions" class="gl-p-2">
<gl-dropdown
data-testid="dropdown-toggle"
right
:text="$options.i18n.userAdministration"
:text-sr-only="!showButtonLabels"
icon="settings"
data-qa-selector="user_actions_dropdown_toggle"
:data-qa-username="user.username"
>
<gl-dropdown-section-header>{{
$options.i18n.userAdministration
}}</gl-dropdown-section-header>
<template v-for="action in dropdownSafeActions">
<component
:is="getActionComponent(action)"
v-if="getActionComponent(action)"
:key="action"
:path="userPaths[action]"
:username="user.name"
:data-testid="action"
>
{{ $options.i18n[action] }}
</component>
<gl-dropdown-item v-else-if="isLdapAction(action)" :key="action" :data-testid="action">
{{ $options.i18n[action] }}
</gl-dropdown-item>
</template>
<template v-for="action in dropdownSafeActions">
<component
:is="getActionComponent(action)"
v-if="getActionComponent(action)"
:key="action"
:path="userPaths[action]"
:username="user.name"
:data-testid="action"
>
{{ $options.i18n[action] }}
</component>
<gl-dropdown-item v-else-if="isLdapAction(action)" :key="action" :data-testid="action">
{{ $options.i18n[action] }}
</gl-dropdown-item>
</template>
<gl-dropdown-divider v-if="hasDeleteActions" />
<gl-dropdown-divider v-if="hasDeleteActions" />
<template v-for="action in dropdownDeleteActions">
<component
:is="getActionComponent(action)"
v-if="getActionComponent(action)"
:key="action"
:paths="userPaths"
:username="user.name"
:oncall-schedules="user.oncallSchedules"
:data-testid="`delete-${action}`"
>
{{ $options.i18n[action] }}
</component>
</template>
</gl-dropdown>
<template v-for="action in dropdownDeleteActions">
<component
:is="getActionComponent(action)"
v-if="getActionComponent(action)"
:key="action"
:paths="userPaths"
:username="user.name"
:oncall-schedules="user.oncallSchedules"
:data-testid="`delete-${action}`"
>
{{ $options.i18n[action] }}
</component>
</template>
</gl-dropdown>
</div>
</div>
</template>

View file

@ -6,7 +6,7 @@ export const LENGTH_OF_USER_NOTE_TOOLTIP = 100;
export const I18N_USER_ACTIONS = {
edit: __('Edit'),
settings: __('Settings'),
userAdministration: s__('AdminUsers|User administration'),
unlock: __('Unlock'),
block: s__('AdminUsers|Block'),
unblock: s__('AdminUsers|Unblock'),
@ -17,4 +17,12 @@ export const I18N_USER_ACTIONS = {
ldapBlocked: s__('AdminUsers|Cannot unblock LDAP blocked users'),
delete: s__('AdminUsers|Delete user'),
deleteWithContributions: s__('AdminUsers|Delete user and contributions'),
ban: s__('AdminUsers|Ban user'),
unban: s__('AdminUsers|Unban user'),
};
export const CONFIRM_DELETE_BUTTON_SELECTOR = '.js-delete-user-modal-button';
export const MODAL_TEXTS_CONTAINER_SELECTOR = '#js-modal-texts';
export const MODAL_MANAGER_SELECTOR = '#js-delete-user-modal';

View file

@ -2,7 +2,15 @@ import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import csrf from '~/lib/utils/csrf';
import AdminUsersApp from './components/app.vue';
import ModalManager from './components/modals/user_modal_manager.vue';
import UserActions from './components/user_actions.vue';
import {
CONFIRM_DELETE_BUTTON_SELECTOR,
MODAL_TEXTS_CONTAINER_SELECTOR,
MODAL_MANAGER_SELECTOR,
} from './constants';
Vue.use(VueApollo);
@ -10,22 +18,71 @@ const apolloProvider = new VueApollo({
defaultClient: createDefaultClient({}, { assumeImmutableResults: true }),
});
export const initAdminUsersApp = (el = document.querySelector('#js-admin-users-app')) => {
const initApp = (el, component, userPropKey, props = {}) => {
if (!el) {
return false;
}
const { users, paths } = el.dataset;
const { [userPropKey]: user, paths } = el.dataset;
return new Vue({
el,
apolloProvider,
render: (createElement) =>
createElement(AdminUsersApp, {
createElement(component, {
props: {
users: convertObjectPropsToCamelCase(JSON.parse(users), { deep: true }),
[userPropKey]: convertObjectPropsToCamelCase(JSON.parse(user), { deep: true }),
paths: convertObjectPropsToCamelCase(JSON.parse(paths)),
...props,
},
}),
});
};
export const initAdminUsersApp = (el = document.querySelector('#js-admin-users-app')) =>
initApp(el, AdminUsersApp, 'users');
export const initAdminUserActions = (el = document.querySelector('#js-admin-user-actions')) =>
initApp(el, UserActions, 'user', { showButtonLabels: true });
export const initDeleteUserModals = () => {
const modalsMountElement = document.querySelector(MODAL_TEXTS_CONTAINER_SELECTOR);
if (!modalsMountElement) {
return;
}
const modalConfiguration = Array.from(modalsMountElement.children).reduce((accumulator, node) => {
const { modal, ...config } = node.dataset;
return {
...accumulator,
[modal]: {
title: node.dataset.title,
...config,
content: node.innerHTML,
},
};
}, {});
// eslint-disable-next-line no-new
new Vue({
el: MODAL_MANAGER_SELECTOR,
functional: true,
methods: {
show(...args) {
this.$refs.manager.show(...args);
},
},
render(h) {
return h(ModalManager, {
ref: 'manager',
props: {
selector: CONFIRM_DELETE_BUTTON_SELECTOR,
modalConfiguration,
csrfToken: csrf.token,
},
});
},
});
};

View file

@ -25,28 +25,33 @@ export default {
};
</script>
<template>
<gl-empty-state class="js-empty-state" :title="__('Usage ping is off')" :svg-path="svgPath">
<gl-empty-state :title="s__('ServicePing|Service ping is off')" :svg-path="svgPath">
<template #description>
<gl-sprintf
v-if="!isAdmin"
:message="
__(
'To view instance-level analytics, ask an admin to turn on %{docLinkStart}usage ping%{docLinkEnd}.',
s__(
'ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}.',
)
"
>
<template #docLink="{ content }">
<gl-link :href="docsLink" target="_blank">{{ content }}</gl-link>
<gl-link :href="docsLink" target="_blank" data-testid="docs-link">{{ content }}</gl-link>
</template>
</gl-sprintf>
<template v-else
><p>
{{ __('Turn on usage ping to review instance-level analytics.') }}
<template v-else>
<p>
{{ s__('ServicePing|Turn on service ping to review instance-level analytics.') }}
</p>
<gl-button category="primary" variant="success" :href="primaryButtonPath">
{{ __('Turn on usage ping') }}</gl-button
<gl-button
category="primary"
variant="success"
:href="primaryButtonPath"
data-testid="power-on-button"
>
{{ s__('ServicePing|Turn on service ping') }}
</gl-button>
</template>
</template>
</gl-empty-state>

View file

@ -1,27 +1,33 @@
import Vue from 'vue';
import { parseBoolean } from '~/lib/utils/common_utils';
import UserCallout from '~/user_callout';
import UsagePingDisabled from './components/usage_ping_disabled.vue';
import ServicePingDisabled from './components/service_ping_disabled.vue';
export default () => {
// eslint-disable-next-line no-new
new UserCallout();
const emptyStateContainer = document.getElementById('js-devops-usage-ping-disabled');
const emptyStateContainer = document.getElementById('js-devops-service-ping-disabled');
if (!emptyStateContainer) return false;
const { emptyStateSvgPath, enableUsagePingLink, docsLink, isAdmin } = emptyStateContainer.dataset;
const {
isAdmin,
emptyStateSvgPath,
enableServicePingPath,
docsLink,
} = emptyStateContainer.dataset;
return new Vue({
el: emptyStateContainer,
provide: {
isAdmin: Boolean(isAdmin),
isAdmin: parseBoolean(isAdmin),
svgPath: emptyStateSvgPath,
primaryButtonPath: enableUsagePingLink,
primaryButtonPath: enableServicePingPath,
docsLink,
},
render(h) {
return h(UsagePingDisabled);
return h(ServicePingDisabled);
},
});
};

View file

@ -0,0 +1,121 @@
<script>
import { GlDaterangePicker, GlSprintf, GlIcon, GlTooltipDirective } from '@gitlab/ui';
import { getDayDifference } from '~/lib/utils/datetime_utility';
import { __, sprintf } from '~/locale';
import { OFFSET_DATE_BY_ONE } from '../constants';
export default {
components: {
GlDaterangePicker,
GlSprintf,
GlIcon,
},
directives: {
GlTooltip: GlTooltipDirective,
},
props: {
show: {
type: Boolean,
required: false,
default: true,
},
startDate: {
type: Date,
required: false,
default: null,
},
endDate: {
type: Date,
required: false,
default: null,
},
minDate: {
type: Date,
required: false,
default: null,
},
maxDate: {
type: Date,
required: false,
default() {
return new Date();
},
},
maxDateRange: {
type: Number,
required: false,
default: 0,
},
includeSelectedDate: {
type: Boolean,
required: false,
default: false,
},
},
data() {
return {
maxDateRangeTooltip: sprintf(
__(
'Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days.',
),
{
maxDateRange: this.maxDateRange,
},
),
};
},
computed: {
dateRange: {
get() {
return { startDate: this.startDate, endDate: this.endDate };
},
set({ startDate, endDate }) {
this.$emit('change', { startDate, endDate });
},
},
numberOfDays() {
const dayDifference = getDayDifference(this.startDate, this.endDate);
return this.includeSelectedDate ? dayDifference + OFFSET_DATE_BY_ONE : dayDifference;
},
},
};
</script>
<template>
<div
v-if="show"
class="gl-display-flex gl-flex-direction-column gl-lg-flex-direction-row align-items-lg-center justify-content-lg-end"
>
<gl-daterange-picker
v-model="dateRange"
class="d-flex flex-column flex-lg-row"
:default-start-date="startDate"
:default-end-date="endDate"
:default-min-date="minDate"
:max-date-range="maxDateRange"
:default-max-date="maxDate"
:same-day-selection="includeSelectedDate"
theme="animate-picker"
start-picker-class="js-daterange-picker-from gl-display-flex gl-flex-direction-column gl-lg-flex-direction-row gl-lg-align-items-center gl-lg-mr-3 gl-mb-2 gl-lg-mb-0"
end-picker-class="js-daterange-picker-to d-flex flex-column flex-lg-row align-items-lg-center"
label-class="gl-mb-2 gl-lg-mb-0"
/>
<div
v-if="maxDateRange"
class="daterange-indicator d-flex flex-row flex-lg-row align-items-flex-start align-items-lg-center"
>
<span class="number-of-days pl-2 pr-1">
<gl-sprintf :message="n__('1 day selected', '%d days selected', numberOfDays)">
<template #numberOfDays>{{ numberOfDays }}</template>
</gl-sprintf>
</span>
<gl-icon
v-gl-tooltip
data-testid="helper-icon"
:title="maxDateRangeTooltip"
name="question"
:size="14"
class="text-secondary"
/>
</div>
</div>
</template>

View file

@ -1,80 +0,0 @@
<script>
import {
GlCard,
GlDeprecatedSkeletonLoading as GlSkeletonLoading,
GlLink,
GlIcon,
GlTooltipDirective,
} from '@gitlab/ui';
export default {
name: 'MetricCard',
components: {
GlCard,
GlSkeletonLoading,
GlLink,
GlIcon,
},
directives: {
GlTooltip: GlTooltipDirective,
},
props: {
title: {
type: String,
required: true,
},
metrics: {
type: Array,
required: true,
},
isLoading: {
type: Boolean,
required: false,
default: false,
},
},
methods: {
valueText(metric) {
const { value = null, unit = null } = metric;
if (!value || value === '-') return '-';
return unit && value ? `${value} ${unit}` : value;
},
},
};
</script>
<template>
<gl-card class="gl-mb-5">
<template #header>
<strong ref="title">{{ title }}</strong>
</template>
<template #default>
<gl-skeleton-loading v-if="isLoading" class="gl-h-auto gl-py-3" />
<div v-else ref="metricsWrapper" class="gl-display-flex">
<div
v-for="metric in metrics"
:key="metric.key"
ref="metricItem"
class="js-metric-card-item gl-flex-grow-1 gl-text-center"
>
<gl-link v-if="metric.link" :href="metric.link">
<h3 class="gl-my-2 gl-text-blue-700">{{ valueText(metric) }}</h3>
</gl-link>
<h3 v-else class="gl-my-2">{{ valueText(metric) }}</h3>
<p class="text-secondary gl-font-sm gl-mb-2">
{{ metric.label }}
<span v-if="metric.tooltipText">
&nbsp;
<gl-icon
v-gl-tooltip="{ title: metric.tooltipText }"
:size="14"
class="gl-vertical-align-middle"
name="question"
data-testid="tooltip"
/>
</span>
</p>
</div>
</div>
</template>
</gl-card>
</template>

View file

@ -0,0 +1,241 @@
<script>
import {
GlIcon,
GlLoadingIcon,
GlAvatar,
GlDropdown,
GlDropdownSectionHeader,
GlDropdownItem,
GlSearchBoxByType,
} from '@gitlab/ui';
import { debounce } from 'lodash';
import { filterBySearchTerm } from '~/analytics/shared/utils';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { n__, s__, __ } from '~/locale';
import getProjects from '../graphql/projects.query.graphql';
export default {
name: 'ProjectsDropdownFilter',
components: {
GlIcon,
GlLoadingIcon,
GlAvatar,
GlDropdown,
GlDropdownSectionHeader,
GlDropdownItem,
GlSearchBoxByType,
},
props: {
groupId: {
type: Number,
required: true,
},
groupNamespace: {
type: String,
required: true,
},
multiSelect: {
type: Boolean,
required: false,
default: false,
},
label: {
type: String,
required: false,
default: s__('CycleAnalytics|project dropdown filter'),
},
queryParams: {
type: Object,
required: false,
default: () => ({}),
},
defaultProjects: {
type: Array,
required: false,
default: () => [],
},
},
data() {
return {
loading: true,
projects: [],
selectedProjects: this.defaultProjects || [],
searchTerm: '',
isDirty: false,
};
},
computed: {
selectedProjectsLabel() {
if (this.selectedProjects.length === 1) {
return this.selectedProjects[0].name;
} else if (this.selectedProjects.length > 1) {
return n__(
'CycleAnalytics|Project selected',
'CycleAnalytics|%d projects selected',
this.selectedProjects.length,
);
}
return this.selectedProjectsPlaceholder;
},
selectedProjectsPlaceholder() {
return this.multiSelect ? __('Select projects') : __('Select a project');
},
isOnlyOneProjectSelected() {
return this.selectedProjects.length === 1;
},
selectedProjectIds() {
return this.selectedProjects.map((p) => p.id);
},
availableProjects() {
return filterBySearchTerm(this.projects, this.searchTerm);
},
noResultsAvailable() {
const { loading, availableProjects } = this;
return !loading && !availableProjects.length;
},
},
watch: {
searchTerm() {
this.search();
},
},
mounted() {
this.search();
},
methods: {
search: debounce(function debouncedSearch() {
this.fetchData();
}, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
getSelectedProjects(selectedProject, isMarking) {
return isMarking
? this.selectedProjects.concat([selectedProject])
: this.selectedProjects.filter((project) => project.id !== selectedProject.id);
},
singleSelectedProject(selectedObj, isMarking) {
return isMarking ? [selectedObj] : [];
},
setSelectedProjects(selectedObj, isMarking) {
this.selectedProjects = this.multiSelect
? this.getSelectedProjects(selectedObj, isMarking)
: this.singleSelectedProject(selectedObj, isMarking);
},
onClick({ project, isSelected }) {
this.setSelectedProjects(project, !isSelected);
this.$emit('selected', this.selectedProjects);
},
onMultiSelectClick({ project, isSelected }) {
this.setSelectedProjects(project, !isSelected);
this.isDirty = true;
},
onSelected(ev) {
if (this.multiSelect) {
this.onMultiSelectClick(ev);
} else {
this.onClick(ev);
}
},
onHide() {
if (this.multiSelect && this.isDirty) {
this.$emit('selected', this.selectedProjects);
}
this.searchTerm = '';
this.isDirty = false;
},
fetchData() {
this.loading = true;
return this.$apollo
.query({
query: getProjects,
variables: {
groupFullPath: this.groupNamespace,
search: this.searchTerm,
...this.queryParams,
},
})
.then((response) => {
const {
data: {
group: {
projects: { nodes },
},
},
} = response;
this.loading = false;
this.projects = nodes;
});
},
isProjectSelected(id) {
return this.selectedProjects ? this.selectedProjectIds.includes(id) : false;
},
getEntityId(project) {
return getIdFromGraphQLId(project.id);
},
},
};
</script>
<template>
<gl-dropdown
ref="projectsDropdown"
class="dropdown dropdown-projects"
toggle-class="gl-shadow-none"
@hide="onHide"
>
<template #button-content>
<div class="gl-display-flex gl-flex-grow-1">
<gl-avatar
v-if="isOnlyOneProjectSelected"
:src="selectedProjects[0].avatarUrl"
:entity-id="getEntityId(selectedProjects[0])"
:entity-name="selectedProjects[0].name"
:size="16"
shape="rect"
:alt="selectedProjects[0].name"
class="gl-display-inline-flex gl-vertical-align-middle gl-mr-2"
/>
{{ selectedProjectsLabel }}
</div>
<gl-icon class="gl-ml-2" name="chevron-down" />
</template>
<template #header>
<gl-dropdown-section-header>{{ __('Projects') }}</gl-dropdown-section-header>
<gl-search-box-by-type v-model.trim="searchTerm" />
</template>
<gl-dropdown-item
v-for="project in availableProjects"
:key="project.id"
:is-check-item="true"
:is-checked="isProjectSelected(project.id)"
@click.native.capture.stop="
onSelected({ project, isSelected: isProjectSelected(project.id) })
"
>
<div class="gl-display-flex">
<gl-avatar
class="gl-mr-2 vertical-align-middle"
:alt="project.name"
:size="16"
:entity-id="getEntityId(project)"
:entity-name="project.name"
:src="project.avatarUrl"
shape="rect"
/>
<div>
<div data-testid="project-name">{{ project.name }}</div>
<div class="gl-text-gray-500" data-testid="project-full-path">
{{ project.fullPath }}
</div>
</div>
</div>
</gl-dropdown-item>
<gl-dropdown-item v-show="noResultsAvailable" class="gl-pointer-events-none text-secondary">{{
__('No matching results')
}}</gl-dropdown-item>
<gl-dropdown-item v-if="loading">
<gl-loading-icon size="lg" />
</gl-dropdown-item>
</gl-dropdown>
</template>

View file

@ -0,0 +1,12 @@
import { masks } from 'dateformat';
export const DATE_RANGE_LIMIT = 180;
export const OFFSET_DATE_BY_ONE = 1;
export const PROJECTS_PER_PAGE = 50;
const { isoDate, mediumDate } = masks;
export const dateFormats = {
isoDate,
defaultDate: mediumDate,
defaultDateTime: 'mmm d, yyyy h:MMtt',
};

View file

@ -0,0 +1,22 @@
query getGroupProjects(
$groupFullPath: ID!
$search: String!
$first: Int!
$includeSubgroups: Boolean = false
) {
group(fullPath: $groupFullPath) {
projects(
search: $search
first: $first
includeSubgroups: $includeSubgroups
sort: SIMILARITY
) {
nodes {
id
name
avatarUrl
fullPath
}
}
}
}

View file

@ -0,0 +1,4 @@
export const filterBySearchTerm = (data = [], searchTerm = '', filterByKey = 'name') => {
if (!searchTerm?.length) return data;
return data.filter((item) => item[filterByKey].toLowerCase().includes(searchTerm.toLowerCase()));
};

View file

@ -1,5 +1,6 @@
<script>
import MetricCard from '~/analytics/shared/components/metric_card.vue';
import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
import { GlSingleStat } from '@gitlab/ui/dist/charts';
import createFlash from '~/flash';
import { number } from '~/lib/utils/unit_format';
import { s__ } from '~/locale';
@ -10,7 +11,8 @@ const defaultPrecision = 0;
export default {
name: 'UsageCounts',
components: {
MetricCard,
GlSkeletonLoading,
GlSingleStat,
},
data() {
return {
@ -56,10 +58,24 @@ export default {
</script>
<template>
<metric-card
:title="__('Usage Trends')"
:metrics="counts"
:is-loading="$apollo.queries.counts.loading"
class="gl-mt-4"
/>
<div>
<h2>
{{ __('Usage Trends') }}
</h2>
<div
class="gl-display-flex gl-flex-direction-column gl-md-flex-direction-row gl-my-6 gl-align-items-flex-start"
>
<gl-skeleton-loading v-if="$apollo.queries.counts.loading" />
<template v-else>
<gl-single-stat
v-for="count in counts"
:key="count.key"
class="gl-pr-9 gl-my-4 gl-md-mt-0 gl-md-mb-0"
:value="`${count.value}`"
:title="count.label"
:should-animate="true"
/>
</template>
</div>
</div>
</template>

View file

@ -3,7 +3,7 @@ import { __ } from '~/locale';
import axios from './lib/utils/axios_utils';
import { joinPaths } from './lib/utils/url_utility';
const DEFAULT_PER_PAGE = 20;
export const DEFAULT_PER_PAGE = 20;
/**
* Slow deprecation Notice: Please rather use for new calls
@ -83,8 +83,8 @@ const Api = {
tagsPath: '/api/:version/projects/:id/repository/tags',
freezePeriodsPath: '/api/:version/projects/:id/freeze_periods',
freezePeriodPath: '/api/:version/projects/:id/freeze_periods/:freeze_period_id',
usageDataIncrementCounterPath: '/api/:version/usage_data/increment_counter',
usageDataIncrementUniqueUsersPath: '/api/:version/usage_data/increment_unique_users',
serviceDataIncrementCounterPath: '/api/:version/usage_data/increment_counter',
serviceDataIncrementUniqueUsersPath: '/api/:version/usage_data/increment_unique_users',
featureFlagUserLists: '/api/:version/projects/:id/feature_flags_user_lists',
featureFlagUserList: '/api/:version/projects/:id/feature_flags_user_lists/:list_iid',
containerRegistryDetailsPath: '/api/:version/registry/repositories/:id/',
@ -875,7 +875,7 @@ const Api = {
return null;
}
const url = Api.buildUrl(this.usageDataIncrementCounterPath);
const url = Api.buildUrl(this.serviceDataIncrementCounterPath);
const headers = {
'Content-Type': 'application/json',
};
@ -888,7 +888,7 @@ const Api = {
return null;
}
const url = Api.buildUrl(this.usageDataIncrementUniqueUsersPath);
const url = Api.buildUrl(this.serviceDataIncrementUniqueUsersPath);
const headers = {
'Content-Type': 'application/json',
};

View file

@ -1,6 +1,8 @@
import axios from '~/lib/utils/axios_utils';
import { buildApiUrl } from './api_utils';
const GROUP_VSA_PATH_BASE =
'/groups/:id/-/analytics/value_stream_analytics/value_streams/:value_stream_id/stages/:stage_id';
const PROJECT_VSA_PATH_BASE = '/:project_path/-/analytics/value_stream_analytics/value_streams';
const PROJECT_VSA_STAGES_PATH = `${PROJECT_VSA_PATH_BASE}/:value_stream_id/stages`;
@ -13,6 +15,12 @@ const buildProjectValueStreamPath = (projectPath, valueStreamId = null) => {
return buildApiUrl(PROJECT_VSA_PATH_BASE).replace(':project_path', projectPath);
};
const buildGroupValueStreamPath = ({ groupId, valueStreamId = null, stageId = null }) =>
buildApiUrl(GROUP_VSA_PATH_BASE)
.replace(':id', groupId)
.replace(':value_stream_id', valueStreamId)
.replace(':stage_id', stageId);
export const getProjectValueStreams = (projectPath) => {
const url = buildProjectValueStreamPath(projectPath);
return axios.get(url);
@ -30,3 +38,14 @@ export const getProjectValueStreamStageData = ({ requestPath, stageId, params })
export const getProjectValueStreamMetrics = (requestPath, params) =>
axios.get(requestPath, { params });
/**
* Shared group VSA paths
* We share some endpoints across and group and project level VSA
* When used for project level VSA, requests should include the `project_id` in the params object
*/
export const getValueStreamStageMedian = ({ groupId, valueStreamId, stageId }, params = {}) => {
const stageBase = buildGroupValueStreamPath({ groupId, valueStreamId, stageId });
return axios.get(`${stageBase}/median`, { params });
};

View file

@ -1 +0,0 @@
export const DEFAULT_PER_PAGE = 20;

View file

@ -1,6 +1,6 @@
import { DEFAULT_PER_PAGE } from '~/api';
import axios from '../lib/utils/axios_utils';
import { buildApiUrl } from './api_utils';
import { DEFAULT_PER_PAGE } from './constants';
const GROUPS_PATH = '/api/:version/groups.json';
const DESCENDANT_GROUPS_PATH = '/api/:version/groups/:id/descendant_groups';

View file

@ -1,6 +1,6 @@
import { DEFAULT_PER_PAGE } from '~/api';
import axios from '../lib/utils/axios_utils';
import { buildApiUrl } from './api_utils';
import { DEFAULT_PER_PAGE } from './constants';
const PROJECTS_PATH = '/api/:version/projects.json';

View file

@ -1,8 +1,8 @@
import { deprecatedCreateFlash as flash } from '~/flash';
import { DEFAULT_PER_PAGE } from '~/api';
import createFlash from '~/flash';
import { __ } from '~/locale';
import axios from '../lib/utils/axios_utils';
import { buildApiUrl } from './api_utils';
import { DEFAULT_PER_PAGE } from './constants';
const USER_COUNTS_PATH = '/api/:version/user_counts';
const USERS_PATH = '/api/:version/users.json';
@ -52,7 +52,11 @@ export function getUserProjects(userId, query, options, callback) {
params: { ...defaults, ...options },
})
.then(({ data }) => callback(data))
.catch(() => flash(__('Something went wrong while fetching projects')));
.catch(() =>
createFlash({
message: __('Something went wrong while fetching projects'),
}),
);
}
export function updateUserStatus({ emoji, message, availability, clearStatusAfter }) {

View file

@ -0,0 +1,98 @@
<script>
import { GlFormInput, GlFormGroup, GlButton, GlForm } from '@gitlab/ui';
import csrf from '~/lib/utils/csrf';
import { __ } from '~/locale';
export const i18n = {
currentPassword: __('Current password'),
confirmWebAuthn: __(
'Are you sure? This will invalidate your registered applications and U2F / WebAuthn devices.',
),
confirm: __('Are you sure? This will invalidate your registered applications and U2F devices.'),
disableTwoFactor: __('Disable two-factor authentication'),
regenerateRecoveryCodes: __('Regenerate recovery codes'),
};
export default {
name: 'ManageTwoFactorForm',
i18n,
components: {
GlForm,
GlFormInput,
GlFormGroup,
GlButton,
},
inject: [
'webauthnEnabled',
'profileTwoFactorAuthPath',
'profileTwoFactorAuthMethod',
'codesProfileTwoFactorAuthPath',
'codesProfileTwoFactorAuthMethod',
],
data() {
return {
method: '',
action: '#',
};
},
computed: {
confirmText() {
if (this.webauthnEnabled) {
return i18n.confirmWebAuthn;
}
return i18n.confirm;
},
},
methods: {
handleFormSubmit(event) {
this.method = event.submitter.dataset.formMethod;
this.action = event.submitter.dataset.formAction;
},
},
csrf,
};
</script>
<template>
<gl-form
class="gl-display-inline-block"
method="post"
:action="action"
@submit="handleFormSubmit($event)"
>
<input type="hidden" name="_method" data-testid="test-2fa-method-field" :value="method" />
<input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
<gl-form-group :label="$options.i18n.currentPassword" label-for="current-password">
<gl-form-input
id="current-password"
type="password"
name="current_password"
required
data-qa-selector="current_password_field"
/>
</gl-form-group>
<gl-button
type="submit"
class="btn-danger gl-mr-3 gl-display-inline-block"
data-testid="test-2fa-disable-button"
variant="danger"
:data-confirm="confirmText"
:data-form-action="profileTwoFactorAuthPath"
:data-form-method="profileTwoFactorAuthMethod"
>
{{ $options.i18n.disableTwoFactor }}
</gl-button>
<gl-button
type="submit"
class="gl-display-inline-block"
data-testid="test-2fa-regenerate-codes-button"
:data-form-action="codesProfileTwoFactorAuthPath"
:data-form-method="codesProfileTwoFactorAuthMethod"
>
{{ $options.i18n.regenerateRecoveryCodes }}
</gl-button>
</gl-form>
</template>

View file

@ -1,8 +1,39 @@
import Vue from 'vue';
import { updateHistory, removeParams } from '~/lib/utils/url_utility';
import ManageTwoFactorForm from './components/manage_two_factor_form.vue';
import RecoveryCodes from './components/recovery_codes.vue';
import { SUCCESS_QUERY_PARAM } from './constants';
export const initManageTwoFactorForm = () => {
const el = document.querySelector('.js-manage-two-factor-form');
if (!el) {
return false;
}
const {
webauthnEnabled = false,
profileTwoFactorAuthPath = '',
profileTwoFactorAuthMethod = '',
codesProfileTwoFactorAuthPath = '',
codesProfileTwoFactorAuthMethod = '',
} = el.dataset;
return new Vue({
el,
provide: {
webauthnEnabled,
profileTwoFactorAuthPath,
profileTwoFactorAuthMethod,
codesProfileTwoFactorAuthPath,
codesProfileTwoFactorAuthMethod,
},
render(createElement) {
return createElement(ManageTwoFactorForm);
},
});
};
export const initRecoveryCodes = () => {
const el = document.querySelector('.js-2fa-recovery-codes');

View file

@ -7,7 +7,7 @@ import { uniq } from 'lodash';
import * as Emoji from '~/emoji';
import { scrollToElement } from '~/lib/utils/common_utils';
import { dispose, fixTitle } from '~/tooltips';
import { deprecatedCreateFlash as flash } from './flash';
import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { isInVueNoteablePage } from './lib/utils/dom_utils';
import { __ } from './locale';
@ -488,7 +488,11 @@ export class AwardsHandler {
callback();
}
})
.catch(() => flash(__('Something went wrong on our end.')));
.catch(() =>
createFlash({
message: __('Something went wrong on our end.'),
}),
);
}
findEmojiIcon(votesBlock, emoji) {

View file

@ -84,7 +84,7 @@ export default {
/>
</a>
<gl-loading-icon v-show="isLoading" :inline="true" />
<gl-loading-icon v-show="isLoading" size="sm" :inline="true" />
<div v-show="hasError" class="btn-group">
<div class="btn btn-default btn-sm disabled">

View file

@ -221,7 +221,7 @@ export default {
:link-url="renderedLinkUrl"
/>
<p v-show="isRendering">
<gl-loading-icon :inline="true" />
<gl-loading-icon size="sm" :inline="true" />
</p>
<p v-show="!renderedBadge && !isRendering" class="disabled-content">
{{ s__('Badges|No image to preview') }}

View file

@ -73,7 +73,7 @@ export default {
data-testid="delete-badge"
@click="updateBadgeInModal(badge)"
/>
<gl-loading-icon v-show="badge.isDeleting" :inline="true" />
<gl-loading-icon v-show="badge.isDeleting" size="sm" :inline="true" />
</div>
</div>
</div>

View file

@ -94,9 +94,11 @@ export default {
@handleUpdateNote="update"
@toggleResolveStatus="toggleResolveDiscussion(draft.id)"
>
<strong slot="note-header-info" class="badge draft-pending-label gl-mr-2">
{{ __('Pending') }}
</strong>
<template #note-header-info>
<strong class="badge draft-pending-label gl-mr-2">
{{ __('Pending') }}
</strong>
</template>
</noteable-note>
</ul>

View file

@ -26,7 +26,7 @@ export default {
</script>
<template>
<div v-show="draftsCount > 0">
<nav class="review-bar-component">
<nav class="review-bar-component" data-testid="review_bar_component">
<div
class="review-bar-content d-flex gl-justify-content-end"
data-qa-selector="review_bar_content"

View file

@ -1,5 +1,5 @@
import { isEmpty } from 'lodash';
import { deprecatedCreateFlash as flash } from '~/flash';
import createFlash from '~/flash';
import { scrollToElement } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
import { CHANGES_TAB, DISCUSSION_TAB, SHOW_TAB } from '../../../constants';
@ -18,7 +18,9 @@ export const addDraftToDiscussion = ({ commit }, { endpoint, data }) =>
return res;
})
.catch(() => {
flash(__('An error occurred adding a draft to the thread.'));
createFlash({
message: __('An error occurred adding a draft to the thread.'),
});
});
export const createNewDraft = ({ commit }, { endpoint, data }) =>
@ -30,7 +32,9 @@ export const createNewDraft = ({ commit }, { endpoint, data }) =>
return res;
})
.catch(() => {
flash(__('An error occurred adding a new draft.'));
createFlash({
message: __('An error occurred adding a new draft.'),
});
});
export const deleteDraft = ({ commit, getters }, draft) =>
@ -39,7 +43,11 @@ export const deleteDraft = ({ commit, getters }, draft) =>
.then(() => {
commit(types.DELETE_DRAFT, draft.id);
})
.catch(() => flash(__('An error occurred while deleting the comment')));
.catch(() =>
createFlash({
message: __('An error occurred while deleting the comment'),
}),
);
export const fetchDrafts = ({ commit, getters, state, dispatch }) =>
service
@ -53,7 +61,11 @@ export const fetchDrafts = ({ commit, getters, state, dispatch }) =>
}
});
})
.catch(() => flash(__('An error occurred while fetching pending comments')));
.catch(() =>
createFlash({
message: __('An error occurred while fetching pending comments'),
}),
);
export const publishSingleDraft = ({ commit, dispatch, getters }, draftId) => {
commit(types.REQUEST_PUBLISH_DRAFT, draftId);
@ -111,7 +123,11 @@ export const updateDraft = (
.then((res) => res.data)
.then((data) => commit(types.RECEIVE_DRAFT_UPDATE_SUCCESS, data))
.then(callback)
.catch(() => flash(__('An error occurred while updating the comment')));
.catch(() =>
createFlash({
message: __('An error occurred while updating the comment'),
}),
);
};
export const scrollToDraft = ({ dispatch, rootGetters }, draft) => {

View file

@ -1,6 +1,6 @@
import $ from 'jquery';
import { once, countBy } from 'lodash';
import { deprecatedCreateFlash as flash } from '~/flash';
import createFlash from '~/flash';
import { darkModeEnabled } from '~/lib/utils/color_utils';
import { __, sprintf } from '~/locale';
@ -79,7 +79,9 @@ function importMermaidModule() {
mermaidModule = initMermaid(mermaid);
})
.catch((err) => {
flash(sprintf(__("Can't load mermaid module: %{err}"), { err }));
createFlash({
message: sprintf(__("Can't load mermaid module: %{err}"), { err }),
});
// eslint-disable-next-line no-console
console.error(err);
});
@ -206,7 +208,9 @@ function renderMermaids($els) {
});
})
.catch((err) => {
flash(sprintf(__('Encountered an error while rendering: %{err}'), { err }));
createFlash({
message: sprintf(__('Encountered an error while rendering: %{err}'), { err }),
});
// eslint-disable-next-line no-console
console.error(err);
});

View file

@ -1,7 +1,7 @@
/* eslint-disable func-names */
import $ from 'jquery';
import { deprecatedCreateFlash as flash } from '~/flash';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
@ -79,7 +79,11 @@ MarkdownPreview.prototype.fetchMarkdownPreview = function (text, url, success) {
};
success(data);
})
.catch(() => flash(__('An error occurred while fetching markdown preview')));
.catch(() =>
createFlash({
message: __('An error occurred while fetching markdown preview'),
}),
);
};
MarkdownPreview.prototype.hideReferencedUsers = function ($form) {

View file

@ -1,9 +1,11 @@
import createFlash from '~/flash';
import { __ } from '~/locale';
import { deprecatedCreateFlash as Flash } from '../flash';
import BalsamiqViewer from './balsamiq/balsamiq_viewer';
function onError() {
const flash = new Flash(__('Balsamiq file could not be loaded.'));
const flash = createFlash({
message: __('Balsamiq file could not be loaded.'),
});
return flash;
}

View file

@ -27,6 +27,11 @@ export default {
default: false,
required: false,
},
richViewer: {
type: String,
default: '',
required: false,
},
loading: {
type: Boolean,
default: true,
@ -71,6 +76,7 @@ export default {
v-else
ref="contentViewer"
:content="content"
:rich-viewer="richViewer"
:is-raw-content="isRawContent"
:file-name="blob.name"
:type="activeViewer.fileType"

View file

@ -1,6 +1,6 @@
<script>
import { debounce } from 'lodash';
import { initEditorLite } from '~/blob/utils';
import { initSourceEditor } from '~/blob/utils';
import { SNIPPET_MEASURE_BLOBS_CONTENT } from '~/performance/constants';
import eventHub from './eventhub';
@ -36,7 +36,7 @@ export default {
},
},
mounted() {
this.editor = initEditorLite({
this.editor = initSourceEditor({
el: this.$refs.editor,
blobPath: this.fileName,
blobContent: this.value,

View file

@ -29,7 +29,7 @@ export default {
<slot name="filepath-prepend"></slot>
<template v-if="blob.path">
<file-icon :file-name="blob.path" :size="18" aria-hidden="true" css-classes="mr-2" />
<file-icon :file-name="blob.path" :size="16" aria-hidden="true" css-classes="mr-2" />
<strong
class="file-title-name mr-1 js-blob-header-filepath"
data-qa-selector="file_title_content"

View file

@ -0,0 +1,55 @@
<script>
import { GlAlert, GlLoadingIcon, GlTable } from '@gitlab/ui';
import Papa from 'papaparse';
export default {
components: {
GlTable,
GlAlert,
GlLoadingIcon,
},
props: {
csv: {
type: String,
required: true,
},
},
data() {
return {
items: [],
errorMessage: null,
loading: true,
};
},
mounted() {
const parsed = Papa.parse(this.csv, { skipEmptyLines: true });
this.items = parsed.data;
if (parsed.errors.length) {
this.errorMessage = parsed.errors.map((e) => e.message).join('. ');
}
this.loading = false;
},
};
</script>
<template>
<div class="container-fluid md gl-mt-3 gl-mb-3">
<div v-if="loading" class="gl-text-center loading">
<gl-loading-icon class="gl-mt-5" size="lg" />
</div>
<div v-else>
<gl-alert v-if="errorMessage" variant="danger" :dismissible="false">
{{ errorMessage }}
</gl-alert>
<gl-table
:empty-text="__('No CSV data to display.')"
:items="items"
:fields="$options.fields"
show-empty
thead-class="gl-display-none"
/>
</div>
</div>
</template>

View file

@ -0,0 +1,17 @@
import Vue from 'vue';
import CsvViewer from './csv_viewer.vue';
export default () => {
const el = document.getElementById('js-csv-viewer');
return new Vue({
el,
render(createElement) {
return createElement(CsvViewer, {
props: {
csv: el.dataset.data,
},
});
},
});
};

View file

@ -0,0 +1,3 @@
import renderCSV from './csv';
export default renderCSV;

View file

@ -2,11 +2,10 @@ import $ from 'jquery';
import Api from '~/api';
import initPopover from '~/blob/suggest_gitlab_ci_yml';
import createFlash from '~/flash';
import { __ } from '~/locale';
import toast from '~/vue_shared/plugins/global_toast';
import { deprecatedCreateFlash as Flash } from '../flash';
import BlobCiYamlSelector from './template_selectors/ci_yaml_selector';
import DockerfileSelector from './template_selectors/dockerfile_selector';
import GitignoreSelector from './template_selectors/gitignore_selector';
@ -146,7 +145,7 @@ export default class FileTemplateMediator {
text: __('Undo'),
onClick: (e, toastObj) => {
self.restoreFromCache();
toastObj.goAway(0);
toastObj.hide();
},
},
});
@ -155,7 +154,11 @@ export default class FileTemplateMediator {
initPopover(suggestCommitChanges);
}
})
.catch((err) => new Flash(`An error occurred while fetching the template: ${err}`));
.catch((err) =>
createFlash({
message: __(`An error occurred while fetching the template: ${err}`),
}),
);
}
displayMatchedTemplateSelector() {

View file

@ -1,5 +1,5 @@
import { SwaggerUIBundle } from 'swagger-ui-dist';
import { deprecatedCreateFlash as flash } from '~/flash';
import createFlash from '~/flash';
import { __ } from '~/locale';
export default () => {
@ -13,7 +13,9 @@ export default () => {
});
})
.catch((error) => {
flash(__('Something went wrong while initializing the OpenAPI viewer'));
createFlash({
message: __('Something went wrong while initializing the OpenAPI viewer'),
});
throw error;
});
};

View file

@ -1,6 +1,6 @@
import Editor from '~/editor/editor_lite';
import Editor from '~/editor/source_editor';
export function initEditorLite({ el, ...args }) {
export function initSourceEditor({ el, ...args }) {
const editor = new Editor({
scrollbar: {
alwaysConsumeMouseWheel: false,

View file

@ -1,14 +1,16 @@
import $ from 'jquery';
import '~/behaviors/markdown/render_gfm';
import createFlash from '~/flash';
import { __ } from '~/locale';
import {
REPO_BLOB_LOAD_VIEWER_START,
REPO_BLOB_LOAD_VIEWER_FINISH,
REPO_BLOB_LOAD_VIEWER,
REPO_BLOB_SWITCH_TO_VIEWER_START,
REPO_BLOB_SWITCH_VIEWER,
} from '~/performance/constants';
import { performanceMarkAndMeasure } from '~/performance/utils';
import { fixTitle } from '~/tooltips';
import { deprecatedCreateFlash as Flash } from '../../flash';
import axios from '../../lib/utils/axios_utils';
import { handleLocationHash } from '../../lib/utils/common_utils';
import eventHub from '../../notes/event_hub';
@ -21,6 +23,8 @@ const loadRichBlobViewer = (type) => {
return import(/* webpackChunkName: 'notebook_viewer' */ '../notebook_viewer');
case 'openapi':
return import(/* webpackChunkName: 'openapi_viewer' */ '../openapi_viewer');
case 'csv':
return import(/* webpackChunkName: 'csv_viewer' */ '../csv_viewer');
case 'pdf':
return import(/* webpackChunkName: 'pdf_viewer' */ '../pdf_viewer');
case 'sketch':
@ -38,13 +42,18 @@ export const handleBlobRichViewer = (viewer, type) => {
loadRichBlobViewer(type)
.then((module) => module?.default(viewer))
.catch((error) => {
Flash(__('Error loading file viewer.'));
createFlash({
message: __('Error loading file viewer.'),
});
throw error;
});
};
export default class BlobViewer {
constructor() {
performanceMarkAndMeasure({
mark: REPO_BLOB_LOAD_VIEWER_START,
});
const viewer = document.querySelector('.blob-viewer[data-type="rich"]');
const type = viewer?.dataset?.richType;
BlobViewer.initAuxiliaryViewer();
@ -137,7 +146,7 @@ export default class BlobViewer {
switchToViewer(name) {
performanceMarkAndMeasure({
mark: REPO_BLOB_LOAD_VIEWER_START,
mark: REPO_BLOB_SWITCH_TO_VIEWER_START,
});
const newViewer = this.$fileHolder[0].querySelector(`.blob-viewer[data-type='${name}']`);
if (this.activeViewer === newViewer) return;
@ -167,11 +176,15 @@ export default class BlobViewer {
BlobViewer.loadViewer(newViewer)
.then((viewer) => {
$(viewer).renderGFM();
window.requestIdleCallback(() => {
this.$fileHolder.trigger('highlight:line');
handleLocationHash();
this.$fileHolder.trigger('highlight:line');
handleLocationHash();
viewer.setAttribute('data-loaded', 'true');
this.toggleCopyButtonState();
eventHub.$emit('showBlobInteractionZones', viewer.dataset.path);
});
this.toggleCopyButtonState();
performanceMarkAndMeasure({
mark: REPO_BLOB_LOAD_VIEWER_FINISH,
measures: [
@ -179,10 +192,18 @@ export default class BlobViewer {
name: REPO_BLOB_LOAD_VIEWER,
start: REPO_BLOB_LOAD_VIEWER_START,
},
{
name: REPO_BLOB_SWITCH_VIEWER,
start: REPO_BLOB_SWITCH_TO_VIEWER_START,
},
],
});
})
.catch(() => new Flash(__('Error loading viewer')));
.catch(() =>
createFlash({
message: __('Error loading viewer'),
}),
);
}
static loadViewer(viewerParam) {
@ -197,9 +218,10 @@ export default class BlobViewer {
return axios.get(url).then(({ data }) => {
viewer.innerHTML = data.html;
viewer.setAttribute('data-loaded', 'true');
eventHub.$emit('showBlobInteractionZones', viewer.dataset.path);
window.requestIdleCallback(() => {
viewer.removeAttribute('data-loading');
});
return viewer;
});

View file

@ -1,6 +1,6 @@
import $ from 'jquery';
import EditorLite from '~/editor/editor_lite';
import { FileTemplateExtension } from '~/editor/extensions/editor_file_template_ext';
import { FileTemplateExtension } from '~/editor/extensions/source_editor_file_template_ext';
import SourceEditor from '~/editor/source_editor';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { addEditorMarkdownListeners } from '~/lib/utils/text_markdown';
@ -16,7 +16,7 @@ export default class EditBlob {
this.configureMonacoEditor();
if (this.options.isMarkdown) {
import('~/editor/extensions/editor_markdown_ext')
import('~/editor/extensions/source_editor_markdown_ext')
.then(({ EditorMarkdownExtension: MarkdownExtension } = {}) => {
this.editor.use(new MarkdownExtension());
addEditorMarkdownListeners(this.editor);
@ -40,7 +40,7 @@ export default class EditBlob {
const fileContentEl = document.getElementById('file-content');
const form = document.querySelector('.js-edit-blob-form');
const rootEditor = new EditorLite();
const rootEditor = new SourceEditor();
this.editor = rootEditor.createInstance({
el: editorEl,

View file

@ -54,6 +54,7 @@ export function formatListIssues(listIssues) {
const listIssue = {
...i,
id,
fullId: i.id,
labels: i.labels?.nodes || [],
assignees: i.assignees?.nodes || [],
};
@ -106,8 +107,8 @@ export function formatIssueInput(issueInput, boardConfig) {
const { labels, assigneeId, milestoneId } = boardConfig;
return {
milestoneId: milestoneId ? fullMilestoneId(milestoneId) : null,
...issueInput,
milestoneId: milestoneId ? fullMilestoneId(milestoneId) : null,
labelIds: [...labelIds, ...(labels?.map((l) => fullLabelId(l)) || [])],
assigneeIds: [...assigneeIds, ...(assigneeId ? [fullUserId(assigneeId)] : [])],
};

View file

@ -1,7 +1,7 @@
<script>
import { GlIcon, GlLink, GlPopover, GlLoadingIcon } from '@gitlab/ui';
import { blockingIssuablesQueries, issuableTypes } from '~/boards/constants';
import { IssueType } from '~/graphql_shared/constants';
import { TYPE_ISSUE } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { truncate } from '~/lib/utils/text_utility';
import { __, n__, s__, sprintf } from '~/locale';
@ -13,7 +13,7 @@ export default {
},
},
graphQLIdType: {
[issuableTypes.issue]: IssueType,
[issuableTypes.issue]: TYPE_ISSUE,
},
referenceFormatter: {
[issuableTypes.issue]: (r) => r.split('/')[1],
@ -163,7 +163,7 @@ export default {
><span data-testid="popover-title">{{ blockedLabel }}</span></template
>
<template v-if="loading">
<gl-loading-icon />
<gl-loading-icon size="sm" />
<p class="gl-mt-4 gl-mb-0 gl-font-small">{{ loadingMessage }}</p>
</template>
<template v-else>

View file

@ -1,5 +1,12 @@
<script>
import { GlLabel, GlTooltipDirective, GlIcon, GlLoadingIcon } from '@gitlab/ui';
import {
GlLabel,
GlTooltip,
GlTooltipDirective,
GlIcon,
GlLoadingIcon,
GlSprintf,
} from '@gitlab/ui';
import { sortBy } from 'lodash';
import { mapActions, mapGetters, mapState } from 'vuex';
import boardCardInner from 'ee_else_ce/boards/mixins/board_card_inner';
@ -16,6 +23,7 @@ import IssueTimeEstimate from './issue_time_estimate.vue';
export default {
components: {
GlTooltip,
GlLabel,
GlLoadingIcon,
GlIcon,
@ -25,6 +33,7 @@ export default {
IssueTimeEstimate,
IssueCardWeight: () => import('ee_component/boards/components/issue_card_weight.vue'),
BoardBlockedIcon,
GlSprintf,
},
directives: {
GlTooltip: GlTooltipDirective,
@ -55,7 +64,7 @@ export default {
};
},
computed: {
...mapState(['isShowingLabels', 'issuableType']),
...mapState(['isShowingLabels', 'issuableType', 'allowSubEpics']),
...mapGetters(['isEpicBoard']),
cappedAssignees() {
// e.g. maxRender is 4,
@ -99,6 +108,12 @@ export default {
}
return false;
},
shouldRenderEpicCountables() {
return this.isEpicBoard && this.item.hasIssues;
},
shouldRenderEpicProgress() {
return this.totalWeight > 0;
},
showLabelFooter() {
return this.isShowingLabels && this.item.labels.find(this.showLabel);
},
@ -115,6 +130,20 @@ export default {
}
return __('Blocked issue');
},
totalEpicsCount() {
return this.item.descendantCounts.openedEpics + this.item.descendantCounts.closedEpics;
},
totalIssuesCount() {
return this.item.descendantCounts.openedIssues + this.item.descendantCounts.closedIssues;
},
totalWeight() {
return (
this.item.descendantWeightSum.openedIssues + this.item.descendantWeightSum.closedIssues
);
},
totalProgress() {
return Math.round((this.item.descendantWeightSum.closedIssues / this.totalWeight) * 100);
},
},
methods: {
...mapActions(['performSearch', 'setError']),
@ -227,17 +256,93 @@ export default {
{{ itemId }}
</span>
<span class="board-info-items gl-mt-3 gl-display-inline-block">
<issue-due-date
v-if="item.dueDate"
:date="item.dueDate"
:closed="item.closed || Boolean(item.closedAt)"
/>
<issue-time-estimate v-if="item.timeEstimate" :estimate="item.timeEstimate" />
<issue-card-weight
v-if="validIssueWeight(item)"
:weight="item.weight"
@click="filterByWeight(item.weight)"
/>
<span v-if="shouldRenderEpicCountables" data-testid="epic-countables">
<gl-tooltip :target="() => $refs.countBadge" data-testid="epic-countables-tooltip">
<p v-if="allowSubEpics" class="gl-font-weight-bold gl-m-0">
{{ __('Epics') }} &#8226;
<span class="gl-font-weight-normal">
<gl-sprintf :message="__('%{openedEpics} open, %{closedEpics} closed')">
<template #openedEpics>{{ item.descendantCounts.openedEpics }}</template>
<template #closedEpics>{{ item.descendantCounts.closedEpics }}</template>
</gl-sprintf>
</span>
</p>
<p class="gl-font-weight-bold gl-m-0">
{{ __('Issues') }} &#8226;
<span class="gl-font-weight-normal">
<gl-sprintf :message="__('%{openedIssues} open, %{closedIssues} closed')">
<template #openedIssues>{{ item.descendantCounts.openedIssues }}</template>
<template #closedIssues>{{ item.descendantCounts.closedIssues }}</template>
</gl-sprintf>
</span>
</p>
<p class="gl-font-weight-bold gl-m-0">
{{ __('Total weight') }} &#8226;
<span class="gl-font-weight-normal" data-testid="epic-countables-total-weight">
{{ totalWeight }}
</span>
</p>
</gl-tooltip>
<gl-tooltip
v-if="shouldRenderEpicProgress"
:target="() => $refs.progressBadge"
data-testid="epic-progress-tooltip"
>
<p class="gl-font-weight-bold gl-m-0">
{{ __('Progress') }} &#8226;
<span class="gl-font-weight-normal" data-testid="epic-progress-tooltip-content">
<gl-sprintf
:message="__('%{completedWeight} of %{totalWeight} weight completed')"
>
<template #completedWeight>{{
item.descendantWeightSum.closedIssues
}}</template>
<template #totalWeight>{{ totalWeight }}</template>
</gl-sprintf>
</span>
</p>
</gl-tooltip>
<span ref="countBadge" class="issue-count-badge board-card-info gl-mr-0 gl-pr-0">
<span v-if="allowSubEpics" class="gl-mr-3">
<gl-icon name="epic" />
{{ totalEpicsCount }}
</span>
<span class="gl-mr-3" data-testid="epic-countables-counts-issues">
<gl-icon name="issues" />
{{ totalIssuesCount }}
</span>
<span class="gl-mr-3" data-testid="epic-countables-weight-issues">
<gl-icon name="weight" />
{{ totalWeight }}
</span>
</span>
<span
v-if="shouldRenderEpicProgress"
ref="progressBadge"
class="issue-count-badge board-card-info gl-pl-0"
>
<span class="gl-mr-3" data-testid="epic-progress">
<gl-icon name="progress" />
{{ totalProgress }}%
</span>
</span>
</span>
<span v-if="!isEpicBoard">
<issue-due-date
v-if="item.dueDate"
:date="item.dueDate"
:closed="item.closed || Boolean(item.closedAt)"
/>
<issue-time-estimate v-if="item.timeEstimate" :estimate="item.timeEstimate" />
<issue-card-weight
v-if="validIssueWeight(item)"
:weight="item.weight"
@click="filterByWeight(item.weight)"
/>
</span>
</span>
</div>
<div class="board-card-assignee gl-display-flex">

View file

@ -41,7 +41,7 @@ export default {
watch: {
filterParams: {
handler() {
if (this.list.id) {
if (this.list.id && !this.list.collapsed) {
this.fetchItemsForList({ listId: this.list.id });
}
},

Some files were not shown because too many files have changed in this diff Show more