New upstream version 13.12.3+ds1

This commit is contained in:
Pirate Praveen 2021-06-08 01:23:25 +05:30
parent 1d7c7e5095
commit d8d5ad1a24
6762 changed files with 291997 additions and 101906 deletions

1
.gitignore vendored
View file

@ -105,3 +105,4 @@ ee/changelogs/unreleased-ee
tags.lock tags.lock
tags.temp tags.temp
.stylelintcache .stylelintcache
.solargraph.yml

View file

@ -53,21 +53,36 @@ workflow:
variables: variables:
RAILS_ENV: "test" RAILS_ENV: "test"
NODE_ENV: "test" NODE_ENV: "test"
BUNDLE_WITHOUT: "production:development"
BUNDLE_INSTALL_FLAGS: "--jobs=$(nproc) --retry=3 --quiet"
# we override the max_old_space_size to prevent OOM errors # we override the max_old_space_size to prevent OOM errors
NODE_OPTIONS: --max_old_space_size=3584 NODE_OPTIONS: --max_old_space_size=3584
SIMPLECOV: "true"
GIT_DEPTH: "20" GIT_DEPTH: "20"
GIT_SUBMODULE_STRATEGY: "none" GIT_SUBMODULE_STRATEGY: "none"
GET_SOURCES_ATTEMPTS: "3" GET_SOURCES_ATTEMPTS: "3"
KNAPSACK_RSPEC_SUITE_REPORT_PATH: knapsack/report-master.json KNAPSACK_RSPEC_SUITE_REPORT_PATH: knapsack/report-master.json
FLAKY_RSPEC_SUITE_REPORT_PATH: rspec_flaky/report-suite.json FLAKY_RSPEC_SUITE_REPORT_PATH: rspec_flaky/report-suite.json
RSPEC_TESTS_MAPPING_PATH: crystalball/mapping.json RSPEC_TESTS_MAPPING_PATH: crystalball/mapping.json
RSPEC_PACKED_TESTS_MAPPING_PATH: crystalball/packed-mapping.json RSPEC_PACKED_TESTS_MAPPING_PATH: crystalball/packed-mapping.json
BUILD_ASSETS_IMAGE: "false"
ES_JAVA_OPTS: "-Xms256m -Xmx256m" ES_JAVA_OPTS: "-Xms256m -Xmx256m"
ELASTIC_URL: "http://elastic:changeme@elasticsearch:9200" ELASTIC_URL: "http://elastic:changeme@elasticsearch:9200"
DOCKER_VERSION: "20.10.1" DOCKER_VERSION: "20.10.1"
CACHE_CLASSES: "true" CACHE_CLASSES: "true"
CHECK_PRECOMPILED_ASSETS: "true"
FF_USE_FASTZIP: "true"
DOCS_REVIEW_APPS_DOMAIN: "178.62.207.141.nip.io"
DOCS_GITLAB_REPO_SUFFIX: "ee"
REVIEW_APPS_DOMAIN: "gitlab-review.app"
REVIEW_APPS_GCP_PROJECT: "gitlab-review-apps"
REVIEW_APPS_GCP_REGION: "us-central1"
BUILD_ASSETS_IMAGE: "true" # Set it to "false" to disable assets image building, used in `build-assets-image`
RSPEC_FAIL_FAST_ENABLED: "true" # Set it to "false" to disable RSpec fail-fast
SIMPLECOV: "true"
# Preparing custom clone path to reduce space used by all random forks # Preparing custom clone path to reduce space used by all random forks
# on GitLab.com's Shared Runners. Our main forks - especially the security # on GitLab.com's Shared Runners. Our main forks - especially the security
@ -91,30 +106,4 @@ variables:
GIT_CLONE_PATH: "/builds/gitlab-org-forks/${CI_PROJECT_NAME}" GIT_CLONE_PATH: "/builds/gitlab-org-forks/${CI_PROJECT_NAME}"
include: include:
- local: .gitlab/ci/build-images.gitlab-ci.yml - local: .gitlab/ci/*.gitlab-ci.yml
- local: .gitlab/ci/cache-repo.gitlab-ci.yml
- local: .gitlab/ci/cng.gitlab-ci.yml
- local: .gitlab/ci/docs.gitlab-ci.yml
- local: .gitlab/ci/frontend.gitlab-ci.yml
- local: .gitlab/ci/global.gitlab-ci.yml
- local: .gitlab/ci/memory.gitlab-ci.yml
- local: .gitlab/ci/pages.gitlab-ci.yml
- local: .gitlab/ci/qa.gitlab-ci.yml
- local: .gitlab/ci/reports.gitlab-ci.yml
- local: .gitlab/ci/rails.gitlab-ci.yml
- local: .gitlab/ci/vendored-gems.gitlab-ci.yml
- local: .gitlab/ci/review.gitlab-ci.yml
- local: .gitlab/ci/rules.gitlab-ci.yml
- local: .gitlab/ci/setup.gitlab-ci.yml
- local: .gitlab/ci/dev-fixtures.gitlab-ci.yml
- local: .gitlab/ci/test-metadata.gitlab-ci.yml
- local: .gitlab/ci/yaml.gitlab-ci.yml
- local: .gitlab/ci/releases.gitlab-ci.yml
- local: .gitlab/ci/notify.gitlab-ci.yml
- local: .gitlab/ci/dast.gitlab-ci.yml
- local: .gitlab/ci/workhorse.gitlab-ci.yml
- local: .gitlab/ci/graphql.gitlab-ci.yml
# switch the remote include to a local include until this is resolved:
# https://gitlab.com/gitlab-org/gitlab/-/issues/327299
# - remote: 'https://gitlab.com/gitlab-org/frontend/untamper-my-lockfile/-/raw/main/.gitlab-ci-template.yml'
- local: .gitlab/ci/untamper-my-lockfile.yml

View file

@ -17,42 +17,47 @@
/doc/administration/operations/ @axil @eread @marcia /doc/administration/operations/ @axil @eread @marcia
/doc/administration/packages/ @ngaskill /doc/administration/packages/ @ngaskill
/doc/administration/postgresql/ @marcia /doc/administration/postgresql/ @marcia
/doc/administration/raketasks/ @axil @eread @mjang1 /doc/administration/raketasks/ @axil @eread
/doc/administration/redis/ @axil /doc/administration/redis/ @axil
/doc/administration/reference_architectures/ @axil /doc/administration/reference_architectures/ @axil
/doc/administration/snippets/ @aqualls /doc/administration/snippets/ @aqualls
/doc/administration/troubleshooting @axil @marcia @mjang1 /doc/administration/troubleshooting @axil @marcia
/doc/api/group_activity_analytics.md @msedlakjakubowski
/doc/ci/ @marcel.amirault @sselhorn /doc/ci/ @marcel.amirault @sselhorn
/doc/ci/environments/ @axil /doc/ci/environments/ @axil
/doc/ci/services/ @sselhorn /doc/ci/services/ @sselhorn
/doc/ci/test_cases/ @msedlakjakubowski /doc/ci/test_cases/ @msedlakjakubowski
/doc/development/ @marcia @mjang1 /doc/development/ @marcia
/doc/development/documentation/ @cnorris /doc/development/documentation/ @cnorris
/doc/development/value_stream_analytics.md @msedlakjakubowski
/doc/gitlab-basics/ @marcia /doc/gitlab-basics/ @marcia
/doc/install/ @axil /doc/install/ @axil
/doc/integration/ @aqualls @mjang1 /doc/integration/ @aqualls
/doc/operations/ @ngaskill @axil /doc/operations/ @ngaskill @axil
/doc/push_rules/ @aqualls /doc/push_rules/ @aqualls
/doc/ssh/ @mjang1 /doc/ssh/ @eread
/doc/subscriptions/ @sselhorn /doc/subscriptions/ @sselhorn
/doc/topics/autodevops/ @ngaskill @marcia /doc/topics/autodevops/ @ngaskill @marcia
/doc/topics/git/ @aqualls /doc/topics/git/ @aqualls
/doc/update/ @axil @marcia /doc/update/ @axil @marcia
/doc/user/analytics/ @mjang1 @ngaskill /doc/user/analytics/ @msedlakjakubowski @ngaskill
/doc/user/application_security @rdickenson /doc/user/application_security @rdickenson
/doc/user/clusters/ @marcia /doc/user/clusters/ @marcia
/doc/user/compliance/ @mjang1 @rdickenson /doc/user/compliance/ @rdickenson
/doc/user/group/ @mjang1 @msedlakjakubowski /doc/user/group/ @msedlakjakubowski
/doc/user/group/bulk_editing/ @msedlakjakubowski /doc/user/group/bulk_editing/ @msedlakjakubowski
/doc/user/group/devops_adoption/ @msedlakjakubowski
/doc/user/group/epics/ @msedlakjakubowski /doc/user/group/epics/ @msedlakjakubowski
/doc/user/group/insights/ @msedlakjakubowski
/doc/user/group/iterations/ @msedlakjakubowski /doc/user/group/iterations/ @msedlakjakubowski
/doc/user/group/roadmap/ @msedlakjakubowski /doc/user/group/roadmap/ @msedlakjakubowski
/doc/user/group/value_stream_analytics/ @msedlakjakubowski
/doc/user/infrastructure/ @marcia /doc/user/infrastructure/ @marcia
/doc/user/packages/ @ngaskill /doc/user/packages/ @ngaskill
/doc/user/profile/ @mjang1 @msedlakjakubowski /doc/user/profile/ @msedlakjakubowski
/doc/user/project/ @aqualls @axil @eread @mjang1 @msedlakjakubowski @ngaskill /doc/user/project/ @aqualls @axil @eread @msedlakjakubowski @ngaskill
/doc/user/project/clusters/ @ngaskill /doc/user/project/clusters/ @ngaskill
/doc/user/project/import/ @mjang1 @msedlakjakubowski /doc/user/project/import/ @msedlakjakubowski
/doc/user/project/integrations/ @aqualls /doc/user/project/integrations/ @aqualls
/doc/user/project/integrations/prometheus_library/ @ngaskill /doc/user/project/integrations/prometheus_library/ @ngaskill
/doc/user/project/issues/ @msedlakjakubowski /doc/user/project/issues/ @msedlakjakubowski
@ -60,7 +65,7 @@
/doc/user/project/milestones/ @msedlakjakubowski /doc/user/project/milestones/ @msedlakjakubowski
/doc/user/project/pages/ @axil /doc/user/project/pages/ @axil
/doc/user/project/repository/ @aqualls /doc/user/project/repository/ @aqualls
/doc/user/project/settings/ @mjang1 @aqualls /doc/user/project/settings/ @aqualls
/doc/user/project/static_site_editor/index.md @aqualls /doc/user/project/static_site_editor/index.md @aqualls
/doc/user/project/web_ide/index.md @aqualls /doc/user/project/web_ide/index.md @aqualls
/doc/user/project/wiki/index.md @aqualls /doc/user/project/wiki/index.md @aqualls
@ -131,13 +136,13 @@
/doc/user/snippets.md @aqualls /doc/user/snippets.md @aqualls
[Docs Growth] [Docs Growth]
/doc/administration/instance_review.md @aqualls /doc/administration/instance_review.md @kpaizee
/doc/api/invitations.md @aqualls /doc/api/invitations.md @kpaizee
/doc/api/experiments.md @aqualls /doc/api/experiments.md @kpaizee
/doc/development/experiment_guide/ @aqualls /doc/development/experiment_guide/ @kpaizee
/doc/development/snowplow/ @aqualls /doc/development/snowplow/ @kpaizee
/doc/development/usage_ping/ @aqualls /doc/development/usage_ping/ @kpaizee
/doc/user/admin_area/license.md @aqualls /doc/user/admin_area/license.md @kpaizee
[Frontend] [Frontend]
*.scss @annabeldunstone @gitlab-org/maintainers/frontend *.scss @annabeldunstone @gitlab-org/maintainers/frontend
@ -223,33 +228,41 @@ Dangerfile @gl-quality/eng-prod
/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/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
[Container Security] [Container Security]
/ee/app/views/projects/threat_monitoring/** @gitlab-org/threat-management/defend/container-security/frontend /ee/app/views/projects/threat_monitoring/** @gitlab-org/protect/container-security-frontend
/ee/app/assets/javascripts/pages/projects/threat_monitoring/** @gitlab-org/threat-management/defend/container-security/frontend /ee/app/views/projects/security/policies/** @gitlab-org/protect/container-security-frontend
/ee/app/assets/javascripts/threat_monitoring/** @gitlab-org/threat-management/defend/container-security/frontend /ee/spec/views/projects/security/policies/** @gitlab-org/protect/container-security-frontend
/ee/spec/frontend/threat_monitoring/** @gitlab-org/threat-management/defend/container-security/frontend /ee/app/assets/javascripts/pages/projects/threat_monitoring/** @gitlab-org/protect/container-security-frontend
/ee/app/assets/javascripts/threat_monitoring/** @gitlab-org/protect/container-security-frontend
/ee/spec/frontend/threat_monitoring/** @gitlab-org/protect/container-security-frontend
/ee/app/controllers/projects/threat_monitoring_controller.rb @gitlab-org/threat-management/defend/container-security/backend /ee/app/controllers/projects/threat_monitoring_controller.rb @gitlab-org/protect/container-security-backend
/ee/spec/controllers/projects/threat_monitoring_controller_spec.rb @gitlab-org/threat-management/defend/container-security/backend /ee/spec/controllers/projects/threat_monitoring_controller_spec.rb @gitlab-org/protect/container-security-backend
/lib/gitlab/kubernetes/cilium_network_policy.rb @gitlab-org/threat-management/defend/container-security/backend /ee/app/controllers/projects/security/policies_controller.rb @gitlab-org/protect/container-security-backend
/spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb @gitlab-org/threat-management/defend/container-security/backend /ee/spec/requests/projects/security/policies_controller_spec.rb @gitlab-org/protect/container-security-backend
/lib/gitlab/kubernetes/network_policy_common.rb @gitlab-org/threat-management/defend/container-security/backend /ee/app/models/security/orchestration_policy_configuration.rb @gitlab-org/protect/container-security-backend
/spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb @gitlab-org/threat-management/defend/container-security/backend /ee/spec/models/security/orchestration_policy_configuration_spec.rb @gitlab-org/protect/container-security-backend
/lib/gitlab/kubernetes/network_policy.rb @gitlab-org/threat-management/defend/container-security/backend /lib/gitlab/kubernetes/cilium_network_policy.rb @gitlab-org/protect/container-security-backend
/spec/lib/gitlab/kubernetes/network_policy_spec.rb @gitlab-org/threat-management/defend/container-security/backend /spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb @gitlab-org/protect/container-security-backend
/ee/app/services/network_policies/** @gitlab-org/threat-management/defend/container-security/backend /lib/gitlab/kubernetes/network_policy_common.rb @gitlab-org/protect/container-security-backend
/ee/spec/services/network_policies/** @gitlab-org/threat-management/defend/container-security/backend /spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb @gitlab-org/protect/container-security-backend
/ee/app/controllers/projects/security/waf_anomalies_controller.rb @gitlab-org/threat-management/defend/container-security/backend /lib/gitlab/kubernetes/network_policy.rb @gitlab-org/protect/container-security-backend
/ee/spec/controllers/projects/security/waf_anomalies_controller_spec.rb @gitlab-org/threat-management/defend/container-security/backend /spec/lib/gitlab/kubernetes/network_policy_spec.rb @gitlab-org/protect/container-security-backend
/app/models/clusters/applications/cilium.rb @gitlab-org/threat-management/defend/container-security/backend /ee/app/services/network_policies/** @gitlab-org/protect/container-security-backend
/spec/models/clusters/applications/cilium_spec.rb @gitlab-org/threat-management/defend/container-security/backend /ee/spec/services/network_policies/** @gitlab-org/protect/container-security-backend
/ee/app/controllers/projects/security/network_policies_controller.rb @gitlab-org/threat-management/defend/container-security/backend /ee/app/controllers/projects/security/waf_anomalies_controller.rb @gitlab-org/protect/container-security-backend
/ee/spec/controllers/projects/security/network_policies_controller_spec.rb @gitlab-org/threat-management/defend/container-security/backend /ee/spec/controllers/projects/security/waf_anomalies_controller_spec.rb @gitlab-org/protect/container-security-backend
/ee/app/workers/network_policy_metrics_worker.rb @gitlab-org/threat-management/defend/container-security/backend /app/models/clusters/applications/cilium.rb @gitlab-org/protect/container-security-backend
/ee/spec/workers/network_policy_metrics_worker_spec.rb @gitlab-org/threat-management/defend/container-security/backend /spec/models/clusters/applications/cilium_spec.rb @gitlab-org/protect/container-security-backend
/ee/app/services/network_policies/** @gitlab-org/threat-management/defend/container-security/backend /ee/app/controllers/projects/security/network_policies_controller.rb @gitlab-org/protect/container-security-backend
/ee/spec/services/network_policies/** @gitlab-org/threat-management/defend/container-security/backend /ee/spec/controllers/projects/security/network_policies_controller_spec.rb @gitlab-org/protect/container-security-backend
/ee/lib/gitlab/usage_data_counters/network_policy_counter.rb @gitlab-org/threat-management/defend/container-security/backend /ee/app/workers/network_policy_metrics_worker.rb @gitlab-org/protect/container-security-backend
/ee/spec/lib/gitlab/usage_data_counters/network_policy_counter_spec.rb @gitlab-org/threat-management/defend/container-security/backend /ee/spec/workers/network_policy_metrics_worker_spec.rb @gitlab-org/protect/container-security-backend
/ee/app/services/network_policies/** @gitlab-org/protect/container-security-backend
/ee/spec/services/network_policies/** @gitlab-org/protect/container-security-backend
/ee/app/services/security/orchestration/** @gitlab-org/protect/container-security-backend
/ee/spec/services/security/orchestration/** @gitlab-org/protect/container-security-backend
/ee/lib/gitlab/usage_data_counters/network_policy_counter.rb @gitlab-org/protect/container-security-backend
/ee/spec/lib/gitlab/usage_data_counters/network_policy_counter_spec.rb @gitlab-org/protect/container-security-backend
[Code Owners] [Code Owners]
/ee/lib/gitlab/code_owners.rb @reprazent @kerrizor @garyh /ee/lib/gitlab/code_owners.rb @reprazent @kerrizor @garyh
@ -257,6 +270,39 @@ Dangerfile @gl-quality/eng-prod
/ee/spec/lib/gitlab/code_owners/ @reprazent @kerrizor @garyh /ee/spec/lib/gitlab/code_owners/ @reprazent @kerrizor @garyh
/doc/user/project/code_owners.md @reprazent @kerrizor @garyh /doc/user/project/code_owners.md @reprazent @kerrizor @garyh
[Merge Requests]
/app/controllers/projects/merge_requests/ @garyh @patrickbajao @marc_shaw @kerrizor
/app/models/merge_request.rb @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/app/services/merge_requests/ @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/app/workers/merge_requests/ @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/app/workers/merge_request_mergeability_check_worker.rb @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/lib/gitlab/diff/ @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/lib/gitlab/discussions_diff/ @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/lib/gitlab/quick_actions/ @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/ee/app/models/merge_request.rb @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/ee/app/services/merge_requests/ @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/ee/app/workers/merge_requests/ @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/ee/app/workers/merge_request_reset_approvals_worker.rb @dskim_gitlab @garyh @patrickbajao @marc_shaw @kerrizor
/app/assets/javascripts/diffs @viktomas @jboyson @iamphill @thomasrandolph
/app/assets/javascripts/batch_comments/ @viktomas @jboyson @iamphill @thomasrandolph
/app/assets/javascripts/notes @viktomas @jboyson @iamphill @thomasrandolph
/app/assets/javascripts/merge_request @viktomas @jboyson @iamphill @thomasrandolph
/app/assets/javascripts/merge_conflicts @viktomas @jboyson @iamphill @thomasrandolph
/app/assets/javascripts/mr_notes @viktomas @jboyson @iamphill @thomasrandolph
/app/assets/javascripts/mr_popover @viktomas @jboyson @iamphill @thomasrandolph
/app/assets/javascripts/vue_merge_request_widget @viktomas @jboyson @iamphill @thomasrandolph
/app/assets/javascripts/merge_request.js @viktomas @jboyson @iamphill @thomasrandolph
/app/assets/javascripts/merge_request_tabs.js @viktomas @jboyson @iamphill @thomasrandolph
/app/assets/stylesheets/framework/diffs.scss @viktomas @jboyson @iamphill @thomasrandolph
/app/assets/stylesheets/components/batch_comments/ @viktomas @jboyson @iamphill @thomasrandolph
/ee/app/assets/javascripts/diffs/ @viktomas @jboyson @iamphill @thomasrandolph
/ee/app/assets/javascripts/vue_merge_request_widget @viktomas @jboyson @iamphill @thomasrandolph
/spec/frontend/diffs/ @viktomas @jboyson @iamphill @thomasrandolph
/spec/frontend/batch_comments/ @viktomas @jboyson @iamphill @thomasrandolph
[Product Intelligence] [Product Intelligence]
/ee/lib/gitlab/usage_data_counters/ @gitlab-org/growth/product-intelligence/engineers /ee/lib/gitlab/usage_data_counters/ @gitlab-org/growth/product-intelligence/engineers
/ee/lib/ee/gitlab/usage_data.rb @gitlab-org/growth/product-intelligence/engineers /ee/lib/ee/gitlab/usage_data.rb @gitlab-org/growth/product-intelligence/engineers
@ -284,3 +330,6 @@ Dangerfile @gl-quality/eng-prod
[Workhorse] [Workhorse]
/workhorse/ @jacobvosmaer-gitlab @nick.thomas @nolith @patrickbajao /workhorse/ @jacobvosmaer-gitlab @nick.thomas @nolith @patrickbajao
[Application Security]
/lib/gitlab/content_security_policy/ @gitlab-com/gl-security/appsec

View file

@ -9,8 +9,18 @@ build-qa-image:
- .build-images:rules:build-qa-image - .build-images:rules:build-qa-image
stage: build-images stage: build-images
needs: [] needs: []
variables:
QA_IMAGE: "${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_REF_SLUG}"
script: script:
- export QA_IMAGE="${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_REF_SLUG}" # 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
- /kaniko/executor --context=${CI_PROJECT_DIR} --dockerfile=${CI_PROJECT_DIR}/qa/Dockerfile --destination=${QA_IMAGE} --cache=true - /kaniko/executor --context=${CI_PROJECT_DIR} --dockerfile=${CI_PROJECT_DIR}/qa/Dockerfile --destination=${QA_IMAGE} --cache=true
retry: 2 retry: 2

View file

@ -28,9 +28,9 @@ cache-repo:
before_script: before_script:
- '[ -z "$CI_REPO_CACHE_CREDENTIALS" ] || gcloud auth activate-service-account --key-file=$CI_REPO_CACHE_CREDENTIALS' - '[ -z "$CI_REPO_CACHE_CREDENTIALS" ] || gcloud auth activate-service-account --key-file=$CI_REPO_CACHE_CREDENTIALS'
script: script:
# Enable shallow repo caching only if the $ENABLE_SHALLOW_REPO_CACHING variable exists # Enable shallow repo caching unless the $DISABLE_SHALLOW_REPO_CACHING variable exists (in the case the shallow clone caching isn't working well)
# The `git repack` call works around a Git bug with shallow clones: https://gitlab.com/gitlab-org/git/-/issues/86 # The `git repack` call works around a Git bug with shallow clones: https://gitlab.com/gitlab-org/git/-/issues/86
- if [ -n "$ENABLE_SHALLOW_REPO_CACHING" ]; then - if [ -z "$DISABLE_SHALLOW_REPO_CACHING" ]; then
cd .. && rm -rf $CI_PROJECT_NAME; cd .. && rm -rf $CI_PROJECT_NAME;
today=$(date +%Y-%m-%d); today=$(date +%Y-%m-%d);
year=$(date +%Y); year=$(date +%Y);
@ -47,8 +47,8 @@ cache-repo:
time gzip /tmp/$SHALLOW_CLONE_TAR_FILENAME; time gzip /tmp/$SHALLOW_CLONE_TAR_FILENAME;
[ -z "$CI_REPO_CACHE_CREDENTIALS" ] || (echo "Uploading /tmp/$SHALLOW_CLONE_TAR_FILENAME.gz to GCloud." && time gsutil cp /tmp/$SHALLOW_CLONE_TAR_FILENAME.gz gs://gitlab-ci-git-repo-cache/project-$CI_PROJECT_ID/$SHALLOW_CLONE_TAR_FILENAME.gz); [ -z "$CI_REPO_CACHE_CREDENTIALS" ] || (echo "Uploading /tmp/$SHALLOW_CLONE_TAR_FILENAME.gz to GCloud." && time gsutil cp /tmp/$SHALLOW_CLONE_TAR_FILENAME.gz gs://gitlab-ci-git-repo-cache/project-$CI_PROJECT_ID/$SHALLOW_CLONE_TAR_FILENAME.gz);
fi fi
# By default, we want to cache the full repo, unless the $DISABLE_FULL_REPO_CACHING variable exists (in the case the shallow clone caching is working well) # Disable the full repo caching unless the $DISABLE_SHALLOW_REPO_CACHING variable exists (in the case the shallow clone caching isn't working well)
- if [ -z "$DISABLE_FULL_REPO_CACHING" ]; then - if [ -n "$DISABLE_SHALLOW_REPO_CACHING" ]; then
cd .. && rm -rf $CI_PROJECT_NAME; cd .. && rm -rf $CI_PROJECT_NAME;
echo "Cloning $CI_REPOSITORY_URL into $CI_PROJECT_NAME."; echo "Cloning $CI_REPOSITORY_URL into $CI_PROJECT_NAME.";
time git clone --progress $CI_REPOSITORY_URL $CI_PROJECT_NAME; time git clone --progress $CI_REPOSITORY_URL $CI_PROJECT_NAME;

View file

@ -7,4 +7,4 @@ cloud-native-image:
GIT_DEPTH: "1" GIT_DEPTH: "1"
script: script:
- install_gitlab_gem - install_gitlab_gem
- CNG_PROJECT_PATH="gitlab-org/build/CNG" BUILD_TRIGGER_TOKEN=$CI_JOB_TOKEN ./scripts/trigger-build cng - CNG_PROJECT_PATH="gitlab-org/build/CNG" ./scripts/trigger-build cng

View file

@ -3,7 +3,7 @@
- prm - prm
# For scheduling dast job # For scheduling dast job
extends: extends:
- .reports:schedule-dast - .reports:rules:schedule-dast
image: image:
name: "registry.gitlab.com/gitlab-org/security-products/dast:$DAST_VERSION" name: "registry.gitlab.com/gitlab-org/security-products/dast:$DAST_VERSION"
resource_group: dast_scan resource_group: dast_scan

View file

@ -3,7 +3,7 @@
- .default-retry - .default-retry
- .rails-cache - .rails-cache
- .default-before_script - .default-before_script
- .use-pg11 - .use-pg12
stage: test stage: test
needs: ["setup-test-env"] needs: ["setup-test-env"]
variables: variables:
@ -29,7 +29,7 @@ run-dev-fixtures-ee:
extends: extends:
- .run-dev-fixtures - .run-dev-fixtures
- .dev-fixtures:rules:ee-only - .dev-fixtures:rules:ee-only
- .use-pg11-ee - .use-pg12-ee
script: script:
- cp ee/db/fixtures/development/* $FIXTURE_PATH - cp ee/db/fixtures/development/* $FIXTURE_PATH
- *run-dev-fixtures-script - *run-dev-fixtures-script

View file

@ -44,7 +44,7 @@ docs-lint markdown:
- .default-retry - .default-retry
- .docs:rules:docs-lint - .docs:rules:docs-lint
# When updating the image version here, update it in /scripts/lint-doc.sh too. # When updating the image version here, update it in /scripts/lint-doc.sh too.
image: "registry.gitlab.com/gitlab-org/gitlab-docs/lint-markdown:alpine-3.12-vale-2.8.0-markdownlint-0.26.0" image: registry.gitlab.com/gitlab-org/gitlab-docs/lint-markdown:alpine-3.13-vale-2.10.2-markdownlint-0.26.0
stage: test stage: test
needs: [] needs: []
script: script:
@ -52,9 +52,10 @@ docs-lint markdown:
docs-lint links: docs-lint links:
extends: extends:
- .default-retry
- .docs:rules:docs-lint - .docs:rules:docs-lint
image: "registry.gitlab.com/gitlab-org/gitlab-docs/lint-html:alpine-3.12-ruby-2.7.2" image: registry.gitlab.com/gitlab-org/gitlab-docs/lint-html:alpine-3.13-ruby-2.7.2
# TODO: revert to .default-retry when https://gitlab.com/gitlab-org/gitlab/-/issues/331002 is fixed.
retry: 2
stage: test stage: test
needs: [] needs: []
script: script:

View file

@ -58,38 +58,34 @@ compile-test-assets as-if-foss:
update-assets-compile-production-cache: update-assets-compile-production-cache:
extends: extends:
- compile-production-assets - compile-production-assets
- .assets-compile-cache-push
- .shared:rules:update-cache - .shared:rules:update-cache
stage: prepare stage: prepare
artifacts: {} # This job's purpose is only to update the cache. artifacts: {} # This job's purpose is only to update the cache.
cache:
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
update-assets-compile-test-cache: update-assets-compile-test-cache:
extends: extends:
- compile-test-assets - compile-test-assets
- .assets-compile-cache-push
- .shared:rules:update-cache - .shared:rules:update-cache
stage: prepare stage: prepare
artifacts: {} # This job's purpose is only to update the cache. artifacts: {} # This job's purpose is only to update the cache.
cache:
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
update-yarn-cache: update-yarn-cache:
extends: extends:
- .default-retry - .default-retry
- .yarn-cache - .yarn-cache-push
- .shared:rules:update-cache - .shared:rules:update-cache
stage: prepare stage: prepare
script: script:
- *yarn-install - *yarn-install
cache:
policy: push
.frontend-fixtures-base: .frontend-fixtures-base:
extends: extends:
- .default-retry - .default-retry
- .default-before_script - .default-before_script
- .rails-cache - .rails-cache
- .use-pg11 - .use-pg12
stage: fixtures stage: fixtures
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets"] needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets"]
variables: variables:
@ -121,7 +117,7 @@ rspec frontend_fixture as-if-foss:
rspec-ee frontend_fixture: rspec-ee frontend_fixture:
extends: extends:
- .frontend-fixtures-base - .frontend-fixtures-base
- .frontend:rules:default-frontend-jobs - .frontend:rules:default-frontend-jobs-ee
parallel: 2 parallel: 2
graphql-schema-dump: graphql-schema-dump:
@ -156,7 +152,7 @@ eslint-as-if-foss:
needs: [] needs: []
script: script:
- *yarn-install - *yarn-install
- run_timed_command "yarn run eslint" - run_timed_command "yarn run lint:eslint:all"
.karma-base: .karma-base:
extends: .frontend-test-base extends: .frontend-test-base
@ -169,8 +165,10 @@ karma:
extends: extends:
- .karma-base - .karma-base
- .frontend:rules:default-frontend-jobs - .frontend:rules:default-frontend-jobs
# Don't use `needs` since `rspec-ee frontend_fixture` doesn't exist in `gitlab-foss` pipelines. needs:
dependencies: ["rspec frontend_fixture", "rspec-ee frontend_fixture"] - job: "rspec frontend_fixture"
- job: "rspec-ee frontend_fixture"
optional: true
coverage: '/^Statements *: (\d+\.\d+%)/' coverage: '/^Statements *: (\d+\.\d+%)/'
artifacts: artifacts:
name: coverage-javascript name: coverage-javascript
@ -201,8 +199,10 @@ jest:
extends: extends:
- .jest-base - .jest-base
- .frontend:rules:default-frontend-jobs - .frontend:rules:default-frontend-jobs
# Don't use `needs` since `rspec-ee frontend_fixture` doesn't exist in `gitlab-foss` pipelines. needs:
dependencies: ["rspec frontend_fixture", "rspec-ee frontend_fixture"] - job: "rspec frontend_fixture"
- job: "rspec-ee frontend_fixture"
optional: true
artifacts: artifacts:
name: coverage-frontend name: coverage-frontend
expire_in: 31d expire_in: 31d
@ -222,8 +222,11 @@ jest-integration:
script: script:
- *yarn-install - *yarn-install
- run_timed_command "yarn jest:integration --ci" - run_timed_command "yarn jest:integration --ci"
# Don't use `needs` since `rspec-ee frontend_fixture` doesn't exist in `gitlab-foss` pipelines. needs:
dependencies: ["rspec frontend_fixture", "rspec-ee frontend_fixture", "graphql-schema-dump"] - job: "rspec frontend_fixture"
- job: "rspec-ee frontend_fixture"
optional: true
- job: "graphql-schema-dump"
jest-as-if-foss: jest-as-if-foss:
extends: extends:

View file

@ -16,75 +16,147 @@
- source scripts/utils.sh - source scripts/utils.sh
- source scripts/prepare_build.sh - source scripts/prepare_build.sh
.ruby-gems-cache: &ruby-gems-cache
key: "ruby-gems-v1"
paths:
- vendor/ruby/
policy: pull
.ruby-gems-cache-push: &ruby-gems-cache-push
<<: *ruby-gems-cache
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.gitaly-ruby-gems-cache: &gitaly-ruby-gems-cache
key: "gitaly-ruby-gems-v1"
paths:
- vendor/gitaly-ruby/
policy: pull
.gitaly-ruby-gems-cache-push: &gitaly-ruby-gems-cache-push
<<: *gitaly-ruby-gems-cache
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.go-pkg-cache: &go-pkg-cache
key: "go-pkg-v1"
paths:
- .go/pkg/mod/
policy: pull
.go-pkg-cache-push: &go-pkg-cache-push
<<: *go-pkg-cache
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.node-modules-cache: &node-modules-cache
key: "node-modules-${NODE_ENV}-v1"
paths:
- node_modules/
- tmp/cache/webpack-dlls/
policy: pull
.node-modules-cache-push: &node-modules-cache-push
<<: *node-modules-cache
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"
paths:
- assets-hash.txt
- public/assets/webpack/
- tmp/cache/assets/sprockets/
- tmp/cache/babel-loader/
- tmp/cache/vue-loader/
policy: pull
.assets-cache-push: &assets-cache-push
<<: *assets-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:
- tmp/rubocop_cache/
policy: pull
.rubocop-cache-push: &rubocop-cache-push
<<: *rubocop-cache
# We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up but RuboCop has a mechanism
# for keeping only the N latest cache files, so we take advantage of it with `pull-push`.
policy: pull-push
.qa-ruby-gems-cache: &qa-ruby-gems-cache
key: "qa-ruby-gems-v1"
paths:
- qa/vendor/ruby/
policy: pull
.qa-ruby-gems-cache-push: &qa-ruby-gems-cache-push
<<: *qa-ruby-gems-cache
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.setup-test-env-cache: .setup-test-env-cache:
cache: cache:
key: "setup-test-env-v1" - *ruby-gems-cache
paths: - *gitaly-ruby-gems-cache
- vendor/ruby/ - *go-pkg-cache
- vendor/gitaly-ruby/
- .go/pkg/mod/ .setup-test-env-cache-push:
policy: pull cache:
- *ruby-gems-cache-push
- *gitaly-ruby-gems-cache-push
- *go-pkg-cache-push
.rails-cache: .rails-cache:
cache: cache:
key: "rails-v5" - *ruby-gems-cache
paths: - *gitaly-ruby-gems-cache
- vendor/ruby/
- vendor/gitaly-ruby/
policy: pull
.static-analysis-cache: .static-analysis-cache:
cache: cache:
key: "static-analysis-v2" - *ruby-gems-cache
paths: - *node-modules-cache
- vendor/ruby/ - *rubocop-cache
- node_modules/
- tmp/rubocop_cache/ .static-analysis-cache-push:
policy: pull cache:
- *ruby-gems-cache # We don't push this cache as it's already rebuilt by `update-setup-test-env-cache`
- *rubocop-cache-push
.coverage-cache: .coverage-cache:
cache: cache:
key: "coverage-cache-v1" - *ruby-gems-cache
paths:
- vendor/ruby/
policy: pull
.danger-review-cache: .danger-review-cache:
cache: cache:
key: "danger-review-v1" - *ruby-gems-cache
paths: - *node-modules-cache
- vendor/ruby/
- node_modules/
policy: pull
.qa-cache: .qa-cache:
cache: cache:
key: "qa-v2" - *qa-ruby-gems-cache
paths:
- qa/vendor/ruby/ .qa-cache-push:
policy: pull cache:
- *qa-ruby-gems-cache-push
.yarn-cache: .yarn-cache:
cache: cache:
key: "yarn-v1" - *node-modules-cache
paths:
- node_modules/ .yarn-cache-push:
- tmp/cache/webpack-dlls/ cache:
policy: pull - *node-modules-cache-push
.assets-compile-cache: .assets-compile-cache:
cache: cache:
key: "assets-compile-${NODE_ENV}-v1" - *ruby-gems-cache
paths: - *node-modules-cache
- vendor/ruby/ - *assets-cache
- node_modules/
- assets-hash.txt .assets-compile-cache-push:
- public/assets/webpack/ cache:
- tmp/cache/assets/sprockets/ - *ruby-gems-cache # We don't push this cache as it's already rebuilt by `update-setup-test-env-cache`
- tmp/cache/babel-loader/ - *node-modules-cache-push
- tmp/cache/vue-loader/ - *assets-cache-push
- tmp/cache/webpack-dlls/
policy: pull
.use-pg11: .use-pg11:
image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.14-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-11-graphicsmagick-1.3.36" image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.14-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-11-graphicsmagick-1.3.36"
@ -128,7 +200,7 @@
.use-kaniko: .use-kaniko:
image: image:
name: gcr.io/kaniko-project/executor:debug-v1.3.0 name: registry.gitlab.com/gitlab-org/gitlab-build-images:kaniko
entrypoint: [""] entrypoint: [""]
before_script: before_script:
- source scripts/utils.sh - source scripts/utils.sh

View file

@ -37,7 +37,7 @@ memory-static:
memory-on-boot: memory-on-boot:
extends: extends:
- .only-code-memory-job-base - .only-code-memory-job-base
- .use-pg11 - .use-pg12
stage: test stage: test
needs: ["setup-test-env", "compile-test-assets"] needs: ["setup-test-env", "compile-test-assets"]
variables: variables:

View file

@ -3,7 +3,7 @@ pages:
- .default-retry - .default-retry
- .pages:rules - .pages:rules
stage: pages stage: pages
dependencies: needs:
- rspec:coverage - rspec:coverage
- coverage-frontend - coverage-frontend
- karma - karma

View file

@ -4,11 +4,13 @@
- .qa-cache - .qa-cache
stage: test stage: test
needs: [] needs: []
variables:
USE_BUNDLE_INSTALL: "false"
SETUP_DB: "false"
before_script: before_script:
- '[ "$FOSS_ONLY" = "1" ] && rm -rf ee/ qa/spec/ee/ qa/qa/specs/features/ee/ qa/qa/ee/ qa/qa/ee.rb' - !reference [.default-before_script, before_script]
- cd qa/ - cd qa/
- bundle install --clean --jobs=$(nproc) --path=vendor --retry=3 --without=development --quiet - bundle_install_script
- bundle check
qa:internal: qa:internal:
extends: extends:
@ -39,12 +41,11 @@ qa:selectors-as-if-foss:
update-qa-cache: update-qa-cache:
extends: extends:
- .qa-job-base - .qa-job-base
- .qa-cache-push
- .shared:rules:update-cache - .shared:rules:update-cache
stage: prepare stage: prepare
script: script:
- echo "Cache has been updated and ready to be uploaded." - echo "Cache has been updated and ready to be uploaded."
cache:
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.package-and-qa-base: .package-and-qa-base:
image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine

View file

@ -8,7 +8,8 @@
.minimal-bundle-install: .minimal-bundle-install:
script: script:
- run_timed_command "bundle install --jobs=$(nproc) --path=vendor --retry=3 --quiet --without default development test production puma unicorn kerberos metrics omnibus ed25519" - export BUNDLE_WITHOUT="${BUNDLE_WITHOUT}:default:test:puma:unicorn:kerberos:metrics:omnibus:ed25519"
- bundle_install_script
.base-script: .base-script:
script: script:
@ -67,11 +68,11 @@
- .rspec-base - .rspec-base
- .use-pg12 - .use-pg12
.rspec-base-pg11-as-if-foss: .rspec-base-pg12-as-if-foss:
extends: extends:
- .rspec-base - .rspec-base
- .as-if-foss - .as-if-foss
- .use-pg11 - .use-pg12
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets as-if-foss", "detect-tests"] needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets as-if-foss", "detect-tests"]
.rspec-ee-base-pg11: .rspec-ee-base-pg11:
@ -104,7 +105,7 @@
extends: extends:
- .rails-job-base - .rails-job-base
- .rails:rules:ee-and-foss-migration - .rails:rules:ee-and-foss-migration
- .use-pg11 - .use-pg12
stage: test stage: test
needs: ["setup-test-env"] needs: ["setup-test-env"]
# rspec job base specs # rspec job base specs
@ -113,10 +114,10 @@
############################ ############################
# rspec job parallel configs # rspec job parallel configs
.rspec-migration-parallel: .rspec-migration-parallel:
parallel: 5 parallel: 7
.rspec-ee-migration-parallel: .rspec-ee-migration-parallel:
parallel: 2 parallel: 3
.rspec-unit-parallel: .rspec-unit-parallel:
parallel: 20 parallel: 20
@ -148,7 +149,7 @@ setup-test-env:
- .rails-job-base - .rails-job-base
- .setup-test-env-cache - .setup-test-env-cache
- .rails:rules:code-backstage-qa - .rails:rules:code-backstage-qa
- .use-pg11 - .use-pg12
stage: prepare stage: prepare
variables: variables:
GITLAB_TEST_EAGER_LOAD: "0" GITLAB_TEST_EAGER_LOAD: "0"
@ -159,18 +160,13 @@ setup-test-env:
expire_in: 7d expire_in: 7d
paths: paths:
- config/secrets.yml - config/secrets.yml
- tmp/tests/gitaly/_build/bin/
- tmp/tests/gitaly/config.toml - tmp/tests/gitaly/config.toml
- tmp/tests/gitaly/gitaly
- tmp/tests/gitaly/gitaly2.config.toml - tmp/tests/gitaly/gitaly2.config.toml
- tmp/tests/gitaly/gitaly-git2go
- tmp/tests/gitaly/gitaly-hooks
- tmp/tests/gitaly/gitaly-lfs-smudge
- tmp/tests/gitaly/gitaly-ssh
- tmp/tests/gitaly/internal/ - tmp/tests/gitaly/internal/
- tmp/tests/gitaly/internal_gitaly2/ - tmp/tests/gitaly/internal_gitaly2/
- tmp/tests/gitaly/internal_sockets/ - tmp/tests/gitaly/internal_sockets/
- tmp/tests/gitaly/Makefile - tmp/tests/gitaly/Makefile
- tmp/tests/gitaly/praefect
- tmp/tests/gitaly/praefect.config.toml - tmp/tests/gitaly/praefect.config.toml
- tmp/tests/gitaly/ruby/ - tmp/tests/gitaly/ruby/
- tmp/tests/gitlab-elasticsearch-indexer/bin/gitlab-elasticsearch-indexer - tmp/tests/gitlab-elasticsearch-indexer/bin/gitlab-elasticsearch-indexer
@ -191,18 +187,10 @@ setup-test-env:
update-setup-test-env-cache: update-setup-test-env-cache:
extends: extends:
- setup-test-env - setup-test-env
- .setup-test-env-cache-push
- .shared:rules:update-cache - .shared:rules:update-cache
artifacts: artifacts:
paths: [] # This job's purpose is only to update the cache. paths: [] # This job's purpose is only to update the cache.
cache:
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
update-rails-cache:
extends:
- update-setup-test-env-cache
- .rails-cache
cache:
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.coverage-base: .coverage-base:
extends: extends:
@ -213,16 +201,6 @@ update-rails-cache:
SETUP_DB: "false" SETUP_DB: "false"
USE_BUNDLE_INSTALL: "false" USE_BUNDLE_INSTALL: "false"
update-coverage-cache:
extends:
- .coverage-base
- .shared:rules:update-cache
stage: prepare
script:
- !reference [.minimal-bundle-install, script]
cache:
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.static-analysis-base: .static-analysis-base:
extends: extends:
- .default-retry - .default-retry
@ -236,80 +214,81 @@ update-coverage-cache:
update-static-analysis-cache: update-static-analysis-cache:
extends: extends:
- .static-analysis-base - .static-analysis-base
- .static-analysis-cache-push
- .shared:rules:update-cache - .shared:rules:update-cache
stage: prepare stage: prepare
script: script:
- rm -rf ./node_modules # We remove node_modules because there's no mechanism to remove stall entries. - run_timed_command "bundle exec rubocop --parallel" # For the moment we only cache `tmp/rubocop_cache` so we don't need to run all the tasks.
- run_timed_command "retry yarn install --frozen-lockfile"
- run_timed_command "bundle exec rubocop --parallel" # For the moment we only cache `vendor/ruby/`, `node_modules/`, and `tmp/rubocop_cache` so we don't need to run all the tasks,
cache:
# We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up but RuboCop has a mechanism
# for keeping only the N latest cache files, so we take advantage of it with `pull-push` and removing `node_modules` at the start of the job.
policy: pull-push
static-analysis: static-analysis:
extends: extends:
- .static-analysis-base - .static-analysis-base
- .rails:rules:code-backstage-qa - .static-analysis:rules:ee-and-foss
stage: test stage: test
parallel: 4 parallel: 4
script: script:
- run_timed_command "retry yarn install --frozen-lockfile" - run_timed_command "retry yarn install --frozen-lockfile"
- scripts/static-analysis - scripts/static-analysis
rspec migration pg11: static-analysis as-if-foss:
extends: extends:
- .rspec-base-pg11 - static-analysis
- .static-analysis:rules:as-if-foss
- .as-if-foss
rspec migration pg12:
extends:
- .rspec-base-pg12
- .rspec-base-migration - .rspec-base-migration
- .rspec-migration-parallel - .rspec-migration-parallel
rspec migration pg11 minimal: rspec migration pg12 minimal:
extends: extends:
- rspec migration pg11 - rspec migration pg12
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:ee-and-foss-migration:minimal - .rails:rules:ee-and-foss-migration:minimal
rspec unit pg11: rspec unit pg12:
extends: extends:
- .rspec-base-pg11 - .rspec-base-pg12
- .rails:rules:ee-and-foss-unit - .rails:rules:ee-and-foss-unit
- .rspec-unit-parallel - .rspec-unit-parallel
rspec unit pg11 minimal: rspec unit pg12 minimal:
extends: extends:
- rspec unit pg11 - rspec unit pg12
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:ee-and-foss-unit:minimal - .rails:rules:ee-and-foss-unit:minimal
rspec integration pg11: rspec integration pg12:
extends: extends:
- .rspec-base-pg11 - .rspec-base-pg12
- .rails:rules:ee-and-foss-integration - .rails:rules:ee-and-foss-integration
- .rspec-integration-parallel - .rspec-integration-parallel
rspec integration pg11 minimal: rspec integration pg12 minimal:
extends: extends:
- rspec integration pg11 - rspec integration pg12
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:ee-and-foss-integration:minimal - .rails:rules:ee-and-foss-integration:minimal
rspec system pg11: rspec system pg12:
extends: extends:
- .rspec-base-pg11 - .rspec-base-pg12
- .rails:rules:ee-and-foss-system - .rails:rules:ee-and-foss-system
- .rspec-system-parallel - .rspec-system-parallel
rspec system pg11 minimal: rspec system pg12 minimal:
extends: extends:
- rspec system pg11 - rspec system pg12
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:ee-and-foss-system:minimal - .rails:rules:ee-and-foss-system:minimal
# Dedicated job to test DB library code against PG12. # Dedicated job to test DB library code against PG11.
# Note that these are already tested against PG11 in the `rspec unit pg11` / `rspec-ee unit pg11` jobs. # Note that these are already tested against PG12 in the `rspec unit pg12` / `rspec-ee unit pg12` jobs.
rspec db-library-code pg12: rspec db-library-code pg11:
extends: extends:
- .rspec-base-pg12 - .rspec-base-pg11
- .rails:rules:ee-and-foss-db-library-code - .rails:rules:ee-and-foss-db-library-code
script: script:
- !reference [.base-script, script] - !reference [.base-script, script]
@ -317,7 +296,7 @@ rspec db-library-code pg12:
rspec fast_spec_helper: rspec fast_spec_helper:
extends: extends:
- .rspec-base-pg11 - .rspec-base-pg12
- .rails:rules:ee-and-foss-fast_spec_helper - .rails:rules:ee-and-foss-fast_spec_helper
script: script:
- bin/rspec spec/fast_spec_helper.rb - bin/rspec spec/fast_spec_helper.rb
@ -339,6 +318,7 @@ db:check-schema:
- .rails:rules:ee-mr-and-default-branch-only - .rails:rules:ee-mr-and-default-branch-only
script: script:
- source scripts/schema_changed.sh - source scripts/schema_changed.sh
- scripts/validate_migration_timestamps
db:check-migrations: db:check-migrations:
extends: extends:
@ -364,7 +344,7 @@ db:migrate-from-previous-major-version:
- sed -i -e "s/gem 'grpc', '~> 1.24.0'/gem 'grpc', '~> 1.30.2'/" Gemfile # Update gRPC for Ruby 2.7 - sed -i -e "s/gem 'grpc', '~> 1.24.0'/gem 'grpc', '~> 1.30.2'/" Gemfile # Update gRPC for Ruby 2.7
- sed -i -e "s/gem 'google-protobuf', '~> 3.8.0'/gem 'google-protobuf', '~> 3.12'/" Gemfile - sed -i -e "s/gem 'google-protobuf', '~> 3.8.0'/gem 'google-protobuf', '~> 3.12'/" Gemfile
- sed -i -e "s/gem 'nokogiri', '~> 1.10.5'/gem 'nokogiri', '~> 1.11.0'/" Gemfile - sed -i -e "s/gem 'nokogiri', '~> 1.10.5'/gem 'nokogiri', '~> 1.11.0'/" Gemfile
- sed -i -e "s/gem 'mimemagic', '~> 0.3.2'/gem 'ruby-magic', '~> 0.3.2'/" Gemfile - 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 "gem install bundler:1.17.3"
- run_timed_command "bundle update google-protobuf nokogiri grpc mimemagic bootsnap" - run_timed_command "bundle update google-protobuf nokogiri grpc mimemagic bootsnap"
- run_timed_command "bundle install ${BUNDLE_INSTALL_FLAGS}" - run_timed_command "bundle install ${BUNDLE_INSTALL_FLAGS}"
@ -434,17 +414,17 @@ rspec:deprecations:
# We cannot use needs since it would mean needing 84 jobs (since most are parallelized) # We cannot use needs since it would mean needing 84 jobs (since most are parallelized)
# so we use `dependencies` here. # so we use `dependencies` here.
dependencies: dependencies:
- rspec migration pg11 - rspec migration pg12
- rspec unit pg11 - rspec unit pg12
- rspec integration pg11 - rspec integration pg12
- rspec system pg11 - rspec system pg12
- rspec-ee migration pg11 - rspec-ee migration pg12
- rspec-ee unit pg11 - rspec-ee unit pg12
- rspec-ee integration pg11 - rspec-ee integration pg12
- rspec-ee system pg11 - rspec-ee system pg12
- rspec-ee unit pg11 geo - rspec-ee unit pg12 geo
- rspec-ee integration pg11 geo - rspec-ee integration pg12 geo
- rspec-ee system pg11 geo - rspec-ee system pg12 geo
variables: variables:
SETUP_DB: "false" SETUP_DB: "false"
script: script:
@ -466,17 +446,17 @@ rspec:coverage:
# so we use `dependencies` here. # so we use `dependencies` here.
dependencies: dependencies:
- setup-test-env - setup-test-env
- rspec migration pg11 - rspec migration pg12
- rspec unit pg11 - rspec unit pg12
- rspec integration pg11 - rspec integration pg12
- rspec system pg11 - rspec system pg12
- rspec-ee migration pg11 - rspec-ee migration pg12
- rspec-ee unit pg11 - rspec-ee unit pg12
- rspec-ee integration pg11 - rspec-ee integration pg12
- rspec-ee system pg11 - rspec-ee system pg12
- rspec-ee unit pg11 geo - rspec-ee unit pg12 geo
- rspec-ee integration pg11 geo - rspec-ee integration pg12 geo
- rspec-ee system pg11 geo - rspec-ee system pg12 geo
- memory-static - memory-static
- memory-on-boot - memory-on-boot
script: script:
@ -503,17 +483,17 @@ rspec:feature-flags:
# so we use `dependencies` here. # so we use `dependencies` here.
dependencies: dependencies:
- setup-test-env - setup-test-env
- rspec migration pg11 - rspec migration pg12
- rspec unit pg11 - rspec unit pg12
- rspec integration pg11 - rspec integration pg12
- rspec system pg11 - rspec system pg12
- rspec-ee migration pg11 - rspec-ee migration pg12
- rspec-ee unit pg11 - rspec-ee unit pg12
- rspec-ee integration pg11 - rspec-ee integration pg12
- rspec-ee system pg11 - rspec-ee system pg12
- rspec-ee unit pg11 geo - rspec-ee unit pg12 geo
- rspec-ee integration pg11 geo - rspec-ee integration pg12 geo
- rspec-ee system pg11 geo - rspec-ee system pg12 geo
- memory-static - memory-static
- memory-on-boot - memory-on-boot
script: script:
@ -529,138 +509,138 @@ rspec:feature-flags:
################################################## ##################################################
# EE: default refs (MRs, default branch, schedules) jobs # # EE: default refs (MRs, default branch, schedules) jobs #
rspec migration pg11-as-if-foss: rspec migration pg12-as-if-foss:
extends: extends:
- .rspec-base-pg11-as-if-foss - .rspec-base-pg12-as-if-foss
- .rspec-base-migration - .rspec-base-migration
- .rails:rules:as-if-foss-migration - .rails:rules:as-if-foss-migration
- .rspec-migration-parallel - .rspec-migration-parallel
rspec migration pg11-as-if-foss minimal: rspec migration pg12-as-if-foss minimal:
extends: extends:
- rspec migration pg11-as-if-foss - rspec migration pg12-as-if-foss
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:as-if-foss-migration:minimal - .rails:rules:as-if-foss-migration:minimal
rspec unit pg11-as-if-foss: rspec unit pg12-as-if-foss:
extends: extends:
- .rspec-base-pg11-as-if-foss - .rspec-base-pg12-as-if-foss
- .rails:rules:as-if-foss-unit - .rails:rules:as-if-foss-unit
- .rspec-unit-parallel - .rspec-unit-parallel
rspec unit pg11-as-if-foss minimal: rspec unit pg12-as-if-foss minimal:
extends: extends:
- rspec unit pg11-as-if-foss - rspec unit pg12-as-if-foss
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:as-if-foss-unit:minimal - .rails:rules:as-if-foss-unit:minimal
rspec integration pg11-as-if-foss: rspec integration pg12-as-if-foss:
extends: extends:
- .rspec-base-pg11-as-if-foss - .rspec-base-pg12-as-if-foss
- .rails:rules:as-if-foss-integration - .rails:rules:as-if-foss-integration
- .rspec-integration-parallel - .rspec-integration-parallel
rspec integration pg11-as-if-foss minimal: rspec integration pg12-as-if-foss minimal:
extends: extends:
- rspec integration pg11-as-if-foss - rspec integration pg12-as-if-foss
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:as-if-foss-integration:minimal - .rails:rules:as-if-foss-integration:minimal
rspec system pg11-as-if-foss: rspec system pg12-as-if-foss:
extends: extends:
- .rspec-base-pg11-as-if-foss - .rspec-base-pg12-as-if-foss
- .rails:rules:as-if-foss-system - .rails:rules:as-if-foss-system
- .rspec-system-parallel - .rspec-system-parallel
rspec system pg11-as-if-foss minimal: rspec system pg12-as-if-foss minimal:
extends: extends:
- rspec system pg11-as-if-foss - rspec system pg12-as-if-foss
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:as-if-foss-system:minimal - .rails:rules:as-if-foss-system:minimal
rspec-ee migration pg11: rspec-ee migration pg12:
extends: extends:
- .rspec-ee-base-pg11 - .rspec-ee-base-pg12
- .rspec-base-migration - .rspec-base-migration
- .rails:rules:ee-only-migration - .rails:rules:ee-only-migration
- .rspec-ee-migration-parallel - .rspec-ee-migration-parallel
rspec-ee migration pg11 minimal: rspec-ee migration pg12 minimal:
extends: extends:
- rspec-ee migration pg11 - rspec-ee migration pg12
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:ee-only-migration:minimal - .rails:rules:ee-only-migration:minimal
rspec-ee unit pg11: rspec-ee unit pg12:
extends: extends:
- .rspec-ee-base-pg11 - .rspec-ee-base-pg12
- .rails:rules:ee-only-unit - .rails:rules:ee-only-unit
- .rspec-ee-unit-parallel - .rspec-ee-unit-parallel
rspec-ee unit pg11 minimal: rspec-ee unit pg12 minimal:
extends: extends:
- rspec-ee unit pg11 - rspec-ee unit pg12
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:ee-only-unit:minimal - .rails:rules:ee-only-unit:minimal
rspec-ee integration pg11: rspec-ee integration pg12:
extends: extends:
- .rspec-ee-base-pg11 - .rspec-ee-base-pg12
- .rails:rules:ee-only-integration - .rails:rules:ee-only-integration
- .rspec-ee-integration-parallel - .rspec-ee-integration-parallel
rspec-ee integration pg11 minimal: rspec-ee integration pg12 minimal:
extends: extends:
- rspec-ee integration pg11 - rspec-ee integration pg12
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:ee-only-integration:minimal - .rails:rules:ee-only-integration:minimal
rspec-ee system pg11: rspec-ee system pg12:
extends: extends:
- .rspec-ee-base-pg11 - .rspec-ee-base-pg12
- .rails:rules:ee-only-system - .rails:rules:ee-only-system
- .rspec-ee-system-parallel - .rspec-ee-system-parallel
rspec-ee system pg11 minimal: rspec-ee system pg12 minimal:
extends: extends:
- rspec-ee system pg11 - rspec-ee system pg12
- .minimal-rspec-tests - .minimal-rspec-tests
- .rails:rules:ee-only-system:minimal - .rails:rules:ee-only-system:minimal
rspec-ee unit pg11 geo: rspec-ee unit pg12 geo:
extends: extends:
- .rspec-ee-base-geo-pg11 - .rspec-ee-base-geo-pg12
- .rails:rules:ee-only-unit - .rails:rules:ee-only-unit
- .rspec-ee-unit-geo-parallel - .rspec-ee-unit-geo-parallel
# FIXME: Temporarily disable geo minimal rspec jobs https://gitlab.com/gitlab-org/gitlab/-/issues/294212 # FIXME: Temporarily disable geo minimal rspec jobs https://gitlab.com/gitlab-org/gitlab/-/issues/294212
#rspec-ee unit pg11 geo minimal: #rspec-ee unit pg12 geo minimal:
# extends: # extends:
# - rspec-ee unit pg11 geo # - rspec-ee unit pg12 geo
# - .minimal-rspec-tests # - .minimal-rspec-tests
# - .rails:rules:ee-only-unit:minimal # - .rails:rules:ee-only-unit:minimal
rspec-ee integration pg11 geo: rspec-ee integration pg12 geo:
extends: extends:
- .rspec-ee-base-geo-pg11 - .rspec-ee-base-geo-pg12
- .rails:rules:ee-only-integration - .rails:rules:ee-only-integration
# FIXME: Temporarily disable geo minimal rspec jobs https://gitlab.com/gitlab-org/gitlab/-/issues/294212 # FIXME: Temporarily disable geo minimal rspec jobs https://gitlab.com/gitlab-org/gitlab/-/issues/294212
#rspec-ee integration pg11 geo minimal: #rspec-ee integration pg12 geo minimal:
# extends: # extends:
# - rspec-ee integration pg11 geo # - rspec-ee integration pg12 geo
# - .minimal-rspec-tests # - .minimal-rspec-tests
# - .rails:rules:ee-only-integration:minimal # - .rails:rules:ee-only-integration:minimal
rspec-ee system pg11 geo: rspec-ee system pg12 geo:
extends: extends:
- .rspec-ee-base-geo-pg11 - .rspec-ee-base-geo-pg12
- .rails:rules:ee-only-system - .rails:rules:ee-only-system
# FIXME: Temporarily disable geo minimal rspec jobs https://gitlab.com/gitlab-org/gitlab/-/issues/294212 # FIXME: Temporarily disable geo minimal rspec jobs https://gitlab.com/gitlab-org/gitlab/-/issues/294212
#rspec-ee system pg11 geo minimal: #rspec-ee system pg12 geo minimal:
# extends: # extends:
# - rspec-ee system pg11 geo # - rspec-ee system pg12 geo
# - .minimal-rspec-tests # - .minimal-rspec-tests
# - .rails:rules:ee-only-system:minimal # - .rails:rules:ee-only-system:minimal
@ -676,28 +656,28 @@ db:rollback geo:
########################################## ##########################################
# EE/FOSS: default branch nightly scheduled jobs # # EE/FOSS: default branch nightly scheduled jobs #
rspec migration pg12: rspec migration pg11:
extends: extends:
- .rspec-base-pg12 - .rspec-base-pg11
- .rspec-base-migration - .rspec-base-migration
- .rails:rules:default-branch-schedule-nightly--code-backstage - .rails:rules:default-branch-schedule-nightly--code-backstage
- .rspec-migration-parallel - .rspec-migration-parallel
rspec unit pg12: rspec unit pg11:
extends: extends:
- .rspec-base-pg12 - .rspec-base-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage - .rails:rules:default-branch-schedule-nightly--code-backstage
- .rspec-unit-parallel - .rspec-unit-parallel
rspec integration pg12: rspec integration pg11:
extends: extends:
- .rspec-base-pg12 - .rspec-base-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage - .rails:rules:default-branch-schedule-nightly--code-backstage
- .rspec-integration-parallel - .rspec-integration-parallel
rspec system pg12: rspec system pg11:
extends: extends:
- .rspec-base-pg12 - .rspec-base-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage - .rails:rules:default-branch-schedule-nightly--code-backstage
- .rspec-system-parallel - .rspec-system-parallel
# EE/FOSS: default branch nightly scheduled jobs # # EE/FOSS: default branch nightly scheduled jobs #
@ -705,45 +685,45 @@ rspec system pg12:
##################################### #####################################
# EE: default branch nightly scheduled jobs # # EE: default branch nightly scheduled jobs #
rspec-ee migration pg12: rspec-ee migration pg11:
extends: extends:
- .rspec-ee-base-pg12 - .rspec-ee-base-pg11
- .rspec-base-migration - .rspec-base-migration
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-migration-parallel - .rspec-ee-migration-parallel
rspec-ee unit pg12: rspec-ee unit pg11:
extends: extends:
- .rspec-ee-base-pg12 - .rspec-ee-base-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-unit-parallel - .rspec-ee-unit-parallel
rspec-ee integration pg12: rspec-ee integration pg11:
extends: extends:
- .rspec-ee-base-pg12 - .rspec-ee-base-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-integration-parallel - .rspec-ee-integration-parallel
rspec-ee system pg12: rspec-ee system pg11:
extends: extends:
- .rspec-ee-base-pg12 - .rspec-ee-base-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-system-parallel - .rspec-ee-system-parallel
rspec-ee unit pg12 geo: rspec-ee unit pg11 geo:
extends: extends:
- .rspec-ee-base-geo-pg12 - .rspec-ee-base-geo-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-unit-geo-parallel - .rspec-ee-unit-geo-parallel
rspec-ee integration pg12 geo: rspec-ee integration pg11 geo:
extends: extends:
- .rspec-ee-base-geo-pg12 - .rspec-ee-base-geo-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
rspec-ee system pg12 geo: rspec-ee system pg11 geo:
extends: extends:
- .rspec-ee-base-geo-pg12 - .rspec-ee-base-geo-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
# EE: default branch nightly scheduled jobs # # EE: default branch nightly scheduled jobs #
##################################### #####################################
@ -752,7 +732,7 @@ rspec-ee system pg12 geo:
# EE: Canonical MR pipelines # EE: Canonical MR pipelines
rspec fail-fast: rspec fail-fast:
extends: extends:
- .rspec-ee-base-pg11 # This job also runs EE spec which needs elasticsearch - .rspec-ee-base-pg12 # This job also runs EE spec which needs elasticsearch
- .rails:rules:rspec fail-fast - .rails:rules:rspec fail-fast
stage: test stage: test
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets", "detect-tests"] needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets", "detect-tests"]
@ -766,7 +746,7 @@ rspec fail-fast:
rspec foss-impact: rspec foss-impact:
extends: extends:
- .rspec-base-pg11-as-if-foss - .rspec-base-pg12-as-if-foss
- .rails:rules:rspec-foss-impact - .rails:rules:rspec-foss-impact
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets as-if-foss", "detect-tests as-if-foss"] needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets as-if-foss", "detect-tests as-if-foss"]
script: script:

View file

@ -1,120 +1,71 @@
# include: include:
# - template: Jobs/Code-Quality.gitlab-ci.yml - template: Jobs/Code-Quality.gitlab-ci.yml
# - template: Security/SAST.gitlab-ci.yml - template: Security/SAST.gitlab-ci.yml
# - template: Security/Dependency-Scanning.gitlab-ci.yml - template: Security/Secret-Detection.gitlab-ci.yml
# - template: Security/DAST.gitlab-ci.yml - template: Security/Dependency-Scanning.gitlab-ci.yml
- template: Security/License-Scanning.gitlab-ci.yml
# We need to duplicate this job's definition because the rules
# defined in the extended jobs rely on local YAML anchors
# (`*if-default-refs`)
code_quality: code_quality:
extends: extends:
- .default-retry - .default-retry
- .reports:rules:code_quality
- .use-docker-in-docker - .use-docker-in-docker
stage: test
needs: []
variables:
CODE_QUALITY_IMAGE: "registry.gitlab.com/gitlab-org/ci-cd/codequality:0.85.23"
script:
- |
if ! docker info &>/dev/null; then
if [ -z "$DOCKER_HOST" -a "$KUBERNETES_PORT" ]; then
export DOCKER_HOST='tcp://localhost:2375'
fi
fi
- docker pull --quiet "$CODE_QUALITY_IMAGE"
- docker run
--env SOURCE_CODE="$PWD"
--volume "$PWD":/code
--volume /var/run/docker.sock:/var/run/docker.sock
"$CODE_QUALITY_IMAGE" /code
artifacts: artifacts:
reports:
codequality: gl-code-quality-report.json
paths: paths:
- gl-code-quality-report.json # GitLab-specific - gl-code-quality-report.json # GitLab-specific
expire_in: 1 week # GitLab-specific rules: !reference [".reports:rules:code_quality", rules]
# We need to duplicate this job's definition because the rules .sast-analyzer:
# defined in the extended jobs rely on local YAML anchors # We need to re-`extends` from `sast` as the `extends` here overrides the one from the template.
# (`*if-default-refs`)
.sast:
extends: extends:
- .default-retry - .default-retry
- .reports:rules:sast - sast
stage: test
# `needs: []` starts the job immediately in the pipeline
# https://docs.gitlab.com/ee/ci/yaml/README.html#needs
needs: [] needs: []
artifacts: artifacts:
paths: paths:
- gl-sast-report.json # GitLab-specific - gl-sast-report.json # GitLab-specific
reports:
sast: gl-sast-report.json
expire_in: 1 week # GitLab-specific expire_in: 1 week # GitLab-specific
variables: variables:
DOCKER_TLS_CERTDIR: ""
SAST_ANALYZER_IMAGE_PREFIX: "registry.gitlab.com/gitlab-org/security-products/analyzers"
SAST_ANALYZER_IMAGE_TAG: 2
SAST_BRAKEMAN_LEVEL: 2 # GitLab-specific SAST_BRAKEMAN_LEVEL: 2 # GitLab-specific
SAST_EXCLUDED_PATHS: qa,spec,doc,ee/spec,config/gitlab.yml.example # GitLab-specific SAST_EXCLUDED_PATHS: "qa, spec, doc, ee/spec, config/gitlab.yml.example, tmp" # GitLab-specific
SAST_DISABLE_BABEL: "true" SAST_DISABLE_BABEL: "true"
script:
- /analyzer run
brakeman-sast: brakeman-sast:
extends: .sast rules: !reference [".reports:rules:sast", rules]
image:
name: "$SAST_ANALYZER_IMAGE_PREFIX/brakeman:$SAST_ANALYZER_IMAGE_TAG"
eslint-sast: eslint-sast:
extends: .sast rules: !reference [".reports:rules:sast", rules]
image:
name: "$SAST_ANALYZER_IMAGE_PREFIX/eslint:$SAST_ANALYZER_IMAGE_TAG"
nodejs-scan-sast: nodejs-scan-sast:
extends: .sast rules: !reference [".reports:rules:sast", rules]
image:
name: "$SAST_ANALYZER_IMAGE_PREFIX/nodejs-scan:$SAST_ANALYZER_IMAGE_TAG"
secrets-sast: semgrep-sast:
extends: .sast rules: !reference [".reports:rules:sast", rules]
image:
name: "$SAST_ANALYZER_IMAGE_PREFIX/secrets:3" .secret-analyzer:
extends: .default-retry
needs: []
artifacts: artifacts:
paths: paths:
- gl-secret-detection-report.json # GitLab-specific - gl-secret-detection-report.json # GitLab-specific
reports:
sast: gl-secret-detection-report.json
expire_in: 1 week # GitLab-specific expire_in: 1 week # GitLab-specific
# We need to duplicate this job's definition because the rules secret_detection:
# defined in the extended jobs rely on local YAML anchors rules: !reference [".reports:rules:secret_detection", rules]
# (`*if-default-refs`)
.dependency_scanning: .ds-analyzer:
# We need to re-`extends` from `dependency_scanning` as the `extends` here overrides the one from the template.
extends: extends:
- .default-retry - .default-retry
- .reports:rules:dependency_scanning - dependency_scanning
stage: test
needs: [] needs: []
variables: variables:
DS_MAJOR_VERSION: 2 DS_EXCLUDED_PATHS: "qa/qa/ee/fixtures/secure_premade_reports, spec, ee/spec, tmp" # GitLab-specific
DS_EXCLUDED_PATHS: "qa/qa/ee/fixtures/secure_premade_reports, spec, ee/spec" # GitLab-specific
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/gitlab-org/security-products/analyzers"
artifacts: artifacts:
paths: paths:
- gl-dependency-scanning-report.json # GitLab-specific - gl-dependency-scanning-report.json # GitLab-specific
reports:
dependency_scanning: gl-dependency-scanning-report.json
expire_in: 1 week # GitLab-specific expire_in: 1 week # GitLab-specific
script:
- /analyzer run
dependency_scanning gemnasium: gemnasium-dependency_scanning:
extends: .dependency_scanning
image:
name: "$SECURE_ANALYZERS_PREFIX/gemnasium:$DS_MAJOR_VERSION"
before_script: before_script:
# git-lfs is needed for auto-remediation # git-lfs is needed for auto-remediation
- apk add git-lfs - apk add git-lfs
@ -123,56 +74,43 @@ dependency_scanning gemnasium:
- apk add jq - apk add jq
# Lower execa severity based on https://gitlab.com/gitlab-org/gitlab/-/issues/223859#note_452922390 # 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 - 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]
dependency_scanning bundler-audit: bundler-audit-dependency_scanning:
extends: .dependency_scanning rules: !reference [".reports:rules:dependency_scanning", rules]
image:
name: "$SECURE_ANALYZERS_PREFIX/bundler-audit:$DS_MAJOR_VERSION"
dependency_scanning retire-js: retire-js-dependency_scanning:
extends: .dependency_scanning rules: !reference [".reports:rules:dependency_scanning", rules]
image:
name: "$SECURE_ANALYZERS_PREFIX/retire.js:$DS_MAJOR_VERSION"
dependency_scanning gemnasium-python: gemnasium-python-dependency_scanning:
extends: .dependency_scanning rules: !reference [".reports:rules:dependency_scanning", rules]
image:
name: "$SECURE_ANALYZERS_PREFIX/gemnasium-python:$DS_MAJOR_VERSION"
# Analyze dependencies for malicious behavior # Analyze dependencies for malicious behavior
# See https://gitlab.com/gitlab-com/gl-security/security-research/package-hunter # See https://gitlab.com/gitlab-com/gl-security/security-research/package-hunter
package_hunter: package_hunter:
extends: extends:
- .reports:schedule-dast - .default-retry
- .reports:rules:package_hunter
stage: test stage: test
image: 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:latest
entrypoint: [""] entrypoint: [""]
needs: [] needs: []
allow_failure: true
script: script:
- rm -r spec locale .git app/assets/images doc/ - rm -r spec locale .git app/assets/images doc/
- cd .. && tar -I "gzip --best" -cf gitlab.tgz gitlab/ - 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 - 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: artifacts:
paths: paths:
- gl-dependency-scanning-report.json # GitLab-specific - gl-dependency-scanning-report.json
reports: reports:
dependency_scanning: gl-dependency-scanning-report.json dependency_scanning: gl-dependency-scanning-report.json
expire_in: 1 week # GitLab-specific expire_in: 1 week
license_scanning: license_scanning:
extends: extends: .default-retry
- .default-retry
- .reports:rules:license_scanning
stage: test
image:
name: "registry.gitlab.com/gitlab-org/security-products/analyzers/license-finder:3"
entrypoint: [""]
needs: [] needs: []
script:
- /run.sh analyze .
artifacts: artifacts:
reports:
license_scanning: gl-license-scanning-report.json
expire_in: 1 week # GitLab-specific expire_in: 1 week # GitLab-specific
dependencies: [] rules: !reference [".reports:rules:license_scanning", rules]

View file

@ -34,10 +34,7 @@ review-build-cng:
- job: compile-production-assets - job: compile-production-assets
artifacts: false artifacts: false
script: script:
- BUILD_TRIGGER_TOKEN=$REVIEW_APPS_BUILD_TRIGGER_TOKEN ./scripts/trigger-build cng - ./scripts/trigger-build cng
# When the job is manual, review-deploy is also manual and we don't want people
# to have to manually start the jobs in sequence, so we do it for them.
- '[ -z $CI_JOB_MANUAL ] || scripts/api/play_job.rb --job-name "review-deploy"'
.review-workflow-base: .review-workflow-base:
extends: extends:
@ -45,7 +42,6 @@ review-build-cng:
image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3-kubectl1.14 image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3-kubectl1.14
variables: variables:
HOST_SUFFIX: "${CI_ENVIRONMENT_SLUG}" HOST_SUFFIX: "${CI_ENVIRONMENT_SLUG}"
REVIEW_APPS_DOMAIN: "temp.gitlab-review.app" # FIXME: using temporary domain
DOMAIN: "-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}" DOMAIN: "-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}"
GITLAB_HELM_CHART_REF: "v4.6.3" GITLAB_HELM_CHART_REF: "v4.6.3"
environment: environment:
@ -59,7 +55,7 @@ review-deploy:
- .review-workflow-base - .review-workflow-base
- .review:rules:review-deploy - .review:rules:review-deploy
stage: review stage: review
dependencies: [] needs: ["review-build-cng"]
resource_group: "review/${CI_COMMIT_REF_NAME}" resource_group: "review/${CI_COMMIT_REF_NAME}"
before_script: before_script:
- export GITLAB_SHELL_VERSION=$(<GITLAB_SHELL_VERSION) - export GITLAB_SHELL_VERSION=$(<GITLAB_SHELL_VERSION)
@ -75,10 +71,6 @@ review-deploy:
- date - date
- deploy || (display_deployment_debug && exit 1) - deploy || (display_deployment_debug && exit 1)
- disable_sign_ups || (delete_release && exit 1) - disable_sign_ups || (delete_release && exit 1)
# When the job is manual, review-qa-smoke is also manual and we don't want people
# to have to manually start the jobs in sequence, so we do it for them.
- '[ -z $CI_JOB_MANUAL ] || scripts/api/play_job.rb --job-name "review-qa-smoke"'
- '[ -z $CI_JOB_MANUAL ] || scripts/api/play_job.rb --job-name "review-performance"'
after_script: after_script:
# Run seed-dast-test-data.sh only when DAST_RUN is set to true. This is to pupulate review app with data for DAST scan. # Run seed-dast-test-data.sh only when DAST_RUN is set to true. This is to pupulate review app with data for DAST scan.
# Set DAST_RUN to true when jobs are manually scheduled. # Set DAST_RUN to true when jobs are manually scheduled.
@ -123,9 +115,7 @@ review-stop:
- .use-docker-in-docker - .use-docker-in-docker
image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-alpine-ruby-2.7 image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-alpine-ruby-2.7
stage: qa stage: qa
# This is needed so that manual jobs with needs don't block the pipeline. needs: ["review-deploy"]
# See https://gitlab.com/gitlab-org/gitlab/-/issues/199979.
dependencies: ["review-deploy"]
variables: variables:
QA_ARTIFACTS_DIR: "${CI_PROJECT_DIR}/qa" QA_ARTIFACTS_DIR: "${CI_PROJECT_DIR}/qa"
QA_CAN_TEST_GIT_PROTOCOL_V2: "false" QA_CAN_TEST_GIT_PROTOCOL_V2: "false"
@ -175,9 +165,7 @@ review-performance:
name: sitespeedio/sitespeed.io name: sitespeedio/sitespeed.io
entrypoint: [""] entrypoint: [""]
stage: qa stage: qa
# This is needed so that manual jobs with needs don't block the pipeline. needs: ["review-deploy"]
# See https://gitlab.com/gitlab-org/gitlab/-/issues/199979.
dependencies: ["review-deploy"]
before_script: before_script:
- export CI_ENVIRONMENT_URL="$(cat environment_url.txt)" - export CI_ENVIRONMENT_URL="$(cat environment_url.txt)"
- echo "${CI_ENVIRONMENT_URL}" - echo "${CI_ENVIRONMENT_URL}"
@ -200,7 +188,7 @@ parallel-spec-reports:
- .review:rules:review-qa-all - .review:rules:review-qa-all
image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine
stage: post-qa stage: post-qa
dependencies: ["review-qa-all"] needs: ["review-qa-all"]
variables: variables:
NEW_PARALLEL_SPECS_REPORT: qa/report-new.html NEW_PARALLEL_SPECS_REPORT: qa/report-new.html
BASE_ARTIFACT_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/file/qa/" BASE_ARTIFACT_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/file/qa/"
@ -229,8 +217,8 @@ danger-review:
stage: test stage: test
needs: [] needs: []
before_script: before_script:
- source ./scripts/utils.sh - source scripts/utils.sh
- run_timed_command "bundle install --jobs=$(nproc) --path=vendor --retry=3 --quiet --with danger" - bundle_install_script "--with danger"
- run_timed_command "retry yarn install --frozen-lockfile" - run_timed_command "retry yarn install --frozen-lockfile"
script: script:
- > - >
@ -242,12 +230,3 @@ danger-review:
else else
run_timed_command "bundle exec danger --fail-on-errors=true --verbose" run_timed_command "bundle exec danger --fail-on-errors=true --verbose"
fi fi
update-danger-review-cache:
extends:
- danger-review
- .shared:rules:update-cache
stage: prepare
script: echo 'Cache is fresh!'
cache:
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.

View file

@ -124,7 +124,7 @@
.docs-patterns: &docs-patterns .docs-patterns: &docs-patterns
- ".gitlab/route-map.yml" - ".gitlab/route-map.yml"
- "doc/**/*" - "doc/**/*"
- ".markdownlint.json" - ".markdownlint.yml"
- "scripts/lint-doc.sh" - "scripts/lint-doc.sh"
.frontend-dependency-patterns: &frontend-dependency-patterns .frontend-dependency-patterns: &frontend-dependency-patterns
@ -424,6 +424,13 @@
- <<: *if-default-refs - <<: *if-default-refs
changes: *code-backstage-patterns changes: *code-backstage-patterns
.frontend:rules:default-frontend-jobs-ee:
rules:
- <<: *if-not-ee
when: never
- <<: *if-default-refs
changes: *code-backstage-patterns
.frontend:rules:default-frontend-jobs-as-if-foss: .frontend:rules:default-frontend-jobs-as-if-foss:
rules: rules:
- <<: *if-not-ee - <<: *if-not-ee
@ -518,6 +525,8 @@
.qa:rules:package-and-qa: .qa:rules:package-and-qa:
rules: rules:
- <<: *if-not-ee
when: never
- <<: *if-dot-com-gitlab-org-and-security-merge-request - <<: *if-dot-com-gitlab-org-and-security-merge-request
changes: *ci-qa-patterns changes: *ci-qa-patterns
allow_failure: true allow_failure: true
@ -929,6 +938,25 @@
- <<: *if-merge-request - <<: *if-merge-request
changes: [".gitlab/ci/rails.gitlab-ci.yml"] changes: [".gitlab/ci/rails.gitlab-ci.yml"]
#########################
# Static analysis rules #
#########################
.static-analysis:rules:ee-and-foss:
rules:
- changes: *code-backstage-qa-patterns
.static-analysis:rules:as-if-foss:
rules:
- <<: *if-not-ee
when: never
- <<: *if-merge-request-title-as-if-foss
changes: *code-backstage-qa-patterns
- <<: *if-security-merge-request
changes: *code-backstage-qa-patterns
- <<: *if-merge-request
changes: *ci-patterns
####################### #######################
# Vendored gems rules # # Vendored gems rules #
####################### #######################
@ -975,6 +1003,16 @@
changes: *code-backstage-qa-patterns changes: *code-backstage-qa-patterns
allow_failure: true allow_failure: true
.reports:rules:secret_detection:
rules:
- if: '$SECRET_DETECTION_DISABLED'
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:dependency_scanning:
rules: rules:
- if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/' - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/'
@ -996,13 +1034,19 @@
when: manual when: manual
allow_failure: true allow_failure: true
.reports:schedule-dast: .reports:rules:schedule-dast:
rules: rules:
- if: '$DAST_DISABLED || $GITLAB_FEATURES !~ /\bdast\b/' - if: '$DAST_DISABLED || $GITLAB_FEATURES !~ /\bdast\b/'
when: never when: never
- <<: *if-default-branch-schedule-nightly - <<: *if-default-branch-schedule-nightly
allow_failure: true allow_failure: true
.reports:rules:package_hunter:
rules:
- <<: *if-default-branch-schedule-2-hourly
- <<: *if-merge-request
changes: ["yarn.lock"]
.reports:rules:license_scanning: .reports:rules:license_scanning:
rules: rules:
- if: '$LICENSE_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\blicense_scanning\b/' - if: '$LICENSE_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\blicense_scanning\b/'
@ -1042,7 +1086,6 @@
allow_failure: true allow_failure: true
- <<: *if-dot-com-gitlab-org-merge-request - <<: *if-dot-com-gitlab-org-merge-request
changes: *code-patterns changes: *code-patterns
when: manual
allow_failure: true allow_failure: true
- <<: *if-dot-com-gitlab-org-merge-request - <<: *if-dot-com-gitlab-org-merge-request
changes: *qa-patterns changes: *qa-patterns
@ -1063,7 +1106,6 @@
allow_failure: true allow_failure: true
- <<: *if-dot-com-gitlab-org-merge-request - <<: *if-dot-com-gitlab-org-merge-request
changes: *code-qa-patterns changes: *code-qa-patterns
when: manual
allow_failure: true allow_failure: true
- <<: *if-dot-com-gitlab-org-schedule - <<: *if-dot-com-gitlab-org-schedule
allow_failure: true allow_failure: true
@ -1086,7 +1128,6 @@
allow_failure: true allow_failure: true
- <<: *if-dot-com-gitlab-org-merge-request - <<: *if-dot-com-gitlab-org-merge-request
changes: *code-qa-patterns changes: *code-qa-patterns
when: manual
allow_failure: true allow_failure: true
.review:rules:review-qa-all: .review:rules:review-qa-all:

View file

@ -27,19 +27,19 @@ update-tests-metadata:
stage: post-test stage: post-test
dependencies: dependencies:
- setup-test-env - setup-test-env
- rspec migration pg11 - rspec migration pg12
- rspec frontend_fixture - rspec frontend_fixture
- rspec-ee frontend_fixture - rspec-ee frontend_fixture
- rspec unit pg11 - rspec unit pg12
- rspec integration pg11 - rspec integration pg12
- rspec system pg11 - rspec system pg12
- rspec-ee migration pg11 - rspec-ee migration pg12
- rspec-ee unit pg11 - rspec-ee unit pg12
- rspec-ee integration pg11 - rspec-ee integration pg12
- rspec-ee system pg11 - rspec-ee system pg12
- rspec-ee unit pg11 geo - rspec-ee unit pg12 geo
- rspec-ee integration pg11 geo - rspec-ee integration pg12 geo
- rspec-ee system pg11 geo - rspec-ee system pg12 geo
script: script:
- run_timed_command "retry gem install fog-aws mime-types activesupport rspec_profiling postgres-copy --no-document" - run_timed_command "retry gem install fog-aws mime-types activesupport rspec_profiling postgres-copy --no-document"
- source ./scripts/rspec_helpers.sh - source ./scripts/rspec_helpers.sh

View file

@ -0,0 +1,13 @@
<!-- Audit Event documentation: See https://docs.gitlab.com/ee/administration/audit_events.html -->
## Audit need
<!-- Describe the real-world use case for the audit event you want to introduce, and explain the closest thing that GitLab already captures. -->
## Proposal
<!-- Describe the audit event you are proposing should be added, including any details of what should be captured, how, and why. -->
/label ~"Category:Audit Events"
/label ~"feature"
/label ~"group::compliance"

View file

@ -0,0 +1,48 @@
## Experiment summary
We believe that... {describe your hypothesis in one sentence}
To verify that, we will... {describe your test in one sentence}
And well measure the impact on... {metrics}
## Hypothesis
<!-- The hypothesis represents the high-level thought process in creating the experiment but does not need to be proven in one experiment. For example, you could have a hypothesis that “users would benefit from more easily being able to start a trial” and your first experiment could fail, that doesnt void your hypothesis only indicates you may need to think of a new iterative experiment that would still align with your hypothesis. -->
## Business problem
<!-- Where the hypothesis is focused on the user/customer, the business problem represents why/how an experiment in this area could positively impact the business. For example, trials represent a significant way for GitLab to produce valuable leads for the sales team. -->
## Supporting data
<!-- Why should we run this experiment? Whats the potential impact? Show supporting data thats both qualitative and quantitative. Quantitative example, we generate 30,000 sign ups a month and 900 trails within 90 days (3%) with a close rate of 10% and an IACV of $400. If were able to increase our trial volume by 10% percent (990 trials a month) we will generate an additional $3,600 IACV if our close rates remain constant. Qualitative example, in searching Zendesk I was able to find 10 support tickets in the last 30 days that referenced difficulties with starting a trial due to the user not being an admin. (all numbers are hypothetical and only listed for the purpose of having an example) -->
## Expected outcome
<!-- What is the expected outcome of this experiment, what metric are we trying to move? Are there any metrics we know we do not want to impact? For example, we want to impact IACV by increasing the rate at which users start trials within 30 days but we also want to ensure we don't increase the churn rate for users who've recently purchased. -->
## Experiment design & implementation
<!-- What is the experiment were going to run? How long do you believe it will need to run to reach significance? For example, our experiment would be to allow non-admins to request a trial through their admin, to detect a 10% change from our baseline conversion rate well need a sample size of 57,000 (source Optimizely), with our current sign up rate of 30,000 a month this experiment will need to run for ~2 months. (all numbers are hypothetical and only listed for the purpose of having an example) -->
## ICE score
<!-- See https://about.gitlab.com/handbook/product/growth/#growth-ideation-and-prioritization -->
| Impact | Confidence | Ease | Score |
| ------ | ------ | ------ | ------ |
| value 1 | value 2 | value 3 | Average(1:3) |
## Known assumptions
<!-- This is an area to call out known assumptions in the experiment, this is especially helpful for any future colleagues that join the team so they understand other potential influences and how they were accounted for. This section is also helpful in framing possible scenarios and to keep the door open for the next steps. For example, were hoping our experiment will increase the number of people that start a trial but were assuming the conversion rate to paid and IACV will remain the same. This is a known assumption and depending on the results of the experiment could impact the direction we take on any future iterations. -->
## Results, lessons learned, next steps
<!-- What were the results of the experiment? Was the experiment a success or a failure? Based on the results should we remove the code or advocate that it become a permanent part of the experience for all users? Are there future experiments the team is going to run based off these results (include a link to new issue)? For example, our trial experiment was successful we increased the trial create rate by 10% but we saw a 1% drop in our close rate which means our net impact on IACV was negative $360 (990 * 0.09 * 400 compared tot he control of 900 * 0.1 * 400). Our next experiment (link) will focus on increasing the value once a user starts a trial. (all numbers are hypothetical and only listed for the purpose of having an example) -->
## Checklist
* [ ] Fill in the experiment summary and write more about the details of the experiment in the rest of the issue description. Some of these may be filled in through time (the "Result, learnings, next steps" section for example) but at least the experiment summary should be filled in right from the start.
* [ ] Add the label of the `group::` that will work on this experiment (if known).
* [ ] Mention the Product Manager, Engineering Manager, and at least one Product Designer from the group that owns the part of the product that the experiment will affect.
* [ ] Fill in the values in the [ICE score table](#ice-score) ping other team members for the values you arent confident about (i.e. engineering should almost always fill out the ease section). Add the ~"ICE Score Needed" label to indicate that the score is incomplete.
* [ ] Replace the ~"ICE Score Needed" with an ICE low/medium/high score label once all values in the ICE table have been added.
* [ ] Mention the [at]gitlab-core-team team and ask for their feedback.
/label ~"workflow::validation backlog" ~"experiment idea"

View file

@ -0,0 +1,28 @@
<!-- Title suggestion: [Feature flag] Remove FEATURE_FLAG_NAME -->
## Feature
The `:feature_name` feature flag was previously [enabled by default](URL) and should be removed.
## Owners
- Group: ~"group::GROUP_NAME"
- Slack channel: `#g_GROUP_NAME`
- DRI: USERNAME
- PM: USERNAME
**Removal**
This is an __important__ phase, that should be either done in the next Milestone or as soon as possible. For the cleanup phase, please follow our documentation on how to [clean up the feature flag](https://docs.gitlab.com/ee/development/feature_flags/controls.html#cleaning-up).
- [ ] Remove `:feature_name` feature flag
- [ ] Remove all references to the feature flag from the codebase
- [ ] Remove the YAML definitions for the feature from the repository
- [ ] Create a Changelog Entry
- [ ] Clean up the feature flag from all environments by running this chatops command in `#production` channel `/chatops run feature delete some_feature`.
- [ ] Close this issue after the feature flag is removed from the codebase.
/label ~"feature flag" ~"technical debt"
/assign DRI

View file

@ -1,11 +1,11 @@
<!-- Title suggestion: [Feature flag] Enable description of feature --> <!-- Title suggestion: [Feature flag] Enable description of feature -->
## Feature ## Summary
This feature uses the `:feature_name` feature flag! This issue is to rollout [the feature](ISSUE LINK) on production,
that is currently behind the `<feature-flag-name>` feature flag.
<!-- Short description of what the feature is about and link to relevant other issues. --> <!-- Short description of what the feature is about and link to relevant other issues. -->
- [Issue Name](ISSUE LINK)
## Owners ## Owners
@ -26,14 +26,15 @@ Are there any other stages or teams involved that need to be kept in the loop?
## The Rollout Plan ## The Rollout Plan
- Partial Rollout on GitLab.com with beta groups - Partial Rollout on GitLab.com with testing groups
- Rollout on GitLab.com for a certain period (How long) - Rollout on GitLab.com for a certain period (How long)
- Percentage Rollout on GitLab.com - Percentage Rollout on GitLab.com
- Rollout Feature for everyone as soon as it's ready - Rollout Feature for everyone as soon as it's ready
<!-- Which dashboards from https://dashboards.gitlab.net are most relevant? Sentry errors reports can also be useful to review --> <!-- Which dashboards from https://dashboards.gitlab.net are most relevant? Sentry errors reports can also be useful to review -->
**Beta Groups/Projects:** ## Testing Groups/Projects/Users
<!-- If applicable, any groups/projects that are happy to have this feature turned on early. Some organizations may wish to test big changes they are interested in with a small subset of users ahead of time for example. --> <!-- If applicable, any groups/projects that are happy to have this feature turned on early. Some organizations may wish to test big changes they are interested in with a small subset of users ahead of time for example. -->
- `gitlab-org/gitlab` project - `gitlab-org/gitlab` project
@ -55,60 +56,97 @@ Are there any other stages or teams involved that need to be kept in the loop?
<!-- Which dashboards from https://dashboards.gitlab.net are most relevant? --> <!-- Which dashboards from https://dashboards.gitlab.net are most relevant? -->
## Rollout Timeline ## Rollout Steps
<!-- Please check which steps are needed and remove those which don't apply --> ### Rollout on non-production environments
**Initial Rollout** - [ ] Ensure that the feature MRs have been deployed to non-production environments.
- [ ] `/chatops run auto_deploy status <merge-commit-of-your-feature>`
- [ ] Enable the feature globally on non-production environments.
- [ ] `/chatops run feature set <feature-flag-name> true --dev`
- [ ] `/chatops run feature set <feature-flag-name> true --staging`
- [ ] Verify that the feature works as expected. Posting the QA result in this issue is preferable.
*Preparation Phase* ### Preparation before production rollout
- [ ] Enable on staging (`/chatops run feature set feature_name true --staging`)
- [ ] Test on staging - [ ] Ensure that the feature MRs have been deployed to both production and canary.
- [ ] `/chatops run auto_deploy status <merge-commit-of-your-feature>`
- [ ] Check if the feature flag change needs to be accompanied with a
[change management issue](https://about.gitlab.com/handbook/engineering/infrastructure/change-management/#feature-flags-and-the-change-management-process).
Cross link the issue here if it does.
- [ ] Ensure that you or a representative in development can be available for at least 2 hours after feature flag updates in production.
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 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.
- [ ] Ensure that documentation has been updated ([More info](https://docs.gitlab.com/ee/development/documentation/feature_flags.html#features-that-became-enabled-by-default)) ### Global rollout on production
- [ ] Announce on the issue an estimated time this will be enabled on GitLab.com - [ ] [Incrementally roll out](https://docs.gitlab.com/ee/development/feature_flags/controls.html#process) the feature.
- If the feature flag in code has [an actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), perform **actor-based** rollout.
- [ ] `/chatops run feature set <feature-flag-name> <rollout-percentage> --actors`
- If the feature flag in code does **NOT** have [an actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), perform time-based rollout (**random** rollout).
- [ ] `/chatops run feature set <feature-flag-name> <rollout-percentage>`
- 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).
*Partial Rollout Phase* ### (Optional) Release the feature with the feature flag
- [ ] Enable on GitLab.com for individual groups/projects listed above and verify behaviour (`/chatops run feature set --project=gitlab-org/gitlab feature_name true`)
- [ ] Verify behaviour (See Beta Groups) and add details with screenshots as a comment on this issue If you're still unsure whether the feature is [deemed stable](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#including-a-feature-behind-feature-flag-in-the-final-release)
but want to release it in the current milestone, you can change the default state of the feature flag to be enabled.
To do so, follow these steps:
- [ ] If it is possible to perform an incremental rollout, this should be preferred. Proposed increments are: `10%`, `50%`, `100%`. Proposed minimum time between increments is 15 minutes. - [ ] Create a merge request with the following changes. Ask for review and merge it.
- When setting percentages, make sure that the feature works correctly between feature checks. See https://gitlab.com/gitlab-org/gitlab/-/issues/327117 for more information - [ ] 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`.
- For actor-based rollout: `/chatops run feature set feature_name 10 --actors` - [ ] Create [a changelog entry](https://docs.gitlab.com/ee/development/feature_flags/#changelog).
- For time-based rollout: `/chatops run feature set feature_name 10` - [ ] Ensure that the above 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>`
- [ ] Close [the feature issue](ISSUE LINK) to indicate the feature will be released in the current milestone.
- [ ] Make the feature flag enabled by default i.e. Change `default_enabled` to `true` **WARNING:** This approach has the downside that it makes it difficult for us to
[clean up](https://docs.gitlab.com/ee/development/feature_flags/controls.html#cleaning-up) the flag.
For example, on-premise users could disable the feature on their GitLab instance. But when you
remove the flag at some point, they suddenly see the feature as enabled and they can't roll it back
to the previous behavior. To avoid this potential breaking change, use this approach only for urgent
matters.
- [ ] 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#where-to-run-commands)) and in your team channel ### Release the feature
After the feature has been [deemed stable](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#including-a-feature-behind-feature-flag-in-the-final-release),
the [clean up](https://docs.gitlab.com/ee/development/feature_flags/controls.html#cleaning-up)
should be done as soon as possible to permanently enable the feature and reduce complexity in the
codebase.
**Cleanup** <!-- The checklist here is to help stakeholders keep track of the feature flag status -->
- [ ] Create a merge request to remove `<feature-flag-name>` feature flag. Ask for review and merge it.
This is an __important__ phase, that should be either done in the next Milestone or as soon as possible. For the cleanup phase, please follow our documentation on how to [clean up the feature flag](https://docs.gitlab.com/ee/development/feature_flags/controls.html#cleaning-up). - [ ] Remove all references to the feature flag from the codebase.
- [ ] Remove the YAML definitions for the feature from the repository.
<!-- The checklist here is to keep track of it's status for stakeholders --> - [ ] Create [a changelog entry](https://docs.gitlab.com/ee/development/feature_flags/#changelog).
- [ ] Announce on the issue that the flag has been enabled - [ ] Ensure that the above 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),
- [ ] Remove `:feature_name` feature flag the feature can be officially announced in a release blog post.
- [ ] Remove all references to the feature flag from the codebase - [ ] `/chatops run auto_deploy status <merge-commit>`
- [ ] Remove the YAML definitions for the feature from the repository - [ ] Close [the feature issue](ISSUE LINK) to indicate the feature will be released in the current milestone.
- [ ] Create a Changelog Entry - [ ] Clean up the feature flag from all environments by running these chatops command in `#production` channel:
- [ ] `/chatops run feature delete <feature-flag-name> --dev`
- [ ] Clean up the feature flag from all environments by running this chatops command in `#production` channel `/chatops run feature delete some_feature`. - [ ] `/chatops run feature delete <feature-flag-name> --staging`
- [ ] `/chatops run feature delete <feature-flag-name>`
**Final Step** - [ ] Close this rollout issue.
- [ ] Close this rollout issue for the feature flag after the feature flag is removed from the codebase.
## Rollback Steps ## Rollback Steps
- [ ] This feature can be disabled by running the following Chatops command: - [ ] This feature can be disabled by running the following Chatops command:
``` ```
/chatops run feature set --project=gitlab-org/gitlab feature_name false /chatops run feature set <feature-flag-name> false
``` ```
/label ~"feature flag" /label ~"feature flag"

View file

@ -4,7 +4,7 @@
<!-- 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. --> <!-- 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.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. <!-- 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 ~"group::" ~"section::" ~"Category::" ~"GitLab Core"/~"GitLab Premium"/~"GitLab Ultimate"

View file

@ -14,14 +14,14 @@
/label ~"feature" ~"group::" ~"section::" ~"Category::" ~"GitLab Core"/~"GitLab Premium"/~"GitLab Ultimate" /label ~"feature" ~"group::" ~"section::" ~"Category::" ~"GitLab Free"/~"GitLab Premium"/~"GitLab Ultimate"
<!--- Use the following resources to find the appropriate labels: <!--- Use the following resources to find the appropriate labels:
- https://gitlab.com/gitlab-org/gitlab/-/labels - https://gitlab.com/gitlab-org/gitlab/-/labels
- https://about.gitlab.com/handbook/product/categories/features/ - https://about.gitlab.com/handbook/product/categories/features/
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.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. 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.
Other sections to consider adding: Other sections to consider adding:

View file

@ -111,7 +111,7 @@ Use the following resources to find the appropriate labels:
- https://about.gitlab.com/handbook/product/categories/features/ - https://about.gitlab.com/handbook/product/categories/features/
--> -->
/label ~devops:: ~group: ~Category: /label ~devops:: ~group: ~Category:
/label ~"GitLab Core"/~"GitLab Premium"/~"GitLab Ultimate" /label ~"GitLab Free"/~"GitLab Premium"/~"GitLab Ultimate"
/label ~feature /label ~feature
/label ~documentation /label ~documentation
/label ~direction /label ~direction

View file

@ -24,7 +24,7 @@ This issue is for implementing Geo replication and verification of Cool Widgets.
For more background, see [Geo self-service framework](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/geo/framework.md). For more background, see [Geo self-service framework](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/geo/framework.md).
In order to implement and test this feature, you need to first [set up Geo locally](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/geo.md). In order to implement and test this feature, you need to first [set up Geo locally](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/geo.md).
There are three main sections below. It is a good idea to structure your merge requests this way as well: There are three main sections below. It is a good idea to structure your merge requests this way as well:

View file

@ -24,7 +24,7 @@ This issue is for implementing Geo replication and verification of Cool Widgets.
For more background, see [Geo self-service framework](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/geo/framework.md). For more background, see [Geo self-service framework](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/geo/framework.md).
In order to implement and test this feature, you need to first [set up Geo locally](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/geo.md). In order to implement and test this feature, you need to first [set up Geo locally](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/geo.md).
There are three main sections below. It is a good idea to structure your merge requests this way as well: There are three main sections below. It is a good idea to structure your merge requests this way as well:

View file

@ -23,7 +23,11 @@
- ~"development guidelines" when changing docs under `doc/development/*`, `CONTRIBUTING.md`, or `README.md`. - ~"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 ~"Documentation guidelines" when changing docs under `development/documentation/*`.
- ~"development guidelines" and ~"Description templates (.gitlab/\*)" when creating/updating issue and MR description templates. - ~"development guidelines" and ~"Description templates (.gitlab/\*)" when creating/updating issue and MR description templates.
- [ ] Assign the [designated Technical Writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments). - [ ] [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).
/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. 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.
@ -68,5 +72,3 @@ For more information, see our documentation on [Merging a merge request](https:/
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. [ ] 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. [ ] 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). 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

View file

@ -15,6 +15,7 @@ Please link to the respective test case in the testcases project
- [ ] Verify the tags to ensure it runs on the desired test environments. - [ ] Verify the tags to ensure it runs on the desired test environments.
- [ ] If this MR has a dependency on another MR, such as a GitLab QA MR, specify the order in which the MRs should be merged. - [ ] If this MR has a dependency on another MR, such as a GitLab QA MR, specify the order in which the MRs should be merged.
- [ ] (If applicable) Create a follow-up issue to document [the special setup](https://docs.gitlab.com/ee/development/testing_guide/end_to_end/running_tests_that_require_special_setup.html) necessary to run the test: ISSUE_LINK - [ ] (If applicable) Create a follow-up issue to document [the special setup](https://docs.gitlab.com/ee/development/testing_guide/end_to_end/running_tests_that_require_special_setup.html) necessary to run the test: ISSUE_LINK
- [ ] If the test requires an admin's personal access token, ensure that the test passes on your local with and without the `GITLAB_QA_ADMIN_ACCESS_TOKEN` provided.
<!-- Base labels. --> <!-- Base labels. -->
/label ~"Quality" ~"QA" ~test /label ~"Quality" ~"QA" ~test

View file

@ -1,4 +1,4 @@
image: registry.gitlab.com/gitlab-org/gitlab-development-kit/gitpod-workspace:gitpod-workspace-image image: registry.gitlab.com/gitlab-org/gitlab-development-kit/gitpod-workspace:stable
tasks: tasks:
@ -7,8 +7,6 @@ tasks:
- init: | - init: |
echo "$(date) Copying GDK" | tee -a /workspace/startup.log echo "$(date) Copying GDK" | tee -a /workspace/startup.log
rm -r /workspace/.rvm
mv $HOME/.rvm-workspace /workspace/.rvm
cp -r $HOME/gitlab-development-kit /workspace/ cp -r $HOME/gitlab-development-kit /workspace/
( (
set -e set -e

View file

@ -110,7 +110,6 @@ linters:
- Layout/EmptyLineAfterGuardClause - Layout/EmptyLineAfterGuardClause
- Layout/LeadingCommentSpace - Layout/LeadingCommentSpace
- Layout/SpaceAroundOperators - Layout/SpaceAroundOperators
- Layout/SpaceBeforeBlockBraces
- Layout/SpaceBeforeComma - Layout/SpaceBeforeComma
- Layout/SpaceBeforeFirstArg - Layout/SpaceBeforeFirstArg
- Layout/SpaceInsideHashLiteralBraces - Layout/SpaceInsideHashLiteralBraces
@ -118,7 +117,6 @@ linters:
- Layout/TrailingEmptyLines - Layout/TrailingEmptyLines
- Lint/LiteralInInterpolation - Lint/LiteralInInterpolation
- Lint/ParenthesesAsGroupedExpression - Lint/ParenthesesAsGroupedExpression
- Lint/RedundantWithIndex
- Lint/SafeNavigationConsistency - Lint/SafeNavigationConsistency
- Metrics/BlockNesting - Metrics/BlockNesting
- Naming/VariableName - Naming/VariableName
@ -133,7 +131,6 @@ linters:
- Style/IdenticalConditionalBranches - Style/IdenticalConditionalBranches
- Style/NegatedIf - Style/NegatedIf
- Style/NestedTernaryOperator - Style/NestedTernaryOperator
- Style/ParenthesesAroundCondition
- Style/SelfAssignment - Style/SelfAssignment
- Style/TernaryParentheses - Style/TernaryParentheses
- Style/TrailingCommaInHashLiteral - Style/TrailingCommaInHashLiteral

View file

@ -1,148 +0,0 @@
{
"default": true,
"first-header-h1": true,
"header-style": {
"style": "atx"
},
"ul-style": {
"style": "dash"
},
"no-trailing-spaces": false,
"line-length": false,
"no-duplicate-header": {
"allow_different_nesting": true
},
"no-trailing-punctuation": {
"punctuation": ".,;:!。,;:!?"
},
"ol-prefix": {
"style": "one"
},
"no-inline-html": false,
"hr-style": {
"style": "---"
},
"no-emphasis-as-heading": false,
"first-line-h1": false,
"code-block-style": {
"style": "fenced"
},
"proper-names": {
"names": [
"Akismet",
"Alertmanager",
"API",
"Asana",
"Auth0",
"Authentiq",
"Azure",
"Bamboo",
"Bitbucket",
"Bugzilla",
"CAS",
"CentOS",
"Consul",
"Debian",
"DevOps",
"Docker",
"DockerSlim",
"Elasticsearch",
"Facebook",
"fastlane",
"fluent-plugin-redis-slowlog",
"GDK",
"Geo",
"Git LFS",
"git-annex",
"Git",
"Gitaly",
"GitHub",
"GitLab Geo",
"GitLab Monitor",
"GitLab Operator",
"GitLab Pages",
"GitLab Rails",
"GitLab Runner",
"GitLab Shell",
"GitLab Workhorse",
"GitLab",
"Gitleaks",
"Gmail",
"Google",
"Grafana",
"Gzip",
"Helm",
"HipChat",
"ID",
"Ingress",
"jasmine-jquery",
"JavaScript",
"Jaeger",
"Jenkins",
"Jira",
"Jira Cloud",
"Jira Server",
"jQuery",
"JSON",
"JupyterHub",
"Karma",
"Kerberos",
"Knative",
"Kubernetes",
"LDAP",
"Let's Encrypt",
"Markdown",
"markdownlint",
"Mattermost",
"Microsoft",
"Minikube",
"MinIO",
"ModSecurity",
"NGINX Ingress",
"NGINX",
"OAuth",
"OAuth 2",
"OmniAuth",
"Omnibus GitLab",
"OpenID",
"OpenShift",
"PgBouncer",
"PostgreSQL",
"Praefect",
"Prometheus",
"Puma",
"puma-worker-killer",
"Python",
"Rake",
"Redis",
"Redmine",
"reCAPTCHA",
"Ruby",
"runit",
"Salesforce",
"SAML",
"Sentry",
"Sidekiq",
"Shibboleth",
"Slack",
"SMTP",
"SpotBugs",
"SSH",
"Tiller",
"TOML",
"Trello",
"Trello Power-Ups",
"TypeScript",
"Twitter",
"Ubuntu",
"Ultra Auth",
"Unicorn",
"unicorn-worker-killer",
"URL",
"WebdriverIO",
"YAML",
"YouTrack"
],
"code_blocks": false
}
}

140
.markdownlint.yml Normal file
View file

@ -0,0 +1,140 @@
# Base Markdownlint configuration
# Extended Markdownlint configuration in doc/.markdownlint/
"default": true
"first-header-h1": true
"header-style":
"style": "atx"
"ul-style":
"style": "dash"
"no-trailing-spaces": false
"line-length": false
"no-duplicate-header":
"allow_different_nesting": true
"no-trailing-punctuation":
"punctuation": ".,;:!。,;:!?"
"ol-prefix":
"style": "one"
"no-inline-html": false
"hr-style":
"style": "---"
"no-emphasis-as-heading": false
"first-line-h1": false
"code-block-style":
"style": "fenced"
"proper-names":
"names": [
"Akismet",
"Alertmanager",
"API",
"Asana",
"Auth0",
"Authentiq",
"Azure",
"Bamboo",
"Bitbucket",
"Bugzilla",
"CAS",
"CentOS",
"Consul",
"Debian",
"DevOps",
"Docker",
"DockerSlim",
"Elasticsearch",
"Facebook",
"fastlane",
"fluent-plugin-redis-slowlog",
"GDK",
"Geo",
"Git LFS",
"git-annex",
"Git",
"Gitaly",
"GitHub",
"GitLab Geo",
"GitLab Monitor",
"GitLab Operator",
"GitLab Pages",
"GitLab Rails",
"GitLab Runner",
"GitLab Shell",
"GitLab Workhorse",
"GitLab",
"Gitleaks",
"Gmail",
"Google",
"Grafana",
"Gzip",
"Helm",
"HipChat",
"ID",
"Ingress",
"jasmine-jquery",
"JavaScript",
"Jaeger",
"Jenkins",
"Jira",
"Jira Cloud",
"Jira Server",
"jQuery",
"JSON",
"JupyterHub",
"Karma",
"Kerberos",
"Knative",
"Kubernetes",
"LDAP",
"Let's Encrypt",
"Markdown",
"markdownlint",
"Mattermost",
"Microsoft",
"Minikube",
"MinIO",
"ModSecurity",
"NGINX Ingress",
"NGINX",
"OAuth",
"OAuth 2",
"OmniAuth",
"Omnibus GitLab",
"OpenID",
"OpenShift",
"PgBouncer",
"PostgreSQL",
"Praefect",
"Prometheus",
"Puma",
"puma-worker-killer",
"Python",
"Rake",
"Redis",
"Redmine",
"reCAPTCHA",
"Ruby",
"runit",
"Salesforce",
"SAML",
"Sentry",
"Sidekiq",
"Shibboleth",
"Slack",
"SMTP",
"SpotBugs",
"SSH",
"Tiller",
"TOML",
"Trello",
"Trello Power-Ups",
"TypeScript",
"Twitter",
"Ubuntu",
"Ultra Auth",
"Unicorn",
"unicorn-worker-killer",
"URL",
"WebdriverIO",
"YAML",
"YouTrack"
]
"code_blocks": false

View file

@ -48,7 +48,7 @@ PreCommit:
enabled: true enabled: true
description: 'Lint documentation for Markdown errors' description: 'Lint documentation for Markdown errors'
required_executable: 'node_modules/.bin/markdownlint' required_executable: 'node_modules/.bin/markdownlint'
flags: ['--config', '.markdownlint.json', 'doc/**/*.md'] flags: ['--config', '.markdownlint.yml', 'doc/**/*.md']
install_command: 'yarn install' install_command: 'yarn install'
include: include:
- 'doc/**/*.md' - 'doc/**/*.md'

View file

@ -307,6 +307,9 @@ Cop/ActiveRecordAssociationReload:
- 'spec/**/*' - 'spec/**/*'
- 'ee/spec/**/*' - 'ee/spec/**/*'
Cop/ActiveModelErrorsDirectManipulation:
Enabled: true
Gitlab/AvoidFeatureGet: Gitlab/AvoidFeatureGet:
Enabled: true Enabled: true
@ -572,6 +575,9 @@ Rails/SaveBang:
- 'ee/spec/**/*.rb' - 'ee/spec/**/*.rb'
- 'qa/spec/**/*.rb' - 'qa/spec/**/*.rb'
- 'qa/qa/specs/**/*.rb' - 'qa/qa/specs/**/*.rb'
Exclude:
- spec/models/wiki_page/**/*
- spec/models/wiki_page_spec.rb
Cop/PutProjectRoutesUnderScope: Cop/PutProjectRoutesUnderScope:
Include: Include:

View file

@ -13,22 +13,9 @@
# WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/322903 # WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/322903
Graphql/Descriptions: Graphql/Descriptions:
Exclude: Exclude:
- 'app/graphql/types/access_level_enum.rb'
- 'app/graphql/types/base_enum.rb'
- 'app/graphql/types/ci/pipeline_config_source_enum.rb'
- 'app/graphql/types/ci/pipeline_status_enum.rb'
- 'app/graphql/types/container_expiration_policy_cadence_enum.rb'
- 'app/graphql/types/container_expiration_policy_keep_enum.rb'
- 'app/graphql/types/container_expiration_policy_older_than_enum.rb'
- 'app/graphql/types/notes/position_type_enum.rb'
- 'app/graphql/types/packages/package_type_enum.rb'
- 'app/graphql/types/snippets/blob_action_enum.rb' - 'app/graphql/types/snippets/blob_action_enum.rb'
- 'app/graphql/types/snippets/type_enum.rb'
- 'app/graphql/types/snippets/visibility_scopes_enum.rb' - 'app/graphql/types/snippets/visibility_scopes_enum.rb'
- 'app/graphql/types/todo_action_enum.rb'
- 'app/graphql/types/tree/type_enum.rb'
- 'ee/app/graphql/ee/types/list_limit_metric_enum.rb' - 'ee/app/graphql/ee/types/list_limit_metric_enum.rb'
- 'ee/app/graphql/types/alert_management/payload_alert_field_name_enum.rb'
- 'ee/app/graphql/types/epic_state_enum.rb' - 'ee/app/graphql/types/epic_state_enum.rb'
- 'ee/app/graphql/types/health_status_enum.rb' - 'ee/app/graphql/types/health_status_enum.rb'
- 'ee/app/graphql/types/iteration_state_enum.rb' - 'ee/app/graphql/types/iteration_state_enum.rb'
@ -60,18 +47,11 @@ Rails/SaveBang:
- 'ee/spec/lib/gitlab/git_access_spec.rb' - 'ee/spec/lib/gitlab/git_access_spec.rb'
- 'ee/spec/lib/gitlab/import_export/group/relation_factory_spec.rb' - 'ee/spec/lib/gitlab/import_export/group/relation_factory_spec.rb'
- 'ee/spec/lib/gitlab/mirror_spec.rb' - 'ee/spec/lib/gitlab/mirror_spec.rb'
- 'ee/spec/mailers/notify_spec.rb'
- 'ee/spec/models/application_setting_spec.rb' - 'ee/spec/models/application_setting_spec.rb'
- 'ee/spec/models/approval_merge_request_rule_spec.rb' - 'ee/spec/models/approval_merge_request_rule_spec.rb'
- 'ee/spec/models/approval_project_rule_spec.rb' - 'ee/spec/models/approval_project_rule_spec.rb'
- 'ee/spec/models/burndown_spec.rb' - 'ee/spec/models/burndown_spec.rb'
- 'ee/spec/models/ee/appearance_spec.rb'
- 'ee/spec/models/ee/ci/job_artifact_spec.rb'
- 'ee/spec/models/ee/protected_branch_spec.rb'
- 'ee/spec/models/ee/protected_ref_access_spec.rb'
- 'ee/spec/models/ee/protected_ref_spec.rb'
- 'ee/spec/models/elasticsearch_indexed_namespace_spec.rb' - 'ee/spec/models/elasticsearch_indexed_namespace_spec.rb'
- 'ee/spec/models/environment_spec.rb'
- 'ee/spec/models/epic_spec.rb' - 'ee/spec/models/epic_spec.rb'
- 'ee/spec/models/gitlab_subscription_spec.rb' - 'ee/spec/models/gitlab_subscription_spec.rb'
- 'ee/spec/models/issue_spec.rb' - 'ee/spec/models/issue_spec.rb'
@ -92,8 +72,6 @@ Rails/SaveBang:
- 'ee/spec/models/visible_approvable_spec.rb' - 'ee/spec/models/visible_approvable_spec.rb'
- 'ee/spec/models/vulnerabilities/feedback_spec.rb' - 'ee/spec/models/vulnerabilities/feedback_spec.rb'
- 'ee/spec/models/vulnerabilities/issue_link_spec.rb' - 'ee/spec/models/vulnerabilities/issue_link_spec.rb'
- 'ee/spec/services/approval_rules/finalize_service_spec.rb'
- 'ee/spec/services/approval_rules/update_service_spec.rb'
- 'ee/spec/services/ee/boards/issues/create_service_spec.rb' - 'ee/spec/services/ee/boards/issues/create_service_spec.rb'
- 'ee/spec/services/ee/boards/issues/list_service_spec.rb' - 'ee/spec/services/ee/boards/issues/list_service_spec.rb'
- 'ee/spec/services/ee/boards/lists/list_service_spec.rb' - 'ee/spec/services/ee/boards/lists/list_service_spec.rb'
@ -126,23 +104,6 @@ Rails/SaveBang:
- 'ee/spec/services/status_page/trigger_publish_service_spec.rb' - 'ee/spec/services/status_page/trigger_publish_service_spec.rb'
- 'ee/spec/services/todo_service_spec.rb' - 'ee/spec/services/todo_service_spec.rb'
- 'ee/spec/services/vulnerability_feedback/create_service_spec.rb' - 'ee/spec/services/vulnerability_feedback/create_service_spec.rb'
- 'ee/spec/support/protected_tags/access_control_shared_examples.rb'
- 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb'
- 'ee/spec/support/shared_examples/finders/geo/framework_registry_finder_shared_examples.rb'
- 'ee/spec/support/shared_examples/graphql/geo/geo_registries_resolver_shared_examples.rb'
- 'ee/spec/support/shared_examples/lib/analytics/common_merge_request_metrics_refresh_shared_examples.rb'
- 'ee/spec/support/shared_examples/policies/protected_environments_shared_examples.rb'
- 'ee/spec/workers/adjourned_project_deletion_worker_spec.rb'
- 'ee/spec/workers/clear_shared_runners_minutes_worker_spec.rb'
- 'ee/spec/workers/create_github_webhook_worker_spec.rb'
- 'ee/spec/workers/elastic_namespace_rollout_worker_spec.rb'
- 'ee/spec/workers/geo/container_repository_sync_dispatch_worker_spec.rb'
- 'ee/spec/workers/geo/file_download_dispatch_worker_spec.rb'
- 'ee/spec/workers/geo/prune_event_log_worker_spec.rb'
- 'ee/spec/workers/geo/registry_sync_worker_spec.rb'
- 'ee/spec/workers/geo/repository_shard_sync_worker_spec.rb'
- 'ee/spec/workers/repository_import_worker_spec.rb'
- 'ee/spec/workers/update_all_mirrors_worker_spec.rb'
- 'qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb' - 'qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb'
- 'qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb' - 'qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb'
- 'qa/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb' - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb'
@ -151,11 +112,6 @@ Rails/SaveBang:
- 'spec/controllers/boards/issues_controller_spec.rb' - 'spec/controllers/boards/issues_controller_spec.rb'
- 'spec/controllers/sent_notifications_controller_spec.rb' - 'spec/controllers/sent_notifications_controller_spec.rb'
- 'spec/controllers/sessions_controller_spec.rb' - 'spec/controllers/sessions_controller_spec.rb'
- 'spec/frontend/fixtures/issues.rb'
- 'spec/frontend/fixtures/merge_requests.rb'
- 'spec/graphql/mutations/merge_requests/set_locked_spec.rb'
- 'spec/graphql/mutations/merge_requests/set_wip_spec.rb'
- 'spec/graphql/resolvers/boards_resolver_spec.rb'
- 'spec/lib/after_commit_queue_spec.rb' - 'spec/lib/after_commit_queue_spec.rb'
- 'spec/lib/backup/manager_spec.rb' - 'spec/lib/backup/manager_spec.rb'
- 'spec/lib/gitlab/alerting/alert_spec.rb' - 'spec/lib/gitlab/alerting/alert_spec.rb'
@ -200,9 +156,6 @@ Rails/SaveBang:
- 'spec/lib/gitlab/middleware/go_spec.rb' - 'spec/lib/gitlab/middleware/go_spec.rb'
- 'spec/lib/gitlab/shard_health_cache_spec.rb' - 'spec/lib/gitlab/shard_health_cache_spec.rb'
- 'spec/mailers/notify_spec.rb' - 'spec/mailers/notify_spec.rb'
- 'spec/models/appearance_spec.rb'
- 'spec/models/application_record_spec.rb'
- 'spec/models/application_setting_spec.rb'
- 'spec/models/clusters/applications/helm_spec.rb' - 'spec/models/clusters/applications/helm_spec.rb'
- 'spec/models/container_repository_spec.rb' - 'spec/models/container_repository_spec.rb'
- 'spec/models/design_management/version_spec.rb' - 'spec/models/design_management/version_spec.rb'
@ -219,9 +172,6 @@ Rails/SaveBang:
- 'spec/models/jira_import_state_spec.rb' - 'spec/models/jira_import_state_spec.rb'
- 'spec/models/key_spec.rb' - 'spec/models/key_spec.rb'
- 'spec/models/lfs_objects_project_spec.rb' - 'spec/models/lfs_objects_project_spec.rb'
- 'spec/models/member_spec.rb'
- 'spec/models/members/group_member_spec.rb'
- 'spec/models/members/project_member_spec.rb'
- 'spec/models/merge_request_spec.rb' - 'spec/models/merge_request_spec.rb'
- 'spec/models/milestone_spec.rb' - 'spec/models/milestone_spec.rb'
- 'spec/models/namespace_spec.rb' - 'spec/models/namespace_spec.rb'
@ -231,10 +181,6 @@ Rails/SaveBang:
- 'spec/models/operations/feature_flags/strategy_spec.rb' - 'spec/models/operations/feature_flags/strategy_spec.rb'
- 'spec/models/operations/feature_flags/user_list_spec.rb' - 'spec/models/operations/feature_flags/user_list_spec.rb'
- 'spec/models/pages_domain_spec.rb' - 'spec/models/pages_domain_spec.rb'
- 'spec/models/project_auto_devops_spec.rb'
- 'spec/models/project_feature_spec.rb'
- 'spec/models/project_spec.rb'
- 'spec/models/project_team_spec.rb'
- 'spec/models/protectable_dropdown_spec.rb' - 'spec/models/protectable_dropdown_spec.rb'
- 'spec/models/redirect_route_spec.rb' - 'spec/models/redirect_route_spec.rb'
- 'spec/models/release_spec.rb' - 'spec/models/release_spec.rb'
@ -242,14 +188,8 @@ Rails/SaveBang:
- 'spec/models/resource_milestone_event_spec.rb' - 'spec/models/resource_milestone_event_spec.rb'
- 'spec/models/route_spec.rb' - 'spec/models/route_spec.rb'
- 'spec/models/sentry_issue_spec.rb' - 'spec/models/sentry_issue_spec.rb'
- 'spec/models/service_spec.rb'
- 'spec/models/snippet_spec.rb' - 'spec/models/snippet_spec.rb'
- 'spec/models/upload_spec.rb' - 'spec/models/upload_spec.rb'
- 'spec/models/user_preference_spec.rb'
- 'spec/models/user_spec.rb'
- 'spec/models/user_status_spec.rb'
- 'spec/models/wiki_page/meta_spec.rb'
- 'spec/models/wiki_page_spec.rb'
Rails/TimeZone: Rails/TimeZone:
Enabled: true Enabled: true
@ -410,61 +350,12 @@ Rails/TimeZone:
# WIP: https://gitlab.com/gitlab-org/gitlab/-/issues/325836 # WIP: https://gitlab.com/gitlab-org/gitlab/-/issues/325836
RSpec/EmptyLineAfterFinalLetItBe: RSpec/EmptyLineAfterFinalLetItBe:
Exclude: Exclude:
- ee/spec/controllers/groups/analytics/cycle_analytics/stages_controller_spec.rb
- ee/spec/controllers/groups/analytics/cycle_analytics/summary_controller_spec.rb
- ee/spec/controllers/groups/analytics/cycle_analytics/value_streams_controller_spec.rb
- ee/spec/controllers/groups/analytics/tasks_by_type_controller_spec.rb
- ee/spec/controllers/groups/autocomplete_sources_controller_spec.rb
- ee/spec/controllers/groups/insights_controller_spec.rb
- ee/spec/controllers/groups/todos_controller_spec.rb
- ee/spec/controllers/projects/branches_controller_spec.rb
- ee/spec/controllers/projects/incident_management/oncall_schedules_controller_spec.rb
- ee/spec/controllers/projects/insights_controller_spec.rb
- ee/spec/controllers/projects/licenses_controller_spec.rb
- ee/spec/controllers/projects/merge_requests_controller_spec.rb
- ee/spec/controllers/projects/mirrors_controller_spec.rb
- ee/spec/controllers/projects/threat_monitoring_controller_spec.rb
- ee/spec/controllers/subscriptions_controller_spec.rb - ee/spec/controllers/subscriptions_controller_spec.rb
- ee/spec/features/boards/group_boards/multiple_boards_spec.rb
- ee/spec/features/ci_shared_runner_warnings_spec.rb - ee/spec/features/ci_shared_runner_warnings_spec.rb
- ee/spec/features/dashboards/todos_spec.rb
- ee/spec/features/groups/groups_security_credentials_spec.rb
- ee/spec/features/groups/hooks/user_edits_hooks_spec.rb
- ee/spec/features/groups/iterations/user_edits_iteration_spec.rb
- ee/spec/features/groups/usage_quotas_spec.rb
- ee/spec/features/integrations/jira/jira_issues_list_spec.rb - ee/spec/features/integrations/jira/jira_issues_list_spec.rb
- ee/spec/features/issues/bulk_assignment_epic_spec.rb
- ee/spec/features/issues/user_uses_quick_actions_spec.rb
- ee/spec/features/markdown/metrics_spec.rb - ee/spec/features/markdown/metrics_spec.rb
- ee/spec/features/registrations/group_invites_during_signup_flow_spec.rb - ee/spec/features/registrations/group_invites_during_signup_flow_spec.rb
- ee/spec/features/subscriptions_spec.rb - ee/spec/features/subscriptions_spec.rb
- ee/spec/graphql/ee/mutations/concerns/mutations/resolves_issuable_spec.rb
- ee/spec/graphql/mutations/boards/update_epic_user_preferences_spec.rb
- ee/spec/graphql/mutations/clusters/agent_tokens/create_spec.rb
- ee/spec/graphql/mutations/compliance_management/frameworks/create_spec.rb
- ee/spec/graphql/mutations/compliance_management/frameworks/destroy_spec.rb
- ee/spec/graphql/mutations/compliance_management/frameworks/update_spec.rb
- ee/spec/graphql/mutations/dast_scanner_profiles/delete_spec.rb
- ee/spec/graphql/mutations/epics/add_issue_spec.rb
- ee/spec/graphql/mutations/gitlab_subscriptions/activate_spec.rb
- ee/spec/graphql/mutations/incident_management/oncall_rotation/create_spec.rb
- ee/spec/graphql/mutations/incident_management/oncall_rotation/destroy_spec.rb
- ee/spec/graphql/mutations/incident_management/oncall_schedule/create_spec.rb
- ee/spec/graphql/mutations/incident_management/oncall_schedule/destroy_spec.rb
- ee/spec/graphql/mutations/incident_management/oncall_schedule/update_spec.rb
- ee/spec/graphql/mutations/issues/set_epic_spec.rb
- ee/spec/graphql/mutations/requirements_management/export_requirements_spec.rb
- ee/spec/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb
- ee/spec/graphql/types/issue_type_spec.rb
- ee/spec/helpers/ee/graph_helper_spec.rb
- ee/spec/helpers/ee/issues_helper_spec.rb
- ee/spec/helpers/ee/projects/incidents_helper_spec.rb
- ee/spec/helpers/ee/projects/security/api_fuzzing_configuration_helper_spec.rb
- ee/spec/helpers/ee/projects/security/configuration_helper_spec.rb
- ee/spec/helpers/ee/projects/security/sast_configuration_helper_spec.rb
- ee/spec/helpers/ee/trial_helper_spec.rb
- ee/spec/helpers/ee/user_callouts_helper_spec.rb
- ee/spec/helpers/vulnerabilities_helper_spec.rb
- ee/spec/lib/ee/api/entities/user_with_admin_spec.rb - ee/spec/lib/ee/api/entities/user_with_admin_spec.rb
- ee/spec/lib/ee/api/entities/vulnerability_spec.rb - ee/spec/lib/ee/api/entities/vulnerability_spec.rb
- ee/spec/lib/ee/event_filter_spec.rb - ee/spec/lib/ee/event_filter_spec.rb
@ -484,9 +375,6 @@ RSpec/EmptyLineAfterFinalLetItBe:
- ee/spec/lib/gitlab/analytics/cycle_analytics/summary/group/stage_time_summary_spec.rb - ee/spec/lib/gitlab/analytics/cycle_analytics/summary/group/stage_time_summary_spec.rb
- ee/spec/lib/gitlab/checks/diff_check_spec.rb - ee/spec/lib/gitlab/checks/diff_check_spec.rb
- ee/spec/lib/gitlab/code_owners/loader_spec.rb - ee/spec/lib/gitlab/code_owners/loader_spec.rb
- ee/spec/lib/gitlab/elastic/document_reference_spec.rb
- ee/spec/lib/gitlab/elastic/group_search_results_spec.rb
- ee/spec/lib/gitlab/elastic/project_search_results_spec.rb
- ee/spec/lib/gitlab/git_access_spec.rb - ee/spec/lib/gitlab/git_access_spec.rb
- ee/spec/lib/gitlab/git_access_wiki_spec.rb - ee/spec/lib/gitlab/git_access_wiki_spec.rb
- ee/spec/lib/gitlab/graphql/aggregations/vulnerability_statistics/lazy_aggregate_spec.rb - ee/spec/lib/gitlab/graphql/aggregations/vulnerability_statistics/lazy_aggregate_spec.rb
@ -553,8 +441,6 @@ RSpec/EmptyLineAfterFinalLetItBe:
- ee/spec/services/alert_management/process_prometheus_alert_service_spec.rb - ee/spec/services/alert_management/process_prometheus_alert_service_spec.rb
- ee/spec/services/approval_rules/create_service_spec.rb - ee/spec/services/approval_rules/create_service_spec.rb
- ee/spec/services/audit_event_service_spec.rb - ee/spec/services/audit_event_service_spec.rb
- ee/spec/services/award_emojis/add_service_spec.rb
- ee/spec/services/award_emojis/destroy_service_spec.rb
- ee/spec/services/billable_members/destroy_service_spec.rb - ee/spec/services/billable_members/destroy_service_spec.rb
- ee/spec/services/boards/epic_boards/destroy_service_spec.rb - ee/spec/services/boards/epic_boards/destroy_service_spec.rb
- ee/spec/services/clusters/agent_tokens/create_service_spec.rb - ee/spec/services/clusters/agent_tokens/create_service_spec.rb
@ -563,7 +449,6 @@ RSpec/EmptyLineAfterFinalLetItBe:
- ee/spec/services/dast_scanner_profiles/destroy_service_spec.rb - ee/spec/services/dast_scanner_profiles/destroy_service_spec.rb
- ee/spec/services/dast_scanner_profiles/update_service_spec.rb - ee/spec/services/dast_scanner_profiles/update_service_spec.rb
- ee/spec/services/dast_site_profiles/destroy_service_spec.rb - ee/spec/services/dast_site_profiles/destroy_service_spec.rb
- ee/spec/services/dora/aggregate_metrics_service_spec.rb
- ee/spec/services/external_approval_rules/create_service_spec.rb - ee/spec/services/external_approval_rules/create_service_spec.rb
- ee/spec/services/external_approval_rules/destroy_service_spec.rb - ee/spec/services/external_approval_rules/destroy_service_spec.rb
- ee/spec/services/external_approval_rules/update_service_spec.rb - ee/spec/services/external_approval_rules/update_service_spec.rb
@ -574,12 +459,6 @@ RSpec/EmptyLineAfterFinalLetItBe:
- ee/spec/services/merge_request_approval_settings/update_service_spec.rb - ee/spec/services/merge_request_approval_settings/update_service_spec.rb
- ee/spec/services/personal_access_tokens/create_service_audit_log_spec.rb - ee/spec/services/personal_access_tokens/create_service_audit_log_spec.rb
- ee/spec/services/personal_access_tokens/groups/update_lifetime_service_spec.rb - ee/spec/services/personal_access_tokens/groups/update_lifetime_service_spec.rb
- ee/spec/services/projects/after_rename_service_spec.rb
- ee/spec/services/projects/alerting/notify_service_spec.rb
- ee/spec/services/projects/destroy_service_spec.rb
- ee/spec/services/projects/gitlab_projects_import_service_spec.rb
- ee/spec/services/projects/import_export/export_service_spec.rb
- ee/spec/services/projects/transfer_service_spec.rb
- ee/spec/services/push_rules/create_or_update_service_spec.rb - ee/spec/services/push_rules/create_or_update_service_spec.rb
- ee/spec/services/quality_management/test_cases/create_service_spec.rb - ee/spec/services/quality_management/test_cases/create_service_spec.rb
- ee/spec/services/quick_actions/interpret_service_spec.rb - ee/spec/services/quick_actions/interpret_service_spec.rb
@ -588,11 +467,6 @@ RSpec/EmptyLineAfterFinalLetItBe:
- ee/spec/services/requirements_management/update_requirement_service_spec.rb - ee/spec/services/requirements_management/update_requirement_service_spec.rb
- ee/spec/services/resource_access_tokens/create_service_spec.rb - ee/spec/services/resource_access_tokens/create_service_spec.rb
- ee/spec/services/resource_access_tokens/revoke_service_spec.rb - ee/spec/services/resource_access_tokens/revoke_service_spec.rb
- ee/spec/services/todo_service_spec.rb
- ee/spec/support/shared_examples/graphql/geo/geo_registries_resolver_shared_examples.rb
- ee/spec/support/shared_examples/graphql/mutations/set_multiple_assignees_shared_examples.rb
- ee/spec/support/shared_examples/quick_actions/issue/status_page_quick_actions_shared_examples.rb
- ee/spec/support/shared_examples/services/search_notes_shared_examples.rb
- spec/controllers/confirmations_controller_spec.rb - spec/controllers/confirmations_controller_spec.rb
- spec/controllers/dashboard/projects_controller_spec.rb - spec/controllers/dashboard/projects_controller_spec.rb
- spec/controllers/invites_controller_spec.rb - spec/controllers/invites_controller_spec.rb
@ -606,30 +480,8 @@ RSpec/EmptyLineAfterFinalLetItBe:
- spec/features/file_uploads/user_avatar_spec.rb - spec/features/file_uploads/user_avatar_spec.rb
- spec/features/issues/user_sees_breadcrumb_links_spec.rb - spec/features/issues/user_sees_breadcrumb_links_spec.rb
- spec/features/markdown/metrics_spec.rb - spec/features/markdown/metrics_spec.rb
- spec/features/merge_request/user_creates_merge_request_spec.rb
- spec/features/merge_request/user_posts_notes_spec.rb
- spec/features/operations_sidebar_link_spec.rb - spec/features/operations_sidebar_link_spec.rb
- spec/features/participants_autocomplete_spec.rb - spec/features/participants_autocomplete_spec.rb
- spec/features/projects/badges/pipeline_badge_spec.rb
- spec/features/projects/branches/user_deletes_branch_spec.rb
- spec/features/projects/commit/cherry_pick_spec.rb
- spec/features/projects/commit/user_comments_on_commit_spec.rb
- spec/features/projects/commit/user_reverts_commit_spec.rb
- spec/features/projects/commit/user_views_user_status_on_commit_spec.rb
- spec/features/projects/confluence/user_views_confluence_page_spec.rb
- spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb
- spec/features/projects/issues/design_management/user_views_design_images_spec.rb
- spec/features/projects/labels/user_sees_links_to_issuables_spec.rb
- spec/features/projects/labels/user_views_labels_spec.rb
- spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
- spec/features/projects/merge_request_button_spec.rb
- spec/features/projects/pages/user_adds_domain_spec.rb
- spec/features/projects/pipelines/pipeline_spec.rb
- spec/features/projects/product_analytics/events_spec.rb
- spec/features/projects/settings/project_settings_spec.rb
- spec/features/projects/settings/repository_settings_spec.rb
- spec/features/projects/snippets/user_views_snippets_spec.rb
- spec/features/projects/user_sees_user_popover_spec.rb
- spec/features/snippets/embedded_snippet_spec.rb - spec/features/snippets/embedded_snippet_spec.rb
- spec/finders/alert_management/alerts_finder_spec.rb - spec/finders/alert_management/alerts_finder_spec.rb
- spec/finders/ci/commit_statuses_finder_spec.rb - spec/finders/ci/commit_statuses_finder_spec.rb
@ -650,16 +502,6 @@ RSpec/EmptyLineAfterFinalLetItBe:
- spec/frontend/fixtures/pipelines.rb - spec/frontend/fixtures/pipelines.rb
- spec/graphql/features/authorization_spec.rb - spec/graphql/features/authorization_spec.rb
- spec/graphql/gitlab_schema_spec.rb - spec/graphql/gitlab_schema_spec.rb
- spec/graphql/mutations/alert_management/alerts/todo/create_spec.rb
- spec/graphql/mutations/alert_management/create_alert_issue_spec.rb
- spec/graphql/mutations/alert_management/http_integration/create_spec.rb
- spec/graphql/mutations/alert_management/http_integration/destroy_spec.rb
- spec/graphql/mutations/alert_management/http_integration/reset_token_spec.rb
- spec/graphql/mutations/alert_management/http_integration/update_spec.rb
- spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
- spec/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb
- spec/graphql/mutations/alert_management/prometheus_integration/update_spec.rb
- spec/graphql/mutations/alert_management/update_alert_status_spec.rb
- spec/graphql/mutations/boards/lists/update_spec.rb - spec/graphql/mutations/boards/lists/update_spec.rb
- spec/graphql/mutations/custom_emoji/create_spec.rb - spec/graphql/mutations/custom_emoji/create_spec.rb
- spec/graphql/mutations/discussions/toggle_resolve_spec.rb - spec/graphql/mutations/discussions/toggle_resolve_spec.rb
@ -667,53 +509,15 @@ RSpec/EmptyLineAfterFinalLetItBe:
- spec/graphql/mutations/issues/set_severity_spec.rb - spec/graphql/mutations/issues/set_severity_spec.rb
- spec/graphql/mutations/labels/create_spec.rb - spec/graphql/mutations/labels/create_spec.rb
- spec/graphql/mutations/notes/reposition_image_diff_note_spec.rb - spec/graphql/mutations/notes/reposition_image_diff_note_spec.rb
- spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb
- spec/graphql/resolvers/alert_management/alert_status_counts_resolver_spec.rb
- spec/graphql/resolvers/branch_commit_resolver_spec.rb
- spec/graphql/resolvers/design_management/designs_resolver_spec.rb
- spec/graphql/resolvers/design_management/version/designs_at_version_resolver_spec.rb
- spec/graphql/resolvers/group_milestones_resolver_spec.rb
- spec/graphql/resolvers/merge_request_pipelines_resolver_spec.rb
- spec/graphql/resolvers/metrics/dashboards/annotation_resolver_spec.rb
- spec/graphql/resolvers/project_pipeline_resolver_spec.rb
- spec/graphql/resolvers/project_pipelines_resolver_spec.rb
- spec/graphql/resolvers/timelog_resolver_spec.rb
- spec/lib/bulk_imports/groups/loaders/group_loader_spec.rb - spec/lib/bulk_imports/groups/loaders/group_loader_spec.rb
- spec/lib/extracts_path_spec.rb - spec/lib/extracts_path_spec.rb
- spec/lib/extracts_ref_spec.rb - spec/lib/extracts_ref_spec.rb
- spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb - spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
- spec/lib/gitlab/ci/build/policy/changes_spec.rb
- spec/lib/gitlab/ci/config/external/file/local_spec.rb
- spec/lib/gitlab/ci/config/external/file/project_spec.rb
- spec/lib/gitlab/ci/config/external/file/template_spec.rb
- spec/lib/gitlab/ci/config/external/mapper_spec.rb
- spec/lib/gitlab/ci/config/external/processor_spec.rb
- spec/lib/gitlab/ci/pipeline/chain/build_spec.rb
- spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb
- spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb
- spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb
- spec/lib/gitlab/ci/pipeline/chain/validate/repository_spec.rb
- spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
- spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb
- spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb
- spec/lib/gitlab/ci/pipeline/seed/processable/resource_group_spec.rb
- spec/lib/gitlab/ci/reports/test_failure_history_spec.rb
- spec/lib/gitlab/ci/syntax_templates_spec.rb
- spec/lib/gitlab/ci/trace/chunked_io_spec.rb
- spec/lib/gitlab/ci/trace_spec.rb
- spec/lib/gitlab/closing_issue_extractor_spec.rb - spec/lib/gitlab/closing_issue_extractor_spec.rb
- spec/lib/gitlab/composer/cache_spec.rb - spec/lib/gitlab/composer/cache_spec.rb
- spec/lib/gitlab/data_builder/wiki_page_spec.rb - spec/lib/gitlab/data_builder/wiki_page_spec.rb
- spec/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers_spec.rb
- spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb
- spec/lib/gitlab/deploy_key_access_spec.rb - spec/lib/gitlab/deploy_key_access_spec.rb
- spec/lib/gitlab/email/handler/service_desk_handler_spec.rb - spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
- spec/lib/gitlab/git/lfs_changes_spec.rb
- spec/lib/gitlab/git/merge_base_spec.rb
- spec/lib/gitlab/git/push_spec.rb
- spec/lib/gitlab/git_access_design_spec.rb
- spec/lib/gitlab/git_access_project_spec.rb
- spec/lib/gitlab/git_access_wiki_spec.rb
- spec/lib/gitlab/gitaly_client/operation_service_spec.rb - spec/lib/gitlab/gitaly_client/operation_service_spec.rb
- spec/lib/gitlab/gl_repository/repo_type_spec.rb - spec/lib/gitlab/gl_repository/repo_type_spec.rb
- spec/lib/gitlab/group_search_results_spec.rb - spec/lib/gitlab/group_search_results_spec.rb
@ -723,11 +527,6 @@ RSpec/EmptyLineAfterFinalLetItBe:
- spec/lib/gitlab/prometheus/query_variables_spec.rb - spec/lib/gitlab/prometheus/query_variables_spec.rb
- spec/lib/gitlab/reactive_cache_set_cache_spec.rb - spec/lib/gitlab/reactive_cache_set_cache_spec.rb
- spec/lib/gitlab/reference_extractor_spec.rb - spec/lib/gitlab/reference_extractor_spec.rb
- spec/lib/gitlab/repository_cache_spec.rb
- spec/lib/gitlab/repository_hash_cache_spec.rb
- spec/lib/gitlab/repository_set_cache_spec.rb
- spec/lib/gitlab/repository_size_checker_spec.rb
- spec/lib/gitlab/repository_size_error_message_spec.rb
- spec/lib/gitlab/search_results_spec.rb - spec/lib/gitlab/search_results_spec.rb
- spec/lib/gitlab/shell_spec.rb - spec/lib/gitlab/shell_spec.rb
- spec/models/abuse_report_spec.rb - spec/models/abuse_report_spec.rb
@ -750,37 +549,15 @@ RSpec/EmptyLineAfterFinalLetItBe:
- spec/models/note_spec.rb - spec/models/note_spec.rb
- spec/models/notification_setting_spec.rb - spec/models/notification_setting_spec.rb
- spec/models/operations/feature_flag_spec.rb - spec/models/operations/feature_flag_spec.rb
- spec/models/packages/dependency_spec.rb
- spec/models/packages/go/module_version_spec.rb
- spec/models/packages/package_spec.rb
- spec/models/packages/tag_spec.rb
- spec/models/plan_limits_spec.rb - spec/models/plan_limits_spec.rb
- spec/models/prometheus_alert_spec.rb - spec/models/prometheus_alert_spec.rb
- spec/models/protected_branch/push_access_level_spec.rb - spec/models/protected_branch/push_access_level_spec.rb
- spec/models/release_spec.rb
- spec/models/releases/evidence_spec.rb
- spec/models/releases/source_spec.rb
- spec/models/repository_spec.rb - spec/models/repository_spec.rb
- spec/models/service_spec.rb
- spec/models/snippet_repository_spec.rb - spec/models/snippet_repository_spec.rb
- spec/models/snippet_spec.rb - spec/models/snippet_spec.rb
- spec/models/terraform/state_spec.rb - spec/models/terraform/state_spec.rb
- spec/models/u2f_registration_spec.rb - spec/models/u2f_registration_spec.rb
- spec/models/user_spec.rb - spec/models/user_spec.rb
- spec/models/wiki_page/meta_spec.rb
- spec/models/wiki_page_spec.rb
- spec/presenters/alert_management/alert_presenter_spec.rb
- spec/presenters/ci/pipeline_presenter_spec.rb
- spec/presenters/label_presenter_spec.rb
- spec/presenters/packages/composer/packages_presenter_spec.rb
- spec/presenters/packages/conan/package_presenter_spec.rb
- spec/presenters/packages/detail/package_presenter_spec.rb
- spec/presenters/packages/npm/package_presenter_spec.rb
- spec/presenters/packages/nuget/search_results_presenter_spec.rb
- spec/presenters/project_presenter_spec.rb
- spec/presenters/prometheus_alert_presenter_spec.rb
- spec/presenters/release_presenter_spec.rb
- spec/presenters/user_presenter_spec.rb
- spec/requests/api/api_spec.rb - spec/requests/api/api_spec.rb
- spec/requests/api/award_emoji_spec.rb - spec/requests/api/award_emoji_spec.rb
- spec/requests/api/branches_spec.rb - spec/requests/api/branches_spec.rb
@ -879,38 +656,11 @@ RSpec/EmptyLineAfterFinalLetItBe:
- spec/services/auth/dependency_proxy_authentication_service_spec.rb - spec/services/auth/dependency_proxy_authentication_service_spec.rb
- spec/services/auto_merge_service_spec.rb - spec/services/auto_merge_service_spec.rb
- spec/services/bulk_create_integration_service_spec.rb - spec/services/bulk_create_integration_service_spec.rb
- spec/services/ci/change_variable_service_spec.rb
- spec/services/ci/change_variables_service_spec.rb
- spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb
- spec/services/ci/create_pipeline_service/custom_config_content_spec.rb
- spec/services/ci/create_pipeline_service/dry_run_spec.rb
- spec/services/ci/create_pipeline_service/environment_spec.rb
- spec/services/ci/create_pipeline_service/parameter_content_spec.rb
- spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb
- spec/services/ci/create_pipeline_service_spec.rb
- spec/services/ci/create_web_ide_terminal_service_spec.rb
- spec/services/ci/expire_pipeline_cache_service_spec.rb
- spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb
- spec/services/ci/find_exposed_artifacts_service_spec.rb
- spec/services/ci/job_artifacts/create_service_spec.rb
- spec/services/ci/parse_dotenv_artifact_service_spec.rb
- spec/services/ci/pipeline_bridge_status_service_spec.rb
- spec/services/ci/pipeline_trigger_service_spec.rb
- spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb
- spec/services/ci/register_job_service_spec.rb
- spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb
- spec/services/ci/retry_build_service_spec.rb
- spec/services/ci/stop_environments_service_spec.rb
- spec/services/clusters/applications/prometheus_health_check_service_spec.rb - spec/services/clusters/applications/prometheus_health_check_service_spec.rb
- spec/services/container_expiration_policy_service_spec.rb - spec/services/container_expiration_policy_service_spec.rb
- spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb - spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
- spec/services/discussions/resolve_service_spec.rb - spec/services/discussions/resolve_service_spec.rb
- spec/services/discussions/unresolve_service_spec.rb - spec/services/discussions/unresolve_service_spec.rb
- spec/services/feature_flags/create_service_spec.rb
- spec/services/feature_flags/destroy_service_spec.rb
- spec/services/feature_flags/disable_service_spec.rb
- spec/services/feature_flags/enable_service_spec.rb
- spec/services/feature_flags/update_service_spec.rb
- spec/services/git/branch_push_service_spec.rb - spec/services/git/branch_push_service_spec.rb
- spec/services/import/bitbucket_server_service_spec.rb - spec/services/import/bitbucket_server_service_spec.rb
- spec/services/incident_management/incidents/create_service_spec.rb - spec/services/incident_management/incidents/create_service_spec.rb
@ -999,27 +749,6 @@ RSpec/EmptyLineAfterFinalLetItBe:
- spec/views/search/_results.html.haml_spec.rb - spec/views/search/_results.html.haml_spec.rb
- spec/views/shared/_label_row.html.haml_spec.rb - spec/views/shared/_label_row.html.haml_spec.rb
- spec/views/shared/milestones/_top.html.haml_spec.rb - spec/views/shared/milestones/_top.html.haml_spec.rb
- spec/workers/ci/create_cross_project_pipeline_worker_spec.rb
- spec/workers/cluster_update_app_worker_spec.rb
- spec/workers/environments/canary_ingress/update_worker_spec.rb
- spec/workers/expire_job_cache_worker_spec.rb
- spec/workers/gitlab/jira_import/import_issue_worker_spec.rb
- spec/workers/gitlab/jira_import/stage/start_import_worker_spec.rb
- spec/workers/gitlab/jira_import/stuck_jira_import_jobs_worker_spec.rb
- spec/workers/import_issues_csv_worker_spec.rb
- spec/workers/incident_management/add_severity_system_note_worker_spec.rb
- spec/workers/incident_management/process_alert_worker_spec.rb
- spec/workers/incident_management/process_prometheus_alert_worker_spec.rb
- spec/workers/jira_connect/sync_project_worker_spec.rb
- spec/workers/namespaces/onboarding_issue_created_worker_spec.rb
- spec/workers/packages/composer/cache_update_worker_spec.rb
- spec/workers/pages_domain_ssl_renewal_cron_worker_spec.rb
- spec/workers/projects/git_garbage_collect_worker_spec.rb
- spec/workers/prometheus/create_default_alerts_worker_spec.rb
- spec/workers/propagate_integration_group_worker_spec.rb
- spec/workers/propagate_integration_project_worker_spec.rb
- spec/workers/run_pipeline_schedule_worker_spec.rb
- spec/workers/update_external_pull_requests_worker_spec.rb
RSpec/TimecopFreeze: RSpec/TimecopFreeze:
Exclude: Exclude:
@ -1604,7 +1333,6 @@ RSpec/AnyInstanceOf:
- 'spec/uploaders/workers/object_storage/migrate_uploads_worker_spec.rb' - 'spec/uploaders/workers/object_storage/migrate_uploads_worker_spec.rb'
- 'spec/views/layouts/_head.html.haml_spec.rb' - 'spec/views/layouts/_head.html.haml_spec.rb'
- 'spec/views/projects/artifacts/_artifact.html.haml_spec.rb' - 'spec/views/projects/artifacts/_artifact.html.haml_spec.rb'
- 'spec/views/shared/runners/show.html.haml_spec.rb'
- 'spec/workers/archive_trace_worker_spec.rb' - 'spec/workers/archive_trace_worker_spec.rb'
- 'spec/workers/build_coverage_worker_spec.rb' - 'spec/workers/build_coverage_worker_spec.rb'
- 'spec/workers/build_hooks_worker_spec.rb' - 'spec/workers/build_hooks_worker_spec.rb'
@ -1689,9 +1417,6 @@ Gitlab/NamespacedClass:
- 'app/finders/context_commits_finder.rb' - 'app/finders/context_commits_finder.rb'
- 'app/finders/contributed_projects_finder.rb' - 'app/finders/contributed_projects_finder.rb'
- 'app/finders/deployments_finder.rb' - 'app/finders/deployments_finder.rb'
- 'app/finders/environment_names_finder.rb'
- 'app/finders/environments_finder.rb'
- 'app/finders/environments_by_deployments_finder.rb'
- 'app/finders/events_finder.rb' - 'app/finders/events_finder.rb'
- 'app/finders/feature_flags_finder.rb' - 'app/finders/feature_flags_finder.rb'
- 'app/finders/feature_flags_user_lists_finder.rb' - 'app/finders/feature_flags_user_lists_finder.rb'
@ -1787,6 +1512,7 @@ Gitlab/NamespacedClass:
- 'app/models/concerns/uniquify.rb' - 'app/models/concerns/uniquify.rb'
- 'app/models/container_expiration_policy.rb' - 'app/models/container_expiration_policy.rb'
- 'app/models/container_repository.rb' - 'app/models/container_repository.rb'
- 'app/models/context_commits_diff.rb'
- 'app/models/custom_emoji.rb' - 'app/models/custom_emoji.rb'
- 'app/models/data_list.rb' - 'app/models/data_list.rb'
- 'app/models/deploy_key.rb' - 'app/models/deploy_key.rb'
@ -1846,6 +1572,7 @@ Gitlab/NamespacedClass:
- 'app/models/individual_note_discussion.rb' - 'app/models/individual_note_discussion.rb'
- 'app/models/instance_configuration.rb' - 'app/models/instance_configuration.rb'
- 'app/models/instance_metadata.rb' - 'app/models/instance_metadata.rb'
- 'app/models/integration.rb'
- 'app/models/internal_id.rb' - 'app/models/internal_id.rb'
- 'app/models/issuable_severity.rb' - 'app/models/issuable_severity.rb'
- 'app/models/issue.rb' - 'app/models/issue.rb'
@ -1933,21 +1660,13 @@ Gitlab/NamespacedClass:
- 'app/models/project_repository_storage_move.rb' - 'app/models/project_repository_storage_move.rb'
- 'app/models/project_services/alerts_service.rb' - 'app/models/project_services/alerts_service.rb'
- 'app/models/project_services/alerts_service_data.rb' - 'app/models/project_services/alerts_service_data.rb'
- 'app/models/project_services/asana_service.rb'
- 'app/models/project_services/assembla_service.rb'
- 'app/models/project_services/bamboo_service.rb'
- 'app/models/project_services/bugzilla_service.rb' - 'app/models/project_services/bugzilla_service.rb'
- 'app/models/project_services/buildkite_service.rb' - 'app/models/project_services/buildkite_service.rb'
- 'app/models/project_services/builds_email_service.rb'
- 'app/models/project_services/campfire_service.rb'
- 'app/models/project_services/chat_notification_service.rb' - 'app/models/project_services/chat_notification_service.rb'
- 'app/models/project_services/ci_service.rb' - 'app/models/project_services/ci_service.rb'
- 'app/models/project_services/confluence_service.rb'
- 'app/models/project_services/custom_issue_tracker_service.rb' - 'app/models/project_services/custom_issue_tracker_service.rb'
- 'app/models/project_services/datadog_service.rb'
- 'app/models/project_services/discord_service.rb' - 'app/models/project_services/discord_service.rb'
- 'app/models/project_services/drone_ci_service.rb' - 'app/models/project_services/drone_ci_service.rb'
- 'app/models/project_services/emails_on_push_service.rb'
- 'app/models/project_services/ewm_service.rb' - 'app/models/project_services/ewm_service.rb'
- 'app/models/project_services/external_wiki_service.rb' - 'app/models/project_services/external_wiki_service.rb'
- 'app/models/project_services/flowdock_service.rb' - 'app/models/project_services/flowdock_service.rb'
@ -2014,7 +1733,6 @@ Gitlab/NamespacedClass:
- 'app/models/self_managed_prometheus_alert_event.rb' - 'app/models/self_managed_prometheus_alert_event.rb'
- 'app/models/sent_notification.rb' - 'app/models/sent_notification.rb'
- 'app/models/sentry_issue.rb' - 'app/models/sentry_issue.rb'
- 'app/models/service.rb'
- 'app/models/service_desk_setting.rb' - 'app/models/service_desk_setting.rb'
- 'app/models/service_list.rb' - 'app/models/service_list.rb'
- 'app/models/shard.rb' - 'app/models/shard.rb'
@ -2092,6 +1810,7 @@ Gitlab/NamespacedClass:
- 'app/policies/group_policy.rb' - 'app/policies/group_policy.rb'
- 'app/policies/identity_provider_policy.rb' - 'app/policies/identity_provider_policy.rb'
- 'app/policies/instance_metadata_policy.rb' - 'app/policies/instance_metadata_policy.rb'
- 'app/policies/integration_policy.rb'
- 'app/policies/issuable_policy.rb' - 'app/policies/issuable_policy.rb'
- 'app/policies/issue_policy.rb' - 'app/policies/issue_policy.rb'
- 'app/policies/merge_request_policy.rb' - 'app/policies/merge_request_policy.rb'
@ -2112,7 +1831,6 @@ Gitlab/NamespacedClass:
- 'app/policies/release_policy.rb' - 'app/policies/release_policy.rb'
- 'app/policies/repository_policy.rb' - 'app/policies/repository_policy.rb'
- 'app/policies/resource_label_event_policy.rb' - 'app/policies/resource_label_event_policy.rb'
- 'app/policies/service_policy.rb'
- 'app/policies/suggestion_policy.rb' - 'app/policies/suggestion_policy.rb'
- 'app/policies/timebox_policy.rb' - 'app/policies/timebox_policy.rb'
- 'app/policies/timelog_policy.rb' - 'app/policies/timelog_policy.rb'
@ -2201,6 +1919,7 @@ Gitlab/NamespacedClass:
- 'app/serializers/container_repository_entity.rb' - 'app/serializers/container_repository_entity.rb'
- 'app/serializers/container_tag_entity.rb' - 'app/serializers/container_tag_entity.rb'
- 'app/serializers/container_tags_serializer.rb' - 'app/serializers/container_tags_serializer.rb'
- 'app/serializers/context_commits_diff_entity.rb'
- 'app/serializers/current_board_entity.rb' - 'app/serializers/current_board_entity.rb'
- 'app/serializers/current_board_serializer.rb' - 'app/serializers/current_board_serializer.rb'
- 'app/serializers/current_user_entity.rb' - 'app/serializers/current_user_entity.rb'
@ -2252,6 +1971,8 @@ Gitlab/NamespacedClass:
- 'app/serializers/group_entity.rb' - 'app/serializers/group_entity.rb'
- 'app/serializers/group_group_link_entity.rb' - 'app/serializers/group_group_link_entity.rb'
- 'app/serializers/group_group_link_serializer.rb' - 'app/serializers/group_group_link_serializer.rb'
- 'app/serializers/group_issuable_autocomplete_entity.rb'
- 'app/serializers/group_issuable_autocomplete_serializer.rb'
- 'app/serializers/group_serializer.rb' - 'app/serializers/group_serializer.rb'
- 'app/serializers/issuable_entity.rb' - 'app/serializers/issuable_entity.rb'
- 'app/serializers/issuable_sidebar_basic_entity.rb' - 'app/serializers/issuable_sidebar_basic_entity.rb'
@ -2354,6 +2075,7 @@ Gitlab/NamespacedClass:
- 'app/services/auto_merge_service.rb' - 'app/services/auto_merge_service.rb'
- 'app/services/base_container_service.rb' - 'app/services/base_container_service.rb'
- 'app/services/base_count_service.rb' - 'app/services/base_count_service.rb'
- 'app/services/base_project_service.rb'
- 'app/services/base_renderer.rb' - 'app/services/base_renderer.rb'
- 'app/services/base_service.rb' - 'app/services/base_service.rb'
- 'app/services/bulk_create_integration_service.rb' - 'app/services/bulk_create_integration_service.rb'
@ -2754,8 +2476,6 @@ Gitlab/NamespacedClass:
- 'ee/app/serializers/geo_project_registry_entity.rb' - 'ee/app/serializers/geo_project_registry_entity.rb'
- 'ee/app/serializers/geo_project_registry_serializer.rb' - 'ee/app/serializers/geo_project_registry_serializer.rb'
- 'ee/app/serializers/group_analytics_serializer.rb' - 'ee/app/serializers/group_analytics_serializer.rb'
- 'ee/app/serializers/group_issuable_autocomplete_entity.rb'
- 'ee/app/serializers/group_issuable_autocomplete_serializer.rb'
- 'ee/app/serializers/group_vulnerability_autocomplete_entity.rb' - 'ee/app/serializers/group_vulnerability_autocomplete_entity.rb'
- 'ee/app/serializers/group_vulnerability_autocomplete_serializer.rb' - 'ee/app/serializers/group_vulnerability_autocomplete_serializer.rb'
- 'ee/app/serializers/invited_group_entity.rb' - 'ee/app/serializers/invited_group_entity.rb'
@ -2975,7 +2695,6 @@ Performance/OpenStruct:
- 'Guardfile' - 'Guardfile'
- 'app/finders/snippets_finder.rb' - 'app/finders/snippets_finder.rb'
- 'app/helpers/application_settings_helper.rb' - 'app/helpers/application_settings_helper.rb'
- 'app/models/cycle_analytics/project_level_stage_adapter.rb'
- 'ee/lib/gitlab/graphql/aggregations/epics/epic_node.rb' - 'ee/lib/gitlab/graphql/aggregations/epics/epic_node.rb'
- 'ee/lib/gitlab/graphql/aggregations/epics/epic_node.rb' - 'ee/lib/gitlab/graphql/aggregations/epics/epic_node.rb'
- 'lib/api/wikis.rb' - 'lib/api/wikis.rb'
@ -3010,30 +2729,17 @@ Gitlab/FeatureAvailableUsage:
- 'app/helpers/events_helper.rb' - 'app/helpers/events_helper.rb'
- 'app/helpers/labels_helper.rb' - 'app/helpers/labels_helper.rb'
- 'app/policies/project_policy.rb' - 'app/policies/project_policy.rb'
- 'app/views/groups/issues.html.haml'
- 'app/views/groups/merge_requests.html.haml'
- 'app/views/shared/boards/_switcher.html.haml' - 'app/views/shared/boards/_switcher.html.haml'
- 'ee/app/controllers/concerns/description_diff_actions.rb' - 'ee/app/controllers/concerns/description_diff_actions.rb'
- 'ee/app/controllers/concerns/ee/boards_actions.rb' - 'ee/app/controllers/concerns/ee/boards_actions.rb'
- 'ee/app/controllers/concerns/security_dashboards_permissions.rb' - 'ee/app/controllers/concerns/security_dashboards_permissions.rb'
- 'ee/app/controllers/ee/boards/lists_controller.rb' - 'ee/app/controllers/ee/boards/lists_controller.rb'
- 'ee/app/controllers/ee/groups/application_controller.rb'
- 'ee/app/controllers/ee/groups/group_members_controller.rb'
- 'ee/app/controllers/ee/projects/autocomplete_sources_controller.rb' - 'ee/app/controllers/ee/projects/autocomplete_sources_controller.rb'
- 'ee/app/controllers/ee/projects/issues_controller.rb' - 'ee/app/controllers/ee/projects/issues_controller.rb'
- 'ee/app/controllers/ee/projects/security/configuration_controller.rb' - 'ee/app/controllers/ee/projects/security/configuration_controller.rb'
- 'ee/app/controllers/ee/projects/settings/ci_cd_controller.rb' - 'ee/app/controllers/ee/projects/settings/ci_cd_controller.rb'
- 'ee/app/controllers/ee/projects/settings/operations_controller.rb' - 'ee/app/controllers/ee/projects/settings/operations_controller.rb'
- 'ee/app/controllers/ee/projects/settings/repository_controller.rb' - 'ee/app/controllers/ee/projects/settings/repository_controller.rb'
- 'ee/app/controllers/groups/analytics/application_controller.rb'
- 'ee/app/controllers/groups/audit_events_controller.rb'
- 'ee/app/controllers/groups/bulk_update_controller.rb'
- 'ee/app/controllers/groups/contribution_analytics_controller.rb'
- 'ee/app/controllers/groups/epics_controller.rb'
- 'ee/app/controllers/groups/hooks_controller.rb'
- 'ee/app/controllers/groups/issues_analytics_controller.rb'
- 'ee/app/controllers/groups/iterations_controller.rb'
- 'ee/app/controllers/projects/analytics/issues_analytics_controller.rb'
- 'ee/app/controllers/projects/audit_events_controller.rb' - 'ee/app/controllers/projects/audit_events_controller.rb'
- 'ee/app/controllers/projects/cluster_agents_controller.rb' - 'ee/app/controllers/projects/cluster_agents_controller.rb'
- 'ee/app/controllers/projects/iterations/inherited_controller.rb' - 'ee/app/controllers/projects/iterations/inherited_controller.rb'
@ -3044,23 +2750,18 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/finders/clusters/agents_finder.rb' - 'ee/app/finders/clusters/agents_finder.rb'
- 'ee/app/finders/ee/alert_management/alerts_finder.rb' - 'ee/app/finders/ee/alert_management/alerts_finder.rb'
- 'ee/app/finders/ee/alert_management/http_integrations_finder.rb' - 'ee/app/finders/ee/alert_management/http_integrations_finder.rb'
- 'ee/app/finders/ee/group_projects_finder.rb'
- 'ee/app/graphql/ee/types/group_type.rb' - 'ee/app/graphql/ee/types/group_type.rb'
- 'ee/app/graphql/mutations/dast/profiles/create.rb' - 'ee/app/graphql/mutations/dast/profiles/create.rb'
- 'ee/app/graphql/mutations/dast/profiles/run.rb' - 'ee/app/graphql/mutations/dast/profiles/run.rb'
- 'ee/app/graphql/mutations/dast/profiles/update.rb' - 'ee/app/graphql/mutations/dast/profiles/update.rb'
- 'ee/app/graphql/mutations/instance_security_dashboard/remove_project.rb' - 'ee/app/graphql/mutations/instance_security_dashboard/remove_project.rb'
- 'ee/app/graphql/resolvers/boards/epic_boards_resolver.rb'
- 'ee/app/graphql/resolvers/clusters/agent_tokens_resolver.rb' - 'ee/app/graphql/resolvers/clusters/agent_tokens_resolver.rb'
- 'ee/app/graphql/resolvers/epics_resolver.rb'
- 'ee/app/helpers/ee/analytics/navbar_helper.rb'
- 'ee/app/helpers/ee/application_helper.rb' - 'ee/app/helpers/ee/application_helper.rb'
- 'ee/app/helpers/ee/boards_helper.rb' - 'ee/app/helpers/ee/boards_helper.rb'
- 'ee/app/helpers/ee/clusters_helper.rb' - 'ee/app/helpers/ee/clusters_helper.rb'
- 'ee/app/helpers/ee/dashboard_helper.rb' - 'ee/app/helpers/ee/dashboard_helper.rb'
- 'ee/app/helpers/ee/form_helper.rb' - 'ee/app/helpers/ee/form_helper.rb'
- 'ee/app/helpers/ee/graph_helper.rb' - 'ee/app/helpers/ee/graph_helper.rb'
- 'ee/app/helpers/ee/groups_helper.rb'
- 'ee/app/helpers/ee/issues_helper.rb' - 'ee/app/helpers/ee/issues_helper.rb'
- 'ee/app/helpers/ee/lock_helper.rb' - 'ee/app/helpers/ee/lock_helper.rb'
- 'ee/app/helpers/ee/operations_helper.rb' - 'ee/app/helpers/ee/operations_helper.rb'
@ -3069,7 +2770,6 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/helpers/ee/releases_helper.rb' - 'ee/app/helpers/ee/releases_helper.rb'
- 'ee/app/helpers/ee/search_helper.rb' - 'ee/app/helpers/ee/search_helper.rb'
- 'ee/app/helpers/ee/tree_helper.rb' - 'ee/app/helpers/ee/tree_helper.rb'
- 'ee/app/helpers/groups/security_features_helper.rb'
- 'ee/app/models/approval_state.rb' - 'ee/app/models/approval_state.rb'
- 'ee/app/models/concerns/approvable.rb' - 'ee/app/models/concerns/approvable.rb'
- 'ee/app/models/concerns/ee/project_security_scanners_information.rb' - 'ee/app/models/concerns/ee/project_security_scanners_information.rb'
@ -3092,15 +2792,12 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/models/ee/project_ci_cd_setting.rb' - 'ee/app/models/ee/project_ci_cd_setting.rb'
- 'ee/app/models/namespace_statistics.rb' - 'ee/app/models/namespace_statistics.rb'
- 'ee/app/models/project_security_setting.rb' - 'ee/app/models/project_security_setting.rb'
- 'ee/app/models/saml_provider.rb'
- 'ee/app/policies/compliance_management/framework_policy.rb'
- 'ee/app/policies/compliance_management/framework_policy.rb' - 'ee/app/policies/compliance_management/framework_policy.rb'
- 'ee/app/policies/ee/group_policy.rb' - 'ee/app/policies/ee/group_policy.rb'
- 'ee/app/policies/ee/namespace_policy.rb' - 'ee/app/policies/ee/namespace_policy.rb'
- 'ee/app/policies/ee/project_policy.rb' - 'ee/app/policies/ee/project_policy.rb'
- 'ee/app/policies/ee/protected_branch_policy.rb' - 'ee/app/policies/ee/protected_branch_policy.rb'
- 'ee/app/presenters/ee/label_presenter.rb' - 'ee/app/presenters/ee/label_presenter.rb'
- 'ee/app/presenters/epic_presenter.rb'
- 'ee/app/presenters/merge_request_approver_presenter.rb' - 'ee/app/presenters/merge_request_approver_presenter.rb'
- 'ee/app/serializers/dashboard_operations_project_entity.rb' - 'ee/app/serializers/dashboard_operations_project_entity.rb'
- 'ee/app/serializers/ee/environment_entity.rb' - 'ee/app/serializers/ee/environment_entity.rb'
@ -3124,7 +2821,6 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/services/ee/boards/issues/list_service.rb' - 'ee/app/services/ee/boards/issues/list_service.rb'
- 'ee/app/services/ee/boards/lists/create_service.rb' - 'ee/app/services/ee/boards/lists/create_service.rb'
- 'ee/app/services/ee/boards/update_service.rb' - 'ee/app/services/ee/boards/update_service.rb'
- 'ee/app/services/ee/groups/create_service.rb'
- 'ee/app/services/ee/ide/schemas_config_service.rb' - 'ee/app/services/ee/ide/schemas_config_service.rb'
- 'ee/app/services/ee/issuable_base_service.rb' - 'ee/app/services/ee/issuable_base_service.rb'
- 'ee/app/services/ee/issue_links/create_service.rb' - 'ee/app/services/ee/issue_links/create_service.rb'
@ -3139,9 +2835,6 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/services/ee/projects/create_service.rb' - 'ee/app/services/ee/projects/create_service.rb'
- 'ee/app/services/ee/protected_branches/create_service.rb' - 'ee/app/services/ee/protected_branches/create_service.rb'
- 'ee/app/services/ee/releases/create_evidence_service.rb' - 'ee/app/services/ee/releases/create_evidence_service.rb'
- 'ee/app/services/ee/search/group_service.rb'
- 'ee/app/services/iterations/cadences/create_service.rb'
- 'ee/app/services/iterations/cadences/update_service.rb'
- 'ee/app/services/iterations/create_service.rb' - 'ee/app/services/iterations/create_service.rb'
- 'ee/app/services/iterations/update_service.rb' - 'ee/app/services/iterations/update_service.rb'
- 'ee/app/services/merge_requests/sync_report_approver_approval_rules.rb' - 'ee/app/services/merge_requests/sync_report_approver_approval_rules.rb'
@ -3150,16 +2843,6 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/services/quality_management/test_cases/create_service.rb' - 'ee/app/services/quality_management/test_cases/create_service.rb'
- 'ee/app/services/requirements_management/process_test_reports_service.rb' - 'ee/app/services/requirements_management/process_test_reports_service.rb'
- 'ee/app/services/security/store_scans_service.rb' - 'ee/app/services/security/store_scans_service.rb'
- 'ee/app/views/groups/_templates_setting.html.haml'
- 'ee/app/views/groups/contribution_analytics/show.html.haml'
- 'ee/app/views/groups/ee/_settings_nav.html.haml'
- 'ee/app/views/groups/epics/index.html.haml'
- 'ee/app/views/groups/epics/show.html.haml'
- 'ee/app/views/groups/epics/show.html.haml'
- 'ee/app/views/groups/hooks/index.html.haml'
- 'ee/app/views/groups/roadmap/show.html.haml'
- 'ee/app/views/groups/settings/_allowed_email_domain.html.haml'
- 'ee/app/views/groups/settings/_ip_restriction.html.haml'
- 'ee/app/views/layouts/nav/_test_cases_link.html.haml' - 'ee/app/views/layouts/nav/_test_cases_link.html.haml'
- 'ee/app/views/layouts/nav/sidebar/_project_iterations_link.html.haml' - 'ee/app/views/layouts/nav/sidebar/_project_iterations_link.html.haml'
- 'ee/app/views/projects/_merge_request_approvals_settings.html.haml' - 'ee/app/views/projects/_merge_request_approvals_settings.html.haml'
@ -3193,7 +2876,6 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/views/shared/issuable/_board_create_list_dropdown.html.haml' - 'ee/app/views/shared/issuable/_board_create_list_dropdown.html.haml'
- 'ee/app/views/shared/issuable/_board_create_list_dropdown.html.haml' - 'ee/app/views/shared/issuable/_board_create_list_dropdown.html.haml'
- 'ee/app/views/shared/issuable/_group_bulk_update_sidebar.html.haml' - 'ee/app/views/shared/issuable/_group_bulk_update_sidebar.html.haml'
- 'ee/app/views/shared/issuable/_iteration_select.html.haml'
- 'ee/app/views/shared/issuable/form/_default_templates.html.haml' - 'ee/app/views/shared/issuable/form/_default_templates.html.haml'
- 'ee/app/views/shared/labels/_create_label_help_text.html.haml' - 'ee/app/views/shared/labels/_create_label_help_text.html.haml'
- 'ee/app/views/shared/promotions/_promote_mr_features.html.haml' - 'ee/app/views/shared/promotions/_promote_mr_features.html.haml'
@ -3207,14 +2889,10 @@ Gitlab/FeatureAvailableUsage:
- 'ee/app/workers/analytics/code_review_metrics_worker.rb' - 'ee/app/workers/analytics/code_review_metrics_worker.rb'
- 'ee/app/workers/group_saml_group_sync_worker.rb' - 'ee/app/workers/group_saml_group_sync_worker.rb'
- 'ee/lib/api/external_approval_rules.rb' - 'ee/lib/api/external_approval_rules.rb'
- 'ee/lib/api/helpers/epics_helpers.rb'
- 'ee/lib/api/ldap_group_links.rb'
- 'ee/lib/ee/api/entities/approval_state.rb' - 'ee/lib/ee/api/entities/approval_state.rb'
- 'ee/lib/ee/api/entities/board.rb' - 'ee/lib/ee/api/entities/board.rb'
- 'ee/lib/ee/api/entities/group.rb'
- 'ee/lib/ee/api/entities/issue.rb' - 'ee/lib/ee/api/entities/issue.rb'
- 'ee/lib/ee/api/entities/project.rb' - 'ee/lib/ee/api/entities/project.rb'
- 'ee/lib/ee/api/groups.rb'
- 'ee/lib/ee/api/helpers.rb' - 'ee/lib/ee/api/helpers.rb'
- 'ee/lib/ee/api/internal/kubernetes.rb' - 'ee/lib/ee/api/internal/kubernetes.rb'
- 'ee/lib/ee/api/job_artifacts.rb' - 'ee/lib/ee/api/job_artifacts.rb'
@ -3224,14 +2902,11 @@ Gitlab/FeatureAvailableUsage:
- 'ee/lib/ee/gitlab/gon_helper.rb' - 'ee/lib/ee/gitlab/gon_helper.rb'
- 'ee/lib/ee/gitlab/tree_summary.rb' - 'ee/lib/ee/gitlab/tree_summary.rb'
- 'ee/lib/gitlab/alert_management.rb' - 'ee/lib/gitlab/alert_management.rb'
- 'ee/lib/gitlab/auth/group_saml/group_lookup.rb'
- 'ee/lib/gitlab/ci/pipeline/chain/config/content/compliance.rb' - 'ee/lib/gitlab/ci/pipeline/chain/config/content/compliance.rb'
- 'ee/lib/gitlab/code_owners.rb' - 'ee/lib/gitlab/code_owners.rb'
- 'ee/lib/gitlab/import_export/group/group_and_descendants_repo_restorer.rb'
- 'ee/lib/gitlab/incident_management.rb' - 'ee/lib/gitlab/incident_management.rb'
- 'ee/lib/gitlab/path_locks_finder.rb' - 'ee/lib/gitlab/path_locks_finder.rb'
- 'ee/lib/incident_management/incident_sla.rb' - 'ee/lib/incident_management/incident_sla.rb'
- 'ee/spec/models/ee/namespace_spec.rb'
- 'ee/spec/models/instance_security_dashboard_spec.rb' - 'ee/spec/models/instance_security_dashboard_spec.rb'
- 'ee/spec/models/license_spec.rb' - 'ee/spec/models/license_spec.rb'
- 'ee/spec/models/project_spec.rb' - 'ee/spec/models/project_spec.rb'
@ -3249,7 +2924,6 @@ Style/RegexpLiteralMixedPreserve:
- 'app/models/concerns/ci/maskable.rb' - 'app/models/concerns/ci/maskable.rb'
- 'app/models/operations/feature_flag.rb' - 'app/models/operations/feature_flag.rb'
- 'app/models/packages/go/module.rb' - 'app/models/packages/go/module.rb'
- 'app/models/project_services/chat_message/base_message.rb'
- 'app/services/packages/conan/search_service.rb' - 'app/services/packages/conan/search_service.rb'
- 'app/services/projects/update_remote_mirror_service.rb' - 'app/services/projects/update_remote_mirror_service.rb'
- 'config/initializers/rspec_profiling.rb' - 'config/initializers/rspec_profiling.rb'

View file

@ -266,19 +266,6 @@ Performance/CollectionLiteralInLoop:
Performance/ConstantRegexp: Performance/ConstantRegexp:
Enabled: false Enabled: false
# Offense count: 18
# Cop supports --auto-correct.
Performance/Count:
Exclude:
- 'app/helpers/groups_helper.rb'
- 'app/services/merge_requests/add_context_service.rb'
- 'ee/lib/gitlab/graphql/aggregations/epics/epic_node.rb'
- 'lib/gitlab/sidekiq_status.rb'
- 'spec/lib/gitlab/conflict/file_spec.rb'
- 'spec/lib/gitlab/git/tree_spec.rb'
- 'spec/models/ci/build_spec.rb'
- 'spec/support_specs/helpers/active_record/query_recorder_spec.rb'
# Offense count: 14 # Offense count: 14
# Cop supports --auto-correct. # Cop supports --auto-correct.
# Configuration parameters: SafeMultiline. # Configuration parameters: SafeMultiline.
@ -354,8 +341,6 @@ Performance/Sum:
- 'ee/spec/lib/gitlab/elastic/bulk_indexer_spec.rb' - 'ee/spec/lib/gitlab/elastic/bulk_indexer_spec.rb'
- 'lib/api/entities/issuable_time_stats.rb' - 'lib/api/entities/issuable_time_stats.rb'
- 'lib/container_registry/tag.rb' - 'lib/container_registry/tag.rb'
- 'lib/declarative_policy/rule.rb'
- 'lib/declarative_policy/runner.rb'
- 'lib/gitlab/ci/reports/test_suite_comparer.rb' - 'lib/gitlab/ci/reports/test_suite_comparer.rb'
- 'lib/gitlab/diff/file.rb' - 'lib/gitlab/diff/file.rb'
- 'lib/gitlab/sherlock/transaction.rb' - 'lib/gitlab/sherlock/transaction.rb'
@ -613,9 +598,7 @@ Rails/RenderInline:
# SupportedStyles: conservative, aggressive # SupportedStyles: conservative, aggressive
Rails/ShortI18n: Rails/ShortI18n:
Exclude: Exclude:
- 'app/models/project_services/chat_message/pipeline_message.rb'
- 'app/uploaders/content_type_whitelist.rb' - 'app/uploaders/content_type_whitelist.rb'
- 'spec/views/shared/runners/show.html.haml_spec.rb'
# Offense count: 1144 # Offense count: 1144
# Configuration parameters: ForbiddenMethods, AllowedMethods. # Configuration parameters: ForbiddenMethods, AllowedMethods.
@ -628,11 +611,6 @@ Rails/SkipsModelValidations:
Rails/SquishedSQLHeredocs: Rails/SquishedSQLHeredocs:
Enabled: false Enabled: false
# Offense count: 44
# Cop supports --auto-correct.
Rails/WhereEquals:
Enabled: false
# Offense count: 44 # Offense count: 44
# Cop supports --auto-correct. # Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle. # Configuration parameters: EnforcedStyle.
@ -640,16 +618,6 @@ Rails/WhereEquals:
Rails/WhereExists: Rails/WhereExists:
Enabled: false Enabled: false
# Offense count: 8
# Cop supports --auto-correct.
Security/YAMLLoad:
Exclude:
- 'lib/gitlab/redis/wrapper.rb'
- 'lib/system_check/incoming_email/imap_authentication_check.rb'
- 'spec/config/mail_room_spec.rb'
- 'spec/initializers/secret_token_spec.rb'
- 'spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb'
# Offense count: 240 # Offense count: 240
# Cop supports --auto-correct. # Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle. # Configuration parameters: EnforcedStyle.
@ -851,21 +819,6 @@ Style/NumericLiteralPrefix:
Style/PercentLiteralDelimiters: Style/PercentLiteralDelimiters:
Enabled: false Enabled: false
# Offense count: 247
# Cop supports --auto-correct.
# Configuration parameters: .
# SupportedStyles: compact, exploded
Style/RaiseArgs:
Enabled: false
EnforcedStyle: exploded
# Offense count: 2
# Cop supports --auto-correct.
Style/RedundantBegin:
Exclude:
- 'app/services/clusters/applications/check_installation_progress_service.rb'
- 'lib/gitlab/database/postgres_hll/batch_distinct_counter.rb'
# Offense count: 26 # Offense count: 26
# Cop supports --auto-correct. # Cop supports --auto-correct.
# Configuration parameters: SafeForConstants. # Configuration parameters: SafeForConstants.
@ -878,30 +831,11 @@ Style/RedundantFetchBlock:
- 'spec/lib/gitlab/null_request_store_spec.rb' - 'spec/lib/gitlab/null_request_store_spec.rb'
- 'spec/lib/gitlab/safe_request_store_spec.rb' - 'spec/lib/gitlab/safe_request_store_spec.rb'
# Offense count: 26
# Cop supports --auto-correct.
Style/RedundantFileExtensionInRequire:
Enabled: false
# Offense count: 206 # Offense count: 206
# Cop supports --auto-correct. # Cop supports --auto-correct.
Style/RedundantInterpolation: Style/RedundantInterpolation:
Enabled: false Enabled: false
# Offense count: 10
# Cop supports --auto-correct.
Style/RedundantRegexpCharacterClass:
Exclude:
- 'app/models/concerns/taskable.rb'
- 'ee/app/models/saml_provider.rb'
- 'lib/banzai/filter/markdown_pre_escape_filter.rb'
- 'lib/gitlab/authorized_keys.rb'
- 'lib/gitlab/fogbugz_import/repository.rb'
- 'lib/gitlab/quick_actions/substitution_definition.rb'
- 'lib/gitlab/regex.rb'
- 'spec/features/merge_request/user_views_open_merge_request_spec.rb'
- 'spec/tasks/gitlab/usage_data_rake_spec.rb'
# Offense count: 279 # Offense count: 279
# Cop supports --auto-correct. # Cop supports --auto-correct.
Style/RedundantRegexpEscape: Style/RedundantRegexpEscape:
@ -917,13 +851,6 @@ Style/RedundantSelf:
Style/RescueModifier: Style/RescueModifier:
Enabled: false Enabled: false
# Offense count: 359
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: implicit, explicit
Style/RescueStandardError:
Enabled: false
# Offense count: 123 # Offense count: 123
# Cop supports --auto-correct. # Cop supports --auto-correct.
Style/SingleArgumentDig: Style/SingleArgumentDig:

16
.solargraph.yml.example Normal file
View file

@ -0,0 +1,16 @@
---
include:
- "**/*.rb"
exclude:
- "**/spec/**/*"
- qa/qa/specs/features/**/*
- vendor/**/*
- ".bundle/**/*"
require: []
domains: []
reporters:
- rubocop
- require_not_found
require_paths: []
plugins: []
max_files: 15000

View file

@ -2,6 +2,645 @@
documentation](doc/development/changelog.md) for instructions on adding your own documentation](doc/development/changelog.md) for instructions on adding your own
entry. entry.
## 13.12.3 (2021-06-07)
### Added (1 change)
- [Add an option to expose description_html in Release API](gitlab-org/gitlab@47f3fba10dfa82c65b6b006d56cc1724aac411eb) ([merge request](gitlab-org/gitlab!63393))
### Fixed (5 changes)
- [Fix spam detection with Akismet client](gitlab-org/gitlab@75dbe8d017ed691d0517f0a6ca7b9bdd866fa9d9) ([merge request](gitlab-org/gitlab!63393))
- [Set CSP back to disabled by default](gitlab-org/gitlab@f8f2dbf229693e20171185ae8e31fd59ce2131b3) ([merge request](gitlab-org/gitlab!63393))
- [Fix CSP issues related to captchas](gitlab-org/gitlab@cec54814460994ea40311f1091fb7f091d04964f) ([merge request](gitlab-org/gitlab!63393))
- [Fix issue with frames not loading in Safari](gitlab-org/gitlab@77b9355f244370b1c184943581f3b6cc27495931) ([merge request](gitlab-org/gitlab!63393))
- [Catch PgQuery::ParseError errors and log as-is](gitlab-org/gitlab@a4f36df3701208b5d015e1e818f3d5be3577697a) ([merge request](gitlab-org/gitlab!62795))
### Changed (1 change)
- [Improve SSH key expiration warning emails](gitlab-org/gitlab@2e3929503046ab1da5635ef295321ce08843f937) ([merge request](gitlab-org/gitlab!63393))
## 13.12.2 (2021-06-01)
### Security (11 changes)
- [Bump BinData version](gitlab-org/security/gitlab@609303ac4904cad6bbcc776bb809a46a66891d53) ([merge request](gitlab-org/security/gitlab!1414))
- [Block access to GitLab for users with expired password](gitlab-org/security/gitlab@f0a07ce8a596a4dd6f1311dff893c896b0cdf82f) ([merge request](gitlab-org/security/gitlab!1446))
- [Adds redirect page to OAuth](gitlab-org/security/gitlab@6ed6dfc8f9ba785fd5337ee0f4701c983b6f07b0) ([merge request](gitlab-org/security/gitlab!1441))
- [Update users two factor required from group](gitlab-org/security/gitlab@8c3fe378289d2dced2139c9db396b6270d3bc0ab) ([merge request](gitlab-org/security/gitlab!1432))
- [Updates authorization for lint](gitlab-org/security/gitlab@be33caed9684af07ac715038d7a2865d9d0c7247) ([merge request](gitlab-org/security/gitlab!1429))
- [Opt in to Atlassians new context qsh](gitlab-org/security/gitlab@f1d06250fbef6fa2af8a8c88d3b3f9391c332089) ([merge request](gitlab-org/security/gitlab!1408))
- [Limit oncall projects shown to scope of source](gitlab-org/security/gitlab@a70859aaac44c9b3bd3cc673737e01e2a3aba99c) ([merge request](gitlab-org/security/gitlab!1410)) **GitLab Enterprise Edition**
- [Only verify commit signatures if the user email is verified](gitlab-org/security/gitlab@9039fdffdf109cdf667be8db3d792a502aad8bb9) ([merge request](gitlab-org/security/gitlab!1385))
- [Prevent XSS on notebooks](gitlab-org/security/gitlab@9a2dc30920c2a271257ccec92aebcfabec276096) ([merge request](gitlab-org/security/gitlab!1421))
- [Truncate all non-blob markdown to 1MB by default](gitlab-org/security/gitlab@e9e6bc0450639ee25fd0ced983da231700a4d4f9) ([merge request](gitlab-org/security/gitlab!1420))
- [Use xpath search of Nokogiri instead of css search](gitlab-org/security/gitlab@7e5c79021ab54ffc70d22bba3c663ce38ae83a88) ([merge request](gitlab-org/security/gitlab!1416))
## 13.12.1 (2021-05-25)
### Fixed (3 changes)
- [Merge branch 'fix/pin-gke-version-to-1-18' into 'master'](gitlab-org/gitlab@44de5542ca82b371ed280db9ce03e0c4d4bd6135) ([merge request](gitlab-org/gitlab!62466))
- [Merge branch '331562-fix-pipeline-security-tab-scanner-filter' into 'master'](gitlab-org/gitlab@1d70bf2efd574537d73b5fd80f92fd8dd939980b) ([merge request](gitlab-org/gitlab!62466))
- [Update Gitaly's binary path in init.d scripts](gitlab-org/gitlab@0761e78434dbfa120c8ae14263bfe77f9ae48c71) ([merge request](gitlab-org/gitlab!62457))
## 13.12.0 (2021-05-22)
### Security (3 changes)
- Prevent DOS from Chaining in Mermaid. !60382
- Report pipeline creation success only when warranted. !60746
- Fix XSS vulnerability in shared runner description. !60891
### Removed (10 changes, 2 of them are from the community)
- Delete feature flag for usage_data_a_compliance_audit_events_api. !52947
- Remove feature flag api_always_use_application_json. !56777
- Remove unneeded index on packages_debian_{project,group}_architectures.distribution_id. !59615 (Mathieu Parent)
- Delete HipChat service database records. !59769
- Set Hipchat metric definitions status to removed. !59779
- Remove Legacy Group-Level DORA metrics API. !59858
- Remove Alerts service metric. !60149
- Remove description_html field from Release Rest API. !61327
- Removes multiple_cache_per_job feature flag and associated code. (Laura Montemayor)
- Remove support for WIP in merge request title toggle.
### Fixed (108 changes, 32 of them are from the community)
- Add warning when locally stored description is out of date. !29438
- Disable unsupported task items in Markdown tables. !46060
- Flush statistics cache anytime it is updated. !52938
- Return an HTML response for a request with the Accept */* header. !56288
- Resolve offense Performance/Count. !57007 (Shubham Kumar (@imskr))
- Don't show due dates in red if the issue is closed. !57647 (Daniel Ziegenberg <daniel@ziegenberg.at>)
- Fix Rails/SaveBang Rubocop offenses for wiki_page models. !57899 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix Rails/SaveBang rubocop offenses in spec/frontend. !57909 (Abdul Wadood @abdulwd)
- Fix Rails/SaveBang rubocop offenses in spec/graphql. !57912 (Abdul Wadood @abdulwd)
- Resolve RuboCop offenses for Style/RedundantRegexpCharacterClass. !57914 (Shubham Kumar @imskr)
- Fixes rubocop offenses Style/RescueStandardError. !57923 (Shubham Kumar (@imskr))
- Resolves rubocop offense Style/RedundantFileExtensionInRequire. !57963 (Shubham Kumar (@imskr))
- Fix Rails/SaveBang Rubocop offenses for project related models. !57983 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix Rails/SaveBang Rubocop offenses for member models. !57994 (Huzaifa Iftikhar @huzaifaiftikhar)
- Resolves offenses Style/RaiseArgs. !58009 (Shubham Kumar @imskr)
- Resolves offenses Style/RedundantBegin. !58017 (Shubham Kumar (@imskr))
- Resolves offenses Security/YAMLLoad. !58042 (Shubham Kumar (@imskr))
- Resolves rubocop offenses Rails/WhereEquals. !58067 (Shubham Kumar (@imskr))
- Fix EmptyLineAfterFinalLetItBe offenses for merge request module. !58185 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe Rubocop offenses for projects module. !58187 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses for alert management module. !58191 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses in spec/graphql/resolvers. !58239 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses in spec/lib/gitlab/ci. !58249 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses in spec/lib/gitlab/database. !58251 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses in spec/lib/gitlab/git. !58254 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses in spec/lib/gitlab/repository. !58308 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses in spec/models/packages. !58370 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses in spec/models/releases. !58384 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses in spec/models/wiki_page. !58388 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses in spec/presenters. !58405 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses in spec/services/ci. !58411 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix EmptyLineAfterFinalLetItBe offenses in spec/services/feature_flags. !58419 (Huzaifa Iftikhar @huzaifaiftikhar)
- Fix RSpec/EmptyLineAfterFinalLetItBe rubocop offenses in spec/workers. !58421 (Abdul Wadood @abdulwd)
- Prevent loss of timelogs when deleting notes. !58525 (Lee Tickett @leetickett)
- Fix multiline comment dragging in Firefox. !58692
- Update cached count for "done" todos when deleting todo targets. !58773
- Fix light label text color in dark mode. !59088
- Fix false positive for codequality mr diff report. !59421
- Fix for shell announcement banners. !59482
- Reschedule background migration to copy projects.container_registry_enabled to project_features.container_registry_access_level. !59513
- Fix images not showing in Jupyter Markdown tables. !59551
- Fix paginator of Environment Serializer. !59751
- Add generic avatar method for users and groups. !59758
- Set Web hook defaults to intended default values. !59814
- Fix restrictive permissions for ProjectMembers who are owners. !59844
- Users search: fix avatar size. !59883
- Fix cascading settings attr writer behavior. !59910
- Set a default region to Workhorse S3 client. !59932
- Fix invite banner display member count for subgroups page. !59948
- Fix LFS push mirroring for mirrors set up a long time ago. !59972
- Fix pipeline status when DAG jobs needs manual jobs. !59975
- Fix tag matching behavior on New Release page. !60035
- Fix bug that prevented searching for group/project members with multiple words. !60051
- Fix link to subgroup OAuth application. !60066
- Explicitly destroy webhooks and logs before the project deletion. !60122
- Upgrade omniauth_openid_connect gem to our own fork. !60181
- Fix bug when board card label is clicked. !60327
- Align help icon for code quality merge request widget. !60330
- Fast destroy job artifacts when destroying a pipeline. !60391
- Ensure we never error in web hook logs. !60408
- Fix bug where test report was not showing while pipeline was running. !60416
- Do not set experiment cookie on self managed and delete existing cookies. !60419
- Fix regression in GraphQL field MergeRequest.assignees.webUrl. !60428
- Fix usage ping misreporting consolidated object storage settings. !60526
- Fixes bug where variables are being filtered that do not have a value but a key. !60538
- Fix MR sidebar rendering on mobile. !60552
- Fix EnvironmentSerializer preloads unrelated pipelines/builds. !60562
- Don't email issue email participants confidential comments. !60594 (Lee Tickett @leetickett)
- Resolve Cannot Set Assignee in Boards View for self-managed GitLab with Relative URL. !60711
- Check duplicate package regex against version as well as name. !60760
- Fix Openshift template to run on main branch. !60811
- Fix downloadable artifacts for pipeline. !60836
- Fix SMTP errors when delivering service desk thank you emails with SMTP pool enabled. !60843
- Fix changelog Dangerfile to convert MR IID to a string before comparison. !60899
- Fix due date being randomly set in issue page. !60917
- Disable autocomplete for due date in issue sidebar to prevent triggering updates on Chrome. !60973
- Remove subscribed field from todos, related issues, and epic issues API. !60981
- Fixed quick actions link not showing in diff line comment forms. !61029
- Fixes merge request controls not visible when merge request has single commit. !61030
- Fixed preview review comment not working with single file diff mode. !61032
- Fixed dollar signs in suggestions getting replaced incorrectly. !61041
- Fix artifacts dropdown for merge request and commits pipelines tables. !61045
- Remove hyphen from Cloudrail CI template name. !61079
- Bust the cache for /whats-new. !61081
- Fix commit messages text color in dark mode. !61082
- Suppress all non-nullable field errors for assignee widget graphql queries to remove assignee fetching error messages in boards. !61091
- Correct the 'blocked' scope in 'Member' class. !61108
- Preserve user changes in the wiki editor if multiple people edit the page. !61120
- Fix multiple assignees checked in boards sidebar. !61227
- Fix incorrect issue and merge requests counts with filters. !61230
- Fix slack label filter behavior blank. !61236
- GithubImport: Fix Review importer when the author does not exist anymore. !61257
- Restrict issue creation via API by relevant permissions. !61281
- Merge Request API: Treat 0 as a non-assigning sentinel value. !61301
- Remove extra padding and margin from merge request widget review app dropdown chevron. !61302
- Fix a bug displaying project commit anchors. !61361
- Reset Source Editor's layout after Startup CSS. !61426
- GithubImporter: Fix "ArgumentError: string contains null byte". !61480
- Use correct scope when authorizing with Jira GitHub DVCS connector. !61496
- Fix user popover bio overflow. !61555
- Hide commit msg for package files without pipeline. !61571
- Fix position of note actions. !61594
- Inject Feature Flags Limit Value. !61621
- Fix services API returning non-existing services. !61646
- Fix Jira Connect sign in button style. !61665
- Filter out unconnected-to-user members from receiving on access request emails. !61819
- Fixed Rails Save Bang offenses in few spec/models/* files. !61862 (Suraj Tripathi @surajtripathy07)
- Fix issuable search optimization in PG12. !61880
### Deprecated (4 changes, 1 of them is from the community)
- Deprecate Alerts service metric. !59899
- Add Managed Prometheus deprecation warning. !60560
- Deprecate SetWip GraphQL mutation and add SetDraft mutation. !60803
- Add GraphQL field 'Project.topics' and deprecate 'Project.tag_list'. !61250 (Jonas Wälter @wwwjon)
### Changed (145 changes, 52 of them are from the community)
- Update admin users to use GitLab UI table by default. !54085
- Remove artifact expiry backfill temp index. !54252
- Enable the new pipeline form by default. !55250
- Add migration to update plans on new post-EoA subscriptions. !55625
- Add support for retries to Advanced Search reindexing. !55681
- Add missing parts of GraphQL schema to GraphQL documentation. !55944
- Update Keyboard shortcut help: adding search, update styling. !56400
- Redirect to activity page when accepting invitation. !56695
- Add external documentation references in GraphQL. !56704
- Send in-product marketing email usage data. !56752
- Enable new RPC to destroy wiki pages. !57106
- Always resolve GitLab alerts when recovery alert payload is received. !57302
- Add gl-badge for badges in pipeline schedules nav. !57937 (Yogi (@yo))
- Add gl-badge for badges in jobs page nav. !57938 (Yogi (@yo))
- Add gl-badge class for tag's badge. !57939 (Yogi (@yo))
- Add gl-badge for badges in MRs and issues nav. !57942 (Yogi (@yo))
- Add gl-badge for badges in todos nav. !57943 (Yogi (@yo))
- Add gl-badge for badges in admin users nav. !57951 (Yogi (@yo))
- Add gl-badge for storage badge in admin groups page. !57954 (Yogi (@yo))
- Add gl-badge for badges in milestone drawer. !57964 (Yogi (@yo))
- Add gl-badge for badges in snippets nav. !57966 (Yogi (@yo))
- Add gl-badge for badges in pipeline page nav. !57970 (Yogi (@yo))
- Add gl-badge for badges in project search page nav. !57971 (Yogi (@yo))
- Add gl-badge for badges in new MR nav. !57995 (Yogi (@yo))
- Apply gl-form-input for fields in ssh keys page. !58000 (Yogi (@yo))
- Apply gl-form-input for fields in preferences page. !58004 (Yogi (@yo))
- Apply gl-form-input for search field in milestone page. !58007 (Yogi (@yo))
- Apply gl-form-input for fields in new project milestone page. !58010 (Yogi (@yo))
- Move to btn-confirm from btn-success in emails directory. !58029 (Yogi (@yo))
- Move badge to vue component in project badges. !58045 (Yogi (@yo))
- Switch to gl-badge in whats new dropdown. !58235 (Yogi (@yo))
- Add gl-form-input class for fields in create project page. !58299 (Yogi (@yo))
- Move to btn-confirm from btn-success in create from template page. !58303 (Yogi (@yo))
- Add gl-form-input class for fields in gitlab import page. !58304 (Yogi (@yo))
- Add gl-form-input class for fields in bitbucket import page. !58309 (Yogi (@yo))
- Add gl-form-input class for fields in fogbugz import page. !58312 (Yogi (@yo))
- Add gl-form-input class for fields in gitea import page. !58313 (Yogi (@yo))
- Add gl-form-input class for fields in import page. !58316 (Yogi (@yo))
- Add gl-form-input class for fields in phabricator import page. !58318 (Yogi (@yo))
- Change text for incident auto-resolve setting to match behavior. !58515
- Move license history to gl-table utility class. !58531 (Yogi (@yo))
- Add margin top for clear repo check button in admin. !58536 (Yogi (@yo))
- Add more padding for whats new badge in drawer. !58544 (Yogi (@yo))
- Add pause_ms column to batched_background_migrations and batched_background_migration_jobs. !58583
- Geo: Add verification for Terraform States. !58800
- Disable automatic setup of alerts for Prometheus cluster integration. !58853
- Improve message for :project_not_found error to indicate possible cause. !58945 (Ignacy Moryc @ignacy)
- Rename 'no contributions' to 'No contributions' in profile activity graph helper. !59076 (Yogi (@yo))
- Center align project home navigation. !59079 (Yogi (@yo))
- Move to new GitLab UI for card in health check page. !59081 (Yogi (@yo))
- Update to question-o and change color in admin users. !59133 (Yogi (@yo))
- Update to question-o from question icon in navbar. !59134 (Yogi (@yo))
- Update to question-o from question icon in user stats. !59135 (Yogi (@yo))
- Move card in billing page to gl-card utility class. !59138 (Yogi (@yo))
- LibreOffice/OpenOffice file extensions in icon map. !59159 (Holzfeind, Daniel Georg)
- Export issues sorted by relative position and recompute issue relative position on project import. !59175
- Move 2fa recovery codes to GlCard component. !59219 (Yogi (@yo))
- Add gl-form-input utility class for pin code field in 2fa. !59220 (Yogi (@yo))
- Replace invite banner button with modal trigger. !59260
- Resolve Abstract participants dropdown to a shared component. !59358
- Make new project ui the only option. !59452
- Add space next to spinner in Preview payload button. !59458 (Yogi (@yo))
- Add btn-default class in seat link payload button. !59459 (Yogi (@yo))
- Add VulnerabiltyFindingEvidenceRequest model. !59539
- Add VulnerabiltyFindingEvidenceResponse model. !59563
- Add gl-badge utility class for deleted projects tab. !59590 (Yogi (@yo))
- Move npm and yarn to new dropdown UI. !59628
- Change artifacts download button to a vertical ellipsis menu. !59667
- Correct variant of Rebase button in MR widget. !59684
- Improve merge message UI text. !59693
- Use GlModal for Confirmation of Deploy Key Delete. !59697
- Add ability to order cluster token by last used. !59716
- Make new issue, merge request, and epic emails more consistent. !59718
- Add merge request interaction details to MergeRequest.assignees. !59770
- Expose enable_advanced_logs_querying in Environments API. !59772
- Increase note actions target size. !59776
- Redesign the DevOps Score report. !59856
- Bumped image in the CI-Template Jobs/Build.gitlab-ci.yml to 0.6.0. !59882 (Daniel Estermann (@d.esterman))
- Expose job and project queued duration in all APIs. !59901
- Include installable and/or displayable packages only in package finders. !59921
- Log exceptions in Lfs::PushService. !59960
- Container Registry Details: split details from tags call. !59969
- Add ability to include self in cascading setting lock check. !60031
- Remove workhorse_extract_filename_base feature flag. !60070
- Support worker_name predicate in Sidekiq queue selector. !60084
- Add Gradle Kotlin installations commands. !60097 (Cromefire_ (@cromefire_))
- Fix breadcrumbs and navigation in runner details pages. !60129
- Improve dropdown and search in the tags page. !60145
- Clarify image repository delete actions. !60154
- Update RubyGems and NuGet packages to error status upon metadata extraction failure. !60172
- Pre-fill user email address after confirming. !60179
- Retain timelog spent_at time. !60191 (Lee Tickett @leetickett)
- Update button variants to btn-confirm on MR page. !60254
- Rename default branch for empty project actions. !60258
- Remove visualization feature flag in pipeline editor. !60273
- Reorder source_project_id foreign key constraint in merge_requests table. !60313
- Update edit file buttons and spacing. !60318
- Keep consistent Global Search tab order. !60319
- Toggle subscribed state when clicking on icon in collapsed sidebar. !60345
- Add a Spamcheck API key application setting. !60385 (jdsalaro)
- Change product-marketing-email sending schedule. !60422
- Fix copy on webhook admin pages for "Issues events" and "Confidential issues events". !60453
- This change captures resizes of the runner installation instructions modal to make it usable on screens. !60588
- Create table user_credit_card_validations. !60626
- Update error tracking settings to use better copy and correct colors. !60627
- Add sha256 to package file API payload. !60631
- Github Importer: Add Cache to Pull Request Reviews importer. !60668
- Add username and password fields for Advanced Search. !60710
- Migrate DevOps Score empty state to Vue. !60715
- Adds field authorization to pipeline fields. !60754
- Change conan token expiration from 1 hour to 24 hours. !60763
- Remove mobsf service for mobsf SAST job. !60770
- Polish the "What's new" UI. !60804 (Kev @KevSlashNull)
- Disable web-hooks that fail repeatedly. !60837
- Add slack integration individual usage ping. !60847
- Extend branch support for Static Site Editor. !60848
- Store slice multiplier and max slices running for reindex in DB. !60861
- Keep new prometheus cluster integration in sync with old cluster application. !60877
- Validate release description length. !60892
- i18n: Show translation levels for each language in the UI. !60905
- Add kubernetes_agent_proxy_request to usage ping. !60978
- Validate CI pipeline jobs dependencies. !60999
- Update appearance of "Enable shared runners for this project" toggle in Project > Settings > CI/CD. !61043
- Add offset and limit to branch names resolver. !61061
- Require 3 or more characters in search term when searching groups in Jira Connect app. !61099
- Enforce .git suffix when importing git repo. !61115
- Improve field descriptions in the Jira integration form. !61205
- Migrate 'tags' to 'topics' for project in the database context. !61237 (Jonas Wälter @wwwjon)
- Rename master to main in views placeholders. !61252
- Make pipeline retry endpoint async. !61270
- Add relations export request when Bulk Import is initiated. !61365
- Fix :focus styles for What's New. !61398
- Add body to finding evidence requests. !61408
- Make semgrep generally available. !61412
- clicking backdrop closes modal for What's New. !61420
- Scroll to the top of a diff file when it is collapsed. !61432
- Wiki: Use FindAllCommits RPC to list page versions. !61459
- Allows masking ~ character. !61517 (Thomas Dallmair)
- Backfill clusters_integration_elastic_stack.enabled. !61521
- Update rails project template to rails 6.1. !61547
- Add body to finding evidence responses. !61631
- Support warning in pipeline creation by default. !61803
- Make find_remote_root_refs_inmemory feature flag enabled by default. !61824
- Add link to email notifying of MR changing draft status. !61891
- Remove success variant for primary button in upload file modal. (Yogi (@yo))
### Performance (63 changes, 1 of them is from the community)
- Make MergeService idempotent. !55368
- Speed up save on New/Edit Release page. !57000
- Cache path lookups for namespaces. !57027
- Cache project tag list. !57031
- Linear traversal query for Namespace#ancestors. !57137
- Set traversal_ids for every namespace. !57318
- Resolve admin_group_member group policy n+1. !58948
- Optimize AvailableLabelsService for multiple labels search. !59032
- Reduce number of SQL queries when creating SystemNotes. !59102
- Enable pagination in the CompareController. !59162
- Fix N+1 for commits with pipelines. !59234
- Improve diff_files endpoint performance. !59489
- Create the merge request pipeline asynchronously on push. !59624
- Optimize CI Settings page to reduce N+1 queries. !59625
- Linear traversal query for Namespace#descendants. !59632
- Remove unnecessary validation avoiding N+1 queries when building integrations. !59635
- Improve the packages finder helper SQL queries when handling deploy tokens. !59739
- Improve shifting of positions when creating issues. !59745
- Remove the longer_count_cache_validity_period feature flag. !59746
- Recreate index for deployments updated_at and finished_at. !59771
- Exclude build dependency calculation when creating the pipeline. !59810
- Improve pagination of users in the admin panel. !59884
- Prevent loading of cohorts data in the admin users list. !59890
- Avoid loading user objects when bulk updating todos. !59909
- Fix N+1 queries in namespace#any_project_has_container_registry_tags?. !59916
- Replace OpenStruct with Struct in project_level_stage_adapter.rb. !59956 (Amit Patel @amit.savani)
- Recalculate assigned open issues count after cache invalidation. !59961
- Improve performance of LFS integrity checks. !59991
- Add new service to handle add_spent_time to MRs. !60043
- Stop exposing artifacts on pipelines.json. !60126
- Improve the Maven API file endpoints response time when a non existing package is requested. !60142
- Fix three N+1s in Releases API entity generation. !60189
- Remove string duplication in BlobStitcher. !60406
- Delete all label links asynchronously when issuable gets destroyed. !60487
- Fix releases API N+1 in sorted_links usage. !60561
- Refactor notification recipients builder for watchers. !60572
- Remove N+1 query from Issue::Metrics#record. !60589
- Fix repeating SQL queries when changing labels for a resource. !60718
- Fine tune a few queries found in GroupMembers#index. !60857
- Fix N+1 problem in CustomEmojiFilter. !60910
- Create partial indexes for pending/running builds. !60942
- Stop exposing has_downloadable_artifacts in pipelines.json. !60950
- Improve performance of project issues API. !60981
- Include other cols in index for pending builds. !60997
- Remove unnecessary query from close_issue method. !61087
- Partial index optimization for namespaces id. !61098
- Decrease load time of project select dropdowns. !61117
- Apply rate-limiting to webhook executions. !61151
- Update grape-path-helpers to v1.6.3. !61196
- Improve the performance of Release LIST v4 API endpoint by short-interval caching. !61223
- Ensure iid is set before skipping ci pipeline. !61231
- Stop exposing artifacts in pipelines.json. !61253
- Ensure project iid is set before saving pipeline from web terminal. !61311
- Sync traversal path of namespaces. !61329
- Enable notification settings recipient refactor by default. !61443
- Tie-breaker in Deployment Finder should respect the original sort direction. !61444
- Improve memory consumption of issuable APIs. !61561
- Fix environment filter of Deployments Finder. !61564
- Optimize merge request permission check for references. !61591
- Introduced granular control to Monaco tag. !61690
- Apply rate-limit cache to branches endpoint. !61723
- Enforce updated_at ordering in Deployment API for performance optimization. !61870
- Resolve Remove `subscribed` from GraphQL boards list query. !61881
### Added (114 changes, 16 of them are from the community)
- Commit author for suggestions is note author. !39940
- Report summarized Gitaly Apdex via usage ping. !47040
- Allow disabling build stage for Auto Devops. !48638 (Shane Davidson @shanekdavidson)
- Allow access to registry API of the current project using the job token. !49750 (Mathieu Parent)
- Integrate with the Spamcheck anti-spam engine. !52385
- Add generating Speedscope flamegraphs for a request. !53288
- Add collapsible section shortcut to markdown controls. !54938
- Add Terraform Module Registry. !55018
- Clear group open issues count cache when bulk updating issues state. !56386
- Add options for Slack and Mattermost label filter behavior. !56657
- Create packages_helm_file_metadata table. !57017 (Mathieu Parent)
- Add "previously merged commits" dropdown in merge request compare dropdown. !57026
- Add specific rate limits for Package Registry (Package API). !57029 (Jonas Wälter @wwwjon)
- Expose merge request timelogs via GraphQL. !57322 (Lee Tickett @leetickett)
- Automate deactivation of dormant users for self-managed instances. !57778
- Add indexes for cleanup policies on container_repositories and container_expiration_policies. !58123
- Add CI runner counts to usage ping. !58197
- Add snoplow tracking to Releases API. !58221
- Add ConfigureSecretDetection graphql mutation. !58230
- Adds access token endpoints to OpenAPI. !58620 (jimcser)
- Add sorting for group and project packages type. !58657
- Add more fields to the GraphQL blob type. !58906
- Add commmit_pipeline_path to CreateCommit mutation. !58931
- Add cascading namespace setting database migration helper. !58940
- Add application setting for What's new. !59011 (Jonas Wälter @wwwjon)
- Create "projects/import-remote" to import a project using a remote object storage to fetch the exported project
. !59033
- Add support to destroy iteration cadences in GraphQL. !59060
- Remove feature flag from invite members banner. !59203
- Send email to oncall rotation participants and project owners when user is removed. !59331
- Improve errors reporting for board lists update. !59549
- Add autocomplete to milestone description. !59564 (Jonas Wälter @wwwjon)
- Add "active" filter to deploy tokens API. !59582 (Devin Christensen)
- Implement Sidekiq queue re-routing in the application. !59604
- Added type field into Issues API. !59648 (Raimund Hook @stingrayza)
- Expose KAS metadata through GraphQL - enabled, version and externalUrl. !59696
- Support board issue filtering by iids in GraphQL. !59703
- Add note about SSH key title being public information. !59726
- Add missing data to CiJob type. !59805
- Add link to documentation in empty pipeline test reports. !59812
- Add table to store Security Orchestration Policy Schedules. !59842
- Add code owners metric to DevOps adoption page. !59874
- Search projects by topic via API. !59900
- Remove pages_serve_with_zip_file_protocol feature flag. !59908
- Implement variables for pipeline workflow rules. !59970
- Add Group relations export models. !59976
- Add Group relations export API. !59978
- Added tracking to diff view settings. !59979
- Remove pages_update_legacy_storage feature flag. !60005
- Remove pages_serve_from_legacy_storage feature flag. !60010
- Add project_id foreign key to timelogs. !60040 (Lee Tickett @leetickett)
- Lazy load artifacts on pipelines list page. !60058
- Create database table dast_site_profiles_pipelines. !60090
- Allow issueSetDueDate GraphQL mutation to accept null values. !60139
- Introduce limit to number of registered runners. !60157
- Add isuable time tracking report. !60161 (Lee Tickett @leetickett)
- Add internal API support for updating issue types on issues. !60173
- Allow merge request search via GraphQL. !60190 (Lee Tickett @leetickett)
- Add CI template field to project GraphQL type. !60276
- Keep latest pipeline artifact forever. !60400
- Expose user permissions on JobType. !60427
- Add description and roll_over columns to iterations_cadences. !60436
- Populate timelogs.project_id. !60439 (Lee Tickett @leetickett)
- Add Ci::Build graphql mutations. !60443
- Ensure highlighting limits are documented, configurable, and monitorable. !60445
- Add semgrep to SAST config UI. !60460
- Add ability to swap revisions when comparing. !60491
- Add status_changed_at to deployments webhooks. !60518
- Show a random predefined message while MR merging is in progress. !60521
- Add ability to view graph by job dependency. !60522
- Show Deploy Boards for Environments in Folders. !60525
- Allow frontend to observe Prometheus metrics. !60633
- Add setting to allow or disallow duplicates for generic packages. !60664
- Add Escalation policies and rule tables. !60685
- Add support for create, updating, and filtering issues based on issue type in REST API. !60687
- Improve logging in e-mail receiver processing. !60692
- Allow migrating scheduled and retried Sidekiq jobs to new queues. !60724
- Add support for creating/modifying different issue types via GraphQL API. !60747
- Add Maven to Package Graphql types. !60808
- Add API to set credit card validation timestamp for user. !60828
- Add asset links to release keyword. !60896
- Application setting for FloC participation (disabled by default). !60933
- Add API endpoint for deleting a package file. !60970
- Show total group counts in admin users table. !60998
- Package: group and project graphql types - add search. !61001
- Add missing status type and enum to package graphql type. !61002
- Expose blob plain data in GraphQL. !61016
- Lazy load artifacts dropdown in pipelines merge request widget. !61055
- Remove feature flag from upgrade link in user menu. !61057
- Show unit report attachments in the pipeline test report. !61075
- Add Elastic Stack cluster integration. !61077
- Implement bulk import for all groups on the page. !61097
- Add shared_visible_only option to project's groups API. !61118
- Add external status check responses. !61135
- Add more attributes to the blob GraphQL API. !61155
- Add complete field to indicate if a pipeline/job is complete. !61209 (Cong Chen @gentcys)
- Add stuck field to CiJob. !61247
- Add option to remove labels on issue close in the REST and GraphQL API. !61286
- Ban user state and UI. !61292
- Enable by default scheduled execution of batched background migrations. !61316
- Enable by default automatic optimization of batched background migrations. !61317
- Improve UX of the award emoji picker. !61384
- Add semgrep to Secure-Binaries and update support docs. !61411
- Add cron worker for cleaning up unit test tables. !61463
- Redirect to the last visited epic board. !61474
- Implement wildcard support for pipeline include file paths. !61507
- Add DS_EXCLUDED_ANALYZERS var to Dependency Scanning template. !61529
- Add fields to graphQL version type. !61567
- Add pipeline editor drawer for introduction to CI. !61620
- Add nuget metadata type to Package GraphQl type. !61695
- Add repository diskPath parameter to GraphQL API. !61725
- Upgrade Pages to v1.39.0. !61756
- Add 3 stage pipeline template. !61762
- Email users about SSH keys that are expired or expiring soon. !61812
- Observe limit to hours setting in timelog report. !61849 (Lee Tickett @leetickett)
### Other (122 changes, 38 of them are from the community)
- Enable Content-Security-Policy header by default. !56923
- Fix Rails/SaveBang Rubocop offenses for user related models. !57901 (Huzaifa Iftikhar @huzaifaiftikhar)
- Externalise strings in _abuse.html.haml. !57968 (nuwe1)
- Externalise Strings in /application_settings/_gitaly.html.haml. !57976 (nuwe1)
- Externalise strings in application_settings/_plantuml.html.haml. !58023 (nuwe1)
- Externalise strings in /application_settings/_prometheus.html.haml. !58030 (nuwe1)
- Externalize strings in /application_settings/_signin.html.haml. !58066 (nuwe1)
- Externalize strings in application_settings/_spam.html.haml. !58076 (nuwe1)
- Externalize strings in application_settings/_terminal.html.haml. !58081 (nuwe1)
- Eternalize strings in application_settings/_usage.html.haml. !58088 (nuwe1)
- Externalise strings in /admin/users/_form.html.haml. !58096 (nuwe1)
- Externalize strings in admin/users/_profile.html.haml. !58106 (nuwe1)
- Externalise strings in users/_projects.html.haml. !58110 (nuwe1)
- Externalise strings in users/edit.html.haml. !58117 (nuwe1)
- Externalize strings in users/projects.html.haml. !58122 (nuwe1)
- Externalize strings in /users/show.html.haml. !58126 (nuwe1)
- Externalize strings in appearances/_form.html.haml. !58135 (nuwe1)
- Externalise strings in appearances/preview_sign_in.html.haml. !58138 (nuwe1)
- Externalize strings in /background_jobs/show.html.haml. !58141 (nuwe1)
- Externalize strings in broadcast_messages/_form.html.haml. !58143 (nuwe1)
- Externalize strings in requests_profiles/index.html.haml. !58161 (nuwe1)
- Externalizes strings in runners/show.html.haml. !58166 (nuwe1)
- Externalises strings in spam_logs/index.html.haml. !58170 (nuwe1)
- Externalise strings in confirmations/new.html.haml. !58173 (nuwe1)
- Externalize strings in _confirmation_instructions_secondary.html.haml. !58216 (nuwe1)
- Externalize strings in reset_password_instructions.html.haml. !58224 (nuwe1)
- Externalise strings in reset_password_instructions.text.erb. !58226 (nuwe1)
- Externalize strings in unlock_instructions.text.erb. !58229 (nuwe1)
- Externalise strings in shared/_links.erb. !58278 (nuwe1)
- Externalize strings in milestones/_header_title.html.haml. !58300 (nuwe1)
- Externalize strings in milestones/new.html.haml. !58311 (nuwe1)
- Externalize strings in viewers/_changelog.html.haml. !58446 (nuwe1)
- Externalize strings in viewers/_contributing.html.haml. !58447 (nuwe1)
- Externalize strings in viewers/_download.html.haml. !58450 (nuwe1)
- Externalize strings in viewers/_license.html.haml. !58452 (nuwe1)
- Externalise-strings-in-viewers/_readme.html.haml. !58456 (nuwe1)
- Remove the global default branch feature flag. !59024
- Review and revise custom issue tracker UI text. !59277
- Add specs ensuring all metric definition key paths are present in Usage Ping structure. !59314
- Review and revise EWM integration UI text. !59386
- Review UI text and docs for Flowdock integration. !59388
- Align UI of Merge Conflicts app with our design system. !59400
- Prepare to convert PK type for ci_build_needs. !59467
- Upgrade Bootstrap to v4.5.3. !59501
- Review UI text and docs - Google Chat. !59518
- Make Sentry processors for GitLab-internal error tracking compatible with new version of Sentry gem. !59565
- Upgrades the final few bootstrap buttons. !59641
- Remove the enabled by default feature flag for maven group level improvements. !59748
- Initialize int8 migration for ci_job_artifacts. !59786
- Do not require invited users to confirm their email address. !59790
- Update GitLab Runner Helm Chart to 0.28.0. !59802
- Update Create:Code Review metrics definitions. !59816
- Update Metrics Definitions for Runner. !59824
- Add group_level? and instance_level? helpers to Service model. !59838 (Amit Patel @amit.savani)
- Update UI text for confluence integration. !59839
- Revise project access tokens UI text. !59878
- Remove usage_data_track_quickactions feature flag. !59914
- Update, organize, and improve analytics metrics definition files. !59926
- Add --ee option to Usage Metric Definition generator to fill correct tier and distribution. !59942
- Initialize conversion of ci_sources_pipelines.source_job_id to bigint. !59951
- Review and revise YouTrack integration UI text. !59998
- Review UI text for pipeline error messages. !60018
- Drop Vulnerabilities without backing Finding. !60023
- Remove feature flags from known events. !60053
- Update KaTeX integration to v0.13.0. !60071
- Update Bugzilla integration UI text. !60080
- Drop Jira proxy setting columns. !60123
- Add index to support execution time order for batched migration jobs. !60133
- Remove gldropdown_tags feature flag. !60153
- Update active branch icon in IDE to conform to the Pajamas design guide. !60168 (Andreas Resch @reschandreas)
- Add migration to swap partitioned web_hook_logs. !60184
- Update UI links to docs. !60247
- Add index to batched migration jobs status. !60248
- Initialize int8 migration for ci_builds. !60265
- Update GitLab Shell to v13.18.0. !60288
- Remove not_issuable_queries feature flag. !60321
- Remove optimized_timebox_queries feature flag. !60326
- Initialize conversion of ci_build_trace_chunks.build_id to bigint. !60346
- Add user availability status to status modal and settings. !60351
- Align UI text for CI integrations with each other. !60352
- Update 5 min app metric defintions. !60364
- Initialize conversion of ci_builds_runner_session.build_id to bigint. !60366
- Update instance_auto_devops_enabled metric team metadata. !60374
- Update AWS deploy templates metrics. !60377
- Remove graphql_release_data, graphql_milestone_stats, and graphql_releases_page feature flags. !60390
- Remove invite_members_version_b experiment. !60426
- Remove feature flag for pipeline status in pipeline editor. !60463
- Review and revise project integration descriptions. !60510
- Validate foreign key on GroupHooks. !60527
- Bump capybara gem version. !60532
- Remove unused :auto_create_cluster_management_project feature flag. !60550
- Refactor Webex Teams integration settings text. !60565
- Removed feature flag for Pipeline editor merged YAML tab. !60659
- Invalid invite tokens should redirect to the GitLab product. !60666
- Remove search_track_unique_users feature flag. !60706
- Prepare devops adoption database structure for migration. !60733
- Remove optimize_shifting_relative_positions feature flag. !60792
- updating hover state to match other pipeline graph buttons. !60801 (Matt Saddington @mattsaddo)
- Make RecalculateProjectAuthorizations background migration no-op. !60825
- Create database structure to support project value streams. !60925
- Remove invalidated CI Syntax Templates Experiment. !60937
- Update messages when user cannot directly push code to project. !61071
- Remove feature flags related with tracking using Redis HyperLogLog for code review events. !61078
- Merge branch 'mo-update-artifact-documentation' into 'master'. !61084
- Update projects approval rules Usage Data metrics. !61106
- Add issue tracker integrations help text. !61158
- Update checkbox styles in "Group" -> "Settings" -> "General" -> "Permissions, LFS, 2FA". !61294
- Update usage ping metrics for group configure. !61373
- Decrease space between invite and import members buttons to align with Pajamas spacing. !61396
- Update button styles, spacing, variants and responsive behavior for the Tags page. !61413
- Remove sort_diffs feature flag. !61440
- Reschedule DropInvalidVulnerabilities and track jobs. !61491
- Geo: Remove released feature flag `geo_package_file_verification`. !61568
- Remove update merge request related feature flags. !61569
- Fix inconsistent cancel merge train button label. !61597
- Updating button variant and adding tooltip for the SSH delete key button. !61626
- Add draft column to merge_requests table. !61681
- Lowers the z-indexing of the pipeline drawer. !61683
- Update temporary NuGet packages to have processing status. !61724
- Log additional package extraction errors. !61745
- Remove issuable destroy service related FFs. !61764
- Change wording for design management upload. !61782
## 13.11.4 (2021-05-14) ## 13.11.4 (2021-05-14)
### Fixed (3 changes) ### Fixed (3 changes)
@ -846,6 +1485,18 @@ entry.
- Externalize strings in labels/new.html.haml. (nuwe1) - Externalize strings in labels/new.html.haml. (nuwe1)
## 13.10.4 (2021-04-27)
### Security (6 changes)
- Prevent tokens with only read_api scope from executing mutations.
- Update mermaid to version 8.9.2.
- Do not allow deploy tokens in the dependency proxy authentication service.
- Disable keyset pagination for branches by default.
- Bump Carrierwave gem to v1.3.2.
- Restrict setting system_note_timestamp to owners.
## 13.10.3 (2021-04-13) ## 13.10.3 (2021-04-13)
### Security (3 changes) ### Security (3 changes)
@ -1415,6 +2066,18 @@ entry.
- Convert mattermost alert to pajamas. !56556 - Convert mattermost alert to pajamas. !56556
## 13.9.7 (2021-04-27)
### Security (6 changes)
- Prevent tokens with only read_api scope from executing mutations.
- Update mermaid to version 8.9.2.
- Do not allow deploy tokens in the dependency proxy authentication service.
- Disable keyset pagination for branches by default.
- Bump Carrierwave gem to v1.3.2.
- Restrict setting system_note_timestamp to owners.
## 13.9.6 (2021-04-13) ## 13.9.6 (2021-04-13)
### Security (2 changes) ### Security (2 changes)

View file

@ -2,11 +2,15 @@
require 'gitlab-dangerfiles' require 'gitlab-dangerfiles'
Gitlab::Dangerfiles.import_plugins(danger) gitlab_dangerfiles = Gitlab::Dangerfiles::Engine.new(self)
danger.import_plugin('danger/plugins/*.rb') gitlab_dangerfiles.import_plugins
return if helper.release_automation? return if helper.release_automation?
danger.import_plugin('danger/plugins/*.rb')
gitlab_dangerfiles.import_dangerfiles
project_helper.rule_names.each do |rule| project_helper.rule_names.each do |rule|
danger.import_dangerfile(path: File.join('danger', rule)) danger.import_dangerfile(path: File.join('danger', rule))
end end

View file

@ -1 +1 @@
13.11.5 13.12.3

View file

@ -1 +1 @@
2.9.0 2.11.0

View file

@ -1 +1 @@
13.11.1 13.12.0

View file

@ -1 +1 @@
1.38.0 1.39.0

View file

@ -1 +1 @@
13.17.0 13.18.0

30
Gemfile
View file

@ -18,11 +18,14 @@ gem 'default_value_for', '~> 3.4.0'
gem 'pg', '~> 1.1' gem 'pg', '~> 1.1'
gem 'rugged', '~> 1.1' gem 'rugged', '~> 1.1'
gem 'grape-path-helpers', '~> 1.6.1' gem 'grape-path-helpers', '~> 1.6.3'
gem 'faraday', '~> 1.0' gem 'faraday', '~> 1.0'
gem 'marginalia', '~> 1.10.0' gem 'marginalia', '~> 1.10.0'
# Authorization
gem 'declarative_policy', '~> 1.0.0'
# Authentication libraries # Authentication libraries
gem 'devise', '~> 4.7.2' gem 'devise', '~> 4.7.2'
gem 'bcrypt', '~> 3.1', '>= 3.1.14' gem 'bcrypt', '~> 3.1', '>= 3.1.14'
@ -46,7 +49,7 @@ gem 'omniauth-shibboleth', '~> 1.3.0'
gem 'omniauth-twitter', '~> 1.4' gem 'omniauth-twitter', '~> 1.4'
gem 'omniauth_crowd', '~> 2.4.0' gem 'omniauth_crowd', '~> 2.4.0'
gem 'omniauth-authentiq', '~> 0.3.3' gem 'omniauth-authentiq', '~> 0.3.3'
gem 'omniauth_openid_connect', '~> 0.3.5' gem 'gitlab-omniauth-openid-connect', '~> 0.4.0', require: 'omniauth_openid_connect'
gem 'omniauth-salesforce', '~> 1.0.5' gem 'omniauth-salesforce', '~> 1.0.5'
gem 'omniauth-atlassian-oauth2', '~> 0.2.0' gem 'omniauth-atlassian-oauth2', '~> 0.2.0'
gem 'rack-oauth2', '~> 1.16.0' gem 'rack-oauth2', '~> 1.16.0'
@ -89,7 +92,7 @@ gem 'net-ldap', '~> 0.16.3'
# API # API
gem 'grape', '~> 1.5.2' gem 'grape', '~> 1.5.2'
gem 'grape-entity', '~> 0.7.1' gem 'grape-entity', '~> 0.9.0'
gem 'rack-cors', '~> 1.0.6', require: 'rack/cors' gem 'rack-cors', '~> 1.0.6', require: 'rack/cors'
# GraphQL API # GraphQL API
@ -264,7 +267,7 @@ gem 'kubeclient', '~> 4.9.1'
# Sanitize user input # Sanitize user input
gem 'sanitize', '~> 5.2.1' gem 'sanitize', '~> 5.2.1'
gem 'babosa', '~> 1.0.2' gem 'babosa', '~> 1.0.4'
# Sanitizes SVG input # Sanitizes SVG input
gem 'loofah', '~> 2.2' gem 'loofah', '~> 2.2'
@ -297,7 +300,7 @@ gem 'gon', '~> 6.4.0'
gem 'request_store', '~> 1.5' gem 'request_store', '~> 1.5'
gem 'base32', '~> 0.3.0' gem 'base32', '~> 0.3.0'
gem "gitlab-license", "~> 1.4" gem 'gitlab-license', '~> 1.5'
# Protect against bruteforcing # Protect against bruteforcing
gem 'rack-attack', '~> 6.3.0' gem 'rack-attack', '~> 6.3.0'
@ -343,6 +346,7 @@ end
group :development do group :development do
gem 'lefthook', '~> 0.7.0', require: false gem 'lefthook', '~> 0.7.0', require: false
gem 'solargraph', '~> 0.40.4', require: false
gem 'letter_opener_web', '~> 1.4.0' gem 'letter_opener_web', '~> 1.4.0'
@ -356,9 +360,9 @@ end
group :development, :test do group :development, :test do
gem 'deprecation_toolkit', '~> 1.5.1', require: false gem 'deprecation_toolkit', '~> 1.5.1', require: false
gem 'bullet', '~> 6.1.3' gem 'bullet', '~> 6.1.3'
gem 'gitlab-pry-byebug', platform: :mri, require: ['pry-byebug', 'pry-byebug/pry_remote_ext'] gem 'pry-byebug'
gem 'pry-rails', '~> 0.3.9' gem 'pry-rails', '~> 0.3.9'
gem 'pry-remote' gem 'pry-shell', '~> 0.4.0'
gem 'awesome_print', require: false gem 'awesome_print', require: false
@ -399,7 +403,7 @@ group :development, :test do
end end
group :development, :test, :danger do group :development, :test, :danger do
gem 'gitlab-dangerfiles', '~> 1.1.1', require: false gem 'gitlab-dangerfiles', '~> 2.0.0', require: false
end end
group :development, :test, :coverage do group :development, :test, :coverage do
@ -413,13 +417,12 @@ group :development, :test, :omnibus do
end end
group :test do group :test do
gem 'json-schema', '~> 2.8.0'
gem 'fuubar', '~> 2.2.0' gem 'fuubar', '~> 2.2.0'
gem 'rspec-retry', '~> 0.6.1' gem 'rspec-retry', '~> 0.6.1'
gem 'rspec_profiling', '~> 0.0.6' gem 'rspec_profiling', '~> 0.0.6'
gem 'rspec-parameterized', require: false gem 'rspec-parameterized', require: false
gem 'capybara', '~> 3.34.0' gem 'capybara', '~> 3.35.3'
gem 'capybara-screenshot', '~> 1.0.22' gem 'capybara-screenshot', '~> 1.0.22'
gem 'selenium-webdriver', '~> 3.142' gem 'selenium-webdriver', '~> 3.142'
@ -474,8 +477,11 @@ group :ed25519 do
gem 'bcrypt_pbkdf', '~> 1.0' gem 'bcrypt_pbkdf', '~> 1.0'
end end
# Spamcheck GRPC protocol definitions
gem 'spamcheck', '~> 0.1.0'
# Gitaly GRPC protocol definitions # Gitaly GRPC protocol definitions
gem 'gitaly', '~> 13.11.0.pre.rc1' gem 'gitaly', '~> 13.12.0.pre.rc1'
gem 'grpc', '~> 1.30.2' gem 'grpc', '~> 1.30.2'
@ -488,7 +494,7 @@ gem 'flipper', '~> 0.17.1'
gem 'flipper-active_record', '~> 0.17.1' gem 'flipper-active_record', '~> 0.17.1'
gem 'flipper-active_support_cache_store', '~> 0.17.1' gem 'flipper-active_support_cache_store', '~> 0.17.1'
gem 'unleash', '~> 0.1.5' gem 'unleash', '~> 0.1.5'
gem 'gitlab-experiment', '~> 0.5.3' gem 'gitlab-experiment', '~> 0.5.4'
# Structured logging # Structured logging
gem 'lograge', '~> 0.5' gem 'lograge', '~> 0.5'

View file

@ -132,11 +132,13 @@ GEM
faraday_middleware (~> 1.0.0.rc1) faraday_middleware (~> 1.0.0.rc1)
net-http-persistent (~> 4.0) net-http-persistent (~> 4.0)
nokogiri (~> 1.11.0.rc2) nokogiri (~> 1.11.0.rc2)
babosa (1.0.2) babosa (1.0.4)
backport (1.1.2)
base32 (0.3.2) base32 (0.3.2)
batch-loader (2.0.1) batch-loader (2.0.1)
bcrypt (3.1.16) bcrypt (3.1.16)
bcrypt_pbkdf (1.0.0) bcrypt_pbkdf (1.0.0)
benchmark (0.1.1)
benchmark-ips (2.3.0) benchmark-ips (2.3.0)
benchmark-memory (0.1.2) benchmark-memory (0.1.2)
memory_profiler (~> 0.9) memory_profiler (~> 0.9)
@ -160,13 +162,13 @@ GEM
bundler (>= 1.2.0, < 3) bundler (>= 1.2.0, < 3)
thor (>= 0.18, < 2) thor (>= 0.18, < 2)
byebug (11.1.3) byebug (11.1.3)
capybara (3.34.0) capybara (3.35.3)
addressable addressable
mini_mime (>= 0.1.3) mini_mime (>= 0.1.3)
nokogiri (~> 1.8) nokogiri (~> 1.8)
rack (>= 1.6.0) rack (>= 1.6.0)
rack-test (>= 0.6.3) rack-test (>= 0.6.3)
regexp_parser (~> 1.5) regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2) xpath (~> 3.2)
capybara-screenshot (1.0.22) capybara-screenshot (1.0.22)
capybara (>= 1.0, < 4) capybara (>= 1.0, < 4)
@ -245,6 +247,7 @@ GEM
html-pipeline html-pipeline
declarative (0.0.20) declarative (0.0.20)
declarative-option (0.1.0) declarative-option (0.1.0)
declarative_policy (1.0.0)
default_value_for (3.4.0) default_value_for (3.4.0)
activerecord (>= 3.2.0, < 7.0) activerecord (>= 3.2.0, < 7.0)
deprecation_toolkit (1.5.1) deprecation_toolkit (1.5.1)
@ -306,6 +309,7 @@ GEM
dry-equalizer (~> 0.3) dry-equalizer (~> 0.3)
dry-inflector (~> 0.1, >= 0.1.2) dry-inflector (~> 0.1, >= 0.1.2)
dry-logic (~> 1.0, >= 1.0.2) dry-logic (~> 1.0, >= 1.0.2)
e2mmap (0.1.0)
ecma-re-validator (0.2.1) ecma-re-validator (0.2.1)
regexp_parser (~> 1.2) regexp_parser (~> 1.2)
ed25519 (1.2.4) ed25519 (1.2.4)
@ -435,7 +439,7 @@ GEM
rails (>= 3.2.0) rails (>= 3.2.0)
git (1.7.0) git (1.7.0)
rchardet (~> 1.8) rchardet (~> 1.8)
gitaly (13.11.0.pre.rc1) gitaly (13.12.0.pre.rc1)
grpc (~> 1.0) grpc (~> 1.0)
github-markup (1.7.0) github-markup (1.7.0)
gitlab (4.16.1) gitlab (4.16.1)
@ -443,10 +447,11 @@ GEM
terminal-table (~> 1.5, >= 1.5.1) terminal-table (~> 1.5, >= 1.5.1)
gitlab-chronic (0.10.5) gitlab-chronic (0.10.5)
numerizer (~> 0.2) numerizer (~> 0.2)
gitlab-dangerfiles (1.1.1) gitlab-dangerfiles (2.0.0)
danger-gitlab danger-gitlab
gitlab-experiment (0.5.3) gitlab-experiment (0.5.4)
activesupport (>= 3.0) activesupport (>= 3.0)
request_store (>= 1.0)
scientist (~> 1.6, >= 1.6.0) scientist (~> 1.6, >= 1.6.0)
gitlab-fog-azure-rm (1.0.1) gitlab-fog-azure-rm (1.0.1)
azure-storage-blob (~> 2.0) azure-storage-blob (~> 2.0)
@ -470,13 +475,14 @@ GEM
opentracing (~> 0.4) opentracing (~> 0.4)
pg_query (~> 1.3) pg_query (~> 1.3)
redis (> 3.0.0, < 5.0.0) redis (> 3.0.0, < 5.0.0)
gitlab-license (1.4.0) gitlab-license (1.5.0)
gitlab-mail_room (0.0.9) gitlab-mail_room (0.0.9)
gitlab-markup (1.7.1) gitlab-markup (1.7.1)
gitlab-net-dns (0.9.1) gitlab-net-dns (0.9.1)
gitlab-pry-byebug (3.9.0) gitlab-omniauth-openid-connect (0.4.0)
byebug (~> 11.0) addressable (~> 2.7)
pry (~> 0.13.0) omniauth (~> 1.9)
openid_connect (~> 1.2)
gitlab-sidekiq-fetcher (0.5.6) gitlab-sidekiq-fetcher (0.5.6)
sidekiq (~> 5) sidekiq (~> 5)
gitlab-styles (6.2.0) gitlab-styles (6.2.0)
@ -511,8 +517,8 @@ GEM
google-cloud-env (1.4.0) google-cloud-env (1.4.0)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.3, < 2.0)
google-protobuf (3.14.0) google-protobuf (3.14.0)
googleapis-common-protos-types (1.0.5) googleapis-common-protos-types (1.0.6)
google-protobuf (~> 3.11) google-protobuf (~> 3.14)
googleauth (0.14.0) googleauth (0.14.0)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.3, < 2.0)
jwt (>= 1.4, < 3.0) jwt (>= 1.4, < 3.0)
@ -529,10 +535,10 @@ GEM
mustermann-grape (~> 1.0.0) mustermann-grape (~> 1.0.0)
rack (>= 1.3.0) rack (>= 1.3.0)
rack-accept rack-accept
grape-entity (0.7.1) grape-entity (0.9.0)
activesupport (>= 4.0) activesupport (>= 3.0.0)
multi_json (>= 1.3.2) multi_json (>= 1.3.2)
grape-path-helpers (1.6.1) grape-path-helpers (1.6.3)
activesupport activesupport
grape (~> 1.3) grape (~> 1.3)
rake (> 12) rake (> 12)
@ -633,6 +639,7 @@ GEM
jaeger-client (1.1.0) jaeger-client (1.1.0)
opentracing (~> 0.3) opentracing (~> 0.3)
thrift thrift
jaro_winkler (1.5.4)
jira-ruby (2.1.4) jira-ruby (2.1.4)
activesupport activesupport
atlassian-jwt atlassian-jwt
@ -648,8 +655,6 @@ GEM
activesupport (>= 4.2) activesupport (>= 4.2)
aes_key_wrap aes_key_wrap
bindata bindata
json-schema (2.8.1)
addressable (>= 2.4)
json_schemer (0.2.12) json_schemer (0.2.12)
ecma-re-validator (~> 0.2) ecma-re-validator (~> 0.2)
hana (~> 1.3) hana (~> 1.3)
@ -870,12 +875,8 @@ GEM
activesupport activesupport
nokogiri (>= 1.4.4) nokogiri (>= 1.4.4)
omniauth (~> 1.0) omniauth (~> 1.0)
omniauth_openid_connect (0.3.5)
addressable (~> 2.5)
omniauth (~> 1.9)
openid_connect (~> 1.1)
open4 (1.3.4) open4 (1.3.4)
openid_connect (1.1.8) openid_connect (1.2.0)
activemodel activemodel
attr_required (>= 1.0.0) attr_required (>= 1.0.0)
json-jwt (>= 1.5.0) json-jwt (>= 1.5.0)
@ -897,6 +898,8 @@ GEM
parser (3.0.0.0) parser (3.0.0.0)
ast (~> 2.4.1) ast (~> 2.4.1)
parslet (1.8.2) parslet (1.8.2)
pastel (0.8.0)
tty-color (~> 0.5)
peek (1.1.0) peek (1.1.0)
railties (>= 4.0.0) railties (>= 4.0.0)
pg (1.2.3) pg (1.2.3)
@ -921,11 +924,15 @@ GEM
pry (0.13.1) pry (0.13.1)
coderay (~> 1.1) coderay (~> 1.1)
method_source (~> 1.0) method_source (~> 1.0)
pry-byebug (3.9.0)
byebug (~> 11.0)
pry (~> 0.13.0)
pry-rails (0.3.9) pry-rails (0.3.9)
pry (>= 0.10.4) pry (>= 0.10.4)
pry-remote (0.1.8) pry-shell (0.4.0)
pry (~> 0.9) pry (~> 0.13.0)
slop (~> 3.0) tty-markdown
tty-prompt
public_suffix (4.0.6) public_suffix (4.0.6)
puma (5.1.1) puma (5.1.1)
nio4r (~> 2.0) nio4r (~> 2.0)
@ -1191,9 +1198,24 @@ GEM
simplecov-html (0.12.2) simplecov-html (0.12.2)
sixarm_ruby_unaccent (1.2.0) sixarm_ruby_unaccent (1.2.0)
slack-messenger (2.3.4) slack-messenger (2.3.4)
slop (3.6.0)
snowplow-tracker (0.6.1) snowplow-tracker (0.6.1)
contracts (~> 0.7, <= 0.11) contracts (~> 0.7, <= 0.11)
solargraph (0.40.4)
backport (~> 1.1)
benchmark
bundler (>= 1.17.2)
e2mmap
jaro_winkler (~> 1.5)
kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.1)
parser (~> 3.0)
reverse_markdown (>= 1.0.5, < 3)
rubocop (>= 0.52)
thor (~> 1.0)
tilt (~> 2.0)
yard (~> 0.9, >= 0.9.24)
spamcheck (0.1.0)
grpc (~> 1.0)
spring (2.1.1) spring (2.1.1)
spring-commands-rspec (1.0.4) spring-commands-rspec (1.0.4)
spring (>= 0.9.1) spring (>= 0.9.1)
@ -1215,7 +1237,12 @@ GEM
state_machines-activerecord (0.8.0) state_machines-activerecord (0.8.0)
activerecord (>= 5.1) activerecord (>= 5.1)
state_machines-activemodel (>= 0.8.0) state_machines-activemodel (>= 0.8.0)
swd (1.1.2) strings (0.2.1)
strings-ansi (~> 0.2)
unicode-display_width (>= 1.5, < 3.0)
unicode_utils (~> 1.4)
strings-ansi (0.2.0)
swd (1.2.0)
activesupport (>= 3) activesupport (>= 3)
attr_required (>= 0.0.5) attr_required (>= 0.0.5)
httpclient (>= 2.4) httpclient (>= 2.4)
@ -1261,6 +1288,23 @@ GEM
truncato (0.7.11) truncato (0.7.11)
htmlentities (~> 4.3.1) htmlentities (~> 4.3.1)
nokogiri (>= 1.7.0, <= 2.0) nokogiri (>= 1.7.0, <= 2.0)
tty-color (0.6.0)
tty-cursor (0.7.1)
tty-markdown (0.7.0)
kramdown (>= 1.16.2, < 3.0)
pastel (~> 0.8)
rouge (~> 3.14)
strings (~> 0.2.0)
tty-color (~> 0.5)
tty-screen (~> 0.8)
tty-prompt (0.23.1)
pastel (~> 0.8)
tty-reader (~> 0.8)
tty-reader (0.9.0)
tty-cursor (~> 0.7)
tty-screen (~> 0.8)
wisper (~> 2.0)
tty-screen (0.8.1)
tzinfo (1.2.9) tzinfo (1.2.9)
thread_safe (~> 0.1) thread_safe (~> 0.1)
u2f (0.2.1) u2f (0.2.1)
@ -1329,12 +1373,14 @@ GEM
builder builder
expression_parser expression_parser
rinku rinku
wisper (2.0.1)
with_env (1.1.0) with_env (1.1.0)
wmi-lite (1.0.5) wmi-lite (1.0.5)
xml-simple (1.1.5) xml-simple (1.1.5)
xpath (3.2.0) xpath (3.2.0)
nokogiri (~> 1.8) nokogiri (~> 1.8)
yajl-ruby (1.4.1) yajl-ruby (1.4.1)
yard (0.9.26)
zeitwerk (2.4.2) zeitwerk (2.4.2)
PLATFORMS PLATFORMS
@ -1360,7 +1406,7 @@ DEPENDENCIES
aws-sdk-cloudformation (~> 1) aws-sdk-cloudformation (~> 1)
aws-sdk-core (~> 3) aws-sdk-core (~> 3)
aws-sdk-s3 (~> 1) aws-sdk-s3 (~> 1)
babosa (~> 1.0.2) babosa (~> 1.0.4)
base32 (~> 0.3.0) base32 (~> 0.3.0)
batch-loader (~> 2.0.1) batch-loader (~> 2.0.1)
bcrypt (~> 3.1, >= 3.1.14) bcrypt (~> 3.1, >= 3.1.14)
@ -1373,7 +1419,7 @@ DEPENDENCIES
browser (~> 4.2) browser (~> 4.2)
bullet (~> 6.1.3) bullet (~> 6.1.3)
bundler-audit (~> 0.7.0.1) bundler-audit (~> 0.7.0.1)
capybara (~> 3.34.0) capybara (~> 3.35.3)
capybara-screenshot (~> 1.0.22) capybara-screenshot (~> 1.0.22)
carrierwave (~> 1.3) carrierwave (~> 1.3)
charlock_holmes (~> 0.7.7) charlock_holmes (~> 0.7.7)
@ -1385,6 +1431,7 @@ DEPENDENCIES
crystalball (~> 0.7.0) crystalball (~> 0.7.0)
database_cleaner (~> 1.7.0) database_cleaner (~> 1.7.0)
deckar01-task_list (= 2.3.1) deckar01-task_list (= 2.3.1)
declarative_policy (~> 1.0.0)
default_value_for (~> 3.4.0) default_value_for (~> 3.4.0)
deprecation_toolkit (~> 1.5.1) deprecation_toolkit (~> 1.5.1)
derailed_benchmarks derailed_benchmarks
@ -1425,19 +1472,19 @@ DEPENDENCIES
gettext (~> 3.3) gettext (~> 3.3)
gettext_i18n_rails (~> 1.8.0) gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.3) gettext_i18n_rails_js (~> 1.3)
gitaly (~> 13.11.0.pre.rc1) gitaly (~> 13.12.0.pre.rc1)
github-markup (~> 1.7.0) github-markup (~> 1.7.0)
gitlab-chronic (~> 0.10.5) gitlab-chronic (~> 0.10.5)
gitlab-dangerfiles (~> 1.1.1) gitlab-dangerfiles (~> 2.0.0)
gitlab-experiment (~> 0.5.3) gitlab-experiment (~> 0.5.4)
gitlab-fog-azure-rm (~> 1.0.1) gitlab-fog-azure-rm (~> 1.0.1)
gitlab-fog-google (~> 1.13) gitlab-fog-google (~> 1.13)
gitlab-labkit (~> 0.16.2) gitlab-labkit (~> 0.16.2)
gitlab-license (~> 1.4) gitlab-license (~> 1.5)
gitlab-mail_room (~> 0.0.9) gitlab-mail_room (~> 0.0.9)
gitlab-markup (~> 1.7.1) gitlab-markup (~> 1.7.1)
gitlab-net-dns (~> 0.9.1) gitlab-net-dns (~> 0.9.1)
gitlab-pry-byebug gitlab-omniauth-openid-connect (~> 0.4.0)
gitlab-sidekiq-fetcher (= 0.5.6) gitlab-sidekiq-fetcher (= 0.5.6)
gitlab-styles (~> 6.2.0) gitlab-styles (~> 6.2.0)
gitlab_chronic_duration (~> 0.10.6.2) gitlab_chronic_duration (~> 0.10.6.2)
@ -1447,8 +1494,8 @@ DEPENDENCIES
google-protobuf (~> 3.14.0) google-protobuf (~> 3.14.0)
gpgme (~> 2.0.19) gpgme (~> 2.0.19)
grape (~> 1.5.2) grape (~> 1.5.2)
grape-entity (~> 0.7.1) grape-entity (~> 0.9.0)
grape-path-helpers (~> 1.6.1) grape-path-helpers (~> 1.6.3)
grape_logging (~> 1.7) grape_logging (~> 1.7)
graphiql-rails (~> 1.4.10) graphiql-rails (~> 1.4.10)
graphlient (~> 0.4.0) graphlient (~> 0.4.0)
@ -1472,7 +1519,6 @@ DEPENDENCIES
jira-ruby (~> 2.1.4) jira-ruby (~> 2.1.4)
js_regex (~> 3.4) js_regex (~> 3.4)
json (~> 2.3.0) json (~> 2.3.0)
json-schema (~> 2.8.0)
json_schemer (~> 0.2.12) json_schemer (~> 0.2.12)
jwt (~> 2.1.0) jwt (~> 2.1.0)
kaminari (~> 1.0) kaminari (~> 1.0)
@ -1521,7 +1567,6 @@ DEPENDENCIES
omniauth-shibboleth (~> 1.3.0) omniauth-shibboleth (~> 1.3.0)
omniauth-twitter (~> 1.4) omniauth-twitter (~> 1.4)
omniauth_crowd (~> 2.4.0) omniauth_crowd (~> 2.4.0)
omniauth_openid_connect (~> 0.3.5)
org-ruby (~> 0.9.12) org-ruby (~> 0.9.12)
parallel (~> 1.19) parallel (~> 1.19)
parslet (~> 1.8) parslet (~> 1.8)
@ -1531,8 +1576,9 @@ DEPENDENCIES
png_quantizator (~> 0.2.1) png_quantizator (~> 0.2.1)
premailer-rails (~> 1.10.3) premailer-rails (~> 1.10.3)
prometheus-client-mmap (~> 0.12.0) prometheus-client-mmap (~> 0.12.0)
pry-byebug
pry-rails (~> 0.3.9) pry-rails (~> 0.3.9)
pry-remote pry-shell (~> 0.4.0)
puma (~> 5.1.1) puma (~> 5.1.1)
puma_worker_killer (~> 0.3.1) puma_worker_killer (~> 0.3.1)
rack (~> 2.2.3) rack (~> 2.2.3)
@ -1587,6 +1633,8 @@ DEPENDENCIES
simplecov-cobertura (~> 1.3.1) simplecov-cobertura (~> 1.3.1)
slack-messenger (~> 2.3.4) slack-messenger (~> 2.3.4)
snowplow-tracker (~> 0.6.1) snowplow-tracker (~> 0.6.1)
solargraph (~> 0.40.4)
spamcheck (~> 0.1.0)
spring (~> 2.1.0) spring (~> 2.1.0)
spring-commands-rspec (~> 1.0.4) spring-commands-rspec (~> 1.0.4)
sprockets (~> 3.7.0) sprockets (~> 3.7.0)

View file

@ -88,7 +88,7 @@ For more information please see the [architecture](https://docs.gitlab.com/ee/de
## UX design ## UX design
Please adhere to the [UX Guide](doc/development/ux_guide/index.md) when creating designs and implementing code. Please adhere to the [UX Guide](https://design.gitlab.com/) when creating designs and implementing code.
## Third-party applications ## Third-party applications

View file

@ -1 +1 @@
13.11.5 13.12.3

View file

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1 @@
<svg width="16" height="17" xmlns="http://www.w3.org/2000/svg"><path fill="#fffff" d="M1.53 7.639l-.476.88.476-.88zm0-1.758L1.054 5l.476.88zm2.257 2.982h1v-.596l-.523-.283-.477.879zm8.424 0l-.476-.88-.524.284v.596h1zm2.257-1.224l.477.88-.477-.88zm0-1.758l-.476.879.476-.88zM8.476 2.632l-.477.88.477-.88zm-.953 0l.476.88-.476-.88zM2.007 6.76l-.953-1.758c-1.396.756-1.396 2.76 0 3.516l.953-1.758zm2.257 1.224L2.007 6.76l-.953 1.758L3.31 9.742l.953-1.758zm.523 1.995V8.863h-2v1.116h2zM8 12.5c-1.949 0-3.212-1.289-3.212-2.52h-2c0 2.656 2.51 4.52 5.212 4.52v-2zm3.212-2.52c0 1.231-1.262 2.52-3.212 2.52v2c2.704 0 5.212-1.864 5.212-4.52h-2zm0-1.117v1.116h2V8.863h-2zm2.78-2.103l-2.256 1.223.953 1.759 2.257-1.224-.953-1.758zm0 0l.954 1.758c1.396-.757 1.396-2.76 0-3.516l-.953 1.758zM8 3.51l5.993 3.249.953-1.758-5.993-3.249L8 3.511zm0 0l.953-1.758a2 2 0 00-1.906 0L8 3.511zM2.007 6.76l5.992-3.25-.953-1.758-5.992 3.249.953 1.758z"/><path fill="#fffff" d="M7.228 7.541c-.187-.112-.277-.427-.201-.704.076-.276.288-.41.475-.297L11 8.644v5.316c0 .298-.163.54-.365.54-.2 0-.364-.242-.364-.54V9.37L7.228 7.54z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1 @@
<svg width="108" height="4" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="108" height="4" rx="2" fill="#C2B7E6"/></svg>

After

Width:  |  Height:  |  Size: 134 B

View file

@ -0,0 +1,40 @@
import { ApolloLink, Observable } from 'apollo-link';
import { print } from 'graphql';
import cable from '~/actioncable_consumer';
import { uuids } from '~/lib/utils/uuids';
export default class ActionCableLink extends ApolloLink {
// eslint-disable-next-line class-methods-use-this
request(operation) {
return new Observable((observer) => {
const subscription = cable.subscriptions.create(
{
channel: 'GraphqlChannel',
query: operation.query ? print(operation.query) : null,
variables: operation.variables,
operationName: operation.operationName,
nonce: uuids()[0],
},
{
received(data) {
if (data.errors) {
observer.error(data.errors);
} else if (data.result) {
observer.next(data.result);
}
if (!data.more) {
observer.complete();
}
},
},
);
return {
unsubscribe() {
subscription.unsubscribe();
},
};
});
}
}

View file

@ -14,12 +14,22 @@ export default {
type: Object, type: Object,
required: true, required: true,
}, },
oncallSchedules: {
type: Array,
required: false,
default: () => [],
},
}, },
}; };
</script> </script>
<template> <template>
<shared-delete-action modal-type="delete" :username="username" :paths="paths"> <shared-delete-action
modal-type="delete"
:username="username"
:paths="paths"
:oncall-schedules="oncallSchedules"
>
<slot></slot> <slot></slot>
</shared-delete-action> </shared-delete-action>
</template> </template>

View file

@ -14,12 +14,22 @@ export default {
type: Object, type: Object,
required: true, required: true,
}, },
oncallSchedules: {
type: Array,
required: false,
default: () => [],
},
}, },
}; };
</script> </script>
<template> <template>
<shared-delete-action modal-type="delete-with-contributions" :username="username" :paths="paths"> <shared-delete-action
modal-type="delete-with-contributions"
:username="username"
:paths="paths"
:oncall-schedules="oncallSchedules"
>
<slot></slot> <slot></slot>
</shared-delete-action> </shared-delete-action>
</template> </template>

View file

@ -18,6 +18,10 @@ export default {
type: String, type: String,
required: true, required: true,
}, },
oncallSchedules: {
type: Array,
required: true,
},
}, },
computed: { computed: {
modalAttributes() { modalAttributes() {
@ -26,6 +30,7 @@ export default {
'data-delete-user-url': this.paths.delete, 'data-delete-user-url': this.paths.delete,
'data-gl-modal-action': this.modalType, 'data-gl-modal-action': this.modalType,
'data-username': this.username, 'data-username': this.username,
'data-oncall-schedules': JSON.stringify(this.oncallSchedules),
}; };
}, },
}, },

View file

@ -23,9 +23,7 @@ export default {
'data-method': 'put', 'data-method': 'put',
'data-modal-attributes': JSON.stringify({ 'data-modal-attributes': JSON.stringify({
title: sprintf(s__('AdminUsers|Unblock user %{username}?'), { username: this.username }), title: sprintf(s__('AdminUsers|Unblock user %{username}?'), { username: this.username }),
message: s__( message: s__('AdminUsers|You can always block their account again if needed.'),
'AdminUsers|You can always unblock their account, their data will remain intact.',
),
okVariant: 'confirm', okVariant: 'confirm',
okTitle: s__('AdminUsers|Unblock'), okTitle: s__('AdminUsers|Unblock'),
}), }),

View file

@ -1,48 +0,0 @@
<script>
import { GlEmptyState, GlSprintf, GlLink } from '@gitlab/ui';
export default {
components: {
GlEmptyState,
GlSprintf,
GlLink,
},
inject: {
svgPath: {
default: '',
},
docsLink: {
default: '',
},
primaryButtonPath: {
default: '',
},
},
};
</script>
<template>
<gl-empty-state
class="js-empty-state"
:title="__('Activate user activity analysis')"
:svg-path="svgPath"
:primary-button-text="__('Turn on usage ping')"
:primary-button-link="primaryButtonPath"
>
<template #description>
<gl-sprintf
:message="
__(
'Turn on %{strongStart}usage ping%{strongEnd} to activate analysis of user activity, known as %{docLinkStart}Cohorts%{docLinkEnd}.',
)
"
>
<template #docLink="{ content }">
<gl-link :href="docsLink" target="_blank">{{ content }}</gl-link>
</template>
<template #strong="{ content }"
><strong>{{ content }}</strong></template
>
</gl-sprintf>
</template>
</gl-empty-state>
</template>

View file

@ -70,14 +70,14 @@ export default {
</script> </script>
<template> <template>
<div class="gl-display-flex gl-justify-content-end"> <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">{{ <gl-button v-if="hasEditAction" data-testid="edit" :href="userPaths.edit">{{
$options.i18n.edit $options.i18n.edit
}}</gl-button> }}</gl-button>
<gl-dropdown <gl-dropdown
v-if="hasDropdownActions" v-if="hasDropdownActions"
data-testid="actions" data-testid="dropdown-toggle"
right right
class="gl-ml-2" class="gl-ml-2"
icon="settings" icon="settings"
@ -109,6 +109,7 @@ export default {
:key="action" :key="action"
:paths="userPaths" :paths="userPaths"
:username="user.name" :username="user.name"
:oncall-schedules="user.oncallSchedules"
:data-testid="`delete-${action}`" :data-testid="`delete-${action}`"
> >
{{ $options.i18n[action] }} {{ $options.i18n[action] }}

View file

@ -1,7 +1,10 @@
<script> <script>
import { GlTable } from '@gitlab/ui'; import { GlSkeletonLoader, GlTable } from '@gitlab/ui';
import { __ } from '~/locale'; import createFlash from '~/flash';
import { convertNodeIdsFromGraphQLIds } from '~/graphql_shared/utils';
import { s__, __ } from '~/locale';
import UserDate from '~/vue_shared/components/user_date.vue'; import UserDate from '~/vue_shared/components/user_date.vue';
import getUsersGroupCountsQuery from '../graphql/queries/get_users_group_counts.query.graphql';
import UserActions from './user_actions.vue'; import UserActions from './user_actions.vue';
import UserAvatar from './user_avatar.vue'; import UserAvatar from './user_avatar.vue';
@ -11,6 +14,7 @@ const thWidthClass = (width) => `gl-w-${width}p ${DEFAULT_TH_CLASSES}`;
export default { export default {
components: { components: {
GlSkeletonLoader,
GlTable, GlTable,
UserAvatar, UserAvatar,
UserActions, UserActions,
@ -26,6 +30,45 @@ export default {
required: true, required: true,
}, },
}, },
data() {
return {
groupCounts: [],
};
},
apollo: {
groupCounts: {
query: getUsersGroupCountsQuery,
variables() {
return {
usernames: this.users.map((user) => user.username),
};
},
update(data) {
const nodes = data?.users?.nodes || [];
const parsedIds = convertNodeIdsFromGraphQLIds(nodes);
return parsedIds.reduce((acc, { id, groupCount }) => {
acc[id] = groupCount || 0;
return acc;
}, {});
},
error(error) {
createFlash({
message: this.$options.i18n.groupCountFetchError,
captureError: true,
error,
});
},
skip() {
return !this.users.length;
},
},
},
i18n: {
groupCountFetchError: s__(
'AdminUsers|Could not load user group counts. Please refresh the page to try again.',
),
},
fields: [ fields: [
{ {
key: 'name', key: 'name',
@ -37,6 +80,11 @@ export default {
label: __('Projects'), label: __('Projects'),
thClass: thWidthClass(10), thClass: thWidthClass(10),
}, },
{
key: 'groupCount',
label: __('Groups'),
thClass: thWidthClass(10),
},
{ {
key: 'createdAt', key: 'createdAt',
label: __('Created on'), label: __('Created on'),
@ -50,7 +98,7 @@ export default {
{ {
key: 'settings', key: 'settings',
label: '', label: '',
thClass: thWidthClass(20), thClass: thWidthClass(10),
}, },
], ],
}; };
@ -64,6 +112,7 @@ export default {
:empty-text="s__('AdminUsers|No users found')" :empty-text="s__('AdminUsers|No users found')"
show-empty show-empty
stacked="md" stacked="md"
data-qa-selector="user_row_content"
> >
<template #cell(name)="{ item: user }"> <template #cell(name)="{ item: user }">
<user-avatar :user="user" :admin-user-path="paths.adminUser" /> <user-avatar :user="user" :admin-user-path="paths.adminUser" />
@ -77,6 +126,17 @@ export default {
<user-date :date="lastActivityOn" show-never /> <user-date :date="lastActivityOn" show-never />
</template> </template>
<template #cell(groupCount)="{ item: { id } }">
<div :data-testid="`user-group-count-${id}`">
<gl-skeleton-loader v-if="$apollo.loading" :width="40" :lines="1" />
<span v-else>{{ groupCounts[id] }}</span>
</div>
</template>
<template #cell(projectsCount)="{ item: { id, projectsCount } }">
<div :data-testid="`user-project-count-${id}`">{{ projectsCount }}</div>
</template>
<template #cell(settings)="{ item: user }"> <template #cell(settings)="{ item: user }">
<user-actions :user="user" :paths="paths" /> <user-actions :user="user" :paths="paths" />
</template> </template>

View file

@ -0,0 +1,8 @@
query getUsersGroupCounts($usernames: [String!]) {
users(usernames: $usernames) {
nodes {
id
groupCount
}
}
}

View file

@ -1,7 +1,14 @@
import Vue from 'vue'; import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import AdminUsersApp from './components/app.vue'; import AdminUsersApp from './components/app.vue';
import UsagePingDisabled from './components/usage_ping_disabled.vue';
Vue.use(VueApollo);
const apolloProvider = new VueApollo({
defaultClient: createDefaultClient({}, { assumeImmutableResults: true }),
});
export const initAdminUsersApp = (el = document.querySelector('#js-admin-users-app')) => { export const initAdminUsersApp = (el = document.querySelector('#js-admin-users-app')) => {
if (!el) { if (!el) {
@ -12,6 +19,7 @@ export const initAdminUsersApp = (el = document.querySelector('#js-admin-users-a
return new Vue({ return new Vue({
el, el,
apolloProvider,
render: (createElement) => render: (createElement) =>
createElement(AdminUsersApp, { createElement(AdminUsersApp, {
props: { props: {
@ -21,23 +29,3 @@ export const initAdminUsersApp = (el = document.querySelector('#js-admin-users-a
}), }),
}); });
}; };
export const initCohortsEmptyState = (el = document.querySelector('#js-cohorts-empty-state')) => {
if (!el) {
return false;
}
const { emptyStateSvgPath, enableUsagePingLink, docsLink } = el.dataset;
return new Vue({
el,
provide: {
svgPath: emptyStateSvgPath,
primaryButtonPath: enableUsagePingLink,
docsLink,
},
render(h) {
return h(UsagePingDisabled);
},
});
};

View file

@ -1,32 +0,0 @@
import Api from '~/api';
import { historyPushState } from '~/lib/utils/common_utils';
import { mergeUrlParams } from '~/lib/utils/url_utility';
const COHORTS_PANE = 'cohorts';
const COHORTS_PANE_TAB_CLICK_EVENT = 'i_analytics_cohorts';
const tabClickHandler = (e) => {
const { hash } = e.currentTarget;
let tab = null;
if (hash === `#${COHORTS_PANE}`) {
tab = COHORTS_PANE;
Api.trackRedisHllUserEvent(COHORTS_PANE_TAB_CLICK_EVENT);
}
const newUrl = mergeUrlParams({ tab }, window.location.href);
historyPushState(newUrl);
};
const initTabs = () => {
const tabLinks = document.querySelectorAll('.js-users-tab-item a');
if (tabLinks.length) {
tabLinks.forEach((tabLink) => {
tabLink.addEventListener('click', (e) => tabClickHandler(e));
});
}
};
export default initTabs;

View file

@ -17,6 +17,7 @@ import { convertToSnakeCase } from '~/lib/utils/text_utility';
import { joinPaths, visitUrl } from '~/lib/utils/url_utility'; import { joinPaths, visitUrl } from '~/lib/utils/url_utility';
import { s__, __ } from '~/locale'; import { s__, __ } from '~/locale';
import AlertStatus from '~/vue_shared/alert_details/components/alert_status.vue'; import AlertStatus from '~/vue_shared/alert_details/components/alert_status.vue';
import AlertsDeprecationWarning from '~/vue_shared/components/alerts_deprecation_warning.vue';
import { import {
tdClass, tdClass,
thClass, thClass,
@ -96,6 +97,7 @@ export default {
severityLabels: SEVERITY_LEVELS, severityLabels: SEVERITY_LEVELS,
statusTabs: ALERTS_STATUS_TABS, statusTabs: ALERTS_STATUS_TABS,
components: { components: {
AlertsDeprecationWarning,
GlAlert, GlAlert,
GlLoadingIcon, GlLoadingIcon,
GlTable, GlTable,
@ -273,6 +275,8 @@ export default {
</gl-sprintf> </gl-sprintf>
</gl-alert> </gl-alert>
<alerts-deprecation-warning />
<paginated-table-with-search-and-tabs <paginated-table-with-search-and-tabs
:show-error-msg="showErrorMsg" :show-error-msg="showErrorMsg"
:i18n="$options.i18n" :i18n="$options.i18n"

View file

@ -23,6 +23,7 @@ export default () => {
assigneeUsernameQuery, assigneeUsernameQuery,
alertManagementEnabled, alertManagementEnabled,
userCanEnableAlertManagement, userCanEnableAlertManagement,
hasManagedPrometheus,
} = domEl.dataset; } = domEl.dataset;
const apolloProvider = new VueApollo({ const apolloProvider = new VueApollo({
@ -64,6 +65,7 @@ export default () => {
alertManagementEnabled: parseBoolean(alertManagementEnabled), alertManagementEnabled: parseBoolean(alertManagementEnabled),
trackAlertStatusUpdateOptions: PAGE_CONFIG.OPERATIONS.TRACK_ALERT_STATUS_UPDATE_OPTIONS, trackAlertStatusUpdateOptions: PAGE_CONFIG.OPERATIONS.TRACK_ALERT_STATUS_UPDATE_OPTIONS,
userCanEnableAlertManagement: parseBoolean(userCanEnableAlertManagement), userCanEnableAlertManagement: parseBoolean(userCanEnableAlertManagement),
hasManagedPrometheus: parseBoolean(hasManagedPrometheus),
}, },
apolloProvider, apolloProvider,
render(createElement) { render(createElement) {

View file

@ -12,7 +12,11 @@ import Vue from 'vue';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility'; import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
import { s__, __ } from '~/locale'; import { s__, __ } from '~/locale';
import { mappingFields } from '../constants'; import { mappingFields } from '../constants';
import { getMappingData, transformForSave } from '../utils/mapping_transformations'; import {
getMappingData,
transformForSave,
setFieldsLabels,
} from '../utils/mapping_transformations';
export const i18n = { export const i18n = {
columns: { columns: {
@ -72,11 +76,14 @@ export default {
}, },
computed: { computed: {
mappingData() { mappingData() {
return getMappingData(this.gitlabFields, this.parsedPayload, this.savedMapping); return getMappingData(this.gitlabFields, this.formattedParsedPayload, this.savedMapping);
}, },
hasFallbackColumn() { hasFallbackColumn() {
return this.gitlabFields.some(({ numberOfFallbacks }) => Boolean(numberOfFallbacks)); return this.gitlabFields.some(({ numberOfFallbacks }) => Boolean(numberOfFallbacks));
}, },
formattedParsedPayload() {
return setFieldsLabels(this.parsedPayload);
},
}, },
methods: { methods: {
setMapping(gitlabKey, mappingKey, valueKey = mappingFields.mapping) { setMapping(gitlabKey, mappingKey, valueKey = mappingFields.mapping) {
@ -92,14 +99,16 @@ export default {
}, },
filterFields(searchTerm = '', fields) { filterFields(searchTerm = '', fields) {
const search = searchTerm.toLowerCase(); const search = searchTerm.toLowerCase();
return fields.filter((field) => field.label.toLowerCase().includes(search)); return fields.filter((field) =>
field.displayLabel.replace('...', '').toLowerCase().includes(search),
);
}, },
isSelected(fieldValue, mapping) { isSelected(fieldValue, mapping) {
return isEqual(fieldValue, mapping); return isEqual(fieldValue, mapping);
}, },
selectedValue(mapping) { selectedValue(mapping) {
return ( return (
this.parsedPayload.find((item) => isEqual(item.path, mapping))?.label || this.formattedParsedPayload.find((item) => isEqual(item.path, mapping))?.displayLabel ||
this.$options.i18n.makeSelection this.$options.i18n.makeSelection
); );
}, },
@ -167,11 +176,13 @@ export default {
<gl-dropdown-item <gl-dropdown-item
v-for="mappingField in filterFields(gitlabField.searchTerm, gitlabField.mappingFields)" v-for="mappingField in filterFields(gitlabField.searchTerm, gitlabField.mappingFields)"
:key="`${mappingField.path}__mapping`" :key="`${mappingField.path}__mapping`"
v-gl-tooltip
:is-checked="isSelected(gitlabField.mapping, mappingField.path)" :is-checked="isSelected(gitlabField.mapping, mappingField.path)"
is-check-item is-check-item
:title="mappingField.tooltip"
@click="setMapping(gitlabField.name, mappingField.path)" @click="setMapping(gitlabField.name, mappingField.path)"
> >
{{ mappingField.label }} {{ mappingField.displayLabel }}
</gl-dropdown-item> </gl-dropdown-item>
<gl-dropdown-item v-if="noResults(gitlabField.searchTerm, gitlabField.mappingFields)"> <gl-dropdown-item v-if="noResults(gitlabField.searchTerm, gitlabField.mappingFields)">
{{ $options.i18n.noResults }} {{ $options.i18n.noResults }}
@ -197,13 +208,15 @@ export default {
gitlabField.mappingFields, gitlabField.mappingFields,
)" )"
:key="`${mappingField.path}__fallback`" :key="`${mappingField.path}__fallback`"
v-gl-tooltip
:is-checked="isSelected(gitlabField.fallback, mappingField.path)" :is-checked="isSelected(gitlabField.fallback, mappingField.path)"
is-check-item is-check-item
:title="mappingField.tooltip"
@click=" @click="
setMapping(gitlabField.name, mappingField.path, $options.mappingFields.fallback) setMapping(gitlabField.name, mappingField.path, $options.mappingFields.fallback)
" "
> >
{{ mappingField.label }} {{ mappingField.displayLabel }}
</gl-dropdown-item> </gl-dropdown-item>
<gl-dropdown-item <gl-dropdown-item
v-if="noResults(gitlabField.fallbackSearchTerm, gitlabField.mappingFields)" v-if="noResults(gitlabField.fallbackSearchTerm, gitlabField.mappingFields)"

View file

@ -116,7 +116,7 @@ export default {
methods: { methods: {
tbodyTrClass(item) { tbodyTrClass(item) {
return { return {
[bodyTrClass]: this.integrations.length, [bodyTrClass]: this.integrations?.length,
'gl-bg-blue-50': (item !== null && item.id) === this.currentIntegration?.id, 'gl-bg-blue-50': (item !== null && item.id) === this.currentIntegration?.id,
}; };
}, },

View file

@ -14,13 +14,12 @@ import updateCurrentHttpIntegrationMutation from '../graphql/mutations/update_cu
import updateCurrentPrometheusIntegrationMutation from '../graphql/mutations/update_current_prometheus_integration.mutation.graphql'; import updateCurrentPrometheusIntegrationMutation from '../graphql/mutations/update_current_prometheus_integration.mutation.graphql';
import updatePrometheusIntegrationMutation from '../graphql/mutations/update_prometheus_integration.mutation.graphql'; import updatePrometheusIntegrationMutation from '../graphql/mutations/update_prometheus_integration.mutation.graphql';
import getCurrentIntegrationQuery from '../graphql/queries/get_current_integration.query.graphql'; import getCurrentIntegrationQuery from '../graphql/queries/get_current_integration.query.graphql';
import getHttpIntegrationsQuery from '../graphql/queries/get_http_integrations.query.graphql'; import getHttpIntegrationQuery from '../graphql/queries/get_http_integration.query.graphql';
import getIntegrationsQuery from '../graphql/queries/get_integrations.query.graphql'; import getIntegrationsQuery from '../graphql/queries/get_integrations.query.graphql';
import service from '../services'; import service from '../services';
import { import {
updateStoreAfterIntegrationDelete, updateStoreAfterIntegrationDelete,
updateStoreAfterIntegrationAdd, updateStoreAfterIntegrationAdd,
updateStoreAfterHttpIntegrationAdd,
} from '../utils/cache_updates'; } from '../utils/cache_updates';
import { import {
DELETE_INTEGRATION_ERROR, DELETE_INTEGRATION_ERROR,
@ -68,33 +67,8 @@ export default {
}; };
}, },
update(data) { update(data) {
const { alertManagementIntegrations: { nodes: list = [] } = {} } = data.project || {}; const { alertManagementIntegrations: { nodes = [] } = {} } = data.project || {};
return nodes;
return {
list,
};
},
error(err) {
createFlash({ message: err });
},
},
// TODO: we'll need to update the logic to request specific http integration by its id on edit
// when BE adds support for it https://gitlab.com/gitlab-org/gitlab/-/issues/321674
// currently the request for ALL http integrations is made and on specific integration edit we search it in the list
httpIntegrations: {
fetchPolicy: fetchPolicies.CACHE_AND_NETWORK,
query: getHttpIntegrationsQuery,
variables() {
return {
projectPath: this.projectPath,
};
},
update(data) {
const { alertManagementHttpIntegrations: { nodes: list = [] } = {} } = data.project || {};
return {
list,
};
}, },
error(err) { error(err) {
createFlash({ message: err }); createFlash({ message: err });
@ -107,9 +81,9 @@ export default {
data() { data() {
return { return {
isUpdating: false, isUpdating: false,
integrations: {}, integrations: [],
httpIntegrations: {},
currentIntegration: null, currentIntegration: null,
currentHttpIntegration: null,
newIntegration: null, newIntegration: null,
formVisible: false, formVisible: false,
showSuccessfulCreateAlert: false, showSuccessfulCreateAlert: false,
@ -121,7 +95,7 @@ export default {
return this.$apollo.queries.integrations.loading; return this.$apollo.queries.integrations.loading;
}, },
canAddIntegration() { canAddIntegration() {
return this.multiIntegrations || this.integrations?.list?.length < 2; return this.multiIntegrations || this.integrations.length < 2;
}, },
}, },
methods: { methods: {
@ -142,11 +116,6 @@ export default {
}, },
update(store, { data }) { update(store, { data }) {
updateStoreAfterIntegrationAdd(store, getIntegrationsQuery, data, { projectPath }); updateStoreAfterIntegrationAdd(store, getIntegrationsQuery, data, { projectPath });
if (isHttp) {
updateStoreAfterHttpIntegrationAdd(store, getHttpIntegrationsQuery, data, {
projectPath,
});
}
}, },
}) })
.then(({ data: { httpIntegrationCreate, prometheusIntegrationCreate } = {} } = {}) => { .then(({ data: { httpIntegrationCreate, prometheusIntegrationCreate } = {} } = {}) => {
@ -253,15 +222,38 @@ export default {
}); });
}, },
editIntegration({ id, type }) { editIntegration({ id, type }) {
let currentIntegration = this.integrations.list.find((integration) => integration.id === id); const currentIntegration = this.integrations.find((integration) => integration.id === id);
if (this.isHttp(type)) {
const httpIntegrationMappingData = this.httpIntegrations.list.find(
(integration) => integration.id === id,
);
currentIntegration = { ...currentIntegration, ...httpIntegrationMappingData };
}
this.viewIntegration(currentIntegration, tabIndices.viewCredentials); if (this.multiIntegrations && this.isHttp(type)) {
this.$apollo.addSmartQuery('currentHttpIntegration', {
query: getHttpIntegrationQuery,
variables() {
return {
projectPath: this.projectPath,
id,
};
},
update(data) {
const {
project: {
alertManagementHttpIntegrations: { nodes = [{}] },
},
} = data;
return nodes[0];
},
result() {
this.viewIntegration(
{ ...currentIntegration, ...this.currentHttpIntegration },
tabIndices.viewCredentials,
);
},
error() {
createFlash({ message: DEFAULT_ERROR });
},
});
} else {
this.viewIntegration(currentIntegration, tabIndices.viewCredentials);
}
}, },
viewIntegration(integration, tabIndex) { viewIntegration(integration, tabIndex) {
this.$apollo this.$apollo
@ -368,7 +360,7 @@ export default {
</gl-alert> </gl-alert>
<integrations-list <integrations-list
:integrations="integrations.list" :integrations="integrations"
:loading="loading" :loading="loading"
@edit-integration="editIntegration" @edit-integration="editIntegration"
@delete-integration="deleteIntegration" @delete-integration="deleteIntegration"

View file

@ -6,7 +6,6 @@ mutation updateCurrentPrometheusIntegration(
$type: String $type: String
$url: String $url: String
$apiUrl: String $apiUrl: String
$samplePayload: String
) { ) {
updateCurrentIntegration( updateCurrentIntegration(
id: $id id: $id
@ -16,6 +15,5 @@ mutation updateCurrentPrometheusIntegration(
type: $type type: $type
url: $url url: $url
apiUrl: $apiUrl apiUrl: $apiUrl
samplePayload: $samplePayload
) @client ) @client
} }

View file

@ -1,9 +1,8 @@
#import "ee_else_ce/alerts_settings/graphql/fragments/http_integration_payload_data.fragment.graphql" #import "ee_else_ce/alerts_settings/graphql/fragments/http_integration_payload_data.fragment.graphql"
# TODO: this query need to accept http integration id to request a sepcific integration query getHttpIntegration($projectPath: ID!, $id: ID) {
query getHttpIntegrations($projectPath: ID!) {
project(fullPath: $projectPath) { project(fullPath: $projectPath) {
alertManagementHttpIntegrations { alertManagementHttpIntegrations(id: $id) {
nodes { nodes {
...HttpIntegrationPayloadData ...HttpIntegrationPayloadData
} }

View file

@ -58,31 +58,6 @@ const addIntegrationToStore = (
}); });
}; };
const addHttpIntegrationToStore = (store, query, { httpIntegrationCreate }, variables) => {
const integration = httpIntegrationCreate?.integration;
if (!integration) {
return;
}
const sourceData = store.readQuery({
query,
variables,
});
const data = produce(sourceData, (draftData) => {
draftData.project.alertManagementHttpIntegrations.nodes = [
integration,
...draftData.project.alertManagementHttpIntegrations.nodes,
];
});
store.writeQuery({
query,
variables,
data,
});
};
const onError = (data, message) => { const onError = (data, message) => {
createFlash({ message }); createFlash({ message });
throw new Error(data.errors); throw new Error(data.errors);
@ -105,11 +80,3 @@ export const updateStoreAfterIntegrationAdd = (store, query, data, variables) =>
addIntegrationToStore(store, query, data, variables); addIntegrationToStore(store, query, data, variables);
} }
}; };
export const updateStoreAfterHttpIntegrationAdd = (store, query, data, variables) => {
if (hasErrors(data)) {
onError(data, ADD_INTEGRATION_ERROR);
} else {
addHttpIntegrationToStore(store, query, data, variables);
}
};

View file

@ -1,4 +1,6 @@
import { isEqual } from 'lodash'; import { isEqual } from 'lodash';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
/** /**
* Given data for GitLab alert fields, parsed payload fields data and previously stored mapping (if any) * Given data for GitLab alert fields, parsed payload fields data and previously stored mapping (if any)
* creates an object in a form convenient to build UI && interact with it * creates an object in a form convenient to build UI && interact with it
@ -32,6 +34,26 @@ export const getMappingData = (gitlabFields, payloadFields, savedMapping) => {
}); });
}; };
export const setFieldsLabels = (fields) => {
return fields.map((field) => {
const { label } = field;
let displayLabel;
let tooltip;
const labels = label.split('/');
if (labels.length > 1) {
tooltip = labels.join('.');
displayLabel = `...${capitalizeFirstCharacter(labels.pop())}`;
} else {
displayLabel = capitalizeFirstCharacter(label);
}
return {
...field,
displayLabel,
tooltip,
};
});
};
/** /**
* Based on mapping data configured by the user creates an object in a format suitable for save on BE * Based on mapping data configured by the user creates an object in a format suitable for save on BE
* @param {Object} mappingData - structure describing mapping between GitLab fields and parsed payload fields * @param {Object} mappingData - structure describing mapping between GitLab fields and parsed payload fields

View file

@ -0,0 +1,110 @@
<script>
import { GlBadge, GlTable, GlLink, GlEmptyState } from '@gitlab/ui';
import { GlSingleStat } from '@gitlab/ui/dist/charts';
import { sprintf, s__ } from '~/locale';
const defaultHeaderAttrs = {
thClass: 'gl-bg-white!',
thAttr: { 'data-testid': 'header' },
};
export default {
components: {
GlBadge,
GlTable,
GlSingleStat,
GlLink,
GlEmptyState,
},
inject: {
devopsScoreMetrics: {
default: null,
},
devopsReportDocsPath: {
default: '',
},
noDataImagePath: {
default: '',
},
},
computed: {
titleHelperText() {
return sprintf(
s__(
'DevopsReport|DevOps score metrics are based on usage over the last 30 days. Last updated: %{timestamp}.',
),
{ timestamp: this.devopsScoreMetrics.createdAt },
);
},
isEmpty() {
return this.devopsScoreMetrics.averageScore === undefined;
},
},
tableHeaderFields: [
{
key: 'title',
label: '',
...defaultHeaderAttrs,
},
{
key: 'usage',
label: s__('DevopsReport|Your usage'),
...defaultHeaderAttrs,
},
{
key: 'leadInstance',
label: s__('DevopsReport|Leader usage'),
...defaultHeaderAttrs,
},
{
key: 'score',
label: s__('DevopsReport|Score'),
...defaultHeaderAttrs,
},
],
};
</script>
<template>
<gl-empty-state
v-if="isEmpty"
:title="__('Data is still calculating...')"
:svg-path="noDataImagePath"
>
<template #description>
<p class="gl-mb-0">{{ __('It may be several days before you see feature usage data.') }}</p>
<gl-link :href="devopsReportDocsPath">{{
__('See example DevOps Score page in our documentation.')
}}</gl-link>
</template>
</gl-empty-state>
<div v-else data-testid="devops-score-app">
<div class="gl-text-gray-400 gl-my-4" data-testid="devops-score-note-text">
{{ titleHelperText }}
</div>
<gl-single-stat
unit="%"
size="sm"
:title="s__('DevopsReport|Your score')"
:should-animate="true"
:value="devopsScoreMetrics.averageScore.value"
:meta-icon="devopsScoreMetrics.averageScore.scoreLevel.icon"
:meta-text="devopsScoreMetrics.averageScore.scoreLevel.label"
:variant="devopsScoreMetrics.averageScore.scoreLevel.variant"
/>
<gl-table
:fields="$options.tableHeaderFields"
:items="devopsScoreMetrics.cards"
thead-class="gl-border-t-0 gl-border-b-solid gl-border-b-1 gl-border-b-gray-100"
stacked="sm"
>
<template #cell(usage)="{ item }">
<div data-testid="usageCol">
<span>{{ item.usage }}</span>
<gl-badge :variant="item.scoreLevel.variant" size="sm" class="gl-ml-1">{{
item.scoreLevel.label
}}</gl-badge>
</div>
</template>
</gl-table>
</div>
</template>

View file

@ -0,0 +1,22 @@
import Vue from 'vue';
import DevopsScore from './components/devops_score.vue';
export default () => {
const el = document.getElementById('js-devops-score');
if (!el) return false;
const { devopsScoreMetrics, devopsReportDocsPath, noDataImagePath } = el.dataset;
return new Vue({
el,
provide: {
devopsScoreMetrics: JSON.parse(devopsScoreMetrics),
devopsReportDocsPath,
noDataImagePath,
},
render(h) {
return h(DevopsScore);
},
});
};

View file

@ -6,7 +6,7 @@ export default () => {
// eslint-disable-next-line no-new // eslint-disable-next-line no-new
new UserCallout(); new UserCallout();
const emptyStateContainer = document.getElementById('js-devops-empty-state'); const emptyStateContainer = document.getElementById('js-devops-usage-ping-disabled');
if (!emptyStateContainer) return false; if (!emptyStateContainer) return false;

View file

@ -1,5 +1,5 @@
<script> <script>
import { GlSprintf, GlButton, GlAlert } from '@gitlab/ui'; import { GlSprintf, GlButton, GlAlert, GlCard } from '@gitlab/ui';
import Mousetrap from 'mousetrap'; import Mousetrap from 'mousetrap';
import { __ } from '~/locale'; import { __ } from '~/locale';
import Tracking from '~/tracking'; import Tracking from '~/tracking';
@ -34,7 +34,7 @@ export default {
recoveryCodeDownloadFilename: RECOVERY_CODE_DOWNLOAD_FILENAME, recoveryCodeDownloadFilename: RECOVERY_CODE_DOWNLOAD_FILENAME,
i18n, i18n,
mousetrap: null, mousetrap: null,
components: { GlSprintf, GlButton, GlAlert, ClipboardButton }, components: { GlSprintf, GlButton, GlAlert, ClipboardButton, GlCard },
mixins: [Tracking.mixin()], mixins: [Tracking.mixin()],
props: { props: {
codes: { codes: {
@ -116,8 +116,8 @@ export default {
</gl-sprintf> </gl-sprintf>
</p> </p>
<div <gl-card
class="codes-to-print gl-my-5 gl-p-5 gl-border-solid gl-border-1 gl-border-gray-100 gl-rounded-base" class="codes-to-print gl-my-5"
data-testid="recovery-codes" data-testid="recovery-codes"
data-qa-selector="codes_content" data-qa-selector="codes_content"
> >
@ -126,7 +126,7 @@ export default {
<span class="gl-font-monospace" data-qa-selector="code_content">{{ code }}</span> <span class="gl-font-monospace" data-qa-selector="code_content">{{ code }}</span>
</li> </li>
</ul> </ul>
</div> </gl-card>
<div class="gl-my-n2 gl-mx-n2 gl-display-flex gl-flex-wrap"> <div class="gl-my-n2 gl-mx-n2 gl-display-flex gl-flex-wrap">
<div class="gl-p-2"> <div class="gl-p-2">
<clipboard-button <clipboard-button
@ -140,6 +140,7 @@ export default {
</div> </div>
<div class="gl-p-2"> <div class="gl-p-2">
<gl-button <gl-button
is-unsafe-link
:href="codeDownloadUrl" :href="codeDownloadUrl"
:title="$options.i18n.downloadButton" :title="$options.i18n.downloadButton"
icon="download" icon="download"

View file

@ -12,7 +12,6 @@ import axios from './lib/utils/axios_utils';
import { isInVueNoteablePage } from './lib/utils/dom_utils'; import { isInVueNoteablePage } from './lib/utils/dom_utils';
import { __ } from './locale'; import { __ } from './locale';
window.axios = axios;
const animationEndEventString = 'animationend webkitAnimationEnd MSAnimationEnd oAnimationEnd'; const animationEndEventString = 'animationend webkitAnimationEnd MSAnimationEnd oAnimationEnd';
const transitionEndEventString = 'transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd'; const transitionEndEventString = 'transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd';

View file

@ -1,5 +1,5 @@
<script> <script>
import { GlLoadingIcon } from '@gitlab/ui'; import { GlLoadingIcon, GlBadge } from '@gitlab/ui';
import { mapState } from 'vuex'; import { mapState } from 'vuex';
import { GROUP_BADGE } from '../constants'; import { GROUP_BADGE } from '../constants';
import BadgeListRow from './badge_list_row.vue'; import BadgeListRow from './badge_list_row.vue';
@ -9,6 +9,7 @@ export default {
components: { components: {
BadgeListRow, BadgeListRow,
GlLoadingIcon, GlLoadingIcon,
GlBadge,
}, },
computed: { computed: {
...mapState(['badges', 'isLoading', 'kind']), ...mapState(['badges', 'isLoading', 'kind']),
@ -26,7 +27,7 @@ export default {
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
{{ s__('Badges|Your badges') }} {{ s__('Badges|Your badges') }}
<span v-show="!isLoading" class="badge badge-pill">{{ badges.length }}</span> <gl-badge v-show="!isLoading" size="sm">{{ badges.length }}</gl-badge>
</div> </div>
<gl-loading-icon v-show="isLoading" size="lg" class="card-body" /> <gl-loading-icon v-show="isLoading" size="lg" class="card-body" />
<div v-if="hasNoBadges" class="card-body"> <div v-if="hasNoBadges" class="card-body">

View file

@ -12,7 +12,7 @@ export default {
}; };
</script> </script>
<template> <template>
<gl-badge size="sm" variant="success"> <gl-badge size="sm" variant="info" class="gl-ml-2">
{{ draftsCount }} {{ draftsCount }}
<span class="sr-only"> {{ n__('draft', 'drafts', draftsCount) }} </span> <span class="sr-only"> {{ n__('draft', 'drafts', draftsCount) }} </span>
</gl-badge> </gl-badge>

View file

@ -1,6 +1,6 @@
<script> <script>
import { GlDropdown, GlDropdownItem, GlIcon } from '@gitlab/ui'; import { GlDropdown, GlDropdownItem, GlIcon } from '@gitlab/ui';
import { mapActions, mapGetters } from 'vuex'; import { mapActions, mapGetters, mapState } from 'vuex';
import PreviewItem from './preview_item.vue'; import PreviewItem from './preview_item.vue';
export default { export default {
@ -11,13 +11,22 @@ export default {
PreviewItem, PreviewItem,
}, },
computed: { computed: {
...mapState('diffs', ['viewDiffsFileByFile']),
...mapGetters('batchComments', ['draftsCount', 'sortedDrafts']), ...mapGetters('batchComments', ['draftsCount', 'sortedDrafts']),
}, },
methods: { methods: {
...mapActions('diffs', ['toggleActiveFileByHash']),
...mapActions('batchComments', ['scrollToDraft']), ...mapActions('batchComments', ['scrollToDraft']),
isLast(index) { isLast(index) {
return index === this.sortedDrafts.length - 1; return index === this.sortedDrafts.length - 1;
}, },
async onClickDraft(draft) {
if (this.viewDiffsFileByFile && draft.file_hash) {
await this.toggleActiveFileByHash(draft.file_hash);
}
await this.scrollToDraft(draft);
},
}, },
}; };
</script> </script>
@ -26,7 +35,7 @@ export default {
<gl-dropdown <gl-dropdown
:header-text="n__('%d pending comment', '%d pending comments', draftsCount)" :header-text="n__('%d pending comment', '%d pending comments', draftsCount)"
dropup dropup
toggle-class="qa-review-preview-toggle" data-qa-selector="review_preview_dropdown"
> >
<template #button-content> <template #button-content>
{{ __('Pending comments') }} {{ __('Pending comments') }}
@ -35,7 +44,8 @@ export default {
<gl-dropdown-item <gl-dropdown-item
v-for="(draft, index) in sortedDrafts" v-for="(draft, index) in sortedDrafts"
:key="draft.id" :key="draft.id"
@click="scrollToDraft(draft)" data-testid="preview-item"
@click="onClickDraft(draft)"
> >
<preview-item :draft="draft" :is-last="isLast(index)" /> <preview-item :draft="draft" :is-last="isLast(index)" />
</gl-dropdown-item> </gl-dropdown-item>

View file

@ -22,7 +22,7 @@ export default {
variant: { variant: {
type: String, type: String,
required: false, required: false,
default: 'success', default: 'confirm',
}, },
}, },
computed: { computed: {

View file

@ -0,0 +1,33 @@
import $ from 'jquery';
import Pikaday from 'pikaday';
import { parsePikadayDate, pikadayToString } from '~/lib/utils/datetime_utility';
export default function initDatePickers() {
$('.datepicker').each(function initPikaday() {
const $datePicker = $(this);
const datePickerVal = $datePicker.val();
const calendar = new Pikaday({
field: $datePicker.get(0),
theme: 'gitlab-theme animate-picker',
format: 'yyyy-mm-dd',
container: $datePicker.parent().get(0),
parse: (dateString) => parsePikadayDate(dateString),
toString: (date) => pikadayToString(date),
onSelect(dateText) {
$datePicker.val(calendar.toString(dateText));
},
firstDay: gon.first_day_of_week,
});
calendar.setDate(parsePikadayDate(datePickerVal));
$datePicker.data('pikaday', calendar);
});
$('.js-clear-due-date,.js-clear-start-date').on('click', (e) => {
e.preventDefault();
const calendar = $(e.target).siblings('.datepicker').data('pikaday');
calendar.setDate(null);
});
}

View file

@ -114,6 +114,12 @@ class SafeMathRenderer {
throwOnError: true, throwOnError: true,
maxSize: 20, maxSize: 20,
maxExpand: 20, maxExpand: 20,
trust: (context) =>
// this config option restores the KaTeX pre-v0.11.0
// behavior of allowing certain commands and protocols
// eslint-disable-next-line @gitlab/require-i18n-strings
['\\url', '\\href'].includes(context.command) &&
['http', 'https', 'mailto', '_relative'].includes(context.protocol),
}); });
} catch (e) { } catch (e) {
// Don't show a flash for now because it would override an existing flash message // Don't show a flash for now because it would override an existing flash message

View file

@ -1,5 +1,5 @@
import $ from 'jquery'; import $ from 'jquery';
import { once } from 'lodash'; import { once, countBy } from 'lodash';
import { deprecatedCreateFlash as flash } from '~/flash'; import { deprecatedCreateFlash as flash } from '~/flash';
import { darkModeEnabled } from '~/lib/utils/color_utils'; import { darkModeEnabled } from '~/lib/utils/color_utils';
import { __, sprintf } from '~/locale'; import { __, sprintf } from '~/locale';
@ -22,6 +22,8 @@ import { __, sprintf } from '~/locale';
const MAX_CHAR_LIMIT = 2000; const MAX_CHAR_LIMIT = 2000;
// Max # of mermaid blocks that can be rendered in a page. // Max # of mermaid blocks that can be rendered in a page.
const MAX_MERMAID_BLOCK_LIMIT = 50; const MAX_MERMAID_BLOCK_LIMIT = 50;
// Max # of `&` allowed in Chaining of links syntax
const MAX_CHAINING_OF_LINKS_LIMIT = 30;
// Keep a map of mermaid blocks we've already rendered. // Keep a map of mermaid blocks we've already rendered.
const elsProcessingMap = new WeakMap(); const elsProcessingMap = new WeakMap();
let renderedMermaidBlocks = 0; let renderedMermaidBlocks = 0;
@ -64,6 +66,18 @@ function importMermaidModule() {
}); });
} }
function shouldLazyLoadMermaidBlock(source) {
/**
* If source contains `&`, which means that it might
* contain Chaining of links a new syntax in Mermaid.
*/
if (countBy(source)['&'] > MAX_CHAINING_OF_LINKS_LIMIT) {
return true;
}
return false;
}
function fixElementSource(el) { function fixElementSource(el) {
// Mermaid doesn't like `<br />` tags, so collapse all like tags into `<br>`, which is parsed correctly. // Mermaid doesn't like `<br />` tags, so collapse all like tags into `<br>`, which is parsed correctly.
const source = el.textContent.replace(/<br\s*\/>/g, '<br>'); const source = el.textContent.replace(/<br\s*\/>/g, '<br>');
@ -128,7 +142,8 @@ function renderMermaids($els) {
if ( if (
(source && source.length > MAX_CHAR_LIMIT) || (source && source.length > MAX_CHAR_LIMIT) ||
renderedChars > MAX_CHAR_LIMIT || renderedChars > MAX_CHAR_LIMIT ||
renderedMermaidBlocks >= MAX_MERMAID_BLOCK_LIMIT renderedMermaidBlocks >= MAX_MERMAID_BLOCK_LIMIT ||
shouldLazyLoadMermaidBlock(source)
) { ) {
const html = ` const html = `
<div class="alert gl-alert gl-alert-warning alert-dismissible lazy-render-mermaid-container js-lazy-render-mermaid-container fade show" role="alert"> <div class="alert gl-alert gl-alert-warning alert-dismissible lazy-render-mermaid-container js-lazy-render-mermaid-container fade show" role="alert">

View file

@ -375,7 +375,7 @@ export const MR_PREVIOUS_FILE_IN_DIFF = {
export const MR_GO_TO_FILE = { export const MR_GO_TO_FILE = {
id: 'mergeRequests.goToFile', id: 'mergeRequests.goToFile',
description: __('Go to file'), description: __('Go to file'),
defaultKeys: ['t', 'mod+p'], defaultKeys: ['mod+p', 't'],
customizable: false, customizable: false,
}; };

View file

@ -0,0 +1,80 @@
<script>
import { __, s__ } from '~/locale';
// Map some keys to their proper representation depending on the system
// See also: https://craig.is/killing/mice#keys
const getKeyMap = () => {
const keyMap = {
up: '↑',
down: '↓',
left: '←',
right: '→',
ctrl: s__('KeyboardKey|Ctrl'),
shift: s__('KeyboardKey|Shift'),
enter: s__('KeyboardKey|Enter'),
esc: s__('KeyboardKey|Esc'),
command: '⌘',
option: window.gl?.client?.isMac ? '⌥' : s__('KeyboardKey|Alt'),
};
// Meta and alt are aliases
keyMap.meta = keyMap.command;
keyMap.alt = keyMap.option;
// Mod is Command on Mac, and Ctrl on Windows/Linux
keyMap.mod = window.gl?.client?.isMac ? keyMap.command : keyMap.ctrl;
return keyMap;
};
export default {
functional: true,
props: {
shortcuts: {
type: Array,
required: true,
},
},
render(createElement, context) {
const keyMap = getKeyMap();
const { staticClass } = context.data;
const shortcuts = context.props.shortcuts.reduce((acc, shortcut, i) => {
if (
!window.gl?.client?.isMac &&
(shortcut.includes('command') || shortcut.includes('meta'))
) {
return acc;
}
const keys = shortcut.split(/([ +])/);
if (i !== 0 && acc.length) {
acc.push(` ${__('or')} `);
// If there are multiple alternative shortcuts,
// we keep them on the same line if they are single-key, e.g. `]` or `j`
// but if they consist of multiple keys, we insert a line break, e.g.:
// `shift` + `]` <br> or `shift` + `j`
if (keys.length > 1) {
acc.push(createElement('br'));
}
}
keys.forEach((key) => {
if (key === '+') {
acc.push(' + ');
} else if (key === ' ') {
acc.push(` ${__('then')} `);
} else {
acc.push(createElement('kbd', {}, [keyMap[key] ?? key]));
}
});
return acc;
}, []);
return createElement('div', { staticClass }, shortcuts);
},
};
</script>

View file

@ -1,525 +1,99 @@
<script> <script>
/* eslint-disable @gitlab/vue-require-i18n-strings */ import { GlModal, GlSearchBoxByType } from '@gitlab/ui';
import { GlIcon, GlModal } from '@gitlab/ui'; import { s__, __ } from '~/locale';
import { keybindingGroups } from './keybindings';
import Shortcut from './shortcut.vue';
import ShortcutsToggle from './shortcuts_toggle.vue'; import ShortcutsToggle from './shortcuts_toggle.vue';
export default { export default {
components: { components: {
GlIcon,
GlModal, GlModal,
GlSearchBoxByType,
ShortcutsToggle, ShortcutsToggle,
Shortcut,
},
data() {
return {
searchTerm: '',
};
}, },
computed: { computed: {
ctrlCharacter() { filteredKeybindings() {
return window.gl.client.isMac ? '⌘' : 'ctrl'; if (!this.searchTerm) {
}, return keybindingGroups;
onDotCom() { }
return window.gon.dot_com;
const search = this.searchTerm.toLocaleLowerCase();
const mapped = keybindingGroups.map((group) => {
if (group.name.toLocaleLowerCase().includes(search)) {
return group;
}
return {
...group,
keybindings: group.keybindings.filter((binding) =>
binding.description.toLocaleLowerCase().includes(search),
),
};
});
return mapped.filter((group) => group.keybindings.length);
}, },
}, },
i18n: {
title: __(`Keyboard shortcuts`),
search: s__(`KeyboardShortcuts|Search keyboard shortcuts`),
noMatch: s__(`KeyboardShortcuts|No shortcuts matched your search`),
},
}; };
</script> </script>
<template> <template>
<gl-modal <gl-modal
modal-id="keyboard-shortcut-modal" modal-id="keyboard-shortcut-modal"
size="lg" size="lg"
:title="$options.i18n.title"
data-testid="modal-shortcuts" data-testid="modal-shortcuts"
body-class="shortcut-help-body gl-p-0!"
:visible="true" :visible="true"
:hide-footer="true" :hide-footer="true"
@hidden="$emit('hidden')" @hidden="$emit('hidden')"
> >
<template #modal-title> <div
<shortcuts-toggle /> class="gl-sticky gl-top-0 gl-py-5 gl-px-5 gl-display-flex gl-align-items-center gl-bg-white"
</template> >
<div class="row"> <gl-search-box-by-type
<div class="col-lg-4"> v-model.trim="searchTerm"
<table class="shortcut-mappings text-2"> :aria-label="$options.i18n.search"
<tbody> class="gl-w-half gl-mr-3"
<tr> />
<th></th> <shortcuts-toggle class="gl-w-half gl-ml-3" />
<th>{{ __('Global Shortcuts') }}</th> </div>
</tr> <div v-if="filteredKeybindings.length === 0" class="gl-px-5">
<tr> {{ $options.i18n.noMatch }}
<td class="shortcut"> </div>
<kbd>?</kbd> <div v-else class="shortcut-help-container gl-mt-8 gl-px-5 gl-pb-5">
</td> <section
<td>{{ __('Toggle this dialog') }}</td> v-for="group in filteredKeybindings"
</tr> :key="group.id"
<tr> class="shortcut-help-mapping gl-mb-4"
<td class="shortcut"> >
<kbd>shift p</kbd> <strong class="shortcut-help-mapping-title gl-w-half gl-display-inline-block">
</td> {{ group.name }}
<td>{{ __('Go to your projects') }}</td> </strong>
</tr> <div
<tr> v-for="keybinding in group.keybindings"
<td class="shortcut"> :key="keybinding.id"
<kbd>shift g</kbd> class="gl-display-flex gl-align-items-center"
</td> >
<td>{{ __('Go to your groups') }}</td> <shortcut
</tr> class="gl-w-40p gl-flex-shrink-0 gl-text-right gl-pr-4"
<tr> :shortcuts="keybinding.defaultKeys"
<td class="shortcut"> />
<kbd>shift a</kbd> <div class="gl-w-half gl-flex-shrink-0 gl-flex-grow-1">
</td> {{ keybinding.description }}
<td>{{ __('Go to the activity feed') }}</td> </div>
</tr> </div>
<tr> </section>
<td class="shortcut">
<kbd>shift l</kbd>
</td>
<td>{{ __('Go to the milestone list') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>shift s</kbd>
</td>
<td>{{ __('Go to your snippets') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>s</kbd>
/
<kbd>/</kbd>
</td>
<td>{{ __('Start search') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>shift i</kbd>
</td>
<td>{{ __('Go to your issues') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>shift m</kbd>
</td>
<td>{{ __('Go to your merge requests') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>shift t</kbd>
</td>
<td>{{ __('Go to your To-Do list') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>p</kbd>
<kbd>b</kbd>
</td>
<td>{{ __('Toggle the Performance Bar') }}</td>
</tr>
<tr v-if="onDotCom">
<td class="shortcut">
<kbd>g</kbd>
<kbd>x</kbd>
</td>
<td>{{ __('Toggle GitLab Next') }}</td>
</tr>
</tbody>
<tbody>
<tr>
<th></th>
<th>{{ __('Editing') }}</th>
</tr>
<tr>
<td class="shortcut">
<kbd>{{ ctrlCharacter }} shift p</kbd>
</td>
<td>{{ __('Toggle Markdown preview') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>
<gl-icon name="arrow-up" />
</kbd>
</td>
<td>
{{ __('Edit your most recent comment in a thread (from an empty textarea)') }}
</td>
</tr>
</tbody>
<tbody>
<tr>
<th></th>
<th>{{ __('Wiki') }}</th>
</tr>
<tr>
<td class="shortcut">
<kbd>e</kbd>
</td>
<td>{{ __('Edit wiki page') }}</td>
</tr>
</tbody>
<tbody>
<tr>
<th></th>
<th>{{ __('Repository Graph') }}</th>
</tr>
<tr>
<td class="shortcut">
<kbd>
<gl-icon name="arrow-left" />
</kbd>
/
<kbd>h</kbd>
</td>
<td>{{ __('Scroll left') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>
<gl-icon name="arrow-right" />
</kbd>
/
<kbd>l</kbd>
</td>
<td>{{ __('Scroll right') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>
<gl-icon name="arrow-up" />
</kbd>
/
<kbd>k</kbd>
</td>
<td>{{ __('Scroll up') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>
<gl-icon name="arrow-down" />
</kbd>
/
<kbd>j</kbd>
</td>
<td>{{ __('Scroll down') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>
shift
<gl-icon name="arrow-up" />
/ k
</kbd>
</td>
<td>{{ __('Scroll to top') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>
shift
<gl-icon name="arrow-down" />
/ j
</kbd>
</td>
<td>{{ __('Scroll to bottom') }}</td>
</tr>
</tbody>
</table>
</div>
<div class="col-lg-4">
<table class="shortcut-mappings text-2">
<tbody>
<tr>
<th></th>
<th>{{ __('Project') }}</th>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>p</kbd>
</td>
<td>{{ __("Go to the project's overview page") }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>v</kbd>
</td>
<td>{{ __("Go to the project's activity feed") }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>r</kbd>
</td>
<td>{{ __('Go to releases') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>f</kbd>
</td>
<td>{{ __('Go to files') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>t</kbd>
</td>
<td>{{ __('Go to find file') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>c</kbd>
</td>
<td>{{ __('Go to commits') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>n</kbd>
</td>
<td>{{ __('Go to repository graph') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>d</kbd>
</td>
<td>{{ __('Go to repository charts') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>i</kbd>
</td>
<td>{{ __('Go to issues') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>i</kbd>
</td>
<td>{{ __('New issue') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>b</kbd>
</td>
<td>{{ __('Go to issue boards') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>m</kbd>
</td>
<td>{{ __('Go to merge requests') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>j</kbd>
</td>
<td>{{ __('Go to jobs') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>l</kbd>
</td>
<td>{{ __('Go to metrics') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>e</kbd>
</td>
<td>{{ __('Go to environments') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>k</kbd>
</td>
<td>{{ __('Go to kubernetes') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>s</kbd>
</td>
<td>{{ __('Go to snippets') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>g</kbd>
<kbd>w</kbd>
</td>
<td>{{ __('Go to wiki') }}</td>
</tr>
</tbody>
<tbody>
<tr>
<th></th>
<th>{{ __('Project Files') }}</th>
</tr>
<tr>
<td class="shortcut">
<kbd>
<gl-icon name="arrow-up" />
</kbd>
</td>
<td>{{ __('Move selection up') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>
<gl-icon name="arrow-down" />
</kbd>
</td>
<td>{{ __('Move selection down') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>enter</kbd>
</td>
<td>{{ __('Open Selection') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>esc</kbd>
</td>
<td>{{ __('Go back (while searching for files)') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>y</kbd>
</td>
<td>{{ __('Go to file permalink (while viewing a file)') }}</td>
</tr>
</tbody>
</table>
</div>
<div class="col-lg-4">
<table class="shortcut-mappings text-2">
<tbody>
<tr>
<th></th>
<th>{{ __('Epics, issues, and merge requests') }}</th>
</tr>
<tr>
<td class="shortcut">
<kbd>r</kbd>
</td>
<td>{{ __('Comment/Reply (quoting selected text)') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>e</kbd>
</td>
<td>{{ __('Edit description') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>l</kbd>
</td>
<td>{{ __('Change label') }}</td>
</tr>
</tbody>
<tbody>
<tr>
<th></th>
<th>{{ __('Issues and merge requests') }}</th>
</tr>
<tr>
<td class="shortcut">
<kbd>a</kbd>
</td>
<td>{{ __('Change assignee') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>m</kbd>
</td>
<td>{{ __('Change milestone') }}</td>
</tr>
</tbody>
<tbody>
<tr>
<th></th>
<th>{{ __('Merge requests') }}</th>
</tr>
<tr>
<td class="shortcut">
<kbd>]</kbd>
/
<kbd>j</kbd>
</td>
<td>{{ __('Next file in diff') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>[</kbd>
/
<kbd>k</kbd>
</td>
<td>{{ __('Previous file in diff') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>{{ ctrlCharacter }} p</kbd>
</td>
<td>{{ __('Go to file') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>n</kbd>
</td>
<td>{{ __('Next unresolved discussion') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>p</kbd>
</td>
<td>{{ __('Previous unresolved discussion') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>b</kbd>
</td>
<td>{{ __('Copy source branch name') }}</td>
</tr>
</tbody>
<tbody>
<tr>
<th></th>
<th>{{ __('Merge request commits') }}</th>
</tr>
<tr>
<td class="shortcut">
<kbd>c</kbd>
</td>
<td>{{ __('Next commit') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>x</kbd>
</td>
<td>{{ __('Previous commit') }}</td>
</tr>
</tbody>
<tbody>
<tr>
<th></th>
<th>{{ __('Web IDE') }}</th>
</tr>
<tr>
<td class="shortcut">
<kbd>{{ ctrlCharacter }} p</kbd>
</td>
<td>{{ __('Go to file') }}</td>
</tr>
<tr>
<td class="shortcut">
<kbd>{{ ctrlCharacter }} enter</kbd>
</td>
<td>{{ __('Commit (when editing commit message)') }}</td>
</tr>
</tbody>
</table>
</div>
</div> </div>
</gl-modal> </gl-modal>
</template> </template>

View file

@ -6,7 +6,7 @@ import { disableShortcuts, enableShortcuts, shouldDisableShortcuts } from './sho
export default { export default {
i18n: { i18n: {
toggleLabel: __('Keyboard shortcuts'), toggleLabel: __('Toggle shortcuts'),
}, },
components: { components: {
GlToggle, GlToggle,
@ -31,14 +31,12 @@ export default {
</script> </script>
<template> <template>
<div v-if="localStorageUsable" class="d-inline-flex align-items-center js-toggle-shortcuts"> <div v-if="localStorageUsable" class="js-toggle-shortcuts">
<gl-toggle <gl-toggle
v-model="shortcutsEnabled" v-model="shortcutsEnabled"
aria-describedby="shortcutsToggle"
:label="$options.i18n.toggleLabel" :label="$options.i18n.toggleLabel"
label-position="left" label-position="left"
@change="onChange" @change="onChange"
/> />
<div id="shortcutsToggle" class="sr-only">{{ __('Enable or disable keyboard shortcuts') }}</div>
</div> </div>
</template> </template>

View file

@ -6,6 +6,7 @@ import BlobContentError from './blob_content_error.vue';
import { BLOB_RENDER_EVENT_LOAD, BLOB_RENDER_EVENT_SHOW_SOURCE } from './constants'; import { BLOB_RENDER_EVENT_LOAD, BLOB_RENDER_EVENT_SHOW_SOURCE } from './constants';
export default { export default {
name: 'BlobContent',
components: { components: {
GlLoadingIcon, GlLoadingIcon,
BlobContentError, BlobContentError,

View file

@ -7,7 +7,6 @@ import toast from '~/vue_shared/plugins/global_toast';
import { deprecatedCreateFlash as Flash } from '../flash'; import { deprecatedCreateFlash as Flash } from '../flash';
import BlobCiSyntaxYamlSelector from './template_selectors/ci_syntax_yaml_selector';
import BlobCiYamlSelector from './template_selectors/ci_yaml_selector'; import BlobCiYamlSelector from './template_selectors/ci_yaml_selector';
import DockerfileSelector from './template_selectors/dockerfile_selector'; import DockerfileSelector from './template_selectors/dockerfile_selector';
import GitignoreSelector from './template_selectors/gitignore_selector'; import GitignoreSelector from './template_selectors/gitignore_selector';
@ -34,7 +33,6 @@ export default class FileTemplateMediator {
this.templateSelectors = [ this.templateSelectors = [
GitignoreSelector, GitignoreSelector,
BlobCiYamlSelector, BlobCiYamlSelector,
BlobCiSyntaxYamlSelector,
MetricsDashboardSelector, MetricsDashboardSelector,
DockerfileSelector, DockerfileSelector,
LicenseSelector, LicenseSelector,

View file

@ -1,29 +0,0 @@
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
import FileTemplateSelector from '../file_template_selector';
export default class BlobCiSyntaxYamlSelector extends FileTemplateSelector {
constructor({ mediator }) {
super(mediator);
this.config = {
key: 'gitlab-ci-yaml',
name: '.gitlab-ci.yml',
pattern: /(.gitlab-ci.yml)/,
type: 'gitlab_ci_syntax_ymls',
dropdown: '.js-gitlab-ci-syntax-yml-selector',
wrapper: '.js-gitlab-ci-syntax-yml-selector-wrap',
};
}
initDropdown() {
initDeprecatedJQueryDropdown(this.$dropdown, {
data: this.$dropdown.data('data'),
filterable: true,
selectable: true,
search: {
fields: ['name'],
},
clicked: (options) => this.reportSelectionName(options),
text: (item) => item.name,
});
}
}

View file

@ -1,6 +1,12 @@
import $ from 'jquery'; import $ from 'jquery';
import '~/behaviors/markdown/render_gfm'; import '~/behaviors/markdown/render_gfm';
import { __ } from '~/locale'; import { __ } from '~/locale';
import {
REPO_BLOB_LOAD_VIEWER_START,
REPO_BLOB_LOAD_VIEWER_FINISH,
REPO_BLOB_LOAD_VIEWER,
} from '~/performance/constants';
import { performanceMarkAndMeasure } from '~/performance/utils';
import { fixTitle } from '~/tooltips'; import { fixTitle } from '~/tooltips';
import { deprecatedCreateFlash as Flash } from '../../flash'; import { deprecatedCreateFlash as Flash } from '../../flash';
import axios from '../../lib/utils/axios_utils'; import axios from '../../lib/utils/axios_utils';
@ -130,6 +136,9 @@ export default class BlobViewer {
} }
switchToViewer(name) { switchToViewer(name) {
performanceMarkAndMeasure({
mark: REPO_BLOB_LOAD_VIEWER_START,
});
const newViewer = this.$fileHolder[0].querySelector(`.blob-viewer[data-type='${name}']`); const newViewer = this.$fileHolder[0].querySelector(`.blob-viewer[data-type='${name}']`);
if (this.activeViewer === newViewer) return; if (this.activeViewer === newViewer) return;
@ -163,6 +172,15 @@ export default class BlobViewer {
handleLocationHash(); handleLocationHash();
this.toggleCopyButtonState(); this.toggleCopyButtonState();
performanceMarkAndMeasure({
mark: REPO_BLOB_LOAD_VIEWER_FINISH,
measures: [
{
name: REPO_BLOB_LOAD_VIEWER,
start: REPO_BLOB_LOAD_VIEWER_START,
},
],
});
}) })
.catch(() => new Flash(__('Error loading viewer'))); .catch(() => new Flash(__('Error loading viewer')));
} }

View file

@ -2,6 +2,7 @@
import $ from 'jquery'; import $ from 'jquery';
import initPopover from '~/blob/suggest_gitlab_ci_yml'; import initPopover from '~/blob/suggest_gitlab_ci_yml';
import initCodeQualityWalkthrough from '~/code_quality_walkthrough';
import { deprecatedCreateFlash as createFlash } from '~/flash'; import { deprecatedCreateFlash as createFlash } from '~/flash';
import { disableButtonIfEmptyField, setCookie } from '~/lib/utils/common_utils'; import { disableButtonIfEmptyField, setCookie } from '~/lib/utils/common_utils';
import Tracking from '~/tracking'; import Tracking from '~/tracking';
@ -38,6 +39,13 @@ const initPopovers = () => {
} }
}; };
const initCodeQualityWalkthroughStep = () => {
const codeQualityWalkthroughEl = document.querySelector('.js-code-quality-walkthrough');
if (codeQualityWalkthroughEl) {
initCodeQualityWalkthrough(codeQualityWalkthroughEl);
}
};
export const initUploadForm = () => { export const initUploadForm = () => {
const uploadBlobForm = $('.js-upload-blob-form'); const uploadBlobForm = $('.js-upload-blob-form');
if (uploadBlobForm.length) { if (uploadBlobForm.length) {
@ -74,6 +82,7 @@ export default () => {
isMarkdown, isMarkdown,
}); });
initPopovers(); initPopovers();
initCodeQualityWalkthroughStep();
}) })
.catch((e) => createFlash(e)); .catch((e) => createFlash(e));

View file

@ -1,6 +1,6 @@
import { sortBy, cloneDeep } from 'lodash'; import { sortBy, cloneDeep } from 'lodash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils'; import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { ListType, NOT_FILTER } from './constants'; import { ListType, NOT_FILTER, AssigneeIdParamValues } from './constants';
export function getMilestone() { export function getMilestone() {
return null; return null;
@ -186,6 +186,35 @@ export function transformNotFilters(filters) {
}, {}); }, {});
} }
export function getSupportedParams(filters, supportedFilters) {
return supportedFilters.reduce((acc, f) => {
/**
* TODO the API endpoint for the classic boards
* accepts assignee wildcard value as 'assigneeId' param -
* while the GraphQL query accepts the value in 'assigneWildcardId' field.
* Once we deprecate the classics boards,
* we should change the filtered search bar to use 'asssigneeWildcardId' as a token name.
*/
if (f === 'assigneeId' && filters[f]) {
return AssigneeIdParamValues.includes(filters[f])
? {
...acc,
assigneeWildcardId: filters[f].toUpperCase(),
}
: acc;
}
if (filters[f]) {
return {
...acc,
[f]: filters[f],
};
}
return acc;
}, {});
}
// EE-specific feature. Find the implementation in the `ee/`-folder // EE-specific feature. Find the implementation in the `ee/`-folder
export function transformBoardConfig() { export function transformBoardConfig() {
return ''; return '';

View file

@ -1,5 +1,5 @@
<script> <script>
import { mapActions, mapGetters, mapState } from 'vuex'; import { mapActions, mapState } from 'vuex';
import BoardCardInner from './board_card_inner.vue'; import BoardCardInner from './board_card_inner.vue';
export default { export default {
@ -31,7 +31,6 @@ export default {
}, },
computed: { computed: {
...mapState(['selectedBoardItems', 'activeId']), ...mapState(['selectedBoardItems', 'activeId']),
...mapGetters(['isSwimlanesOn']),
isActive() { isActive() {
return this.item.id === this.activeId; return this.item.id === this.activeId;
}, },
@ -46,7 +45,7 @@ export default {
...mapActions(['toggleBoardItemMultiSelection', 'toggleBoardItem']), ...mapActions(['toggleBoardItemMultiSelection', 'toggleBoardItem']),
toggleIssue(e) { toggleIssue(e) {
// Don't do anything if this happened on a no trigger element // Don't do anything if this happened on a no trigger element
if (e.target.classList.contains('js-no-trigger')) return; if (e.target.closest('.js-no-trigger')) return;
const isMultiSelect = e.ctrlKey || e.metaKey; const isMultiSelect = e.ctrlKey || e.metaKey;
if (isMultiSelect) { if (isMultiSelect) {

View file

@ -190,6 +190,7 @@ export default {
<template v-for="label in orderedLabels"> <template v-for="label in orderedLabels">
<gl-label <gl-label
:key="label.id" :key="label.id"
class="js-no-trigger"
:background-color="label.color" :background-color="label.color"
:title="label.title" :title="label.title"
:description="label.description" :description="label.description"

View file

@ -4,7 +4,6 @@ import { sortBy } from 'lodash';
import Draggable from 'vuedraggable'; import Draggable from 'vuedraggable';
import { mapState, mapGetters, mapActions } from 'vuex'; import { mapState, mapGetters, mapActions } from 'vuex';
import BoardAddNewColumn from 'ee_else_ce/boards/components/board_add_new_column.vue'; import BoardAddNewColumn from 'ee_else_ce/boards/components/board_add_new_column.vue';
import { sortableEnd, sortableStart } from '~/boards/mixins/sortable_default_options';
import defaultSortableConfig from '~/sortable/sortable_config'; import defaultSortableConfig from '~/sortable/sortable_config';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import BoardColumn from './board_column.vue'; import BoardColumn from './board_column.vue';
@ -48,7 +47,7 @@ export default {
: this.lists; : this.lists;
}, },
canDragColumns() { canDragColumns() {
return !this.isEpicBoard && this.glFeatures.graphqlBoardLists && this.canAdminList; return (this.isEpicBoard || this.glFeatures.graphqlBoardLists) && this.canAdminList;
}, },
boardColumnWrapper() { boardColumnWrapper() {
return this.canDragColumns ? Draggable : 'div'; return this.canDragColumns ? Draggable : 'div';
@ -73,14 +72,7 @@ export default {
const el = this.canDragColumns ? this.$refs.list.$el : this.$refs.list; const el = this.canDragColumns ? this.$refs.list.$el : this.$refs.list;
el.scrollTo({ left: el.scrollWidth, behavior: 'smooth' }); el.scrollTo({ left: el.scrollWidth, behavior: 'smooth' });
}, },
handleDragOnStart() {
sortableStart();
},
handleDragOnEnd(params) { handleDragOnEnd(params) {
sortableEnd();
if (this.isEpicBoard) return;
const { item, newIndex, oldIndex, to } = params; const { item, newIndex, oldIndex, to } = params;
const listId = item.dataset.id; const listId = item.dataset.id;
@ -108,7 +100,6 @@ export default {
ref="list" ref="list"
v-bind="draggableOptions" v-bind="draggableOptions"
class="boards-list gl-w-full gl-py-5 gl-px-3 gl-white-space-nowrap" class="boards-list gl-w-full gl-py-5 gl-px-3 gl-white-space-nowrap"
@start="handleDragOnStart"
@end="handleDragOnEnd" @end="handleDragOnEnd"
> >
<board-column <board-column

View file

@ -4,13 +4,13 @@ import { mapState, mapActions, mapGetters } from 'vuex';
import BoardSidebarDueDate from '~/boards/components/sidebar/board_sidebar_due_date.vue'; import BoardSidebarDueDate from '~/boards/components/sidebar/board_sidebar_due_date.vue';
import BoardSidebarLabelsSelect from '~/boards/components/sidebar/board_sidebar_labels_select.vue'; import BoardSidebarLabelsSelect from '~/boards/components/sidebar/board_sidebar_labels_select.vue';
import BoardSidebarMilestoneSelect from '~/boards/components/sidebar/board_sidebar_milestone_select.vue'; import BoardSidebarMilestoneSelect from '~/boards/components/sidebar/board_sidebar_milestone_select.vue';
import BoardSidebarSubscription from '~/boards/components/sidebar/board_sidebar_subscription.vue';
import BoardSidebarTimeTracker from '~/boards/components/sidebar/board_sidebar_time_tracker.vue'; import BoardSidebarTimeTracker from '~/boards/components/sidebar/board_sidebar_time_tracker.vue';
import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.vue'; import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.vue';
import { ISSUABLE } from '~/boards/constants'; import { ISSUABLE } from '~/boards/constants';
import { contentTop } from '~/lib/utils/common_utils'; import { contentTop } from '~/lib/utils/common_utils';
import SidebarAssigneesWidget from '~/sidebar/components/assignees/sidebar_assignees_widget.vue'; import SidebarAssigneesWidget from '~/sidebar/components/assignees/sidebar_assignees_widget.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import SidebarConfidentialityWidget from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue';
import SidebarSubscriptionsWidget from '~/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue';
export default { export default {
headerHeight: `${contentTop()}px`, headerHeight: `${contentTop()}px`,
@ -18,10 +18,11 @@ export default {
GlDrawer, GlDrawer,
BoardSidebarTitle, BoardSidebarTitle,
SidebarAssigneesWidget, SidebarAssigneesWidget,
SidebarConfidentialityWidget,
BoardSidebarTimeTracker, BoardSidebarTimeTracker,
BoardSidebarLabelsSelect, BoardSidebarLabelsSelect,
BoardSidebarDueDate, BoardSidebarDueDate,
BoardSidebarSubscription, SidebarSubscriptionsWidget,
BoardSidebarMilestoneSelect, BoardSidebarMilestoneSelect,
BoardSidebarEpicSelect: () => BoardSidebarEpicSelect: () =>
import('ee_component/boards/components/sidebar/board_sidebar_epic_select.vue'), import('ee_component/boards/components/sidebar/board_sidebar_epic_select.vue'),
@ -30,7 +31,20 @@ export default {
SidebarIterationWidget: () => SidebarIterationWidget: () =>
import('ee_component/sidebar/components/sidebar_iteration_widget.vue'), import('ee_component/sidebar/components/sidebar_iteration_widget.vue'),
}, },
mixins: [glFeatureFlagsMixin()], inject: {
multipleAssigneesFeatureAvailable: {
default: false,
},
epicFeatureAvailable: {
default: false,
},
iterationFeatureAvailable: {
default: false,
},
weightFeatureAvailable: {
default: false,
},
},
computed: { computed: {
...mapGetters([ ...mapGetters([
'isSidebarOpen', 'isSidebarOpen',
@ -50,7 +64,7 @@ export default {
}, },
}, },
methods: { methods: {
...mapActions(['toggleBoardItem', 'setAssignees']), ...mapActions(['toggleBoardItem', 'setAssignees', 'setActiveItemConfidential']),
handleClose() { handleClose() {
this.toggleBoardItem({ boardItem: this.activeBoardItem, sidebarType: this.sidebarType }); this.toggleBoardItem({ boardItem: this.activeBoardItem, sidebarType: this.sidebarType });
}, },
@ -72,13 +86,14 @@ export default {
:iid="activeBoardItem.iid" :iid="activeBoardItem.iid"
:full-path="fullPath" :full-path="fullPath"
:initial-assignees="activeBoardItem.assignees" :initial-assignees="activeBoardItem.assignees"
class="assignee" :allow-multiple-assignees="multipleAssigneesFeatureAvailable"
@assignees-updated="setAssignees" @assignees-updated="setAssignees"
/> />
<board-sidebar-epic-select class="epic" /> <board-sidebar-epic-select v-if="epicFeatureAvailable" class="epic" />
<div> <div>
<board-sidebar-milestone-select /> <board-sidebar-milestone-select />
<sidebar-iteration-widget <sidebar-iteration-widget
v-if="iterationFeatureAvailable"
:iid="activeBoardItem.iid" :iid="activeBoardItem.iid"
:workspace-path="projectPathForActiveIssue" :workspace-path="projectPathForActiveIssue"
:iterations-workspace-path="groupPathForActiveIssue" :iterations-workspace-path="groupPathForActiveIssue"
@ -89,8 +104,19 @@ export default {
<board-sidebar-time-tracker class="swimlanes-sidebar-time-tracker" /> <board-sidebar-time-tracker class="swimlanes-sidebar-time-tracker" />
<board-sidebar-due-date /> <board-sidebar-due-date />
<board-sidebar-labels-select class="labels" /> <board-sidebar-labels-select class="labels" />
<board-sidebar-weight-input v-if="glFeatures.issueWeights" class="weight" /> <board-sidebar-weight-input v-if="weightFeatureAvailable" class="weight" />
<board-sidebar-subscription class="subscriptions" /> <sidebar-confidentiality-widget
:iid="activeBoardItem.iid"
:full-path="fullPath"
:issuable-type="issuableType"
@confidentialityUpdated="setActiveItemConfidential($event)"
/>
<sidebar-subscriptions-widget
:iid="activeBoardItem.iid"
:full-path="fullPath"
:issuable-type="issuableType"
data-testid="sidebar-notifications"
/>
</template> </template>
</gl-drawer> </gl-drawer>
</template> </template>

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