diff options
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 @@ -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 |