Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--GITLAB_KAS_VERSION2
-rw-r--r--Gemfile10
-rw-r--r--Gemfile.checksum50
-rw-r--r--Gemfile.lock22
-rw-r--r--app/assets/javascripts/usage_quotas/storage/constants.js3
-rw-r--r--app/models/users/callout.rb3
-rw-r--r--app/views/projects/_home_panel.html.haml2
-rw-r--r--app/workers/bulk_imports/finish_project_import_worker.rb2
-rw-r--r--app/workers/bulk_imports/pipeline_batch_worker.rb2
-rw-r--r--app/workers/bulk_imports/pipeline_worker.rb2
-rw-r--r--app/workers/bulk_imports/relation_batch_export_worker.rb2
-rw-r--r--app/workers/bulk_imports/relation_export_worker.rb2
-rw-r--r--config/gitlab.yml.example5
-rw-r--r--doc/administration/gitaly/configure_gitaly.md16
-rw-r--r--doc/administration/gitaly/praefect.md12
-rw-r--r--doc/api/graphql/reference/index.md5
-rw-r--r--doc/architecture/blueprints/ai_gateway/index.md141
-rw-r--r--doc/development/documentation/metadata.md97
-rw-r--r--doc/development/documentation/styleguide/index.md108
-rw-r--r--doc/development/documentation/styleguide/word_list.md17
-rw-r--r--doc/development/testing_guide/end_to_end/best_practices.md2
-rw-r--r--doc/gitlab-basics/start-using-git.md1
-rw-r--r--lib/gitlab/ci/config.rb7
-rw-r--r--lib/gitlab/gitaly_client/storage_settings.rb12
-rw-r--r--locale/gitlab.pot17
-rw-r--r--qa/Gemfile6
-rw-r--r--qa/Gemfile.lock12
-rw-r--r--spec/initializers/6_validations_spec.rb14
-rw-r--r--spec/lib/backup/repositories_spec.rb10
-rw-r--r--spec/lib/gitlab/ci/config_spec.rb28
-rw-r--r--spec/lib/gitlab/git/repository_spec.rb5
-rw-r--r--spec/lib/gitlab/gitaly_client/storage_settings_spec.rb14
-rw-r--r--spec/models/project_spec.rb7
-rw-r--r--spec/models/repository_spec.rb6
-rw-r--r--spec/requests/api/projects_spec.rb2
-rw-r--r--spec/services/projects/fork_service_spec.rb2
-rw-r--r--spec/services/projects/update_repository_storage_service_spec.rb7
-rw-r--r--spec/services/projects/update_service_spec.rb2
-rw-r--r--spec/support/helpers/stub_configuration.rb7
-rw-r--r--spec/support/shared_examples/models/concerns/repository_storage_movable_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/workers/schedule_bulk_repository_shard_moves_shared_examples.rb2
-rw-r--r--spec/tasks/gitlab/backup_rake_spec.rb5
-rw-r--r--spec/workers/every_sidekiq_worker_spec.rb10
45 files changed, 370 insertions, 319 deletions
diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION
index 7776cb22262..cb09356c7a7 100644
--- a/GITLAB_KAS_VERSION
+++ b/GITLAB_KAS_VERSION
@@ -1 +1 @@
-v16.6.0
+v16.7.0-rc2
diff --git a/Gemfile b/Gemfile
index 509afc9b5d2..e26ccad018e 100644
--- a/Gemfile
+++ b/Gemfile
@@ -199,9 +199,9 @@ gem 'seed-fu', '~> 2.3.7' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'elasticsearch-model', '~> 7.2' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'elasticsearch-rails', '~> 7.2', require: 'elasticsearch/rails/instrumentation' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'elasticsearch-api', '7.13.3' # rubocop:todo Gemfile/MissingFeatureCategory
-gem 'aws-sdk-core', '~> 3.187.1' # rubocop:todo Gemfile/MissingFeatureCategory
+gem 'aws-sdk-core', '~> 3.188.0' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'aws-sdk-cloudformation', '~> 1' # rubocop:todo Gemfile/MissingFeatureCategory
-gem 'aws-sdk-s3', '~> 1.137.0' # rubocop:todo Gemfile/MissingFeatureCategory
+gem 'aws-sdk-s3', '~> 1.139.0' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'faraday_middleware-aws-sigv4', '~>0.3.0' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'typhoeus', '~> 1.4.0' # Used with Elasticsearch to support http keep-alive connections # rubocop:todo Gemfile/MissingFeatureCategory
@@ -221,7 +221,7 @@ gem 'asciidoctor-plantuml', '~> 0.0.16' # rubocop:todo Gemfile/MissingFeatureCat
gem 'asciidoctor-kroki', '~> 0.8.0', require: false # rubocop:todo Gemfile/MissingFeatureCategory
gem 'rouge', '~> 4.2.0' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'truncato', '~> 0.7.12' # rubocop:todo Gemfile/MissingFeatureCategory
-gem 'nokogiri', '~> 1.15', '>= 1.15.4' # rubocop:todo Gemfile/MissingFeatureCategory
+gem 'nokogiri', '~> 1.15', '>= 1.15.5' # rubocop:todo Gemfile/MissingFeatureCategory
# Calendar rendering
gem 'icalendar' # rubocop:todo Gemfile/MissingFeatureCategory
@@ -264,7 +264,7 @@ gem 'rainbow', '~> 3.0' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'ruby-progressbar', '~> 1.10' # rubocop:todo Gemfile/MissingFeatureCategory
# Linear-time regex library for untrusted regular expressions
-gem 're2', '2.3.0' # rubocop:todo Gemfile/MissingFeatureCategory
+gem 're2', '2.4.3' # rubocop:todo Gemfile/MissingFeatureCategory
# Misc
@@ -310,7 +310,7 @@ gem 'sanitize', '~> 6.0.2' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'babosa', '~> 2.0' # rubocop:todo Gemfile/MissingFeatureCategory
# Sanitizes SVG input
-gem 'loofah', '~> 2.21.4' # rubocop:todo Gemfile/MissingFeatureCategory
+gem 'loofah', '~> 2.22.0' # rubocop:todo Gemfile/MissingFeatureCategory
# Used to provide license templates
gem 'licensee', '~> 9.16' # rubocop:todo Gemfile/MissingFeatureCategory
diff --git a/Gemfile.checksum b/Gemfile.checksum
index a435cddc8dd..2f3d45a886a 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -37,9 +37,9 @@
{"name":"aws-eventstream","version":"1.2.0","platform":"ruby","checksum":"ffa53482c92880b001ff2fb06919b9bb82fd847cbb0fa244985d2ebb6dd0d1df"},
{"name":"aws-partitions","version":"1.761.0","platform":"ruby","checksum":"291e444e1edfc92c5521a6dbdd1236ccc3f122b3520163b2be6ec5b6ef350ef2"},
{"name":"aws-sdk-cloudformation","version":"1.41.0","platform":"ruby","checksum":"31e47539719734413671edf9b1a31f8673fbf9688549f50c41affabbcb1c6b26"},
-{"name":"aws-sdk-core","version":"3.187.1","platform":"ruby","checksum":"bcc4f075b172430df9a147a6d9c615b4915ad112316199092f8bc8edd5a1bb15"},
+{"name":"aws-sdk-core","version":"3.188.0","platform":"ruby","checksum":"67b785c60466e5f459e250a38f55f5170ab6723db8740157bb6b06a7888d6337"},
{"name":"aws-sdk-kms","version":"1.64.0","platform":"ruby","checksum":"40de596c95047bfc6e1aacea24f3df6241aa716b6f7ce08ac4c5f7e3120395ad"},
-{"name":"aws-sdk-s3","version":"1.137.0","platform":"ruby","checksum":"580011295202bf134d62473916933ef00ad9b9076264d8de8bd00e3c4e5bebab"},
+{"name":"aws-sdk-s3","version":"1.139.0","platform":"ruby","checksum":"a7cf63382f93c5790687371daa6723101db8976aa6a9a4ba7f2305a2103fc87b"},
{"name":"aws-sigv4","version":"1.6.0","platform":"ruby","checksum":"ca9e6a15cd424f1f32b524b9760995331459bc22e67d3daad4fcf0c0084b087d"},
{"name":"axe-core-api","version":"4.6.0","platform":"ruby","checksum":"1b0ddec3353f108dc10363baf2282f43a5ff7f13d4e25f99071294e78f8a6c62"},
{"name":"axe-core-rspec","version":"4.6.0","platform":"ruby","checksum":"11c25bc9dd388c137ba4e5e63d64d20092bf22c884d8ffc829a22acfbacd747f"},
@@ -205,7 +205,6 @@
{"name":"get_process_mem","version":"0.2.7","platform":"ruby","checksum":"4afd3c3641dd6a817c09806c7d6d509d8a9984512ac38dea8b917426bbf77eba"},
{"name":"gettext","version":"3.4.9","platform":"ruby","checksum":"292864fe6a15c224cee4125a4a72fab426fdbb280e4cff3cfe44935f549b009a"},
{"name":"gettext_i18n_rails","version":"1.11.0","platform":"ruby","checksum":"e19c7e4a256c500f7f38396dca44a282b9838ae278f57c362993a54964b22bbe"},
-{"name":"gettext_i18n_rails_js","version":"2.0.0","platform":"ruby","checksum":"7bfb72699e3cdf9a2d892cc816e70442a08d0f4e340b92731249ad38b9205b51"},
{"name":"git","version":"1.18.0","platform":"ruby","checksum":"c9b80462e4565cd3d7a9ba8440c41d2c52244b17b0dad0bfddb46de70630c465"},
{"name":"gitaly","version":"16.5.0.pre.rc1","platform":"ruby","checksum":"ed17515ad04d4663a0efc15c8f2887b705f006133e8b10cc9321460eb0a38353"},
{"name":"gitlab","version":"4.19.0","platform":"ruby","checksum":"3f645e3e195dbc24f0834fbf83e8ccfb2056d8e9712b01a640aad418a6949679"},
@@ -347,7 +346,7 @@
{"name":"locale","version":"2.1.3","platform":"ruby","checksum":"b6ddee011e157817cb98e521b3ce7cb626424d5882f1e844aafdee3e8b212725"},
{"name":"lockbox","version":"1.3.0","platform":"ruby","checksum":"ca8e5806e4e0c56d1d762ac5cf401940ff53fc37554ef623d3313c7a6331a3ea"},
{"name":"lograge","version":"0.11.2","platform":"ruby","checksum":"4cbd1554b86f545d795eff15a0c24fd25057d2ac4e1caa5fc186168b3da932ef"},
-{"name":"loofah","version":"2.21.4","platform":"ruby","checksum":"2c18cd5db9fd92a48a270344e57a5b84cf22d668b78e1481f10e4f2cde4eb734"},
+{"name":"loofah","version":"2.22.0","platform":"ruby","checksum":"10d76e070c86b12fec74b6a9515fd1940f4459198b991342d0a7897d86c372fe"},
{"name":"lookbook","version":"2.0.1","platform":"ruby","checksum":"0f14729c8c992810de0792a0be865a5792e5765fbaea5950cce74c6e5c73fc4a"},
{"name":"lru_redux","version":"1.1.0","platform":"ruby","checksum":"ee71d0ccab164c51de146c27b480a68b3631d5b4297b8ffe8eda1c72de87affb"},
{"name":"lumberjack","version":"1.2.7","platform":"ruby","checksum":"a5c6aae6b4234f1420dbcd80b23e3bca0817bd239440dde097ebe3fa63c63b1f"},
@@ -397,17 +396,17 @@
{"name":"nio4r","version":"2.5.8","platform":"java","checksum":"b2b1800f6bf7ce4b797ca8b639ad278a99c9c904fb087a91d944f38e4bd71401"},
{"name":"nio4r","version":"2.5.8","platform":"ruby","checksum":"3becb4ad95ab8ac0a9bd2e1b16466869402be62848082bf6329ae9091f276676"},
{"name":"no_proxy_fix","version":"0.1.2","platform":"ruby","checksum":"4e9b4c31bb146de7fcf347dc1087bb13ac2039b56d50aa019e61036256abcd00"},
-{"name":"nokogiri","version":"1.15.4","platform":"aarch64-linux","checksum":"14091a07e07045a440213f7d5ced732fa7654ae8b6c7d180137f4124c5284ab8"},
-{"name":"nokogiri","version":"1.15.4","platform":"arm-linux","checksum":"572ddc19934d010e98821a946d89462ae66b310fecc3fe12c48b0025c2f76855"},
-{"name":"nokogiri","version":"1.15.4","platform":"arm64-darwin","checksum":"707288e293f4fc82a008f90b7ba0180d9f803f6a239a13e424378fedf8cf93e9"},
-{"name":"nokogiri","version":"1.15.4","platform":"java","checksum":"04745925f63af61144eccef38a703928629cf97c34dbb1c42e3def17ac77ec92"},
-{"name":"nokogiri","version":"1.15.4","platform":"ruby","checksum":"e4a801e5ef643cc0036f0a7e93433d18818b31d48c9c287596b68e92c0173c4d"},
-{"name":"nokogiri","version":"1.15.4","platform":"x64-mingw-ucrt","checksum":"a0bfb65461a0453afed1a41b235fe84d5b9c7f4d70afd45f0dc2fdec8909faf1"},
-{"name":"nokogiri","version":"1.15.4","platform":"x64-mingw32","checksum":"b9d01b9202e33cc23d19b2c1fc18ff4029cdda9b4f937a4baaefd4124a2158ba"},
-{"name":"nokogiri","version":"1.15.4","platform":"x86-linux","checksum":"f6ae258d7ed5f81715118282aa45486e68fd44b9747d0244a236e9ed5b94c45d"},
-{"name":"nokogiri","version":"1.15.4","platform":"x86-mingw32","checksum":"3f65b2426ece8da908bd5df5b6262ce525393f5245f8258a245bb4c3f5759b98"},
-{"name":"nokogiri","version":"1.15.4","platform":"x86_64-darwin","checksum":"d756605c540034debd7f486ae27802e6b1b129013fd6b1bb823783ef6f2bc5d7"},
-{"name":"nokogiri","version":"1.15.4","platform":"x86_64-linux","checksum":"872ced3d72d797ed9b5a76c67141c6cee7589711358e11c73e9c53724ffd1842"},
+{"name":"nokogiri","version":"1.15.5","platform":"aarch64-linux","checksum":"6dfa1d9837ddb233e234d56e244560ab1bc545d3d1744478060e18691f44ded7"},
+{"name":"nokogiri","version":"1.15.5","platform":"arm-linux","checksum":"e3ac6608c6e1714bc11ff04e29a43fedf4cac2aea1bd88256cc3b927c06f347f"},
+{"name":"nokogiri","version":"1.15.5","platform":"arm64-darwin","checksum":"4d7b15d53c0397d131376a19875aa97dd1c8b404c2c03bd2171f9b77e9592d40"},
+{"name":"nokogiri","version":"1.15.5","platform":"java","checksum":"5f87e71aaeb4f7479b94698737a0aacea77836b4805c7433b655e9565bd56cfe"},
+{"name":"nokogiri","version":"1.15.5","platform":"ruby","checksum":"22448ca35dbcbdcec60dbe25ccf452b685a5436c28f21b2fec2e20917aba9100"},
+{"name":"nokogiri","version":"1.15.5","platform":"x64-mingw-ucrt","checksum":"7612be800909ae51e0a7cfbe1f768757857a9ff0339686814ca67d9bae271ca2"},
+{"name":"nokogiri","version":"1.15.5","platform":"x64-mingw32","checksum":"28fd78d98e12005fe017db5ceccb74b2497f30582e6e26a3344200625fe46aae"},
+{"name":"nokogiri","version":"1.15.5","platform":"x86-linux","checksum":"0d1b564d7f148a6766380966bb48b23afa72c72c992c69c71d21acd4a7f5c0e4"},
+{"name":"nokogiri","version":"1.15.5","platform":"x86-mingw32","checksum":"d27dbf44c19b83e570e65b660a8a921441d1e8b6063ab1b985b516f78e0a2854"},
+{"name":"nokogiri","version":"1.15.5","platform":"x86_64-darwin","checksum":"10bafa54935f68aebd23235cb0fc7dfb8f6f5e52131379484771247eb3a0cc70"},
+{"name":"nokogiri","version":"1.15.5","platform":"x86_64-linux","checksum":"c5d9453cc155dc15f08ac699cc1293fd994ec6cfacec48e67653aa95ee946adf"},
{"name":"notiffany","version":"0.1.3","platform":"ruby","checksum":"d37669605b7f8dcb04e004e6373e2a780b98c776f8eb503ac9578557d7808738"},
{"name":"numerizer","version":"0.2.0","platform":"ruby","checksum":"e58076d5ee5370417b7e52d9cb25836d62acd1b8d9a194c308707986c1705d7b"},
{"name":"oauth","version":"0.5.6","platform":"ruby","checksum":"4085fe28e0c5e2434135e00a6555294fd2a4ff96a98d1bdecdcd619fc6368dff"},
@@ -453,7 +452,6 @@
{"name":"pg_query","version":"4.2.3","platform":"ruby","checksum":"1cc9955c7bce8e51e1abc11f1952e3d9d0f1cd4c16c58c56ec75d5aaf1cfd697"},
{"name":"plist","version":"3.7.0","platform":"ruby","checksum":"703ca90a7cb00e8263edd03da2266627f6741d280c910abbbac07c95ffb2f073"},
{"name":"png_quantizator","version":"0.2.1","platform":"ruby","checksum":"6023d4d064125c3a7e02929c95b7320ed6ac0d7341f9e8de0c9ea6576ef3106b"},
-{"name":"po_to_json","version":"2.0.0","platform":"ruby","checksum":"9e59b2904c015d2fcad3ec02022970ad0fb6622f6eb5ba82b47dff99d2fd6b2a"},
{"name":"premailer","version":"1.16.0","platform":"ruby","checksum":"03e4402c448e6bae13fb5f6301a8bde4f3508e1bff90ae7c0972c7be94694786"},
{"name":"premailer-rails","version":"1.10.3","platform":"ruby","checksum":"7cdcb97027866f7a81c490c6d15ada7f39666b5f6375f0821b7e97e0483b112f"},
{"name":"prime","version":"0.1.2","platform":"ruby","checksum":"d4e956cadfaf04de036dc7dc74f95bf6a285a62cc509b28b7a66b245d19fe3a4"},
@@ -500,16 +498,16 @@
{"name":"rbtrace","version":"0.4.14","platform":"ruby","checksum":"162bbf89cecabfc4f09c869b655f6f3a679c4870ebb7cbdcadf7393a81cc1769"},
{"name":"rbtree","version":"0.4.6","platform":"ruby","checksum":"14eea4469b24fd2472542e5f3eb105d6344c8ccf36f0b56d55fdcfeb4e0f10fc"},
{"name":"rchardet","version":"1.8.0","platform":"ruby","checksum":"693acd5253d5ade81a51940697955f6dd4bb2f0d245bda76a8e23deec70a52c7"},
-{"name":"re2","version":"2.3.0","platform":"aarch64-linux","checksum":"a5481148af570cac64196de1c2b87409e731181d8688885cf0e9633e1b19cccf"},
-{"name":"re2","version":"2.3.0","platform":"arm-linux","checksum":"93a973fa68ceee1ba34b12fe45131e3a3dde33b034b3b38f68dbcfac4da9ab9e"},
-{"name":"re2","version":"2.3.0","platform":"arm64-darwin","checksum":"bce955006e6efd9d6c45d98b00a7aa7af2d2465e983c1794e82eef0356fc7331"},
-{"name":"re2","version":"2.3.0","platform":"ruby","checksum":"15021a0e80f3b8934d6709c3ae410570c187625d46e24d4d8d472d5ef400a274"},
-{"name":"re2","version":"2.3.0","platform":"x64-mingw-ucrt","checksum":"b26623ed48eb9b5463658cd7fcac7a65fbe2be95731d5b6dcdf9c50dce4c3071"},
-{"name":"re2","version":"2.3.0","platform":"x64-mingw32","checksum":"95555a31d418ae54e77a35bf9cee248ba1633e4c076445ee3bbde31c692a9973"},
-{"name":"re2","version":"2.3.0","platform":"x86-linux","checksum":"2e693b321dada711e97f492172ad7dabb3ffa687758979ba08f2c68f170b1a55"},
-{"name":"re2","version":"2.3.0","platform":"x86-mingw32","checksum":"be81627fc0b2360ba14638b421d89f14410cd3c56924b9f6b5114170726b077d"},
-{"name":"re2","version":"2.3.0","platform":"x86_64-darwin","checksum":"b87a3920333363dc18fd898737a8e892ead62a81805fe829d9804e36d05f350b"},
-{"name":"re2","version":"2.3.0","platform":"x86_64-linux","checksum":"b0953007ffc5683c587db62fd5f2e4d332d8577b23d7ea611b5ea5c1f521337e"},
+{"name":"re2","version":"2.4.3","platform":"aarch64-linux","checksum":"c61f88ed98553b67b5dcf89fcce4394845b51697983b50b59c8cbff438b2f43d"},
+{"name":"re2","version":"2.4.3","platform":"arm-linux","checksum":"12a9f7044b8667bd0b95115576d811fa22d370203b31452212f69b397b10c1c1"},
+{"name":"re2","version":"2.4.3","platform":"arm64-darwin","checksum":"3ea5da85de0b7d8dd9a871bc939fd340c47e52925a2f7786602bb0e9b558d3b1"},
+{"name":"re2","version":"2.4.3","platform":"ruby","checksum":"4b38ed4b8b3b75dd4fb02d5966b44a3a0d9b9c97d6ef98d264da39dc1a0d702d"},
+{"name":"re2","version":"2.4.3","platform":"x64-mingw-ucrt","checksum":"12a4b345e013693d5bb974d6a975f3a192d0961394986a98063a317bfaf193ad"},
+{"name":"re2","version":"2.4.3","platform":"x64-mingw32","checksum":"e7fef971923684598f3cdf2efa694c54681ef07c2f332b2109f7f9249d672f0c"},
+{"name":"re2","version":"2.4.3","platform":"x86-linux","checksum":"7783d5f18781bf9f73b27d616d10660f2604b9c0f869fe86b702393eb070d49c"},
+{"name":"re2","version":"2.4.3","platform":"x86-mingw32","checksum":"15a3c849cea067c5d71915231541e00753c69234ac403fc497bb55ee3878591a"},
+{"name":"re2","version":"2.4.3","platform":"x86_64-darwin","checksum":"4e695cfe5bf6297dfd78ed02ddb4e5cff39ff045aa59d1dc59e203530b073576"},
+{"name":"re2","version":"2.4.3","platform":"x86_64-linux","checksum":"8ec7616e492881b7703cb07ed2890d7b77b0af553415bf79b19ce6ef5e5c5fed"},
{"name":"recaptcha","version":"5.12.3","platform":"ruby","checksum":"37d1894add9e70a54d0c6c7f0ecbeedffbfa7d075acfbd4c509818dfdebdb7ee"},
{"name":"recursive-open-struct","version":"1.1.3","platform":"ruby","checksum":"a3538a72552fcebcd0ada657bdff313641a4a5fbc482c08cfb9a65acb1c9de5a"},
{"name":"redcarpet","version":"3.6.0","platform":"ruby","checksum":"8ad1889c0355ff4c47174af14edd06d62f45a326da1da6e8a121d59bdcd2e9e9"},
diff --git a/Gemfile.lock b/Gemfile.lock
index 0db2203e1e7..de54e50601c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -291,7 +291,7 @@ GEM
aws-sdk-cloudformation (1.41.0)
aws-sdk-core (~> 3, >= 3.99.0)
aws-sigv4 (~> 1.1)
- aws-sdk-core (3.187.1)
+ aws-sdk-core (3.188.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
@@ -299,8 +299,8 @@ GEM
aws-sdk-kms (1.64.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.137.0)
- aws-sdk-core (~> 3, >= 3.181.0)
+ aws-sdk-s3 (1.139.0)
+ aws-sdk-core (~> 3, >= 3.188.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.6)
aws-sigv4 (1.6.0)
@@ -1014,7 +1014,7 @@ GEM
activesupport (>= 4)
railties (>= 4)
request_store (~> 1.0)
- loofah (2.21.4)
+ loofah (2.22.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
lookbook (2.0.1)
@@ -1095,7 +1095,7 @@ GEM
netrc (0.11.0)
nio4r (2.5.8)
no_proxy_fix (0.1.2)
- nokogiri (1.15.4)
+ nokogiri (1.15.5)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
notiffany (0.1.3)
@@ -1334,7 +1334,7 @@ GEM
optimist (>= 3.0.0)
rbtree (0.4.6)
rchardet (1.8.0)
- re2 (2.3.0)
+ re2 (2.4.3)
mini_portile2 (~> 2.8.5)
recaptcha (5.12.3)
json
@@ -1792,8 +1792,8 @@ DEPENDENCIES
autoprefixer-rails (= 10.2.5.1)
awesome_print
aws-sdk-cloudformation (~> 1)
- aws-sdk-core (~> 3.187.1)
- aws-sdk-s3 (~> 1.137.0)
+ aws-sdk-core (~> 3.188.0)
+ aws-sdk-s3 (~> 1.139.0)
axe-core-rspec
babosa (~> 2.0)
base32 (~> 0.3.0)
@@ -1944,7 +1944,7 @@ DEPENDENCIES
listen (~> 3.7)
lockbox (~> 1.3.0)
lograge (~> 0.5)
- loofah (~> 2.21.4)
+ loofah (~> 2.22.0)
lookbook (~> 2.0, >= 2.0.1)
lru_redux
mail (= 2.8.1)
@@ -1960,7 +1960,7 @@ DEPENDENCIES
net-ldap (~> 0.17.1)
net-ntp
net-protocol (~> 0.1.3)
- nokogiri (~> 1.15, >= 1.15.4)
+ nokogiri (~> 1.15, >= 1.15.5)
oauth2 (~> 2.0)
octokit (~> 6.0)
ohai (~> 18.1)
@@ -2012,7 +2012,7 @@ DEPENDENCIES
rails-i18n (~> 7.0)
rainbow (~> 3.0)
rbtrace (~> 0.4)
- re2 (= 2.3.0)
+ re2 (= 2.4.3)
recaptcha (~> 5.12)
redis (~> 4.8.0)
redis-actionpack (~> 5.3.0)
diff --git a/app/assets/javascripts/usage_quotas/storage/constants.js b/app/assets/javascripts/usage_quotas/storage/constants.js
index 3fdf61a5947..ac447fc96d1 100644
--- a/app/assets/javascripts/usage_quotas/storage/constants.js
+++ b/app/assets/javascripts/usage_quotas/storage/constants.js
@@ -31,6 +31,9 @@ export const PROJECT_TABLE_LABEL_STORAGE_TYPE = s__('UsageQuota|Storage type');
export const PROJECT_TABLE_LABEL_USAGE = s__('UsageQuota|Usage');
export const usageQuotasHelpPaths = {
+ repositorySizeLimit: helpPagePath('administration/settings/account_and_limit_settings', {
+ anchor: 'repository-size-limit',
+ }),
usageQuotas: helpPagePath('user/usage_quotas'),
usageQuotasProjectStorageLimit: helpPagePath('user/usage_quotas', {
anchor: 'project-storage-limit',
diff --git a/app/models/users/callout.rb b/app/models/users/callout.rb
index a9880e56e8c..924e130aab5 100644
--- a/app/models/users/callout.rb
+++ b/app/models/users/callout.rb
@@ -77,7 +77,8 @@ module Users
vsd_feedback_banner: 75, # EE-only
security_policy_protected_branch_modification: 76, # EE-only
vulnerability_report_grouping: 77, # EE-only
- new_nav_for_everyone_callout: 78
+ new_nav_for_everyone_callout: 78,
+ duo_chat_callout: 79 # EE-only
}
validates :feature_name,
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index 8d4f43ffdc7..af48bbd262f 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -48,7 +48,7 @@
.home-panel-description.text-break
.home-panel-description-markdown.read-more-container{ itemprop: 'description' }
= markdown_field(@project, :description)
- %button.btn.gl-button.btn-blank.btn-link.js-read-more-trigger.d-lg-none{ type: "button" }
+ = render Pajamas::ButtonComponent.new(category: :tertiary, variant: :link, button_options: { class: 'js-read-more-trigger gl-lg-display-none' }) do
= _("Read more")
= render_if_exists "projects/home_mirror"
diff --git a/app/workers/bulk_imports/finish_project_import_worker.rb b/app/workers/bulk_imports/finish_project_import_worker.rb
index 815101c89f3..18b8c016493 100644
--- a/app/workers/bulk_imports/finish_project_import_worker.rb
+++ b/app/workers/bulk_imports/finish_project_import_worker.rb
@@ -5,7 +5,7 @@ module BulkImports
include ApplicationWorker
feature_category :importers
- sidekiq_options retry: 5
+ sidekiq_options retry: 3
data_consistency :sticky
idempotent!
diff --git a/app/workers/bulk_imports/pipeline_batch_worker.rb b/app/workers/bulk_imports/pipeline_batch_worker.rb
index 957669d4a66..c24cc64e5c0 100644
--- a/app/workers/bulk_imports/pipeline_batch_worker.rb
+++ b/app/workers/bulk_imports/pipeline_batch_worker.rb
@@ -9,7 +9,7 @@ module BulkImports
data_consistency :always # rubocop:disable SidekiqLoadBalancing/WorkerDataConsistency
feature_category :importers
- sidekiq_options dead: false, retry: 3
+ sidekiq_options dead: false, retry: 6
worker_has_external_dependencies!
worker_resource_boundary :memory
idempotent!
diff --git a/app/workers/bulk_imports/pipeline_worker.rb b/app/workers/bulk_imports/pipeline_worker.rb
index ee12096b835..bd86970844b 100644
--- a/app/workers/bulk_imports/pipeline_worker.rb
+++ b/app/workers/bulk_imports/pipeline_worker.rb
@@ -11,7 +11,7 @@ module BulkImports
data_consistency :always
feature_category :importers
- sidekiq_options dead: false, retry: 3
+ sidekiq_options dead: false, retry: 6
worker_has_external_dependencies!
deduplicate :until_executing
worker_resource_boundary :memory
diff --git a/app/workers/bulk_imports/relation_batch_export_worker.rb b/app/workers/bulk_imports/relation_batch_export_worker.rb
index 87ceb775075..a9ffb2b252d 100644
--- a/app/workers/bulk_imports/relation_batch_export_worker.rb
+++ b/app/workers/bulk_imports/relation_batch_export_worker.rb
@@ -7,7 +7,7 @@ module BulkImports
idempotent!
data_consistency :always # rubocop:disable SidekiqLoadBalancing/WorkerDataConsistency
feature_category :importers
- sidekiq_options status_expiration: StuckExportJobsWorker::EXPORT_JOBS_EXPIRATION, retry: 3
+ sidekiq_options status_expiration: StuckExportJobsWorker::EXPORT_JOBS_EXPIRATION, retry: 6
sidekiq_retries_exhausted do |job, exception|
batch = BulkImports::ExportBatch.find(job['args'][1])
diff --git a/app/workers/bulk_imports/relation_export_worker.rb b/app/workers/bulk_imports/relation_export_worker.rb
index 168626fee85..90941e7583b 100644
--- a/app/workers/bulk_imports/relation_export_worker.rb
+++ b/app/workers/bulk_imports/relation_export_worker.rb
@@ -10,7 +10,7 @@ module BulkImports
loggable_arguments 2, 3
data_consistency :always
feature_category :importers
- sidekiq_options status_expiration: StuckExportJobsWorker::EXPORT_JOBS_EXPIRATION, retry: 3
+ sidekiq_options status_expiration: StuckExportJobsWorker::EXPORT_JOBS_EXPIRATION, retry: 6
worker_resource_boundary :memory
sidekiq_retries_exhausted do |job, exception|
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index 5002e9e24bf..6a6e961a222 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -1190,13 +1190,8 @@ production: &base
## Repositories settings
repositories:
- # Paths where repositories can be stored. Give the canonicalized absolute pathname.
- # IMPORTANT: None of the path components may be symlink, because
- # gitlab-shell invokes Dir.pwd inside the repository path and that results
- # real path not the symlink.
storages: # You must have at least a `default` storage path.
default:
- path: /home/git/repositories/
gitaly_address: unix:/home/git/gitlab/tmp/sockets/private/gitaly.socket # TCP connections are supported too (e.g. tcp://host:port). TLS connections are also supported using the system certificate pool (eg: tls://host:port).
# gitaly_token: 'special token' # Optional: override global gitaly.token for this storage.
diff --git a/doc/administration/gitaly/configure_gitaly.md b/doc/administration/gitaly/configure_gitaly.md
index 15ace9c4ed9..3c8f8553631 100644
--- a/doc/administration/gitaly/configure_gitaly.md
+++ b/doc/administration/gitaly/configure_gitaly.md
@@ -441,22 +441,14 @@ Configure Gitaly clients in one of two ways:
default:
gitaly_address: tcp://gitaly1.internal:8075
gitaly_token: AUTH_TOKEN_1
- path: /some/local/path
storage1:
gitaly_address: tcp://gitaly1.internal:8075
gitaly_token: AUTH_TOKEN_1
- path: /some/local/path
storage2:
gitaly_address: tcp://gitaly2.internal:8075
gitaly_token: AUTH_TOKEN_2
- path: /some/local/path
```
- NOTE:
- `/some/local/path` should be set to a local folder that exists, however no data is stored in
- this folder. This requirement is scheduled to be removed when
- [this issue](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
-
1. Save the file and [restart GitLab](../restart_gitlab.md#self-compiled-installations).
1. Run `sudo -u git -H bundle exec rake gitlab:gitaly:check RAILS_ENV=production` to confirm the
Gitaly client can connect to Gitaly servers.
@@ -694,20 +686,12 @@ Configure Gitaly with TLS in one of two ways:
storages:
default:
gitaly_address: tls://gitaly1.internal:9999
- path: /some/local/path
storage1:
gitaly_address: tls://gitaly1.internal:9999
- path: /some/local/path
storage2:
gitaly_address: tls://gitaly2.internal:9999
- path: /some/local/path
```
- NOTE:
- `/some/local/path` should be set to a local folder that exists, however no data is stored
- in this folder. This requirement is scheduled to be removed when
- [Gitaly issue #1282](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
-
1. Save the file and [restart GitLab](../restart_gitlab.md#self-compiled-installations).
1. On the Gitaly servers, create or edit `/etc/default/gitlab` and add:
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index 0297f295e6f..75515efa47f 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -843,14 +843,8 @@ For self-compiled installations:
storages:
default:
gitaly_address: tls://PRAEFECT_LOADBALANCER_HOST:3305
- path: /some/local/path
```
- NOTE:
- `/some/local/path` should be set to a local folder that exists, however no
- data is stored in this folder. This requirement is scheduled to be removed when
- [this issue](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
-
1. Save the file and [restart GitLab](../restart_gitlab.md#self-compiled-installations).
1. Copy all Praefect server certificates, or their certificate authority, to the system
trusted certificates on each Gitaly server so the Praefect server trusts the
@@ -980,14 +974,8 @@ with Praefect service discovery address, such as `praefect.service.consul`.
storages:
default:
gitaly_address: dns:PRAEFECT_SERVICE_DISCOVERY_ADDRESS:2305
- path: /some/local/path
```
- NOTE:
- `/some/local/path` should be set to a local folder that exists, however no
- data is stored in this folder. [Issue 375254](https://gitlab.com/gitlab-org/gitlab/-/issues/375254)
- proposes to remove this requirement.
-
1. Save the file and [restart GitLab](../restart_gitlab.md#self-compiled-installations).
::EndTabs
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 8b63d32e474..059a2b70ad0 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -19007,6 +19007,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="groupclusteragentshasremotedevelopmentagentconfig"></a>`hasRemoteDevelopmentAgentConfig` | [`Boolean`](#boolean) | Returns only cluster agents which have an associated remote development agent config. |
+| <a id="groupclusteragentshasremotedevelopmentenabled"></a>`hasRemoteDevelopmentEnabled` | [`Boolean`](#boolean) | Returns only cluster agents which have been enabled with the remote development feature. |
| <a id="groupclusteragentshasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. |
##### `Group.codeCoverageActivities`
@@ -20315,6 +20316,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="instancesecuritydashboardclusteragentshasremotedevelopmentagentconfig"></a>`hasRemoteDevelopmentAgentConfig` | [`Boolean`](#boolean) | Returns only cluster agents which have an associated remote development agent config. |
+| <a id="instancesecuritydashboardclusteragentshasremotedevelopmentenabled"></a>`hasRemoteDevelopmentEnabled` | [`Boolean`](#boolean) | Returns only cluster agents which have been enabled with the remote development feature. |
| <a id="instancesecuritydashboardclusteragentshasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. |
##### `InstanceSecurityDashboard.projects`
@@ -23892,6 +23894,7 @@ Returns [`ClusterAgent`](#clusteragent).
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="projectclusteragenthasremotedevelopmentagentconfig"></a>`hasRemoteDevelopmentAgentConfig` | [`Boolean`](#boolean) | Returns only cluster agents which have an associated remote development agent config. |
+| <a id="projectclusteragenthasremotedevelopmentenabled"></a>`hasRemoteDevelopmentEnabled` | [`Boolean`](#boolean) | Returns only cluster agents which have been enabled with the remote development feature. |
| <a id="projectclusteragenthasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. |
| <a id="projectclusteragentname"></a>`name` | [`String!`](#string) | Name of the cluster agent. |
@@ -23910,6 +23913,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="projectclusteragentshasremotedevelopmentagentconfig"></a>`hasRemoteDevelopmentAgentConfig` | [`Boolean`](#boolean) | Returns only cluster agents which have an associated remote development agent config. |
+| <a id="projectclusteragentshasremotedevelopmentenabled"></a>`hasRemoteDevelopmentEnabled` | [`Boolean`](#boolean) | Returns only cluster agents which have been enabled with the remote development feature. |
| <a id="projectclusteragentshasvulnerabilities"></a>`hasVulnerabilities` | [`Boolean`](#boolean) | Returns only cluster agents which have vulnerabilities. |
##### `Project.commitReferences`
@@ -30929,6 +30933,7 @@ Name of the feature that the callout is for.
| <a id="usercalloutfeaturenameenumci_deprecation_warning_for_types_keyword"></a>`CI_DEPRECATION_WARNING_FOR_TYPES_KEYWORD` | Callout feature name for ci_deprecation_warning_for_types_keyword. |
| <a id="usercalloutfeaturenameenumcloud_licensing_subscription_activation_banner"></a>`CLOUD_LICENSING_SUBSCRIPTION_ACTIVATION_BANNER` | Callout feature name for cloud_licensing_subscription_activation_banner. |
| <a id="usercalloutfeaturenameenumcluster_security_warning"></a>`CLUSTER_SECURITY_WARNING` | Callout feature name for cluster_security_warning. |
+| <a id="usercalloutfeaturenameenumduo_chat_callout"></a>`DUO_CHAT_CALLOUT` | Callout feature name for duo_chat_callout. |
| <a id="usercalloutfeaturenameenumeoa_bronze_plan_banner"></a>`EOA_BRONZE_PLAN_BANNER` | Callout feature name for eoa_bronze_plan_banner. |
| <a id="usercalloutfeaturenameenumfeature_flags_new_version"></a>`FEATURE_FLAGS_NEW_VERSION` | Callout feature name for feature_flags_new_version. |
| <a id="usercalloutfeaturenameenumgcp_signup_offer"></a>`GCP_SIGNUP_OFFER` | Callout feature name for gcp_signup_offer. |
diff --git a/doc/architecture/blueprints/ai_gateway/index.md b/doc/architecture/blueprints/ai_gateway/index.md
index 8c5a13d2e76..79387152978 100644
--- a/doc/architecture/blueprints/ai_gateway/index.md
+++ b/doc/architecture/blueprints/ai_gateway/index.md
@@ -77,19 +77,17 @@ secret redaction at this level of the stack as well as in GitLab-rails.
#### Protocol
-We're choosing to use a simple JSON API for the AI-gateway
-service. This allows us to re-use a lot of what is already in place in
-the current model-gateway. It also allows us to make the endpoints
-version agnostic. We could have an API that expects only a rudimentary
-envelope that can contain dynamic information. We should make sure
-that we make these APIs compatible with multiple versions of GitLab,
-or other clients that use the gateway through GitLab. **This means
-that all client versions talk to the same API endpoint, the AI-gateway
-needs to support this, but we don't need to support different
-endpoints per version**.
-
-We also considered gRPC as a the protocol for communication between
-GitLab instances, they differ on these items:
+The communication between the AI-Gateway service and its clients (including the GitLab Rails application) shall use a JSON-based API.
+
+The AI-Gateway API shall expose single-purpose endpoints responsible for providing access to different AI features. [A later section](#single-purpose-endpoints) of this document provides detailed guidelines for building specific endpoints.
+
+The AI Gateway communication protocol shall only expect a rudimentary envelope that wraps all feature-specific dynamic information. The proposed architecture of the protocol allows the API endpoints to be version agnostic, and the AI-Gateway APIs compatible with multiple versions of GitLab(or other clients that use the gateway through GitLab).
+
+ **This means
+that all clients regardless of their versions use the same set of AI-Gateway API feature endpoints. The AI-gateway feature endpoints have to support different client versions, instead of creating multiple feature endpoints per different supported client versions**.
+
+We also considered gRPC as a protocol for communication between
+GitLab instances, JSON API, and gRPC differ on these items:
| gRPC | REST + JSON |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|
@@ -138,37 +136,80 @@ one of the prompt payloads is no longer supported by the AI
gateway. It allows us to potentially avoid breaking features in older
GitLab installations as the AI landscape changes.
-#### Cross version compatibility
-
-When building single purpose endpoints, we should be mindful that
-these endpoints will be used by different GitLab instances indirectly
-by external clients. To achieve this, we have a very simple envelope
-to provide information. It has to have a series of `prompt_components`
-that contain information the AI-gateway can use to build prompts and
-query the model of it selects.
-
-Each prompt component contains 3 elements:
-
-- `type`: This is the kind of information that is being presented in
- `payload`. The AI-gateway should ignore any types it does not know
- about.
-- `payload`: The actual information that can be used by the AI-gateway
- to build the payload that is going to go out to AI providers. The
- payload will be different depending on the type, and the version of
- the client providing the payload. This means that the AI-gateway
- needs to consider all fields optional.
-- `metadata`: Information about the client that built this part of the
- prompt. This may, or may not be used by GitLab for
- telemetry. Nothing inside this field should be required.
-
-The only component in there that is likely to change often is the
+### The AI-Gateway API protocol
+
+It is important to build each single-purpose endpoint, in a version-agnostic way so it can be used by different GitLab instances (and indirectly by external clients). To achieve this goal:
+
+**The AI-Gateway protocol shall rely on a simple JSON envelope wrapping all feature-specific information.** The AI-Gateway protocol can be seen as a transport layer protocol from [the OSI model](https://en.wikipedia.org/wiki/OSI_model) (eg: TCP, UDP) which defines how to transport information between nodes, without being aware of what information is being transported.
+
+The AI-Gateway protocol does not specify which information received by single-purpose endpoint should be processed and in which way. Providing endpoint with the freedom to decide if they will use data coming from each protocol envelope or ignore it.
+
+The AI-Gateway protocol defines each request in the following way:
+
+1. Each single-purpose endpoint shall accept requests containing a single JSON object with a single key: `prompt_components`.
+1. The `prompt_components` key shall contain an array of JSON envelopes that are built according to the following rules:
+
+Each JSON envelope contains 3 elements:
+
+1. `type`: A string identifier specifying a type of information that is being presented in the envelopes
+ `payload`. The AI-gateway single-purpose endpoint may ignore any types it does not know about.
+1. `payload`: The actual information that can be used by the AI-Gateway single-purpose endpoint to send requests to 3rd party AI services providers. The data inside the `payload` element can differ depending on the `type`, and the version of
+ the client providing the `payload`. This means that the AI-Gateway
+ single-purpose endpoint must consider the structure and the type of data present inside the `payload` optional, and gracefully handle missing or malformed information.
+1. `metadata`: This field contains information about a client that built this `prompt_components` envelope. Information from the `metadata` field may, or may not be used by GitLab for
+ telemetry. The same as with the `payload` all fields inside the `metadata` shall be considered optional.
+
+The only envelope field that is expected to likely change often is the
`payload` one. There we need to make sure that all fields are
-optional, and avoid renaming, removing or repurposing fields.
+optional and avoid renaming, removing, or repurposing fields.
-When this is needed, we need to build support for the old versions of
-a field in the gateway, and keep them around for at least 2 major
-versions of GitLab. For example, we could consider adding 2 versions
-of a prompt to the `prompt_components` payload:
+To document and validate the content of `payload` we can specify their
+format using [JSON-schema](https://json-schema.org/).
+
+An example request according to the AI-Gateway component looks as follows:
+
+```json
+{
+ "prompt_components": [
+ {
+ "type": "prompt",
+ "metadata": {
+ "source": "GitLab EE",
+ "version": "16.7.0-pre",
+ },
+ "payload": {
+ "content": "...",
+ "params": {
+ "temperature": 0.2,
+ "maxOutputTokens": 1024
+ },
+ "model": "code-gecko",
+ "provider": "vertex-ai"
+ }
+ },
+ {
+ "type": "editor_content",
+ "metadata": {
+ "source": "vscode",
+ "version": "1.1.1"
+ },
+ "payload": {
+ "filename": "application.rb",
+ "before_cursor": "require 'active_record/railtie'",
+ "after_cursor": "\nrequire 'action_controller/railtie'",
+ "open_files": [
+ {
+ "filename": "app/controllers/application_controller.rb",
+ "content": "class ApplicationController < ActionController::Base..."
+ }
+ ]
+ }
+ }
+ ]
+}
+```
+
+Another example use case includes 2 versions of a prompt passed in the `prompt_components` payload. Where each version is tailored for different 3rd party AI model provider:
```json
{
@@ -177,7 +218,7 @@ of a prompt to the `prompt_components` payload:
"type": "prompt",
"metadata": {
"source": "GitLab EE",
- "version": "16.3",
+ "version": "16.7.0-pre",
},
"payload": {
"content": "You can fetch information about a resource called an issue...",
@@ -193,7 +234,7 @@ of a prompt to the `prompt_components` payload:
"type": "prompt",
"metadata": {
"source": "GitLab EE",
- "version": "16.3",
+ "version": "16.7.0-pre",
},
"payload": {
"content": "System: You can fetch information about a resource called an issue...\n\nHuman:",
@@ -209,11 +250,13 @@ of a prompt to the `prompt_components` payload:
}
```
-Allowing the API to direct the prompt to either provider, based on
-what is in the payload.
+#### Cross-version compatibility
-To document and validate the content of `payload` we can specify their
-format using [JSON-schema](https://json-schema.org/).
+**When renaming, removing, or repurposing fields inside `payload` is needed, a single-purpose endpoint that uses the affected envelope type must build support for the old versions of
+a field in the gateway, and keep them around for at least 2 major
+versions of GitLab.**
+
+A good practise that might help support backwards compatibility is to provide building blocks for the prompt inside the `prompt_components` rather then a complete prompt. By moving responsibility of compiling prompt out of building blocks on the AI-Gateway, one can achive more flexibility in terms of prompt adjustments in the future.
#### Example feature: Code Suggestions
@@ -230,7 +273,7 @@ POST /internal/code-suggestions/completions
"type": "prompt",
"metadata": {
"source": "GitLab EE",
- "version": "16.3",
+ "version": "16.7.0-pre",
},
"payload": {
"content": "...",
diff --git a/doc/development/documentation/metadata.md b/doc/development/documentation/metadata.md
new file mode 100644
index 00000000000..ab2f18fd221
--- /dev/null
+++ b/doc/development/documentation/metadata.md
@@ -0,0 +1,97 @@
+---
+info: For assistance with this Style Guide page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments-to-other-projects-and-subjects.
+stage: none
+group: unassigned
+---
+
+# Metadata
+
+Each documentation Markdown page contains YAML front matter.
+All values in the metadata are treated as strings and are used for the
+docs website only.
+
+## Stage and group metadata
+
+Each page should have metadata related to the stage and group it
+belongs to, as well as an information block. For example:
+
+```yaml
+---
+stage: Example Stage
+group: Example Group
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+```
+
+To populate the metadata, include this information:
+
+- `stage`: The [Stage](https://about.gitlab.com/handbook/product/categories/#devops-stages)
+ that the majority of the page's content belongs to.
+- `group`: The [Group](https://about.gitlab.com/company/team/structure/#product-groups)
+ that the majority of the page's content belongs to.
+- `info`: How to find the Technical Writer associated with the page's stage and
+ group.
+
+## Additional metadata
+
+The following metadata is optional and is not actively maintained.
+
+- `description`: A short description of what the page is about. See the Google [Best practices for creating quality meta descriptions](https://developers.google.com/search/docs/appearance/snippet#meta-descriptions) for writing tips. This content can be used in search result snippets and is shown in social media previews.
+- `feedback`: Set to `false` to not include the "Help & Feedback" footer.
+- `noindex`: Set to `false` to prevent the page from being indexed by search engines.
+- `redirect_to`: Used to control redirects. For more information, see [Redirects in GitLab documentation](redirects.md).
+- `searchbar`: Set to `false` to not include the search bar in the page header.
+- `toc`: Set to `false` to not include the "On this page" navigation.
+
+## Deprecated metadata
+
+The `type` metadata parameter is deprecated but still exists in documentation
+pages. You can remove the `type` metadata parameter and its values.
+
+## Batch updates for TW metadata
+
+The [`CODEOWNERS`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/CODEOWNERS)
+file contains a list of files and the associated technical writers.
+
+When a merge request contains documentation, the information in the `CODEOWNERS` file determines:
+
+- The list of users in the **Approvers** section.
+- The technical writer that the GitLab Bot pings for community contributions.
+
+You can use a Rake task to update the `CODEOWNERS` file.
+
+### Update the `CODEOWNERS` file
+
+When groups or [TW assignments](https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments)
+change, you must update the `CODEOWNERS` file:
+
+1. Update the [stage and group metadata](#stage-and-group-metadata) for any affected doc pages, if necessary. If there are many changes, you can do this step in a separate MR.
+1. Update the [`codeowners.rake`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/tasks/gitlab/tw/codeowners.rake) file with the changes.
+1. Go to the root of the `gitlab` repository.
+1. Run the Rake task with this command: `bundle exec rake tw:codeowners`
+1. Review the changes in the `CODEOWNERS` file.
+1. Add and commit all your changes and push your branch up to `origin`.
+1. Create a merge request and assign it to a technical writing manager for review.
+
+When you update the `codeowners.rake` file:
+
+- To specify multiple writers for a single group, use a space between writer names. Files are assigned to both writers.
+
+ ```ruby
+ CodeOwnerRule.new('Group Name', '@writer1 @writer2'),
+ ```
+
+ - To assign different writers within a group to docs in different directories, use the `path` parameter to specify a directory:
+
+ ```ruby
+ CodeOwnerRule.new('Group Name', ->(path) { path.start_with?('/doc/user') ? '@writer1' : '@writer2' }),
+ ```
+
+ In this example, `writer1` is a code owner for files related to this group that are in `/doc/user`.
+ For everything else, `writer2` is made code owner. For an example, see [MR 127903](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/127903).
+
+- For a group that does not have an assigned writer, include the group name in the file and comment out the line:
+
+ ```ruby
+ # CodeOwnerRule.new('Group Name', ''),
+ ```
diff --git a/doc/development/documentation/styleguide/index.md b/doc/development/documentation/styleguide/index.md
index f481979aa3e..0ae842e62ad 100644
--- a/doc/development/documentation/styleguide/index.md
+++ b/doc/development/documentation/styleguide/index.md
@@ -147,105 +147,47 @@ Use backticks for:
- Commands, parameters, and filenames.
- Values. For example: "In the **Name** text box, type `test`."
-## Metadata
-
-Each documentation Markdown page contains YAML front matter.
-All values in the metadata are treated as strings and are used for the
-docs website only.
-
-### Stage and group metadata
-
-Each page should have metadata related to the stage and group it
-belongs to, as well as an information block. For example:
-
-```yaml
----
-stage: Example Stage
-group: Example Group
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
----
-```
-
-To populate the metadata, include this information:
-
-- `stage`: The [Stage](https://about.gitlab.com/handbook/product/categories/#devops-stages)
- that the majority of the page's content belongs to.
-- `group`: The [Group](https://about.gitlab.com/company/team/structure/#product-groups)
- that the majority of the page's content belongs to.
-- `info`: How to find the Technical Writer associated with the page's stage and
- group.
-
-### Additional metadata
-
-The following metadata is optional and is not actively maintained.
-
-- `description`: A short description of what the page is about. See the Google [Best practices for creating quality meta descriptions](https://developers.google.com/search/docs/appearance/snippet#meta-descriptions) for writing tips. This content can be used in search result snippets and is shown in social media previews.
-- `feedback`: Set to `false` to not include the "Help & Feedback" footer.
-- `noindex`: Set to `false` to prevent the page from being indexed by search engines.
-- `redirect_to`: Used to control redirects. For more information, see [Redirects in GitLab documentation](../redirects.md).
-- `searchbar`: Set to `false` to not include the search bar in the page header.
-- `toc`: Set to `false` to not include the "On this page" navigation.
-
-### Deprecated metadata
-
-The `type` metadata parameter is deprecated but still exists in documentation
-pages. You can remove the `type` metadata parameter and its values.
-
-### Batch updates for TW metadata
-
-The [`CODEOWNERS`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/CODEOWNERS)
-file contains a list of files and the associated technical writers.
-
-When a merge request contains documentation, the information in the `CODEOWNERS` file determines:
+## Language
-- The list of users in the **Approvers** section.
-- The technical writer that the GitLab Bot pings for community contributions.
+GitLab documentation should be clear and easy to understand.
-You can use a Rake task to update the `CODEOWNERS` file.
+- Avoid unnecessary words.
+- Be clear, concise, and stick to the goal of the topic.
+- Write in US English with US grammar. (Tested in [`British.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/British.yml).)
-#### Update the `CODEOWNERS` file
+### Active voice
-When groups or [TW assignments](https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments)
-change, you must update the `CODEOWNERS` file:
+In most cases, text is easier to understand and to translate if you use active voice instead of passive.
-1. Update the [stage and group metadata](#stage-and-group-metadata) for any affected doc pages, if necessary. If there are many changes, you can do this step in a separate MR.
-1. Update the [`codeowners.rake`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/tasks/gitlab/tw/codeowners.rake) file with the changes.
-1. Go to the root of the `gitlab` repository.
-1. Run the Rake task with this command: `bundle exec rake tw:codeowners`
-1. Review the changes in the `CODEOWNERS` file.
-1. Add and commit all your changes and push your branch up to `origin`.
-1. Create a merge request and assign it to a technical writing manager for review.
+For example, use:
-When you update the `codeowners.rake` file:
+- The developer writes code for the application.
-- To specify multiple writers for a single group, use a space between writer names. Files are assigned to both writers.
+Instead of:
- ```ruby
- CodeOwnerRule.new('Group Name', '@writer1 @writer2'),
- ```
+- Application code is written by the developer.
- - To assign different writers within a group to docs in different directories, use the `path` parameter to specify a directory:
+Sometimes, using `GitLab` as the subject can be awkward. For example, `GitLab exports the report`.
+In this case, you can use passive voice instead. For example, `The report is exported`.
- ```ruby
- CodeOwnerRule.new('Group Name', ->(path) { path.start_with?('/doc/user') ? '@writer1' : '@writer2' }),
- ```
+### Customer perspective
- In this example, `writer1` is a code owner for files related to this group that are in `/doc/user`.
- For everything else, `writer2` is made code owner. For an example, see [MR 127903](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/127903).
+Focus on the functionality and benefits that GitLab brings to customer,
+rather than what GitLab has created.
-- For a group that does not have an assigned writer, include the group name in the file and comment out the line:
+For example, use:
- ```ruby
- # CodeOwnerRule.new('Group Name', ''),
- ```
+- Use merge requests to compare code in the source and target branches.
-## Language
+Instead of:
-GitLab documentation should be clear and easy to understand.
+- GitLab allows you to compare code.
+- GitLab created the ability to let you compare code.
+- Merge requests let you compare code.
-- Avoid unnecessary words.
-- Be clear, concise, and stick to the goal of the topic.
-- Write in US English with US grammar. (Tested in [`British.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/British.yml).)
+Words that indicate you are not writing from a customer perspective are
+[allow and enable](word_list.md#allow-enable). Try instead to use
+[you](word_list.md#you-your-yours) and to speak directly to the user.
### Capitalization
diff --git a/doc/development/documentation/styleguide/word_list.md b/doc/development/documentation/styleguide/word_list.md
index 0159ae7e06e..ec7c3dc270c 100644
--- a/doc/development/documentation/styleguide/word_list.md
+++ b/doc/development/documentation/styleguide/word_list.md
@@ -77,23 +77,6 @@ When you create a user, you choose an access level: **Regular**, **Auditor**, or
Capitalize these words when you refer to the UI. Otherwise use lowercase.
-## active voice
-
-Use active voice instead of passive.
-
-Use:
-
-- The contributor writes the documentation.
-
-Instead of:
-
-- The documentation is written by contributors.
-
-NOTE:
-If you can add the phrase "by zombies" to the phrase,
-the construction is passive. For example, `The button is selected by zombies`
-is passive. `Zombies select the button` is active.
-
## Admin Area
Use title case for **Admin Area**.
diff --git a/doc/development/testing_guide/end_to_end/best_practices.md b/doc/development/testing_guide/end_to_end/best_practices.md
index 598e0a612b5..71d607f6f05 100644
--- a/doc/development/testing_guide/end_to_end/best_practices.md
+++ b/doc/development/testing_guide/end_to_end/best_practices.md
@@ -128,7 +128,7 @@ end
1. Every `describe`, `context`, and `it` blocks should have a short description attached
1. Keep descriptions as concise as possible.
1. Long descriptions or multiple conditionals could be a sign it should be split up (additional `context` blocks).
- 1. The [Documentation Style Guide](../../documentation/styleguide/index.md) gives recommendations on how to write concisely and with [active voice](../../documentation/styleguide/word_list.md#active-voice).
+ 1. The [Documentation Style Guide](../../documentation/styleguide/index.md) gives recommendations on how to write concisely and with [active voice](../../documentation/styleguide/index.md#active-voice).
1. The outermost `Rspec.describe` block should be [the DevOps stage name](https://about.gitlab.com/handbook/product/categories/#devops-stages)
1. Inside the `Rspec.describe` block is a `describe` block with the name of the feature being tested
1. Optional `context` blocks define what the conditions being tested are
diff --git a/doc/gitlab-basics/start-using-git.md b/doc/gitlab-basics/start-using-git.md
index c46b89f7620..588c9125485 100644
--- a/doc/gitlab-basics/start-using-git.md
+++ b/doc/gitlab-basics/start-using-git.md
@@ -140,6 +140,7 @@ You can also
Clone with HTTPS when you want to authenticate each time you perform an operation
between your computer and GitLab.
+[OAuth credential helpers](../user/profile/account/two_factor_authentication.md#oauth-credential-helpers) can decrease the number of times you must manually authenticate, making HTTPS a seamless experience.
1. On the left sidebar, select **Search or go to** and find the project you want to clone.
1. On the right-hand side of the page, select **Clone**, then copy the URL for **Clone with HTTPS**.
diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb
index 73d329930a5..7ad1d9a60e6 100644
--- a/lib/gitlab/ci/config.rb
+++ b/lib/gitlab/ci/config.rb
@@ -19,13 +19,14 @@ module Gitlab
Config::Yaml::Tags::TagError
].freeze
- attr_reader :root, :context, :source_ref_path, :source, :logger
+ attr_reader :root, :context, :source_ref_path, :source, :logger, :inject_edge_stages
# rubocop: disable Metrics/ParameterLists
- def initialize(config, project: nil, pipeline: nil, sha: nil, user: nil, parent_pipeline: nil, source: nil, pipeline_config: nil, logger: nil)
+ def initialize(config, project: nil, pipeline: nil, sha: nil, user: nil, parent_pipeline: nil, source: nil, pipeline_config: nil, logger: nil, inject_edge_stages: true)
@logger = logger || ::Gitlab::Ci::Pipeline::Logger.new(project: project)
@source_ref_path = pipeline&.source_ref_path
@project = project
+ @inject_edge_stages = inject_edge_stages
@context = self.logger.instrument(:config_build_context, once: true) do
pipeline ||= ::Ci::Pipeline.new(project: project, sha: sha, user: user, source: source)
@@ -145,6 +146,8 @@ module Gitlab
Config::Yaml::Tags::Resolver.new(initial_config).to_hash
end
+ return initial_config unless inject_edge_stages
+
logger.instrument(:config_stages_inject, once: true) do
Config::EdgeStagesInjector.new(initial_config).to_hash
end
diff --git a/lib/gitlab/gitaly_client/storage_settings.rb b/lib/gitlab/gitaly_client/storage_settings.rb
index adf0c811274..253d7c4a93e 100644
--- a/lib/gitlab/gitaly_client/storage_settings.rb
+++ b/lib/gitlab/gitaly_client/storage_settings.rb
@@ -12,7 +12,7 @@ module Gitlab
InvalidConfigurationError = Class.new(StandardError)
INVALID_STORAGE_MESSAGE = <<~MSG
- Storage is invalid because it has no `path` key.
+ Storage is invalid because it has no `gitaly_address` key.
For source installations, update your config/gitlab.yml Refer to gitlab.yml.example for an updated example.
If you're using the GitLab Development Kit, you can update your configuration running `gdk reconfigure`.
@@ -38,13 +38,15 @@ module Gitlab
def initialize(storage)
raise InvalidConfigurationError, "expected a Hash, got a #{storage.class.name}" unless storage.is_a?(Hash)
- raise InvalidConfigurationError, INVALID_STORAGE_MESSAGE unless storage.has_key?('path')
+
+ @hash = ActiveSupport::HashWithIndifferentAccess.new(storage)
+
+ raise InvalidConfigurationError, INVALID_STORAGE_MESSAGE unless @hash.has_key?('gitaly_address')
# Support a nil 'path' field because some of the circuit breaker tests use it.
- @legacy_disk_path = File.expand_path(storage['path'], Rails.root) if storage['path']
+ @legacy_disk_path = File.expand_path(@hash['path'], Rails.root) if @hash['path'] && @hash['path'] != Deprecated
- storage['path'] = Deprecated
- @hash = ActiveSupport::HashWithIndifferentAccess.new(storage)
+ @hash['path'] = Deprecated
end
def gitaly_address
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index ba2130713b3..b499abf7623 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -6687,6 +6687,9 @@ msgstr ""
msgid "AsanaService|User Personal Access Token. User must have access to the task. All comments are attributed to this user."
msgstr ""
+msgid "Ask GitLab Duo"
+msgstr ""
+
msgid "Ask a maintainer to check the import status for more details."
msgstr ""
@@ -47698,14 +47701,23 @@ msgstr ""
msgid "TanukiBot|Give feedback"
msgstr ""
+msgid "TanukiBot|How to use GitLab"
+msgstr ""
+
msgid "TanukiBot|Source"
msgid_plural "TanukiBot|Sources"
msgstr[0] ""
msgstr[1] ""
+msgid "TanukiBot|The issue, epic, or code you're viewing"
+msgstr ""
+
msgid "TanukiBot|There was an error communicating with GitLab Duo Chat. Please try again later."
msgstr ""
+msgid "TanukiBot|Use AI to answer questions about things like:"
+msgstr ""
+
msgid "TanukiBot|What is a fork?"
msgstr ""
@@ -51963,7 +51975,7 @@ msgstr ""
msgid "UsageQuota|Product analytics"
msgstr ""
-msgid "UsageQuota|Projects under this namespace have %{planLimit} of storage."
+msgid "UsageQuota|Projects under this namespace have %{planLimit} of storage limit applied to repository and LFS objects."
msgstr ""
msgid "UsageQuota|Purchased storage"
@@ -58028,6 +58040,9 @@ msgstr ""
msgid "must have a valid format and be greater than or equal to zero."
msgstr ""
+msgid "must have the 'enabled' flag set to true"
+msgstr ""
+
msgid "must match %{association}.project_id"
msgstr ""
diff --git a/qa/Gemfile b/qa/Gemfile
index 289c16533c1..ea5425c1f1b 100644
--- a/qa/Gemfile
+++ b/qa/Gemfile
@@ -11,19 +11,19 @@ gem 'capybara', '~> 3.39.2'
gem 'capybara-screenshot', '~> 1.0.26'
gem 'rake', '~> 13', '>= 13.1.0'
gem 'rspec', '~> 3.12'
-gem 'selenium-webdriver', '= 4.14.0'
+gem 'selenium-webdriver', '= 4.15.0'
gem 'airborne', '~> 0.3.7', require: false # airborne is messing with rspec sandboxed mode so not requiring by default
gem 'rest-client', '~> 2.1.0'
gem 'rspec-retry', '~> 0.6.2', require: 'rspec/retry'
gem 'rspec_junit_formatter', '~> 0.6.0'
-gem 'faker', '~> 3.2'
+gem 'faker', '~> 3.2', '>= 3.2.2'
gem 'knapsack', '~> 4.0'
gem 'parallel_tests', '~> 4.2', '>= 4.2.1'
gem 'rotp', '~> 6.3.0'
gem 'parallel', '~> 1.23'
gem 'rainbow', '~> 3.1.1'
gem 'rspec-parameterized', '~> 1.0.0'
-gem 'octokit', '~> 7.2.0'
+gem 'octokit', '~> 8.0.0'
gem "faraday-retry", "~> 2.2"
gem 'zeitwerk', '~> 2.6', '>= 2.6.8'
gem 'influxdb-client', '~> 2.9'
diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock
index ea59d41703a..a0181217426 100644
--- a/qa/Gemfile.lock
+++ b/qa/Gemfile.lock
@@ -85,7 +85,7 @@ GEM
excon (0.92.4)
factory_bot (6.3.0)
activesupport (>= 5.0.0)
- faker (3.2.0)
+ faker (3.2.2)
i18n (>= 1.8.11, < 2)
faraday (2.5.2)
faraday-net_http (>= 2.0, < 3.1)
@@ -221,7 +221,7 @@ GEM
nokogiri (1.15.4)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
- octokit (7.2.0)
+ octokit (8.0.0)
faraday (>= 1, < 3)
sawyer (~> 0.9)
oj (3.13.23)
@@ -306,7 +306,7 @@ GEM
sawyer (0.9.2)
addressable (>= 2.3.5)
faraday (>= 0.17.3, < 3)
- selenium-webdriver (4.14.0)
+ selenium-webdriver (4.15.0)
rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0)
@@ -361,7 +361,7 @@ DEPENDENCIES
confiner (~> 0.4)
deprecation_toolkit (~> 2.0.3)
factory_bot (~> 6.3.0)
- faker (~> 3.2)
+ faker (~> 3.2, >= 3.2.2)
faraday-retry (~> 2.2)
fog-core (= 2.1.0)
fog-google (~> 1.19)
@@ -371,7 +371,7 @@ DEPENDENCIES
influxdb-client (~> 2.9)
knapsack (~> 4.0)
nokogiri (~> 1.15, >= 1.15.4)
- octokit (~> 7.2.0)
+ octokit (~> 8.0.0)
parallel (~> 1.23)
parallel_tests (~> 4.2, >= 4.2.1)
pry-byebug (~> 3.10.1)
@@ -384,7 +384,7 @@ DEPENDENCIES
rspec-retry (~> 0.6.2)
rspec_junit_formatter (~> 0.6.0)
ruby-debug-ide (~> 0.7.3)
- selenium-webdriver (= 4.14.0)
+ selenium-webdriver (= 4.15.0)
slack-notifier (~> 2.4)
terminal-table (~> 3.0.2)
warning (~> 1.3)
diff --git a/spec/initializers/6_validations_spec.rb b/spec/initializers/6_validations_spec.rb
index 4d317a7583e..6422dccc6d5 100644
--- a/spec/initializers/6_validations_spec.rb
+++ b/spec/initializers/6_validations_spec.rb
@@ -7,10 +7,10 @@ RSpec.describe '6_validations' do
describe 'validate_storages_config' do
context 'with correct settings' do
before do
- mock_storages(
- 'storage' => Gitlab::GitalyClient::StorageSettings.new('path' => 'tmp/tests/paths/a/b/c'),
- 'storage.with_VALID-chars01' => Gitlab::GitalyClient::StorageSettings.new('path' => 'tmp/tests/paths/a/b/d'),
- 'gitaly.c.gitlab-prd-164c.internal' => Gitlab::GitalyClient::StorageSettings.new('path' => 'tmp/tests/paths/a/b/e')
+ stub_storage_settings(
+ 'storage' => {},
+ 'storage.with_VALID-chars01' => {},
+ 'gitaly.c.gitlab-prd-164c.internal' => {}
)
end
@@ -21,7 +21,7 @@ RSpec.describe '6_validations' do
context 'with invalid storage names' do
before do
- mock_storages('name with spaces' => Gitlab::GitalyClient::StorageSettings.new('path' => 'tmp/tests/paths/a/b/c'))
+ stub_storage_settings('name with spaces' => {})
end
it 'throws an error' do
@@ -29,8 +29,4 @@ RSpec.describe '6_validations' do
end
end
end
-
- def mock_storages(storages)
- allow(Gitlab.config.repositories).to receive(:storages).and_return(storages)
- end
end
diff --git a/spec/lib/backup/repositories_spec.rb b/spec/lib/backup/repositories_spec.rb
index 139c178afde..024f6c5db96 100644
--- a/spec/lib/backup/repositories_spec.rb
+++ b/spec/lib/backup/repositories_spec.rb
@@ -90,10 +90,7 @@ RSpec.describe Backup::Repositories, feature_category: :backup_restore do
let_it_be(:project) { create(:project_with_design, :repository) }
before do
- stub_storage_settings('test_second_storage' => {
- 'gitaly_address' => Gitlab.config.repositories.storages.default.gitaly_address,
- 'path' => TestEnv::SECOND_STORAGE_PATH
- })
+ stub_storage_settings('test_second_storage' => {})
end
it 'calls enqueue for all repositories on the specified storage', :aggregate_failures do
@@ -253,10 +250,7 @@ RSpec.describe Backup::Repositories, feature_category: :backup_restore do
let(:storages) { %w[default] }
before do
- stub_storage_settings('test_second_storage' => {
- 'gitaly_address' => Gitlab.config.repositories.storages.default.gitaly_address,
- 'path' => TestEnv::SECOND_STORAGE_PATH
- })
+ stub_storage_settings('test_second_storage' => {})
end
it 'calls enqueue for all repositories on the specified storage', :aggregate_failures do
diff --git a/spec/lib/gitlab/ci/config_spec.rb b/spec/lib/gitlab/ci/config_spec.rb
index fdf152b3584..76be65d91c4 100644
--- a/spec/lib/gitlab/ci/config_spec.rb
+++ b/spec/lib/gitlab/ci/config_spec.rb
@@ -43,6 +43,34 @@ RSpec.describe Gitlab::Ci::Config, feature_category: :pipeline_composition do
expect(config.to_hash).to eq hash
end
+ context 'when yml has stages' do
+ let(:yml) do
+ <<-EOS
+ image: image:1.0
+ stages:
+ - custom_stage
+ rspec:
+ script:
+ - gem install rspec
+ - rspec
+ EOS
+ end
+
+ specify do
+ expect(config.to_hash[:stages]).to eq(['.pre', 'custom_stage', '.post'])
+ end
+
+ context 'with inject_edge_stages option disabled' do
+ let(:config) do
+ described_class.new(yml, project: nil, pipeline: nil, sha: nil, user: nil, inject_edge_stages: false)
+ end
+
+ specify do
+ expect(config.to_hash[:stages]).to contain_exactly('custom_stage')
+ end
+ end
+ end
+
describe '#valid?' do
it 'is valid' do
expect(config).to be_valid
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index 5791d9c524f..169e9e231d8 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -2670,10 +2670,7 @@ RSpec.describe Gitlab::Git::Repository, feature_category: :source_code_managemen
subject { new_repository.replicate(repository) }
before do
- stub_storage_settings('test_second_storage' => {
- 'gitaly_address' => Gitlab.config.repositories.storages.default.gitaly_address,
- 'path' => TestEnv::SECOND_STORAGE_PATH
- })
+ stub_storage_settings('test_second_storage' => {})
end
after do
diff --git a/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb b/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb
index 7252f7d6afb..6ea9dfde09d 100644
--- a/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/storage_settings_spec.rb
@@ -4,11 +4,11 @@ require 'spec_helper'
RSpec.describe Gitlab::GitalyClient::StorageSettings, feature_category: :gitaly do
describe "#initialize" do
- context 'when the storage contains no path' do
+ context 'when the storage contains no gitaly_address' do
it 'raises an error' do
expect do
described_class.new("foo" => {})
- end.to raise_error(described_class::InvalidConfigurationError)
+ end.to raise_error(described_class::InvalidConfigurationError, described_class::INVALID_STORAGE_MESSAGE)
end
end
@@ -23,21 +23,13 @@ RSpec.describe Gitlab::GitalyClient::StorageSettings, feature_category: :gitaly
context 'when the storage is valid' do
it 'raises no error' do
expect do
- described_class.new("path" => Rails.root)
+ described_class.new("gitaly_address" => "unix:tmp/tests/gitaly/gitaly.socket")
end.not_to raise_error
end
end
end
describe '.gitaly_address' do
- context 'when the storage settings have no gitaly address but one is requested' do
- it 'raises an error' do
- expect do
- described_class.new("path" => Rails.root).gitaly_address
- end.to raise_error("key not found: \"gitaly_address\"")
- end
- end
-
context 'when the storage settings have a gitaly address and one is requested' do
it 'returns the setting value' do
expect(described_class.new("path" => Rails.root, "gitaly_address" => "test").gitaly_address).to eq("test")
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 5b4ca9a117a..64ed8811e00 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -6946,12 +6946,7 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
let(:repository_storage) { shard_to.name }
before do
- stub_storage_settings(
- 'test_second_storage' => {
- 'gitaly_address' => Gitlab.config.repositories.storages.default.gitaly_address,
- 'path' => TestEnv::SECOND_STORAGE_PATH
- }
- )
+ stub_storage_settings('test_second_storage' => {})
project.update!(pool_repository: project_pool, repository_storage: repository_storage)
end
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index ff94526117b..905e919dd44 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -3649,12 +3649,8 @@ RSpec.describe Repository, feature_category: :source_code_management do
describe '.pick_storage_shard', :request_store do
before do
- storages = {
- 'default' => Gitlab::GitalyClient::StorageSettings.new('path' => 'tmp/tests/repositories'),
- 'picked' => Gitlab::GitalyClient::StorageSettings.new('path' => 'tmp/tests/repositories')
- }
+ stub_storage_settings('picked' => {})
- allow(Gitlab.config.repositories).to receive(:storages).and_return(storages)
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
Gitlab::CurrentSettings.current_application_settings
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index e9319d514aa..1ed185ad5a8 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -4465,7 +4465,7 @@ RSpec.describe API::Projects, :aggregate_failures, feature_category: :groups_and
end
it 'returns 200 when repository storage has changed' do
- stub_storage_settings('test_second_storage' => { 'path' => TestEnv::SECOND_STORAGE_PATH })
+ stub_storage_settings('test_second_storage' => {})
expect do
Sidekiq::Testing.fake! do
diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb
index ceb060445ad..e6418c7b4ea 100644
--- a/spec/services/projects/fork_service_spec.rb
+++ b/spec/services/projects/fork_service_spec.rb
@@ -387,7 +387,7 @@ RSpec.describe Projects::ForkService, feature_category: :source_code_management
# Stub everything required to move a project to a Gitaly shard that does not exist
allow(Gitlab::GitalyClient).to receive(:filesystem_id).with('default').and_call_original
allow(Gitlab::GitalyClient).to receive(:filesystem_id).with('test_second_storage').and_return(SecureRandom.uuid)
- stub_storage_settings('test_second_storage' => { 'path' => TestEnv::SECOND_STORAGE_PATH })
+ stub_storage_settings('test_second_storage' => {})
allow_any_instance_of(Gitlab::Git::Repository).to receive(:create_repository)
.and_return(true)
allow_any_instance_of(Gitlab::Git::Repository).to receive(:replicate)
diff --git a/spec/services/projects/update_repository_storage_service_spec.rb b/spec/services/projects/update_repository_storage_service_spec.rb
index cc54748bbb8..95aba9040c1 100644
--- a/spec/services/projects/update_repository_storage_service_spec.rb
+++ b/spec/services/projects/update_repository_storage_service_spec.rb
@@ -13,12 +13,7 @@ RSpec.describe Projects::UpdateRepositoryStorageService, feature_category: :sour
before do
allow(Time).to receive(:now).and_return(time)
- stub_storage_settings(
- 'test_second_storage' => {
- 'gitaly_address' => Gitlab.config.repositories.storages.default.gitaly_address,
- 'path' => TestEnv::SECOND_STORAGE_PATH
- }
- )
+ stub_storage_settings('test_second_storage' => {})
end
context 'without wiki and design repository' do
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
index c8c903ef7f8..c393125de3f 100644
--- a/spec/services/projects/update_service_spec.rb
+++ b/spec/services/projects/update_service_spec.rb
@@ -791,7 +791,7 @@ RSpec.describe Projects::UpdateService, feature_category: :groups_and_projects d
let(:opts) { { repository_storage: 'test_second_storage' } }
before do
- stub_storage_settings('test_second_storage' => { 'path' => 'tmp/tests/extra_storage' })
+ stub_storage_settings('test_second_storage' => {})
end
shared_examples 'the transfer was not scheduled' do
diff --git a/spec/support/helpers/stub_configuration.rb b/spec/support/helpers/stub_configuration.rb
index 562805cec3d..e043d1249b9 100644
--- a/spec/support/helpers/stub_configuration.rb
+++ b/spec/support/helpers/stub_configuration.rb
@@ -93,10 +93,11 @@ module StubConfiguration
messages.deep_stringify_keys!
# Default storage is always required
- messages['default'] ||= Gitlab.config.repositories.storages.default
+ messages['default'] ||= Gitlab.config.repositories.storages[GitalySetup::REPOS_STORAGE]
messages.each do |storage_name, storage_hash|
- if !storage_hash.key?('path') || storage_hash['path'] == Gitlab::GitalyClient::StorageSettings::Deprecated
- storage_hash['path'] = Gitlab::GitalyClient::StorageSettings.allow_disk_access { TestEnv.repos_path }
+ # Default additional storages to connect to the default storage
+ unless storage_hash.key?('gitaly_address')
+ storage_hash['gitaly_address'] = Gitlab.config.repositories.storages[GitalySetup::REPOS_STORAGE].gitaly_address
end
messages[storage_name] = Gitlab::GitalyClient::StorageSettings.new(storage_hash.to_h)
diff --git a/spec/support/shared_examples/models/concerns/repository_storage_movable_shared_examples.rb b/spec/support/shared_examples/models/concerns/repository_storage_movable_shared_examples.rb
index d8a8d1e1cea..993c94e2695 100644
--- a/spec/support/shared_examples/models/concerns/repository_storage_movable_shared_examples.rb
+++ b/spec/support/shared_examples/models/concerns/repository_storage_movable_shared_examples.rb
@@ -68,7 +68,7 @@ RSpec.shared_examples 'handles repository moves' do
describe 'state transitions' do
before do
- stub_storage_settings('test_second_storage' => { 'path' => 'tmp/tests/extra_storage' })
+ stub_storage_settings('test_second_storage' => {})
end
context 'when in the default state' do
diff --git a/spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb b/spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb
index 181bab41e09..f400c5fa201 100644
--- a/spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb
@@ -90,7 +90,7 @@ RSpec.shared_examples 'repository_storage_moves API' do |container_type|
end
before do
- stub_storage_settings('test_second_storage' => { 'path' => 'tmp/tests/extra_storage' })
+ stub_storage_settings('test_second_storage' => {})
end
it 'schedules a container repository storage move' do
@@ -203,7 +203,7 @@ RSpec.shared_examples 'repository_storage_moves API' do |container_type|
end
before do
- stub_storage_settings('test_second_storage' => { 'path' => 'tmp/tests/extra_storage' })
+ stub_storage_settings('test_second_storage' => {})
end
it 'schedules the worker' do
diff --git a/spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb b/spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb
index acf15730180..6fd5b0b169c 100644
--- a/spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb
+++ b/spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb
@@ -5,7 +5,7 @@ RSpec.shared_examples 'moves repository shard in bulk' do
let(:destination_storage_name) { 'test_second_storage' }
before do
- stub_storage_settings(destination_storage_name => { 'path' => 'tmp/tests/extra_storage' })
+ stub_storage_settings(destination_storage_name => {})
end
describe '#execute' do
diff --git a/spec/support/shared_examples/workers/schedule_bulk_repository_shard_moves_shared_examples.rb b/spec/support/shared_examples/workers/schedule_bulk_repository_shard_moves_shared_examples.rb
index 6707f65eb69..4b73c1720bc 100644
--- a/spec/support/shared_examples/workers/schedule_bulk_repository_shard_moves_shared_examples.rb
+++ b/spec/support/shared_examples/workers/schedule_bulk_repository_shard_moves_shared_examples.rb
@@ -6,7 +6,7 @@ RSpec.shared_examples 'schedules bulk repository shard moves' do
describe "#perform" do
before do
- stub_storage_settings(destination_storage_name => { 'path' => 'tmp/tests/extra_storage' })
+ stub_storage_settings(destination_storage_name => {})
allow(worker_klass).to receive(:perform_async)
end
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb
index 75be7b97a67..4f27ba57bcb 100644
--- a/spec/tasks/gitlab/backup_rake_spec.rb
+++ b/spec/tasks/gitlab/backup_rake_spec.rb
@@ -453,10 +453,7 @@ RSpec.describe 'gitlab:backup namespace rake tasks', :delete, feature_category:
before do
# We only need a backup of the repositories for this test
stub_env('SKIP', 'db,uploads,builds,artifacts,lfs,terraform_state,registry')
- stub_storage_settings(second_storage_name => {
- 'gitaly_address' => Gitlab.config.repositories.storages.default.gitaly_address,
- 'path' => TestEnv::SECOND_STORAGE_PATH
- })
+ stub_storage_settings(second_storage_name => {})
end
shared_examples 'includes repositories in all repository storages' do
diff --git a/spec/workers/every_sidekiq_worker_spec.rb b/spec/workers/every_sidekiq_worker_spec.rb
index de8115aacc2..eac91608c54 100644
--- a/spec/workers/every_sidekiq_worker_spec.rb
+++ b/spec/workers/every_sidekiq_worker_spec.rb
@@ -141,9 +141,9 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'BulkImportWorker' => 3,
'BulkImports::ExportRequestWorker' => 5,
'BulkImports::EntityWorker' => 3,
- 'BulkImports::PipelineWorker' => 3,
- 'BulkImports::PipelineBatchWorker' => 3,
- 'BulkImports::FinishProjectImportWorker' => 5,
+ 'BulkImports::PipelineWorker' => 6,
+ 'BulkImports::PipelineBatchWorker' => 6,
+ 'BulkImports::FinishProjectImportWorker' => 3,
'BulkImports::TransformReferencesWorker' => 3,
'Chaos::CpuSpinWorker' => 3,
'Chaos::DbSpinWorker' => 3,
@@ -484,8 +484,8 @@ RSpec.describe 'Every Sidekiq worker', feature_category: :shared do
'ComplianceManagement::MergeRequests::ComplianceViolationsWorker' => 3,
'Zoekt::IndexerWorker' => 2,
'Issuable::RelatedLinksCreateWorker' => 3,
- 'BulkImports::RelationBatchExportWorker' => 3,
- 'BulkImports::RelationExportWorker' => 3
+ 'BulkImports::RelationBatchExportWorker' => 6,
+ 'BulkImports::RelationExportWorker' => 6
}.merge(extra_retry_exceptions)
end