Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
58d8928b52
commit
23ac82a9db
10
Gemfile
10
Gemfile
|
|
@ -1,9 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
def next?
|
||||
File.basename(__FILE__) == "Gemfile.next"
|
||||
end
|
||||
|
||||
source 'https://rubygems.org'
|
||||
|
||||
if ENV.fetch('BUNDLER_CHECKSUM_VERIFICATION_OPT_IN', 'false') != 'false' # this verification is still experimental
|
||||
|
|
@ -29,11 +25,7 @@ gem 'bundler-checksum', '~> 0.1.0', path: 'vendor/gems/bundler-checksum', requir
|
|||
#
|
||||
# See https://docs.gitlab.com/ee/development/gemfile.html#upgrade-rails for guidelines when upgrading Rails
|
||||
|
||||
if next?
|
||||
gem 'rails', '~> 7.1.5.1', feature_category: :shared
|
||||
else
|
||||
gem 'rails', '~> 7.0.8.7', feature_category: :shared
|
||||
end
|
||||
gem 'rails', '~> 7.1.5.1', feature_category: :shared
|
||||
|
||||
gem 'activerecord-gitlab', path: 'gems/activerecord-gitlab', feature_category: :shared
|
||||
# This can be dropped after upgrading to Rails 7.2: https://github.com/rails/rails/pull/49674
|
||||
|
|
|
|||
|
|
@ -2,18 +2,18 @@
|
|||
{"name":"CFPropertyList","version":"3.0.7","platform":"ruby","checksum":"c45721614aca8d5eb6fa216f2ec28ec38de1a94505e9766a20e98745492c3c4c"},
|
||||
{"name":"RedCloth","version":"4.3.4","platform":"ruby","checksum":"5231b2fdd91a933915cba330e5fd1a74025e77b56f57b7404c7191ebf2812297"},
|
||||
{"name":"acme-client","version":"2.0.21","platform":"ruby","checksum":"e0a044f993cd26f0ba7f8b13a3b2b007ef864cfaa333075a2d8865b087297641"},
|
||||
{"name":"actioncable","version":"7.0.8.7","platform":"ruby","checksum":"4034513841df2fd09dbbf38f37c1a00fc6c841122a8714e5d6916b8d6ce2f162"},
|
||||
{"name":"actionmailbox","version":"7.0.8.7","platform":"ruby","checksum":"940eeaa3d8e85dcd9fc6069e39571e13c5a4bdb0db52c7ab96d14da81d6ac1c2"},
|
||||
{"name":"actionmailer","version":"7.0.8.7","platform":"ruby","checksum":"8be8f9a2f8774af89822bc92e1ab6df10b3a2be59c75486a34e86a1f10d88d14"},
|
||||
{"name":"actionpack","version":"7.0.8.7","platform":"ruby","checksum":"40e6b1d687904a4fd2285d1fa3aad3d9a9d9ba8fd8858dd0faa9f4673c3f5e2c"},
|
||||
{"name":"actiontext","version":"7.0.8.7","platform":"ruby","checksum":"cb75d2db97d5b2c8caccdc0f643541df36c2c53f076a2d49b226f971d8d528a0"},
|
||||
{"name":"actionview","version":"7.0.8.7","platform":"ruby","checksum":"be975bc9c61903fe5da80a97c345271159033bcbba63988c7f27b6b8b98f7fed"},
|
||||
{"name":"activejob","version":"7.0.8.7","platform":"ruby","checksum":"eff4db3aeaee34863a47570089d11d5577ed0ea42b1475dc9be6a413be182a20"},
|
||||
{"name":"activemodel","version":"7.0.8.7","platform":"ruby","checksum":"f13b04bb055c1e85b965ce40b0a2e671b8d97835083597bc7fbc04cde0f40a83"},
|
||||
{"name":"activerecord","version":"7.0.8.7","platform":"ruby","checksum":"f94fc8510e58a18e462c5ee8862c9be75e2bfad0688e8d022b86a6e05df2a45a"},
|
||||
{"name":"actioncable","version":"7.1.5.1","platform":"ruby","checksum":"764637b5b2d97b94e412d562c177bfd16b0fd769d55c98846362f5263e8aaa0d"},
|
||||
{"name":"actionmailbox","version":"7.1.5.1","platform":"ruby","checksum":"c3c20589fe43e6fa88bba2d76a6f9805ffdd02531f4a9a4af8197d59f5a5360a"},
|
||||
{"name":"actionmailer","version":"7.1.5.1","platform":"ruby","checksum":"b213d6d880b23b093ccfef3b4f87a3d27e4666442f71b5b634b2d19e19a49759"},
|
||||
{"name":"actionpack","version":"7.1.5.1","platform":"ruby","checksum":"2bc263d9f43f16cc3b3360f59659ab11f140577602f371f1a968e2672b38d718"},
|
||||
{"name":"actiontext","version":"7.1.5.1","platform":"ruby","checksum":"b8e261cfad5bc6a78b3f15be5e7c7f32190041b3dc6f027a3a353b4392d2f7ec"},
|
||||
{"name":"actionview","version":"7.1.5.1","platform":"ruby","checksum":"8c559a213501798e29b50b5341a643a70bbf6fa0aa2abaf571d0efc59dc4f6aa"},
|
||||
{"name":"activejob","version":"7.1.5.1","platform":"ruby","checksum":"7633376c857f4c491d06b5a7f5d86d9f07afc595398354a3f1abe80eb7e35767"},
|
||||
{"name":"activemodel","version":"7.1.5.1","platform":"ruby","checksum":"74727466854a7fbdfe8f2702ca3112b23877500d4926bf7e02e921ad542191f1"},
|
||||
{"name":"activerecord","version":"7.1.5.1","platform":"ruby","checksum":"f40ad1609bf33b9ba5bdc4e16d80a77b1517153234ceb413d31d635d7b91f1e3"},
|
||||
{"name":"activerecord-explain-analyze","version":"0.1.0","platform":"ruby","checksum":"5debb11fe23f35b91953a80677d80ba9284ee737fd9d148c1d7603ce45217f7b"},
|
||||
{"name":"activestorage","version":"7.0.8.7","platform":"ruby","checksum":"ca411e73733a50983f44b0945bfd0612313beb3a8f914cd3a88e4fcd99399ef5"},
|
||||
{"name":"activesupport","version":"7.0.8.7","platform":"ruby","checksum":"df4702375de924aae81709c831605317c5417f0bd9e502a0373ff84a067204ff"},
|
||||
{"name":"activestorage","version":"7.1.5.1","platform":"ruby","checksum":"ae6b8b076858c666eaad6f896d786b67654235e861e24a83f61f1cc97b43ff63"},
|
||||
{"name":"activesupport","version":"7.1.5.1","platform":"ruby","checksum":"9f0c482e473b9868cb3dfe3e9db549a3bd2302c02e4f595a5caac144a8c7cfb8"},
|
||||
{"name":"addressable","version":"2.8.7","platform":"ruby","checksum":"462986537cf3735ab5f3c0f557f14155d778f4b43ea4f485a9deb9c8f7c58232"},
|
||||
{"name":"aes_key_wrap","version":"1.1.0","platform":"ruby","checksum":"b935f4756b37375895db45669e79dfcdc0f7901e12d4e08974d5540c8e0776a5"},
|
||||
{"name":"akismet","version":"3.0.0","platform":"ruby","checksum":"74991b8e3d3257eeea996b47069abb8da2006c84a144255123e8dffd1c86b230"},
|
||||
|
|
@ -50,7 +50,7 @@
|
|||
{"name":"batch-loader","version":"2.0.5","platform":"ruby","checksum":"964bf638b8f498bab40abaafc6f89c057b2e02aa25b64fc1ec12872ad6bff213"},
|
||||
{"name":"bcrypt","version":"3.1.20","platform":"java","checksum":"8236dff31f6f36cffe334939e4ea59c41e1c94e2e246c01783575fa6df40373f"},
|
||||
{"name":"bcrypt","version":"3.1.20","platform":"ruby","checksum":"8410f8c7b3ed54a3c00cd2456bf13917d695117f033218e2483b2e40b0784099"},
|
||||
{"name":"benchmark","version":"0.2.0","platform":"ruby","checksum":"5f7087b794613abdd3ac9c13f4351f65b164bcb15ced2ad29508e365f9b28c77"},
|
||||
{"name":"benchmark","version":"0.4.0","platform":"ruby","checksum":"0f12f8c495545e3710c3e4f0480f63f06b4c842cc94cec7f33a956f5180e874a"},
|
||||
{"name":"benchmark-ips","version":"2.14.0","platform":"ruby","checksum":"b72bc8a65d525d5906f8cd94270dccf73452ee3257a32b89fbd6684d3e8a9b1d"},
|
||||
{"name":"benchmark-malloc","version":"0.2.0","platform":"ruby","checksum":"37c68f0435261634026f584d79956a35325a3027e3e6b4cc8d7575aa10537e6b"},
|
||||
{"name":"benchmark-memory","version":"0.2.0","platform":"ruby","checksum":"ca1e436433b09535ee8f64f80600a5edb407cff1f6ac70e089ca238118e6ab5c"},
|
||||
|
|
@ -337,8 +337,11 @@
|
|||
{"name":"imagen","version":"0.2.0","platform":"ruby","checksum":"369fe912078877dba92615ebfc6f35a7d833e31f24f47bdd3ad5371a4139e24b"},
|
||||
{"name":"influxdb-client","version":"3.2.0","platform":"ruby","checksum":"dc1e8ec80542f64c9f31af6d9bfa4c147474bf32b9179a7f0cab970793b8e1f2"},
|
||||
{"name":"invisible_captcha","version":"2.1.0","platform":"ruby","checksum":"02b452f3eb1b691d155ba3e8e97e1be0e6b6be62e8bc94957234b9cde0852b1e"},
|
||||
{"name":"io-console","version":"0.8.0","platform":"java","checksum":"3cc6fd5c66e587145c1fdf8dc40c2e3d851e90722a5d0cc3f38da352f06fe1bd"},
|
||||
{"name":"io-console","version":"0.8.0","platform":"ruby","checksum":"cd6a9facbc69871d69b2cb8b926fc6ea7ef06f06e505e81a64f14a470fddefa2"},
|
||||
{"name":"io-event","version":"1.9.0","platform":"ruby","checksum":"4c262b6610ad643a2be75e892135aca4fa67edc67d1944c0ae6b6e5dd73f4fc1"},
|
||||
{"name":"ipaddress","version":"0.8.3","platform":"ruby","checksum":"85640c4f9194c26937afc8c78e3074a8e7c97d5d1210358d1440f01034d006f5"},
|
||||
{"name":"irb","version":"1.15.1","platform":"ruby","checksum":"d9bca745ac4207a8b728a52b98b766ca909b86ff1a504bcde3d6f8c84faae890"},
|
||||
{"name":"jaeger-client","version":"1.1.0","platform":"ruby","checksum":"cb5e9b9bbee6ee8d6a82d03d947a5b04543d8c0a949c22e484254f18d8a458a8"},
|
||||
{"name":"jaro_winkler","version":"1.6.0","platform":"java","checksum":"6cbb36eb4c2649834124d8b92957e577890e8157dd41be8252fde5b02b63b42b"},
|
||||
{"name":"jaro_winkler","version":"1.6.0","platform":"ruby","checksum":"8b081ab4ba7da5d16b438e62c4be58b87724bfeeb1527e62603f05ab0a2cc424"},
|
||||
|
|
@ -518,10 +521,12 @@
|
|||
{"name":"pg_query","version":"6.1.0","platform":"ruby","checksum":"8b005229e209f12c5887c34c60d0eb2a241953b9475b53a9840d24578532481e"},
|
||||
{"name":"plist","version":"3.7.0","platform":"ruby","checksum":"703ca90a7cb00e8263edd03da2266627f6741d280c910abbbac07c95ffb2f073"},
|
||||
{"name":"png_quantizator","version":"0.2.1","platform":"ruby","checksum":"6023d4d064125c3a7e02929c95b7320ed6ac0d7341f9e8de0c9ea6576ef3106b"},
|
||||
{"name":"pp","version":"0.6.2","platform":"ruby","checksum":"947ec3120c6f92195f8ee8aa25a7b2c5297bb106d83b41baa02983686577b6ff"},
|
||||
{"name":"prawn","version":"2.5.0","platform":"ruby","checksum":"f4e20e3b4f30bf5b9ae37dad15eb421831594553aa930b2391b0fa0a99c43cb6"},
|
||||
{"name":"prawn-svg","version":"0.37.0","platform":"ruby","checksum":"271bdd032c066777b2e76fe971b570e24cb6f4890d5658588106e8aa5b6e2830"},
|
||||
{"name":"premailer","version":"1.23.0","platform":"ruby","checksum":"f0d7f6ba299559c96ddf982aa5263f85e5617c86437c8d8ffff120813b2d7efb"},
|
||||
{"name":"premailer-rails","version":"1.12.0","platform":"ruby","checksum":"c13815d161b9bc7f7d3d81396b0bb0a61a90fa9bd89931548bf4e537c7710400"},
|
||||
{"name":"prettyprint","version":"0.2.0","platform":"ruby","checksum":"2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193"},
|
||||
{"name":"prime","version":"0.1.3","platform":"ruby","checksum":"baf031c50d6ce923594913befc8ac86a3251bffb9d6a5e8b03687962054e53e3"},
|
||||
{"name":"prism","version":"1.2.0","platform":"ruby","checksum":"24ff9cd3232346e68052659f14c9a618022ea98935f774df465206aba5c06d2f"},
|
||||
{"name":"proc_to_ast","version":"0.1.0","platform":"ruby","checksum":"92a73fa66e2250a83f8589f818b0751bcf227c68f85916202df7af85082f8691"},
|
||||
|
|
@ -537,6 +542,8 @@
|
|||
{"name":"pry-byebug","version":"3.10.1","platform":"ruby","checksum":"c8f975c32255bfdb29e151f5532130be64ff3d0042dc858d0907e849125581f8"},
|
||||
{"name":"pry-rails","version":"0.3.11","platform":"ruby","checksum":"a69e28e24a34d75d1f60bcf241192a54253f8f7ef8a62cba1e75750a9653593d"},
|
||||
{"name":"pry-shell","version":"0.6.4","platform":"ruby","checksum":"ad024882d29912b071a7de65ebea538b242d2dc1498c60c7c2352ef94769f208"},
|
||||
{"name":"psych","version":"5.2.3","platform":"java","checksum":"3e5425b9e8a2f41cc2707d5ef14fdc1ae908abbafb12fe45727bd63900056585"},
|
||||
{"name":"psych","version":"5.2.3","platform":"ruby","checksum":"84a54bb952d14604fea22d99938348814678782f58b12648fcdfa4d2fce859ee"},
|
||||
{"name":"public_suffix","version":"6.0.1","platform":"ruby","checksum":"61d44e1cab5cbbbe5b31068481cf16976dd0dc1b6b07bd95617ef8c5e3e00c6f"},
|
||||
{"name":"puma","version":"6.5.0","platform":"java","checksum":"a58eea585d291aa33796add9884208bc1591da5d8e61886f8ac74d080b298c40"},
|
||||
{"name":"puma","version":"6.5.0","platform":"ruby","checksum":"94d1b75cab7f356d52e4f1b17b9040a090889b341dbeee6ee3703f441dc189f2"},
|
||||
|
|
@ -554,12 +561,13 @@
|
|||
{"name":"rack-session","version":"1.0.2","platform":"ruby","checksum":"a02115e5420b4de036839b9811e3f7967d73446a554b42aa45106af335851d76"},
|
||||
{"name":"rack-test","version":"2.1.0","platform":"ruby","checksum":"0c61fc61904049d691922ea4bb99e28004ed3f43aa5cfd495024cc345f125dfb"},
|
||||
{"name":"rack-timeout","version":"0.7.0","platform":"ruby","checksum":"757337e9793cca999bb73a61fe2a7d4280aa9eefbaf787ce3b98d860749c87d9"},
|
||||
{"name":"rails","version":"7.0.8.7","platform":"ruby","checksum":"5e67ed4dd915746349bfb8c7ae2f531d3a36eb68fbe2f60ede02a0500715cded"},
|
||||
{"name":"rackup","version":"1.0.1","platform":"ruby","checksum":"ba86604a28989fe1043bff20d819b360944ca08156406812dca6742b24b3c249"},
|
||||
{"name":"rails","version":"7.1.5.1","platform":"ruby","checksum":"05aea2ed7b6392b41ce0fc11455de118455025a431b6ea334a7ac2b101608804"},
|
||||
{"name":"rails-controller-testing","version":"1.0.5","platform":"ruby","checksum":"741448db59366073e86fc965ba403f881c636b79a2c39a48d0486f2607182e94"},
|
||||
{"name":"rails-dom-testing","version":"2.0.3","platform":"ruby","checksum":"b140c4f39f6e609c8113137b9a60dfc2ecb89864e496f87f23a68b3b8f12d8d1"},
|
||||
{"name":"rails-dom-testing","version":"2.2.0","platform":"ruby","checksum":"e515712e48df1f687a1d7c380fd7b07b8558faa26464474da64183a7426fa93b"},
|
||||
{"name":"rails-html-sanitizer","version":"1.6.1","platform":"ruby","checksum":"e3d2fb10339f03b802e39c7f6cac28c54fd404d3f65ae39c31cca9d150c5cbf0"},
|
||||
{"name":"rails-i18n","version":"7.0.10","platform":"ruby","checksum":"efae16e0ac28c0f42e98555c8db1327d69ab02058c8b535e0933cb106dd931ca"},
|
||||
{"name":"railties","version":"7.0.8.7","platform":"ruby","checksum":"1ab985280b02bc4b176d36e1011148db600b763c646e3de88c02a665d864505f"},
|
||||
{"name":"railties","version":"7.1.5.1","platform":"ruby","checksum":"0be15562e2ded4efdc1b6c30f884b6d838c9ba49573dde042334b752b043e2fb"},
|
||||
{"name":"rainbow","version":"3.1.1","platform":"ruby","checksum":"039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a"},
|
||||
{"name":"rake","version":"13.0.6","platform":"ruby","checksum":"5ce4bf5037b4196c24ac62834d8db1ce175470391026bd9e557d669beeb19097"},
|
||||
{"name":"rake-compiler-dock","version":"1.9.1","platform":"ruby","checksum":"e73720a29aba9c114728ce39cc0d8eef69ba61d88e7978c57bac171724cd4d53"},
|
||||
|
|
@ -569,6 +577,7 @@
|
|||
{"name":"rbs","version":"3.6.1","platform":"ruby","checksum":"ed7273d018556844583d1785ac54194e67eec594d68e317d57fa90ad035532c0"},
|
||||
{"name":"rbtrace","version":"0.5.1","platform":"ruby","checksum":"e8cba64d462bfb8ba102d7be2ecaacc789247d52ac587d8003549d909cb9c5dc"},
|
||||
{"name":"rchardet","version":"1.8.0","platform":"ruby","checksum":"693acd5253d5ade81a51940697955f6dd4bb2f0d245bda76a8e23deec70a52c7"},
|
||||
{"name":"rdoc","version":"6.13.0","platform":"ruby","checksum":"32c2139ae43ed91b7c43032fe5423d21d57718829cc5a11e5c9710d2aa5e0329"},
|
||||
{"name":"re2","version":"2.15.0","platform":"aarch64-linux-gnu","checksum":"ed3fe87adbc637373268d2a1b69f07def5079535dd961db735fdfac8fa63520f"},
|
||||
{"name":"re2","version":"2.15.0","platform":"aarch64-linux-musl","checksum":"edf696d3a4587f580828e99cf36b7e04a86e0ebe103f704955b310a3f61e69de"},
|
||||
{"name":"re2","version":"2.15.0","platform":"arm-linux-gnu","checksum":"dbe53c65859a868b42297939daeb610806ae6b1181ff09d1c454e1cdf86ebbc0"},
|
||||
|
|
@ -597,6 +606,7 @@
|
|||
{"name":"regexp_parser","version":"2.10.0","platform":"ruby","checksum":"cb6f0ddde88772cd64bff1dbbf68df66d376043fe2e66a9ef77fcb1b0c548c61"},
|
||||
{"name":"regexp_property_values","version":"1.0.0","platform":"java","checksum":"5e26782b01241616855c4ee7bb8a62fce9387e484f2d3eaf04f2a0633708222e"},
|
||||
{"name":"regexp_property_values","version":"1.0.0","platform":"ruby","checksum":"162499dc0bba1e66d334273a059f207a61981cc8cc69d2ca743594e7886d080f"},
|
||||
{"name":"reline","version":"0.6.0","platform":"ruby","checksum":"57620375dcbe56ec09bac7192bfb7460c716bbf0054dc94345ecaa5438e539d2"},
|
||||
{"name":"representable","version":"3.2.0","platform":"ruby","checksum":"cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace"},
|
||||
{"name":"request_store","version":"1.7.0","platform":"ruby","checksum":"e1b75d5346a315f452242a68c937ef8e48b215b9453a77a6c0acdca2934c88cb"},
|
||||
{"name":"responders","version":"3.0.1","platform":"ruby","checksum":"613fe28e498987f4feaa3230aa6313ca4bd5f0563a3da83511b0dd6cd8f47292"},
|
||||
|
|
@ -679,6 +689,7 @@
|
|||
{"name":"sass-embedded","version":"1.77.5","platform":"x86_64-linux-musl","checksum":"c5dd43155112f7b4eb9e3cafb8ceaa54a157977a2033b1022875bac71a4a4d56"},
|
||||
{"name":"sawyer","version":"0.9.2","platform":"ruby","checksum":"fa3a72d62a4525517b18857ddb78926aab3424de0129be6772a8e2ba240e7aca"},
|
||||
{"name":"sd_notify","version":"0.1.1","platform":"ruby","checksum":"cbc7ac6caa7cedd26b30a72b5eeb6f36050dc0752df263452ea24fb5a4ad3131"},
|
||||
{"name":"securerandom","version":"0.4.1","platform":"ruby","checksum":"cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1"},
|
||||
{"name":"seed-fu","version":"2.3.9","platform":"ruby","checksum":"6d902d12dc1b88a16d487506baacc93b3a92e3671fdd603110d1600d35fbf478"},
|
||||
{"name":"selenium-webdriver","version":"4.27.0","platform":"ruby","checksum":"8821f4ad60b935cfcdc5954c0a6642d894e936250aece8bf37a6fcbebe5eb6e0"},
|
||||
{"name":"semver_dialects","version":"3.6.0","platform":"ruby","checksum":"bb8a78037c6c748114267d0e00f0a19e2701a3837c00cc37336e8224bc8473a3"},
|
||||
|
|
@ -718,6 +729,8 @@
|
|||
{"name":"state_machines-activemodel","version":"0.8.0","platform":"ruby","checksum":"e932dab190d4be044fb5f9cab01a3ea0b092c5f113d4676c6c0a0d49bf738d2c"},
|
||||
{"name":"state_machines-activerecord","version":"0.8.0","platform":"ruby","checksum":"072fb701b8ab03de0608297f6c55dc34ed096e556fa8f77e556f3c461c71aab6"},
|
||||
{"name":"state_machines-rspec","version":"0.6.0","platform":"ruby","checksum":"2ba57a45df57d0c97f79146e2e0f65f519b52e65e182805ef79cb73b1fe5c0bd"},
|
||||
{"name":"stringio","version":"3.1.7","platform":"java","checksum":"167bdd3d60a002ee94bc289cc3259638aaadc36a47b3086a44a694b5dc72a499"},
|
||||
{"name":"stringio","version":"3.1.7","platform":"ruby","checksum":"5b78b7cb242a315fb4fca61a8255d62ec438f58da2b90be66048546ade4507fa"},
|
||||
{"name":"strings","version":"0.2.1","platform":"ruby","checksum":"933293b3c95cf85b81eb44b3cf673e3087661ba739bbadfeadf442083158d6fb"},
|
||||
{"name":"strings-ansi","version":"0.2.0","platform":"ruby","checksum":"90262d760ea4a94cc2ae8d58205277a343409c288cbe7c29416b1826bd511c88"},
|
||||
{"name":"swd","version":"2.0.3","platform":"ruby","checksum":"4cdbe2a4246c19f093fce22e967ec3ebdd4657d37673672e621bf0c7eb770655"},
|
||||
|
|
|
|||
170
Gemfile.lock
170
Gemfile.lock
|
|
@ -235,73 +235,85 @@ GEM
|
|||
base64 (~> 0.2.0)
|
||||
faraday (>= 1.0, < 3.0.0)
|
||||
faraday-retry (>= 1.0, < 3.0.0)
|
||||
actioncable (7.0.8.7)
|
||||
actionpack (= 7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
actioncable (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
nio4r (~> 2.0)
|
||||
websocket-driver (>= 0.6.1)
|
||||
actionmailbox (7.0.8.7)
|
||||
actionpack (= 7.0.8.7)
|
||||
activejob (= 7.0.8.7)
|
||||
activerecord (= 7.0.8.7)
|
||||
activestorage (= 7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
zeitwerk (~> 2.6)
|
||||
actionmailbox (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
activejob (= 7.1.5.1)
|
||||
activerecord (= 7.1.5.1)
|
||||
activestorage (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
mail (>= 2.7.1)
|
||||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
actionmailer (7.0.8.7)
|
||||
actionpack (= 7.0.8.7)
|
||||
actionview (= 7.0.8.7)
|
||||
activejob (= 7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
actionmailer (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
actionview (= 7.1.5.1)
|
||||
activejob (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (7.0.8.7)
|
||||
actionview (= 7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
rack (~> 2.0, >= 2.2.4)
|
||||
rails-dom-testing (~> 2.2)
|
||||
actionpack (7.1.5.1)
|
||||
actionview (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
nokogiri (>= 1.8.5)
|
||||
racc
|
||||
rack (>= 2.2.4)
|
||||
rack-session (>= 1.0.1)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||
actiontext (7.0.8.7)
|
||||
actionpack (= 7.0.8.7)
|
||||
activerecord (= 7.0.8.7)
|
||||
activestorage (= 7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
rails-dom-testing (~> 2.2)
|
||||
rails-html-sanitizer (~> 1.6)
|
||||
actiontext (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
activerecord (= 7.1.5.1)
|
||||
activestorage (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
globalid (>= 0.6.0)
|
||||
nokogiri (>= 1.8.5)
|
||||
actionview (7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
actionview (7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||
activejob (7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
erubi (~> 1.11)
|
||||
rails-dom-testing (~> 2.2)
|
||||
rails-html-sanitizer (~> 1.6)
|
||||
activejob (7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
activerecord (7.0.8.7)
|
||||
activemodel (= 7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
activemodel (7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
activerecord (7.1.5.1)
|
||||
activemodel (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
timeout (>= 0.4.0)
|
||||
activerecord-explain-analyze (0.1.0)
|
||||
activerecord (>= 4)
|
||||
pg
|
||||
activestorage (7.0.8.7)
|
||||
actionpack (= 7.0.8.7)
|
||||
activejob (= 7.0.8.7)
|
||||
activerecord (= 7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
activestorage (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
activejob (= 7.1.5.1)
|
||||
activerecord (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
marcel (~> 1.0)
|
||||
mini_mime (>= 1.1.0)
|
||||
activesupport (7.0.8.7)
|
||||
activesupport (7.1.5.1)
|
||||
base64
|
||||
benchmark (>= 0.3)
|
||||
bigdecimal
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
connection_pool (>= 2.2.5)
|
||||
drb
|
||||
i18n (>= 1.6, < 2)
|
||||
logger (>= 1.4.2)
|
||||
minitest (>= 5.1)
|
||||
mutex_m
|
||||
securerandom (>= 0.3)
|
||||
tzinfo (~> 2.0)
|
||||
addressable (2.8.7)
|
||||
public_suffix (>= 2.0.2, < 7.0)
|
||||
|
|
@ -379,7 +391,7 @@ GEM
|
|||
base64 (0.2.0)
|
||||
batch-loader (2.0.5)
|
||||
bcrypt (3.1.20)
|
||||
benchmark (0.2.0)
|
||||
benchmark (0.4.0)
|
||||
benchmark-ips (2.14.0)
|
||||
benchmark-malloc (0.2.0)
|
||||
benchmark-memory (0.2.0)
|
||||
|
|
@ -1033,8 +1045,13 @@ GEM
|
|||
csv
|
||||
invisible_captcha (2.1.0)
|
||||
rails (>= 5.2)
|
||||
io-console (0.8.0)
|
||||
io-event (1.9.0)
|
||||
ipaddress (0.8.3)
|
||||
irb (1.15.1)
|
||||
pp (>= 0.6.0)
|
||||
rdoc (>= 4.0.0)
|
||||
reline (>= 0.4.2)
|
||||
jaeger-client (1.1.0)
|
||||
opentracing (~> 0.3)
|
||||
thrift
|
||||
|
|
@ -1453,6 +1470,8 @@ GEM
|
|||
google-protobuf (>= 3.25.3)
|
||||
plist (3.7.0)
|
||||
png_quantizator (0.2.1)
|
||||
pp (0.6.2)
|
||||
prettyprint
|
||||
prawn (2.5.0)
|
||||
matrix (~> 0.4)
|
||||
pdf-core (~> 0.10.0)
|
||||
|
|
@ -1470,6 +1489,7 @@ GEM
|
|||
actionmailer (>= 3)
|
||||
net-smtp
|
||||
premailer (~> 1.7, >= 1.7.9)
|
||||
prettyprint (0.2.0)
|
||||
prime (0.1.3)
|
||||
forwardable
|
||||
singleton
|
||||
|
|
@ -1495,6 +1515,9 @@ GEM
|
|||
pry (>= 0.13.0)
|
||||
tty-markdown
|
||||
tty-prompt
|
||||
psych (5.2.3)
|
||||
date
|
||||
stringio
|
||||
public_suffix (6.0.1)
|
||||
puma (6.5.0)
|
||||
nio4r (~> 2.0)
|
||||
|
|
@ -1524,26 +1547,30 @@ GEM
|
|||
rack-test (2.1.0)
|
||||
rack (>= 1.3)
|
||||
rack-timeout (0.7.0)
|
||||
rails (7.0.8.7)
|
||||
actioncable (= 7.0.8.7)
|
||||
actionmailbox (= 7.0.8.7)
|
||||
actionmailer (= 7.0.8.7)
|
||||
actionpack (= 7.0.8.7)
|
||||
actiontext (= 7.0.8.7)
|
||||
actionview (= 7.0.8.7)
|
||||
activejob (= 7.0.8.7)
|
||||
activemodel (= 7.0.8.7)
|
||||
activerecord (= 7.0.8.7)
|
||||
activestorage (= 7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
rackup (1.0.1)
|
||||
rack (< 3)
|
||||
webrick
|
||||
rails (7.1.5.1)
|
||||
actioncable (= 7.1.5.1)
|
||||
actionmailbox (= 7.1.5.1)
|
||||
actionmailer (= 7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
actiontext (= 7.1.5.1)
|
||||
actionview (= 7.1.5.1)
|
||||
activejob (= 7.1.5.1)
|
||||
activemodel (= 7.1.5.1)
|
||||
activerecord (= 7.1.5.1)
|
||||
activestorage (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
bundler (>= 1.15.0)
|
||||
railties (= 7.0.8.7)
|
||||
railties (= 7.1.5.1)
|
||||
rails-controller-testing (1.0.5)
|
||||
actionpack (>= 5.0.1.rc1)
|
||||
actionview (>= 5.0.1.rc1)
|
||||
activesupport (>= 5.0.1.rc1)
|
||||
rails-dom-testing (2.0.3)
|
||||
activesupport (>= 4.2.0)
|
||||
rails-dom-testing (2.2.0)
|
||||
activesupport (>= 5.0.0)
|
||||
minitest
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.6.1)
|
||||
loofah (~> 2.21)
|
||||
|
|
@ -1551,13 +1578,14 @@ GEM
|
|||
rails-i18n (7.0.10)
|
||||
i18n (>= 0.7, < 2)
|
||||
railties (>= 6.0.0, < 8)
|
||||
railties (7.0.8.7)
|
||||
actionpack (= 7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
method_source
|
||||
railties (7.1.5.1)
|
||||
actionpack (= 7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
irb
|
||||
rackup (>= 1.0.0)
|
||||
rake (>= 12.2)
|
||||
thor (~> 1.0)
|
||||
zeitwerk (~> 2.5)
|
||||
thor (~> 1.0, >= 1.2.2)
|
||||
zeitwerk (~> 2.6)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
rake-compiler-dock (1.9.1)
|
||||
|
|
@ -1573,6 +1601,8 @@ GEM
|
|||
msgpack (>= 0.4.3)
|
||||
optimist (>= 3.0.0)
|
||||
rchardet (1.8.0)
|
||||
rdoc (6.13.0)
|
||||
psych (>= 4.0.0)
|
||||
re2 (2.15.0)
|
||||
mini_portile2 (~> 2.8.7)
|
||||
recaptcha (5.12.3)
|
||||
|
|
@ -1601,6 +1631,8 @@ GEM
|
|||
redis (>= 4, < 6)
|
||||
regexp_parser (2.10.0)
|
||||
regexp_property_values (1.0.0)
|
||||
reline (0.6.0)
|
||||
io-console (~> 0.5)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
|
|
@ -1739,6 +1771,7 @@ GEM
|
|||
addressable (>= 2.3.5)
|
||||
faraday (>= 0.17.3, < 3)
|
||||
sd_notify (0.1.1)
|
||||
securerandom (0.4.1)
|
||||
seed-fu (2.3.9)
|
||||
activerecord (>= 3.1)
|
||||
activesupport (>= 3.1)
|
||||
|
|
@ -1844,6 +1877,7 @@ GEM
|
|||
activesupport
|
||||
rspec (~> 3.3)
|
||||
state_machines
|
||||
stringio (3.1.7)
|
||||
strings (0.2.1)
|
||||
strings-ansi (~> 0.2)
|
||||
unicode-display_width (>= 1.5, < 3.0)
|
||||
|
|
@ -2300,7 +2334,7 @@ DEPENDENCIES
|
|||
rack-oauth2 (~> 2.2.1)
|
||||
rack-proxy (~> 0.7.7)
|
||||
rack-timeout (~> 0.7.0)
|
||||
rails (~> 7.0.8.7)
|
||||
rails (~> 7.1.5.1)
|
||||
rails-controller-testing
|
||||
rails-i18n (~> 7.0, >= 7.0.9)
|
||||
rainbow (~> 3.0)
|
||||
|
|
|
|||
|
|
@ -341,7 +341,7 @@
|
|||
{"name":"io-console","version":"0.8.0","platform":"ruby","checksum":"cd6a9facbc69871d69b2cb8b926fc6ea7ef06f06e505e81a64f14a470fddefa2"},
|
||||
{"name":"io-event","version":"1.9.0","platform":"ruby","checksum":"4c262b6610ad643a2be75e892135aca4fa67edc67d1944c0ae6b6e5dd73f4fc1"},
|
||||
{"name":"ipaddress","version":"0.8.3","platform":"ruby","checksum":"85640c4f9194c26937afc8c78e3074a8e7c97d5d1210358d1440f01034d006f5"},
|
||||
{"name":"irb","version":"1.15.2","platform":"ruby","checksum":"222f32952e278da34b58ffe45e8634bf4afc2dc7aa9da23fed67e581aa50fdba"},
|
||||
{"name":"irb","version":"1.15.1","platform":"ruby","checksum":"d9bca745ac4207a8b728a52b98b766ca909b86ff1a504bcde3d6f8c84faae890"},
|
||||
{"name":"jaeger-client","version":"1.1.0","platform":"ruby","checksum":"cb5e9b9bbee6ee8d6a82d03d947a5b04543d8c0a949c22e484254f18d8a458a8"},
|
||||
{"name":"jaro_winkler","version":"1.6.0","platform":"java","checksum":"6cbb36eb4c2649834124d8b92957e577890e8157dd41be8252fde5b02b63b42b"},
|
||||
{"name":"jaro_winkler","version":"1.6.0","platform":"ruby","checksum":"8b081ab4ba7da5d16b438e62c4be58b87724bfeeb1527e62603f05ab0a2cc424"},
|
||||
|
|
@ -577,7 +577,7 @@
|
|||
{"name":"rbs","version":"3.6.1","platform":"ruby","checksum":"ed7273d018556844583d1785ac54194e67eec594d68e317d57fa90ad035532c0"},
|
||||
{"name":"rbtrace","version":"0.5.1","platform":"ruby","checksum":"e8cba64d462bfb8ba102d7be2ecaacc789247d52ac587d8003549d909cb9c5dc"},
|
||||
{"name":"rchardet","version":"1.8.0","platform":"ruby","checksum":"693acd5253d5ade81a51940697955f6dd4bb2f0d245bda76a8e23deec70a52c7"},
|
||||
{"name":"rdoc","version":"6.13.1","platform":"ruby","checksum":"62a0dac99493c94e8eb7a3fb44e55aefcb4cecb119f7991f25bddc5ed8d472f7"},
|
||||
{"name":"rdoc","version":"6.13.0","platform":"ruby","checksum":"32c2139ae43ed91b7c43032fe5423d21d57718829cc5a11e5c9710d2aa5e0329"},
|
||||
{"name":"re2","version":"2.15.0","platform":"aarch64-linux-gnu","checksum":"ed3fe87adbc637373268d2a1b69f07def5079535dd961db735fdfac8fa63520f"},
|
||||
{"name":"re2","version":"2.15.0","platform":"aarch64-linux-musl","checksum":"edf696d3a4587f580828e99cf36b7e04a86e0ebe103f704955b310a3f61e69de"},
|
||||
{"name":"re2","version":"2.15.0","platform":"arm-linux-gnu","checksum":"dbe53c65859a868b42297939daeb610806ae6b1181ff09d1c454e1cdf86ebbc0"},
|
||||
|
|
@ -606,7 +606,7 @@
|
|||
{"name":"regexp_parser","version":"2.10.0","platform":"ruby","checksum":"cb6f0ddde88772cd64bff1dbbf68df66d376043fe2e66a9ef77fcb1b0c548c61"},
|
||||
{"name":"regexp_property_values","version":"1.0.0","platform":"java","checksum":"5e26782b01241616855c4ee7bb8a62fce9387e484f2d3eaf04f2a0633708222e"},
|
||||
{"name":"regexp_property_values","version":"1.0.0","platform":"ruby","checksum":"162499dc0bba1e66d334273a059f207a61981cc8cc69d2ca743594e7886d080f"},
|
||||
{"name":"reline","version":"0.6.1","platform":"ruby","checksum":"1afcc9d7cb1029cdbe780d72f2f09251ce46d3780050f3ec39c3ccc6b60675fb"},
|
||||
{"name":"reline","version":"0.6.0","platform":"ruby","checksum":"57620375dcbe56ec09bac7192bfb7460c716bbf0054dc94345ecaa5438e539d2"},
|
||||
{"name":"representable","version":"3.2.0","platform":"ruby","checksum":"cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace"},
|
||||
{"name":"request_store","version":"1.7.0","platform":"ruby","checksum":"e1b75d5346a315f452242a68c937ef8e48b215b9453a77a6c0acdca2934c88cb"},
|
||||
{"name":"responders","version":"3.0.1","platform":"ruby","checksum":"613fe28e498987f4feaa3230aa6313ca4bd5f0563a3da83511b0dd6cd8f47292"},
|
||||
|
|
|
|||
|
|
@ -1048,7 +1048,7 @@ GEM
|
|||
io-console (0.8.0)
|
||||
io-event (1.9.0)
|
||||
ipaddress (0.8.3)
|
||||
irb (1.15.2)
|
||||
irb (1.15.1)
|
||||
pp (>= 0.6.0)
|
||||
rdoc (>= 4.0.0)
|
||||
reline (>= 0.4.2)
|
||||
|
|
@ -1601,7 +1601,7 @@ GEM
|
|||
msgpack (>= 0.4.3)
|
||||
optimist (>= 3.0.0)
|
||||
rchardet (1.8.0)
|
||||
rdoc (6.13.1)
|
||||
rdoc (6.13.0)
|
||||
psych (>= 4.0.0)
|
||||
re2 (2.15.0)
|
||||
mini_portile2 (~> 2.8.7)
|
||||
|
|
@ -1631,7 +1631,7 @@ GEM
|
|||
redis (>= 4, < 6)
|
||||
regexp_parser (2.10.0)
|
||||
regexp_property_values (1.0.0)
|
||||
reline (0.6.1)
|
||||
reline (0.6.0)
|
||||
io-console (~> 0.5)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
|
|
|
|||
|
|
@ -1,47 +0,0 @@
|
|||
/* eslint-disable no-underscore-dangle,@gitlab/require-i18n-strings,no-console */
|
||||
|
||||
function getPersistedCoverage() {
|
||||
const storedPaths = localStorage.getItem('__coverage_paths__');
|
||||
if (storedPaths) {
|
||||
return JSON.parse(storedPaths);
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
function getCoverage() {
|
||||
if (!window.__coverage__) {
|
||||
throw new Error(
|
||||
'Coverage object is missing on the page. Did you install Istanbul babel plugin and enable Webpack?',
|
||||
);
|
||||
}
|
||||
const filePaths = Object.keys(window.__coverage__);
|
||||
const existingPaths = getPersistedCoverage();
|
||||
return [...new Set([...existingPaths, ...filePaths])];
|
||||
}
|
||||
|
||||
function persistCoverage(coverage = getCoverage()) {
|
||||
localStorage.setItem('__coverage_paths__', JSON.stringify(coverage));
|
||||
console.log(`Coverage paths saved: ${coverage.length} files tracked`);
|
||||
}
|
||||
|
||||
function updateCoverage() {
|
||||
const coverage = getCoverage();
|
||||
persistCoverage(coverage);
|
||||
window.__coverageFilePaths = coverage;
|
||||
}
|
||||
|
||||
window.addEventListener('beforeunload', () => {
|
||||
updateCoverage();
|
||||
});
|
||||
|
||||
window.__coveragePathsPersistence = {
|
||||
update: updateCoverage,
|
||||
getPaths() {
|
||||
return window.__coverageFilePaths || [];
|
||||
},
|
||||
reset() {
|
||||
localStorage.removeItem('__coverage_paths__');
|
||||
window.__coverageFilePaths = [];
|
||||
console.log('Coverage paths reset.');
|
||||
},
|
||||
};
|
||||
|
|
@ -23,6 +23,7 @@ import {
|
|||
WORK_ITEM_TYPE_NAME_EPIC,
|
||||
NAME_TO_ENUM_MAP,
|
||||
WIDGET_TYPE_CUSTOM_FIELDS,
|
||||
WIDGET_TYPE_STATUS,
|
||||
} from '../constants';
|
||||
import { findHierarchyWidgetDefinition } from '../utils';
|
||||
import workItemParticipantsQuery from '../graphql/work_item_participants.query.graphql';
|
||||
|
|
@ -139,6 +140,9 @@ export default {
|
|||
workItemLabels() {
|
||||
return this.isWidgetPresent(WIDGET_TYPE_LABELS);
|
||||
},
|
||||
workItemStatus() {
|
||||
return this.isWidgetPresent(WIDGET_TYPE_STATUS);
|
||||
},
|
||||
workItemStartAndDueDate() {
|
||||
return this.isWidgetPresent(WIDGET_TYPE_START_AND_DUE_DATE);
|
||||
},
|
||||
|
|
@ -188,7 +192,7 @@ export default {
|
|||
return this.isWidgetPresent(WIDGET_TYPE_CUSTOM_FIELDS)?.customFieldValues;
|
||||
},
|
||||
showWorkItemStatus() {
|
||||
return this.glFeatures.workItemStatusFeatureFlag;
|
||||
return this.glFeatures.workItemStatusFeatureFlag && this.workItemStatus;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
|
|
|
|||
|
|
@ -20,12 +20,12 @@ class GroupsController < Groups::ApplicationController
|
|||
before_action :group, except: [:index, :new, :create]
|
||||
|
||||
# Authorize
|
||||
before_action :authorize_admin_group!, only: [:update, :projects, :transfer, :export, :download_export]
|
||||
before_action :authorize_admin_group!, only: [:update, :transfer, :export, :download_export]
|
||||
before_action :authorize_view_edit_page!, only: :edit
|
||||
before_action :authorize_remove_group!, only: [:destroy, :restore]
|
||||
before_action :authorize_create_group!, only: [:new]
|
||||
|
||||
before_action :group_projects, only: [:projects, :activity, :issues, :merge_requests]
|
||||
before_action :group_projects, only: [:activity, :issues, :merge_requests]
|
||||
before_action :event_filter, only: [:activity]
|
||||
|
||||
before_action :user_actions, only: [:show]
|
||||
|
|
@ -47,7 +47,7 @@ class GroupsController < Groups::ApplicationController
|
|||
push_frontend_feature_flag(:mr_approved_filter, type: :ops)
|
||||
end
|
||||
|
||||
skip_cross_project_access_check :index, :new, :create, :edit, :update, :destroy, :projects
|
||||
skip_cross_project_access_check :index, :new, :create, :edit, :update, :destroy
|
||||
# When loading show as an atom feed, we render events that could leak cross
|
||||
# project information
|
||||
skip_cross_project_access_check :show, if: -> { request.format.html? }
|
||||
|
|
@ -152,10 +152,6 @@ class GroupsController < Groups::ApplicationController
|
|||
|
||||
def merge_requests; end
|
||||
|
||||
def projects
|
||||
@projects = @group.projects.with_statistics.page(params[:page])
|
||||
end
|
||||
|
||||
def update
|
||||
if Groups::UpdateService.new(@group, current_user, group_params).execute
|
||||
|
||||
|
|
@ -329,7 +325,7 @@ class GroupsController < Groups::ApplicationController
|
|||
def determine_layout
|
||||
if [:new, :create].include?(action_name.to_sym)
|
||||
'dashboard'
|
||||
elsif [:edit, :update, :projects].include?(action_name.to_sym)
|
||||
elsif [:edit, :update].include?(action_name.to_sym)
|
||||
'group_settings'
|
||||
else
|
||||
'group'
|
||||
|
|
|
|||
|
|
@ -19,11 +19,8 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
before_action :disable_query_limiting, only: [:create_merge_request, :move, :bulk_update]
|
||||
before_action :check_issues_available!
|
||||
before_action :issue, unless: ->(c) { ISSUES_EXCEPT_ACTIONS.include?(c.action_name.to_sym) }
|
||||
before_action :redirect_if_work_item, unless: ->(c) { work_item_redirect_except_actions.include?(c.action_name.to_sym) }
|
||||
before_action :require_incident_for_incident_routes, only: :show
|
||||
|
||||
after_action :log_issue_show, only: :show
|
||||
|
||||
before_action :set_issuables_index, if: ->(c) {
|
||||
SET_ISSUABLES_INDEX_ONLY_ACTIONS.include?(c.action_name.to_sym) && !index_html_request?
|
||||
}
|
||||
|
|
@ -31,6 +28,9 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
SET_ISSUABLES_INDEX_ONLY_ACTIONS.include?(c.action_name.to_sym) && !index_html_request? && params[:search].present?
|
||||
}
|
||||
|
||||
before_action :redirect_if_work_item, unless: ->(c) { work_item_redirect_except_actions.include?(c.action_name.to_sym) }
|
||||
before_action :redirect_index_to_work_items, only: :index
|
||||
|
||||
# Allow write(create) issue
|
||||
before_action :authorize_create_issue!, only: [:new, :create]
|
||||
|
||||
|
|
@ -72,6 +72,8 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
push_frontend_feature_flag(:work_items_view_preference, current_user)
|
||||
end
|
||||
|
||||
after_action :log_issue_show, only: :show
|
||||
|
||||
around_action :allow_gitaly_ref_name_caching, only: [:discussions]
|
||||
|
||||
respond_to :html
|
||||
|
|
@ -474,6 +476,13 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
redirect_to project_work_item_path(project, issue.iid, params: request.query_parameters)
|
||||
end
|
||||
|
||||
def redirect_index_to_work_items
|
||||
return unless index_html_request? && ::Feature.enabled?(:work_item_planning_view, project.group)
|
||||
|
||||
params = request.query_parameters.except("type").merge('type[]' => 'issue')
|
||||
redirect_to project_work_items_path(project, params: params)
|
||||
end
|
||||
|
||||
def require_incident_for_incident_routes
|
||||
return unless params[:incident_tab].present?
|
||||
return if issue.work_item_type&.incident?
|
||||
|
|
|
|||
|
|
@ -268,6 +268,7 @@ module ApplicationSettingsHelper
|
|||
:autocomplete_users_limit,
|
||||
:autocomplete_users_unauthenticated_limit,
|
||||
:ci_job_live_trace_enabled,
|
||||
:ci_partitions_size_limit,
|
||||
:concurrent_github_import_jobs_limit,
|
||||
:concurrent_bitbucket_import_jobs_limit,
|
||||
:concurrent_bitbucket_server_import_jobs_limit,
|
||||
|
|
|
|||
|
|
@ -522,9 +522,11 @@ class ApplicationSetting < ApplicationRecord
|
|||
if: ->(setting) { setting.external_auth_client_cert.present? }
|
||||
|
||||
jsonb_accessor :ci_cd_settings,
|
||||
ci_job_live_trace_enabled: [:boolean, { default: false }]
|
||||
ci_job_live_trace_enabled: [:boolean, { default: false }],
|
||||
ci_partitions_size_limit: [::Gitlab::Database::Type::JsonbInteger.new, { default: 100.gigabytes }]
|
||||
|
||||
validate :validate_object_storage_for_live_trace_configuration, if: -> { ci_job_live_trace_enabled? }
|
||||
validates :ci_partitions_size_limit, presence: true, numericality: { only_integer: true, greater_than: 0 }
|
||||
|
||||
validates :default_ci_config_path,
|
||||
format: { without: %r{(\.{2}|\A/)}, message: N_('cannot include leading slash or directory traversal.') },
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ module ApplicationSettingImplementation
|
|||
autocomplete_users_unauthenticated_limit: 100,
|
||||
ci_job_live_trace_enabled: false,
|
||||
ci_max_total_yaml_size_bytes: 314572800, # max_yaml_size_bytes * ci_max_includes = 2.megabyte * 150
|
||||
ci_partitions_size_limit: 100.gigabytes,
|
||||
commit_email_hostname: default_commit_email_hostname,
|
||||
container_expiration_policies_enable_historic_entries: false,
|
||||
container_registry_features: [],
|
||||
|
|
|
|||
|
|
@ -2,9 +2,6 @@
|
|||
|
||||
module Ci
|
||||
class Partition < Ci::ApplicationRecord
|
||||
MAX_PARTITION_SIZE = 100.gigabytes
|
||||
GSTG_PARTITION_SIZE = 4.gigabytes
|
||||
|
||||
INITIAL_PARTITION_VALUE = 100
|
||||
LATEST_PARTITION_VALUE = 102
|
||||
DEFAULT_PARTITION_VALUES = (INITIAL_PARTITION_VALUE..LATEST_PARTITION_VALUE).to_a.freeze
|
||||
|
|
@ -63,7 +60,7 @@ module Ci
|
|||
end
|
||||
end
|
||||
|
||||
def above_threshold?(threshold)
|
||||
def above_threshold?(threshold = ::Gitlab::CurrentSettings.ci_partitions_size_limit)
|
||||
with_ci_connection do
|
||||
Gitlab::Database::PostgresPartition
|
||||
.with_parent_tables(parent_table_names)
|
||||
|
|
|
|||
|
|
@ -25,10 +25,7 @@ module Ci
|
|||
end
|
||||
|
||||
def above_threshold?
|
||||
threshold = Ci::Partition::MAX_PARTITION_SIZE
|
||||
threshold = Ci::Partition::GSTG_PARTITION_SIZE if Gitlab.staging?
|
||||
|
||||
partition.above_threshold?(threshold)
|
||||
partition.above_threshold?
|
||||
end
|
||||
|
||||
def headroom_available?
|
||||
|
|
|
|||
|
|
@ -24,10 +24,7 @@ module Ci
|
|||
attr_reader :partition
|
||||
|
||||
def above_threshold?
|
||||
threshold = Ci::Partition::MAX_PARTITION_SIZE
|
||||
threshold = Ci::Partition::GSTG_PARTITION_SIZE if Gitlab.staging?
|
||||
|
||||
partition.above_threshold?(threshold)
|
||||
partition.above_threshold?
|
||||
end
|
||||
|
||||
def sync_available_partitions_statuses!
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ module Users
|
|||
migrate_snippets
|
||||
migrate_reviews
|
||||
migrate_releases
|
||||
migrate_timelogs
|
||||
end
|
||||
|
||||
def post_migrate_records
|
||||
|
|
@ -113,6 +114,10 @@ module Users
|
|||
batched_migrate(Achievements::UserAchievement, :revoked_by_user_id)
|
||||
end
|
||||
|
||||
def migrate_timelogs
|
||||
batched_migrate(Timelog, :user_id)
|
||||
end
|
||||
|
||||
# rubocop:disable CodeReuse/ActiveRecord
|
||||
def batched_migrate(base_scope, column, batch_size: 50)
|
||||
loop do
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"description": "Application settings for the CI/CD domain",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"ci_job_live_trace_enabled": {
|
||||
"type": "boolean",
|
||||
"description": "Enable cloud native architecture for storing job logs."
|
||||
},
|
||||
"ci_partitions_size_limit": {
|
||||
"type": "integer",
|
||||
"description": "Maximum table size limit for a CI partition used for creating new partitions."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
- breadcrumb_title _("Projects")
|
||||
- page_title _("Projects")
|
||||
- add_page_specific_style 'page_bundles/projects'
|
||||
- @force_desktop_expanded_sidebar = true
|
||||
|
||||
= render ::Layouts::CrudComponent.new(_('Projects'),
|
||||
icon: 'project',
|
||||
count: @projects.size,
|
||||
options: { class: 'js-search-settings-section' }) do |c|
|
||||
- c.with_actions do
|
||||
- if can? current_user, :admin_group, @group
|
||||
= render Pajamas::ButtonComponent.new(href: new_project_path(namespace_id: @group.id), size: :small) do
|
||||
= _("New project")
|
||||
- c.with_body do
|
||||
%ul.content-list
|
||||
- @projects.each do |project|
|
||||
%li.project-row.gl-items-center{ class: '!gl-flex' }
|
||||
= render Pajamas::AvatarComponent.new(project, alt: project.name, size: 48, class: 'gl-shrink-0 gl-mr-5')
|
||||
.gl-min-w-0.gl-grow
|
||||
.title.gl-mr-5
|
||||
= link_to project_path(project), class: 'js-prefetch-document' do
|
||||
%span.project-full-name
|
||||
%span.namespace-name
|
||||
- if project.namespace
|
||||
= project.namespace.human_name
|
||||
\/
|
||||
%span.project-name
|
||||
= project.name
|
||||
= visibility_level_content(project, css_class: 'visibility-icon gl-ml-2', icon_css_class: 'icon', icon_variant: 'subtle')
|
||||
|
||||
- if project.description.present?
|
||||
.description
|
||||
= markdown_field(project, :description)
|
||||
|
||||
= render 'shared/projects/badges', project: project, css_class: 'gl-mr-3'
|
||||
|
||||
.stats.gl-text-subtle.gl-shrink-0.gl-hidden.sm:gl-flex.gl-gap-3
|
||||
= gl_badge_tag storage_counter(project.statistics&.storage_size)
|
||||
.controls.gl-shrink-0.gl-ml-5
|
||||
= render Pajamas::ButtonComponent.new(href: project_project_members_path(project),
|
||||
variant: :link,
|
||||
button_options: { class: 'gl-mr-2' }) do
|
||||
= _('View members')
|
||||
= render Pajamas::ButtonComponent.new(href: edit_project_path(project),
|
||||
category: :tertiary,
|
||||
icon: 'pencil',
|
||||
button_options: { class: 'has-tooltip', title: _('Edit') })
|
||||
= render 'delete_project_button', project: project
|
||||
- if @projects.blank?
|
||||
.nothing-here-block= _("This group has no projects yet")
|
||||
- c.with_pagination do
|
||||
= paginate @projects, theme: "gitlab"
|
||||
|
|
@ -65,9 +65,6 @@
|
|||
|
||||
= webpack_bundle_tag 'super_sidebar'
|
||||
|
||||
- if ENV['BABEL_ENV'] == 'istanbul'
|
||||
= webpack_bundle_tag 'coverage_persistence'
|
||||
|
||||
- if vite_enabled?
|
||||
= render 'layouts/vite_main'
|
||||
- else
|
||||
|
|
|
|||
|
|
@ -42,20 +42,4 @@ if (isJest) {
|
|||
];
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
presets,
|
||||
plugins,
|
||||
sourceType: 'unambiguous',
|
||||
env: {
|
||||
istanbul: {
|
||||
plugins: [
|
||||
[
|
||||
'istanbul',
|
||||
{
|
||||
extension: ['.js', '.vue', '.mjs', '.cjs'],
|
||||
},
|
||||
],
|
||||
],
|
||||
},
|
||||
},
|
||||
};
|
||||
module.exports = { presets, plugins, sourceType: 'unambiguous' };
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ constraints(::Constraints::GroupUrlConstrainer.new) do
|
|||
get :issues, as: :issues_group_calendar, action: :issues_calendar, constraints: ->(req) { req.format == :ics }
|
||||
get :issues, as: :issues_group
|
||||
get :merge_requests, as: :merge_requests_group
|
||||
get :projects, as: :projects_group, to: redirect('%{id}')
|
||||
get :details, as: :details_group
|
||||
get :activity, as: :activity_group
|
||||
put :transfer, as: :transfer_group
|
||||
|
|
|
|||
|
|
@ -278,7 +278,6 @@ module.exports = {
|
|||
return {
|
||||
default: defaultEntries,
|
||||
sentry: './sentry/index.js',
|
||||
coverage_persistence: './entrypoints/coverage_persistence.js',
|
||||
performance_bar: './entrypoints/performance_bar.js',
|
||||
jira_connect_app: './jira_connect/subscriptions/index.js',
|
||||
sandboxed_mermaid: './lib/mermaid.js',
|
||||
|
|
|
|||
|
|
@ -969,6 +969,24 @@ To set this limit to 100 KB on a GitLab Self-Managed instance, run the following
|
|||
Plan.default.actual_limits.update!(ci_job_annotations_size: 100.kilobytes)
|
||||
```
|
||||
|
||||
### Maximum database partition size for CI/CD tables
|
||||
|
||||
{{< history >}}
|
||||
|
||||
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/189131) in GitLab 18.0.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
The maximum amount of disk space, in bytes, that can be used by a partition of a partitioned table,
|
||||
before new partitions are automatically created. Defaults to 100 GB.
|
||||
|
||||
You can change this limit by using the [GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session).
|
||||
To change the limit, update `ci_partitions_size_limit` with the new value. For example, to set it to 20 GB:
|
||||
|
||||
```ruby
|
||||
ApplicationSetting.update(ci_partitions_size_limit: 20.gigabytes)
|
||||
```
|
||||
|
||||
## Instance monitoring and metrics
|
||||
|
||||
### Limit inbound incident management alerts
|
||||
|
|
|
|||
|
|
@ -465,9 +465,10 @@ to configure other related settings. These requirements are
|
|||
| `bulk_import_max_download_file_size` | integer | no | Maximum download file size when importing from source GitLab instances by direct transfer. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/384976) in GitLab 16.3. |
|
||||
| `can_create_group` | boolean | no | Indicates whether users can create top-level groups. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/367754) in GitLab 15.5. Defaults to `true`. |
|
||||
| `check_namespace_plan` | boolean | no | Enabling this makes only licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public. Premium and Ultimate only. |
|
||||
| `ci_job_live_trace_enabled` | boolean | no | Turns on incremental logging for job logs. When turned on, archived job logs are incrementally uploaded to object storage. Object storage must be configured. You can also configure this setting in the [**Admin** area](../administration/settings/continuous_integration.md#incremental-logging). |
|
||||
| `ci_job_live_trace_enabled` | boolean | no | Turns on incremental logging for job logs. When turned on, archived job logs are incrementally uploaded to object storage. Object storage must be configured. You can also configure this setting in the [**Admin** area](../administration/settings/continuous_integration.md#incremental-logging). |
|
||||
| `ci_max_total_yaml_size_bytes` | integer | no | The maximum amount of memory, in bytes, that can be allocated for the pipeline configuration, with all included YAML configuration files. |
|
||||
| `ci_max_includes` | integer | no | The [maximum number of includes](../administration/settings/continuous_integration.md#maximum-includes) per pipeline. Default is `150`. |
|
||||
| `ci_partitions_size_limit` | integer | no | The maximum amount of disk space, in bytes, that can be used by a database partition for the CI tables before creating new partitions. Default is `100 GB`. |
|
||||
| `concurrent_github_import_jobs_limit` | integer | no | Maximum number of simultaneous import jobs for the GitHub importer. Default is 1000. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/143875) in GitLab 16.11. |
|
||||
| `concurrent_bitbucket_import_jobs_limit` | integer | no | Maximum number of simultaneous import jobs for the Bitbucket Cloud importer. Default is 100. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/143875) in GitLab 16.11. |
|
||||
| `concurrent_bitbucket_server_import_jobs_limit` | integer | no | Maximum number of simultaneous import jobs for the Bitbucket Server importer. Default is 100. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/143875) in GitLab 16.11. |
|
||||
|
|
|
|||
|
|
@ -53,22 +53,22 @@ The debug logs are available in the `language_server.log` file. To view this fil
|
|||
|
||||
## Required information for support
|
||||
|
||||
When creating a support request, provide this information:
|
||||
When creating a support request, provide the following information:
|
||||
|
||||
1. Your current GitLab for Eclipse plugin version.
|
||||
1. Open the `About Eclipse IDE` popup window.
|
||||
1. Open the `About Eclipse IDE` dialog.
|
||||
- On Windows, in your IDE, select **Help > About Eclipse IDE**.
|
||||
- On MacOS, in your IDE, select **Eclipse > About Eclipse IDE**.
|
||||
1. On the dialog, select **Installation details**.
|
||||
1. Locate **GitLab for Eclipse** and copy the **Version** value.
|
||||
|
||||
1. Your Eclipse version.
|
||||
1. Open the `About Eclipse IDE` popup window.
|
||||
1. Open the `About Eclipse IDE` dialog.
|
||||
- On Windows, in your IDE, select **Help > About Eclipse IDE**.
|
||||
- On MacOS, in your IDE, select **Eclipse > About Eclipse IDE**.
|
||||
|
||||
1. Your operating system.
|
||||
1. Are you using `gitlab.com` or a self-managed instance?
|
||||
1. Are you using a GitLab.com, GitLab Self-Managed, or GitLab Dedicated instance?
|
||||
1. Are you using a proxy?
|
||||
1. Are you using a self-signed certificate?
|
||||
1. The [workspace logs](#locate-the-workspace-log-file).
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ After a merge request is created, GitLab Duo reviews it unless:
|
|||
|
||||
Prerequisites:
|
||||
|
||||
- You must have the at least the [Maintainer role](../../permissions.md) in a project.
|
||||
- You must have at least the [Maintainer role](../../permissions.md) in a project.
|
||||
|
||||
To enable `@GitLabDuo` to automatically review merge requests:
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ which you can customize to meet the specific needs of each project.
|
|||
## Set up workspace infrastructure
|
||||
|
||||
Before you [create a workspace](#create-a-workspace), you must set up your infrastructure only once.
|
||||
To set up infrastructure for workspaces:
|
||||
To set up infrastructure for workspaces, regardless of cloud provider, you must:
|
||||
|
||||
1. Set up a Kubernetes cluster that the GitLab agent supports.
|
||||
See the [supported Kubernetes versions](../clusters/agent/_index.md#supported-kubernetes-versions-for-gitlab-features).
|
||||
|
|
@ -41,6 +41,9 @@ To set up infrastructure for workspaces:
|
|||
1. Optional. [Build and run containers in a workspace](#build-and-run-containers-in-a-workspace).
|
||||
1. Optional. [Configure support for private container registries](#configure-support-for-private-container-registries).
|
||||
|
||||
If you use AWS, you can use our OpenTofu tutorial. For more information, see
|
||||
[Tutorial: Set up workspaces infrastructure on AWS](set_up_infrastructure.md).
|
||||
|
||||
## Create a workspace
|
||||
|
||||
{{< history >}}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,294 @@
|
|||
---
|
||||
stage: Create
|
||||
group: Remote Development
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
description: Create the infrastructure needed to support GitLab Workspaces for on-demand, cloud-based development environments.
|
||||
title: 'Tutorial: Set up workspaces infrastructure on AWS'
|
||||
---
|
||||
|
||||
<!-- vale gitlab_base.FutureTense = NO -->
|
||||
|
||||
This tutorial guides you through the GitLab workspaces infrastructure setup on AWS using
|
||||
[OpenTofu](https://opentofu.org/), an open-source fork of Terraform through Infrastructure as Code (IaC).
|
||||
|
||||
## Before you begin
|
||||
|
||||
To follow this tutorial, you must have:
|
||||
|
||||
- An Amazon Web Services (AWS) account.
|
||||
- A domain name for your workspaces environment.
|
||||
|
||||
To set up GitLab workspaces infrastructure:
|
||||
|
||||
1. [Fork the repository](#fork-the-repository)
|
||||
1. [Set up AWS credentials](#set-up-aws-credentials)
|
||||
1. [Prepare domain and certificates](#prepare-domain-and-certificates)
|
||||
1. [Create required keys](#create-required-keys)
|
||||
1. [Configure GitLab OAuth and agent](#configure-gitlab-oauth-and-agent)
|
||||
1. [Create a token for GitLab Agent for Kubernetes](#create-a-token-for-gitlab-agent-for-kubernetes)
|
||||
1. [Configure CI/CD variables](#configure-cicd-variables)
|
||||
1. [Update GitLab agent configuration](#update-gitlab-agent-configuration)
|
||||
1. [Run the pipeline](#run-the-pipeline)
|
||||
1. [Configure DNS records](#configure-dns-records)
|
||||
1. [Authorize the agent](#authorize-the-agent)
|
||||
1. [Verify your workspace setup](#verify-your-workspace-setup)
|
||||
|
||||
## Fork the repository
|
||||
|
||||
First, you need to create your own copy of the infrastructure setup repository so that you can
|
||||
configure it for your environment.
|
||||
|
||||
To fork the repository:
|
||||
|
||||
1. Go to the [Workspaces Infrastructure Setup AWS](https://gitlab.com/gitlab-org/workspaces/examples/workspaces-infrastructure-setup-aws) repository.
|
||||
1. Create a fork of the repository. For more information, see [Create a fork](../project/repository/forking_workflow.md#create-a-fork).
|
||||
|
||||
## Set up AWS credentials
|
||||
|
||||
Next, set up the necessary permissions in AWS so the infrastructure can be properly provisioned.
|
||||
|
||||
To set up AWS credentials:
|
||||
|
||||
1. Create an [IAM User](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) or
|
||||
[IAM Role](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html).
|
||||
1. Assign the following permissions:
|
||||
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "VisualEditor0",
|
||||
"Effect": "Allow",
|
||||
"Action": [
|
||||
"ec2:*",
|
||||
"eks:*",
|
||||
"elasticloadbalancing:*",
|
||||
"autoscaling:*",
|
||||
"cloudwatch:*",
|
||||
"logs:*",
|
||||
"kms:DescribeKey",
|
||||
"kms:TagResource",
|
||||
"kms:UntagResource",
|
||||
"kms:ListResourceTags",
|
||||
"kms:CreateKey",
|
||||
"kms:CreateAlias",
|
||||
"kms:ListAliases",
|
||||
"kms:DeleteAlias",
|
||||
"iam:AddRoleToInstanceProfile",
|
||||
"iam:AttachRolePolicy",
|
||||
"iam:CreateInstanceProfile",
|
||||
"iam:CreateRole",
|
||||
"iam:CreateServiceLinkedRole",
|
||||
"iam:GetRole",
|
||||
"iam:ListAttachedRolePolicies",
|
||||
"iam:ListRolePolicies",
|
||||
"iam:ListRoles",
|
||||
"iam:PassRole",
|
||||
"iam:DetachRolePolicy",
|
||||
"iam:ListInstanceProfilesForRole",
|
||||
"iam:DeleteRole",
|
||||
"iam:CreateOpenIDConnectProvider",
|
||||
"iam:CreatePolicy",
|
||||
"iam:TagOpenIDConnectProvider",
|
||||
"iam:GetPolicy",
|
||||
"iam:GetPolicyVersion",
|
||||
"iam:GetOpenIDConnectProvider",
|
||||
"iam:DeleteOpenIDConnectProvider",
|
||||
"iam:ListPolicyVersions",
|
||||
"iam:DeletePolicy"
|
||||
],
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
1. [Create an access key](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)
|
||||
for the user or role.
|
||||
1. Save your access key ID and secret access key. You'll need them when configuring CI/CD variables later.
|
||||
|
||||
## Prepare domain and certificates
|
||||
|
||||
For your workspaces to be accessible, you'll need a domain and TLS certificates to secure the
|
||||
connections.
|
||||
|
||||
To prepare your domain and certificates:
|
||||
|
||||
1. Buy a domain or use an existing domain for your workspaces environment.
|
||||
1. Create TLS certificates for:
|
||||
- GitLab Workspaces Proxy Domain. For example, `workspaces.example.dev`.
|
||||
- GitLab Workspaces Proxy Wildcard Domain. For example, `*.workspaces.example.dev`.
|
||||
|
||||
## Create required keys
|
||||
|
||||
Now you need to create security keys for authentication and SSH connections.
|
||||
|
||||
To create the required keys:
|
||||
|
||||
1. Generate a signing key consisting of random letters, numbers, and special characters.
|
||||
1. Generate an SSH host key:
|
||||
|
||||
```shell
|
||||
ssh-keygen -f ssh-host-key -N '' -t rsa
|
||||
```
|
||||
|
||||
## Configure GitLab OAuth and agent
|
||||
|
||||
Next, set up OAuth authentication so users can securely access workspaces.
|
||||
|
||||
To configure GitLab OAuth:
|
||||
|
||||
1. Go to **User Settings > Applications**.
|
||||
1. Create a new application with these settings:
|
||||
|
||||
- Name: GitLab Workspaces Proxy
|
||||
- Redirect URI: `https://workspaces.example.dev/auth/callback` (replace with your domain)
|
||||
- Check the **Trusted** checkbox
|
||||
- Scopes: `api`, `read_user`, `openid`, `profile`
|
||||
|
||||
1. Save the Application ID and Secret.
|
||||
|
||||
## Create a token for GitLab Agent for Kubernetes
|
||||
|
||||
The GitLab Agent for Kubernetes will connect your AWS Kubernetes cluster to GitLab.
|
||||
|
||||
To create a token for the agent:
|
||||
|
||||
1. On the left sidebar, select **Operate > Kubernetes clusters**.
|
||||
1. Select **Connect a cluster (agent)**.
|
||||
1. Enter a name for your agent (for example, `gitlab-workspaces-agentk-eks`).
|
||||
1. Select **Register an agent**.
|
||||
1. Save the token and KAS address for later use.
|
||||
|
||||
This token will enable secure communication between GitLab and your Kubernetes cluster.
|
||||
|
||||
## Configure CI/CD variables
|
||||
|
||||
Now, you need to add the necessary variables to your CI/CD configuration so the infrastructure
|
||||
pipeline can run.
|
||||
|
||||
To configure CI/CD variables:
|
||||
|
||||
1. On the left sidebar, select **Settings > CI/CD**.
|
||||
1. Expand **Variables**.
|
||||
1. Add the following required variables:
|
||||
|
||||
- `AWS_ACCESS_KEY_ID`: Your AWS access key ID
|
||||
- `AWS_SECRET_ACCESS_KEY`: Your AWS secret access key
|
||||
- `TF_VAR_agent_token`: GitLab Agent for Kubernetes token
|
||||
- `TF_VAR_workspaces_proxy_auth_client_id`: OAuth application client ID
|
||||
- `TF_VAR_workspaces_proxy_auth_client_secret`: OAuth application secret
|
||||
- `TF_VAR_workspaces_proxy_auth_redirect_uri`: OAuth callback URL
|
||||
- `TF_VAR_workspaces_proxy_auth_signing_key`: Your generated signing key
|
||||
- `TF_VAR_workspaces_proxy_domain`: Domain for the workspaces proxy
|
||||
- `TF_VAR_workspaces_proxy_domain_cert`: TLS certificate for the proxy domain
|
||||
- `TF_VAR_workspaces_proxy_domain_key`: TLS key for the proxy domain
|
||||
- `TF_VAR_workspaces_proxy_ssh_host_key`: Your generated SSH host key
|
||||
- `TF_VAR_workspaces_proxy_wildcard_domain`: Wildcard domain for workspaces
|
||||
- `TF_VAR_workspaces_proxy_wildcard_domain_cert`: TLS certificate for the wildcard domain
|
||||
- `TF_VAR_workspaces_proxy_wildcard_domain_key`: TLS key for the wildcard domain
|
||||
|
||||
1. Optionally, add any of these variables to customize your deployment:
|
||||
|
||||
- `TF_VAR_region`: AWS region.
|
||||
- `TF_VAR_zones`: AWS availability zones.
|
||||
- `TF_VAR_name`: Name prefix for resources.
|
||||
- `TF_VAR_cluster_endpoint_public_access`: Enable public access to cluster endpoint.
|
||||
- `TF_VAR_instance_type`: EC2 instance type for Kubernetes nodes.
|
||||
- `TF_VAR_instance_count`: Number of worker nodes.
|
||||
- `TF_VAR_agent_namespace`: Kubernetes namespace for the agent.
|
||||
- `TF_VAR_kas_address`: GitLab Kubernetes Agent Server address. Required if on a GitLab Self-Managed instance.
|
||||
- `TF_VAR_workspaces_proxy_namespace`: Kubernetes namespace for workspaces proxy.
|
||||
- `TF_VAR_workspaces_proxy_ingress_class_name`: Ingress class name.
|
||||
- `TF_VAR_ingress_nginx_namespace`: Kubernetes namespace for Ingress-NGINX.
|
||||
|
||||
Great job! You've configured all the necessary variables for your infrastructure deployment.
|
||||
|
||||
## Update GitLab agent configuration
|
||||
|
||||
Now, you need to configure the GitLab agent to support workspaces.
|
||||
|
||||
To update the GitLab agent configuration:
|
||||
|
||||
1. In your forked repository, open the `.gitlab/agents/gitlab-workspaces-agentk-eks/config.yaml` file.
|
||||
1. Update the file with the following required fields:
|
||||
|
||||
```yaml
|
||||
remote_development:
|
||||
enabled: true
|
||||
dns_zone: "workspaces.example.dev" # Replace with your domain
|
||||
```
|
||||
|
||||
For more configuration options, see [Workspace settings](settings.md).
|
||||
|
||||
1. Commit and push these changes to your repository.
|
||||
|
||||
## Run the pipeline
|
||||
|
||||
It's time to deploy your infrastructure. You'll run the CI/CD pipeline to create all the necessary
|
||||
resources in AWS.
|
||||
|
||||
To run the pipeline:
|
||||
|
||||
1. Create a new pipeline in your GitLab project:
|
||||
1. On the left sidebar, select **Build > Pipelines**.
|
||||
1. Select **Run pipeline**.
|
||||
1. Verify the `plan` job succeeds, then manually trigger the `apply` job.
|
||||
|
||||
When the OpenTofu code runs, it creates these resources in AWS:
|
||||
|
||||
- A Virtual Private Cloud (VPC).
|
||||
- An Elastic Kubernetes Service (EKS) cluster.
|
||||
- A GitLab Agent for Kubernetes Helm release.
|
||||
- A GitLab Workspaces Proxy Helm release.
|
||||
- An Ingress NGINX Helm release.
|
||||
|
||||
Excellent! Your infrastructure is now being deployed. This might take some time to complete.
|
||||
|
||||
## Configure DNS records
|
||||
|
||||
Now that your infrastructure is deployed, you need to configure DNS records to point to your new
|
||||
environment.
|
||||
|
||||
To configure DNS records:
|
||||
|
||||
1. Get the Ingress-NGINX load balancer address from the pipeline output.
|
||||
1. Create DNS A records that point your domains to this address:
|
||||
- `workspaces.example.dev` → Load balancer IP address
|
||||
- `*.workspaces.example.dev` → Load balancer IP address
|
||||
|
||||
## Authorize the agent
|
||||
|
||||
Next, you'll authorize the GitLab agent to connect to your GitLab instance.
|
||||
|
||||
To authorize the agent:
|
||||
|
||||
1. On the left sidebar, select **Search or go to** and find your group.
|
||||
1. Select **Settings > Workspaces**.
|
||||
1. In the **Group agents** section, select the **All agents** tab.
|
||||
1. From the list of available agents, find the agent with status **Blocked**, and select **Allow**.
|
||||
1. On the confirmation dialog, select **Allow agent**.
|
||||
|
||||
## Verify your workspace setup
|
||||
|
||||
Finally, let's make sure everything is working correctly by creating a test workspace.
|
||||
|
||||
To verify your workspace setup:
|
||||
|
||||
1. Create a new workspace by following the steps in [Create a workspace](configuration.md#create-a-workspace).
|
||||
1. Verify that you can access the workspace environment.
|
||||
1. Interact with the workspace by opening the Web IDE, accessing the terminal, or making changes to project files.
|
||||
|
||||
Congratulations! You've successfully set up GitLab workspaces infrastructure on AWS. Your users
|
||||
can now create development workspace environments for their projects.
|
||||
|
||||
If you encounter any issues, check the logs for additional details and refer to
|
||||
[Troubleshooting workspaces](workspaces_troubleshooting.md) for guidance.
|
||||
|
||||
## Related topics
|
||||
|
||||
- [Workspaces](_index.md)
|
||||
- [Configure workspaces](configuration.md)
|
||||
- [Workspace settings](settings.md)
|
||||
- [Tutorial: Create a custom workspace image that supports arbitrary user IDs](create_image.md)
|
||||
|
|
@ -136,6 +136,7 @@ module Keeps
|
|||
change.description = build_description(feature_flag, latest_feature_flag_status)
|
||||
|
||||
change.labels = [
|
||||
'automation:feature-flag-removal',
|
||||
'maintenance::removal',
|
||||
'feature flag',
|
||||
feature_flag.group
|
||||
|
|
|
|||
|
|
@ -139,9 +139,6 @@ module Gitlab
|
|||
#
|
||||
# @return [Boolean]
|
||||
def self.next_rails?
|
||||
return @next_bundle_gemfile unless @next_bundle_gemfile.nil?
|
||||
return false unless ENV["BUNDLE_GEMFILE"]
|
||||
|
||||
@next_bundle_gemfile = File.exist?(ENV["BUNDLE_GEMFILE"]) && File.basename(ENV["BUNDLE_GEMFILE"]) == "Gemfile.next"
|
||||
true
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@ module Sidebars
|
|||
add_item(general_menu_item)
|
||||
add_item(integrations_menu_item)
|
||||
add_item(access_tokens_menu_item)
|
||||
add_item(group_projects_menu_item)
|
||||
add_item(repository_menu_item)
|
||||
add_item(ci_cd_menu_item)
|
||||
add_item(applications_menu_item)
|
||||
|
|
@ -72,15 +71,6 @@ module Sidebars
|
|||
)
|
||||
end
|
||||
|
||||
def group_projects_menu_item
|
||||
::Sidebars::MenuItem.new(
|
||||
title: _('Projects'),
|
||||
link: projects_group_path(context.group),
|
||||
active_routes: { path: 'groups#projects' },
|
||||
item_id: :group_projects
|
||||
)
|
||||
end
|
||||
|
||||
def repository_menu_item
|
||||
::Sidebars::MenuItem.new(
|
||||
title: _('Repository'),
|
||||
|
|
|
|||
|
|
@ -61802,9 +61802,6 @@ msgstr ""
|
|||
msgid "This group has no inactive access tokens."
|
||||
msgstr ""
|
||||
|
||||
msgid "This group has no projects yet"
|
||||
msgstr ""
|
||||
|
||||
msgid "This group is linked to a subscription"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -66540,9 +66537,6 @@ msgstr ""
|
|||
msgid "View log"
|
||||
msgstr ""
|
||||
|
||||
msgid "View members"
|
||||
msgstr ""
|
||||
|
||||
msgid "View merge requests you're involved with from start to finish by highlighting those that Needs Attention and those you are Following."
|
||||
msgstr ""
|
||||
|
||||
|
|
|
|||
|
|
@ -71,8 +71,8 @@
|
|||
"@gitlab/web-ide": "^0.0.1-dev-20250414030534",
|
||||
"@gleam-lang/highlight.js-gleam": "^1.5.0",
|
||||
"@mattiasbuelens/web-streams-adapter": "^0.1.0",
|
||||
"@rails/actioncable": "7.0.807",
|
||||
"@rails/ujs": "7.0.807",
|
||||
"@rails/actioncable": "7.1.501",
|
||||
"@rails/ujs": "7.1.501",
|
||||
"@sentry/browser": "9.13.0",
|
||||
"@snowplow/browser-plugin-client-hints": "^3.24.2",
|
||||
"@snowplow/browser-plugin-form-tracking": "^3.24.2",
|
||||
|
|
@ -269,7 +269,6 @@
|
|||
"ajv-formats": "^2.1.1",
|
||||
"axios-mock-adapter": "^1.15.0",
|
||||
"babel-jest": "^29.7.0",
|
||||
"babel-plugin-istanbul": "^7.0.0",
|
||||
"chalk": "^2.4.1",
|
||||
"chokidar": "^3.5.3",
|
||||
"crypto": "^1.0.1",
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
diff --git a/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js b/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
|
||||
index d428163..010eaa5 100644
|
||||
--- a/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
|
||||
+++ b/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
|
||||
@@ -281,11 +281,6 @@ Released under the MIT license
|
||||
try {
|
||||
response = JSON.parse(response);
|
||||
} catch (error) {}
|
||||
- } else if (type.match(/\b(?:java|ecma)script\b/)) {
|
||||
- script = document.createElement('script');
|
||||
- script.setAttribute('nonce', cspNonce());
|
||||
- script.text = response;
|
||||
- document.head.appendChild(script).parentNode.removeChild(script);
|
||||
} else if (type.match(/\b(xml|html|svg)\b/)) {
|
||||
parser = new DOMParser();
|
||||
type = type.replace(/;.+/, '');
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
diff --git a/node_modules/@rails/ujs/app/assets/javascripts/rails-ujs.js b/node_modules/@rails/ujs/app/assets/javascripts/rails-ujs.js
|
||||
index 035a521..85b7425 100644
|
||||
--- a/node_modules/@rails/ujs/app/assets/javascripts/rails-ujs.js
|
||||
+++ b/node_modules/@rails/ujs/app/assets/javascripts/rails-ujs.js
|
||||
@@ -150,11 +150,6 @@ Released under the MIT license
|
||||
try {
|
||||
response = JSON.parse(response);
|
||||
} catch (error) {}
|
||||
- } else if (type.match(/\b(?:java|ecma)script\b/)) {
|
||||
- const script = document.createElement("script");
|
||||
- script.setAttribute("nonce", cspNonce());
|
||||
- script.text = response;
|
||||
- document.head.appendChild(script).parentNode.removeChild(script);
|
||||
} else if (type.match(/\b(xml|html|svg)\b/)) {
|
||||
const parser = new DOMParser;
|
||||
type = type.replace(/;.+/, "");
|
||||
|
|
@ -5,7 +5,7 @@ source 'https://rubygems.org'
|
|||
gem 'gitlab-qa', '~> 15', '>= 15.4.0', require: 'gitlab/qa'
|
||||
gem 'gitlab_quality-test_tooling', '~> 2.10.0', require: false
|
||||
gem 'gitlab-utils', path: '../gems/gitlab-utils'
|
||||
gem 'activesupport', '~> 7.0.8.7' # This should stay in sync with the root's Gemfile
|
||||
gem 'activesupport', '~> 7.1.5.1' # This should stay in sync with the root's Gemfile
|
||||
gem 'allure-rspec', '~> 2.26.0'
|
||||
gem 'capybara', '~> 3.40.0'
|
||||
gem 'capybara-screenshot', '~> 1.0.26'
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ PATH
|
|||
remote: gems/gitlab-orchestrator
|
||||
specs:
|
||||
gitlab-orchestrator (0.0.1)
|
||||
activesupport (>= 7)
|
||||
activesupport (>= 7.1.5.1)
|
||||
rainbow (~> 3.1)
|
||||
require_all (~> 3.0)
|
||||
thor (~> 1.3)
|
||||
|
|
@ -22,16 +22,24 @@ PATH
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actionview (7.0.8.7)
|
||||
activesupport (= 7.0.8.7)
|
||||
actionview (7.1.5.1)
|
||||
activesupport (= 7.1.5.1)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||
activesupport (7.0.8.7)
|
||||
erubi (~> 1.11)
|
||||
rails-dom-testing (~> 2.2)
|
||||
rails-html-sanitizer (~> 1.6)
|
||||
activesupport (7.1.5.1)
|
||||
base64
|
||||
benchmark (>= 0.3)
|
||||
bigdecimal
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
connection_pool (>= 2.2.5)
|
||||
drb
|
||||
i18n (>= 1.6, < 2)
|
||||
logger (>= 1.4.2)
|
||||
minitest (>= 5.1)
|
||||
mutex_m
|
||||
securerandom (>= 0.3)
|
||||
tzinfo (~> 2.0)
|
||||
addressable (2.8.7)
|
||||
public_suffix (>= 2.0.2, < 7.0)
|
||||
|
|
@ -47,6 +55,7 @@ GEM
|
|||
tins (~> 1.0)
|
||||
ast (2.4.2)
|
||||
base64 (0.2.0)
|
||||
benchmark (0.4.0)
|
||||
bigdecimal (3.1.9)
|
||||
binding_of_caller (1.0.0)
|
||||
debug_inspector (>= 0.0.1)
|
||||
|
|
@ -66,6 +75,7 @@ GEM
|
|||
launchy
|
||||
coderay (1.1.2)
|
||||
concurrent-ruby (1.2.3)
|
||||
connection_pool (2.5.0)
|
||||
crass (1.0.6)
|
||||
csv (3.3.0)
|
||||
debug_inspector (1.1.0)
|
||||
|
|
@ -74,6 +84,7 @@ GEM
|
|||
activesupport (>= 6.1)
|
||||
diff-lcs (1.3)
|
||||
domain_name (0.6.20240107)
|
||||
drb (2.2.1)
|
||||
erubi (1.12.0)
|
||||
excon (0.110.0)
|
||||
factory_bot (6.5.1)
|
||||
|
|
@ -249,8 +260,9 @@ GEM
|
|||
rack (2.2.10)
|
||||
rack-test (1.1.0)
|
||||
rack (>= 1.0, < 3)
|
||||
rails-dom-testing (2.0.3)
|
||||
activesupport (>= 4.2.0)
|
||||
rails-dom-testing (2.2.0)
|
||||
activesupport (>= 5.0.0)
|
||||
minitest
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.6.1)
|
||||
loofah (~> 2.21)
|
||||
|
|
@ -303,6 +315,7 @@ GEM
|
|||
sawyer (0.9.2)
|
||||
addressable (>= 2.3.5)
|
||||
faraday (>= 0.17.3, < 3)
|
||||
securerandom (0.4.1)
|
||||
selenium-webdriver (4.31.0)
|
||||
base64 (~> 0.2)
|
||||
logger (~> 1.4)
|
||||
|
|
@ -356,7 +369,7 @@ PLATFORMS
|
|||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
activesupport (~> 7.0.8.7)
|
||||
activesupport (~> 7.1.5.1)
|
||||
allure-rspec (~> 2.26.0)
|
||||
capybara (~> 3.40.0)
|
||||
capybara-screenshot (~> 1.0.26)
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ PATH
|
|||
remote: .
|
||||
specs:
|
||||
gitlab-orchestrator (0.0.1)
|
||||
activesupport (>= 7)
|
||||
activesupport (>= 7.1.5.1)
|
||||
rainbow (~> 3.1)
|
||||
require_all (~> 3.0)
|
||||
thor (~> 1.3)
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|||
spec.executables = "orchestrator"
|
||||
spec.require_paths = ["lib"]
|
||||
|
||||
spec.add_dependency "activesupport", ">= 7"
|
||||
spec.add_dependency "activesupport", ">= 7.1.5.1"
|
||||
spec.add_dependency "rainbow", "~> 3.1"
|
||||
spec.add_dependency "require_all", "~> 3.0"
|
||||
spec.add_dependency "thor", "~> 1.3"
|
||||
|
|
|
|||
21
qa/qa.rb
21
qa/qa.rb
|
|
@ -13,6 +13,7 @@ Bundler.require(:default)
|
|||
require 'securerandom'
|
||||
require 'pathname'
|
||||
require 'rainbow/refinement'
|
||||
require 'active_support'
|
||||
require 'active_support/core_ext/hash'
|
||||
require 'active_support/core_ext/object/blank'
|
||||
require 'active_support/core_ext/module/delegation'
|
||||
|
|
@ -102,23 +103,3 @@ end
|
|||
# see: https://github.com/octokit/octokit.rb/issues/1701
|
||||
Warning.ignore(/To use multipart middleware with Faraday v2\.0/)
|
||||
require "octokit"
|
||||
|
||||
# TODO: Temporary monkeypatch for broadcast logging
|
||||
# Remove once activesupport is upgraded to 7.1
|
||||
module Gitlab
|
||||
module QA
|
||||
class TestLogger
|
||||
# Combined logger instance
|
||||
#
|
||||
# @param [<Symbol, String>] level
|
||||
# @param [String] source
|
||||
# @return [ActiveSupport::Logger]
|
||||
def self.logger(level: :info, source: 'Gitlab QA', path: 'tmp')
|
||||
console_log = console_logger(level: level, source: source)
|
||||
file_log = file_logger(source: source, path: path)
|
||||
|
||||
console_log.extend(ActiveSupport::Logger.broadcast(file_log))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -98,10 +98,6 @@ module QA
|
|||
enabled?(ENV['COVERBAND_ENABLED'], default: false)
|
||||
end
|
||||
|
||||
def istanbul_coverage_enabled?
|
||||
ENV['BABEL_ENV'] == 'istanbul'
|
||||
end
|
||||
|
||||
def selective_execution_improved_enabled?
|
||||
enabled?(ENV['SELECTIVE_EXECUTION_IMPROVED'], default: false)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'active_support'
|
||||
require 'active_support/testing/time_helpers'
|
||||
require 'factory_bot'
|
||||
|
||||
|
|
@ -25,20 +26,6 @@ RSpec.configure(&:disable_monkey_patching!)
|
|||
# For JH additionally process when `jh/` exists
|
||||
require_relative('../../../jh/qa/qa/specs/spec_helper') if GitlabEdition.jh?
|
||||
|
||||
front_end_coverage_by_example = {}
|
||||
|
||||
def save_front_end_coverage_mapping(map_to_save)
|
||||
return if map_to_save.empty?
|
||||
|
||||
file = "tmp/js-coverage-by-example-#{ENV['CI_JOB_NAME_SLUG'] || 'local'}-#{SecureRandom.hex(6)}.json"
|
||||
|
||||
# Write the mapping data
|
||||
File.write(file, map_to_save.to_json)
|
||||
QA::Runtime::Logger.info("Saved test coverage mapping data to #{file}")
|
||||
rescue StandardError => e
|
||||
QA::Runtime::Logger.error("Failed to save JS coverage mapping data, error: #{e}")
|
||||
end
|
||||
|
||||
RSpec.configure do |config|
|
||||
config.include ActiveSupport::Testing::TimeHelpers
|
||||
config.include QA::Support::Matchers::EventuallyMatcher
|
||||
|
|
@ -66,11 +53,6 @@ RSpec.configure do |config|
|
|||
|
||||
visit(QA::Runtime::Scenario.gitlab_address) if QA::Runtime::Env.mobile_layout?
|
||||
|
||||
# Reset coverage persistence at the start of each test
|
||||
if Capybara::Session.instance_created? && QA::Runtime::Env.istanbul_coverage_enabled?
|
||||
Capybara.current_session.execute_script("window.__coveragePathsPersistence.reset()")
|
||||
end
|
||||
|
||||
# Reset fabrication counters tracked in resource base
|
||||
Thread.current[:api_fabrication] = 0
|
||||
Thread.current[:browser_ui_fabrication] = 0
|
||||
|
|
@ -96,19 +78,6 @@ RSpec.configure do |config|
|
|||
QA::Support::PageErrorChecker.log_request_errors(page)
|
||||
QA::Support::PageErrorChecker.check_page_for_error_code(page) if example.exception
|
||||
end
|
||||
# Get coverage paths and store in metadata
|
||||
if Capybara::Session.instance_created? && QA::Runtime::Env.istanbul_coverage_enabled?
|
||||
begin
|
||||
Capybara.current_session.execute_script("window.__coveragePathsPersistence.update()")
|
||||
coverage_paths = Capybara.current_session.evaluate_script("window.__coveragePathsPersistence.getPaths()")
|
||||
QA::Runtime::Logger.debug("Coverage paths count: #{coverage_paths.length}")
|
||||
|
||||
example.metadata[:coverage_paths] = coverage_paths
|
||||
front_end_coverage_by_example[example.metadata[:location]] = coverage_paths
|
||||
rescue StandardError => e
|
||||
QA::Runtime::Logger.warn("Failed to collect coverage paths: #{e.message}")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
config.append_after do |example|
|
||||
|
|
@ -127,9 +96,8 @@ RSpec.configure do |config|
|
|||
end
|
||||
|
||||
config.after(:suite) do |suite|
|
||||
# Write all test created resources to JSON file
|
||||
QA::Tools::TestResourceDataProcessor.write_to_file(suite.reporter.failed_examples.any?)
|
||||
|
||||
save_front_end_coverage_mapping(front_end_coverage_by_example) if QA::Runtime::Env.istanbul_coverage_enabled?
|
||||
end
|
||||
|
||||
config.expect_with :rspec do |expectations|
|
||||
|
|
|
|||
|
|
@ -2,6 +2,6 @@
|
|||
|
||||
RSpec.describe QA::Runtime::Logger do
|
||||
it 'returns logger instance' do
|
||||
expect(described_class.logger).to be_an_instance_of(ActiveSupport::Logger)
|
||||
expect(described_class.logger).to be_an_instance_of(ActiveSupport::BroadcastLogger)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -37,11 +37,23 @@ RSpec.describe Projects::IssuesController, :request_store, feature_category: :te
|
|||
end
|
||||
|
||||
context 'when GitLab issues enabled' do
|
||||
it 'renders the "index" template' do
|
||||
it 'redirects to work items index page' do
|
||||
get :index, params: { namespace_id: project.namespace, project_id: project }
|
||||
|
||||
expect(response).to have_gitlab_http_status(:ok)
|
||||
expect(response).to render_template(:index)
|
||||
expect(response).to redirect_to(project_work_items_path(project, 'type[]' => 'issue'))
|
||||
end
|
||||
|
||||
context 'when work_item_planning_view: false' do
|
||||
before do
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
it 'renders the "index" template' do
|
||||
get :index, params: { namespace_id: project.namespace, project_id: project }
|
||||
|
||||
expect(response).to have_gitlab_http_status(:ok)
|
||||
expect(response).to render_template(:index)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -77,14 +89,26 @@ RSpec.describe Projects::IssuesController, :request_store, feature_category: :te
|
|||
project.add_developer(user)
|
||||
end
|
||||
|
||||
it_behaves_like 'set sort order from user preference' do
|
||||
let(:sorting_param) { 'updated_asc' }
|
||||
end
|
||||
|
||||
it "returns index" do
|
||||
it 'redirects to work items index page' do
|
||||
get :index, params: { namespace_id: project.namespace, project_id: project }
|
||||
|
||||
expect(response).to have_gitlab_http_status(:ok)
|
||||
expect(response).to redirect_to(project_work_items_path(project, 'type[]' => 'issue'))
|
||||
end
|
||||
|
||||
context 'when work_item_planning_view: false' do
|
||||
before do
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
it "returns index" do
|
||||
get :index, params: { namespace_id: project.namespace, project_id: project }
|
||||
|
||||
expect(response).to have_gitlab_http_status(:ok)
|
||||
end
|
||||
|
||||
it_behaves_like 'set sort order from user preference' do
|
||||
let(:sorting_param) { 'updated_asc' }
|
||||
end
|
||||
end
|
||||
|
||||
it "returns 301 if request path doesn't match project path" do
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@ RSpec.describe 'Abuse reports', :js, feature_category: :insider_threat do
|
|||
let_it_be(:issue) { create(:issue, project: project, author: abusive_user) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
sign_in(reporter1)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,13 @@ RSpec.describe 'Breadcrumbs schema markup', :aggregate_failures, feature_categor
|
|||
let_it_be(:wiki_home_page) { create(:wiki_page, project: project, title: 'home') }
|
||||
let_it_be(:wiki_sub_page) { create(:wiki_page, project: project, title: 'home/subpage') }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
it 'generates the breadcrumb schema for user projects' do
|
||||
visit project_url(project)
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,10 @@ RSpec.describe 'Registration enabled callout', feature_category: :system_access
|
|||
end
|
||||
|
||||
it 'does not display callout on pages other than root, admin, or dashboard' do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
visit project_issues_path(project)
|
||||
|
||||
expect(page).not_to have_content callout_title
|
||||
|
|
|
|||
|
|
@ -13,6 +13,11 @@ RSpec.describe 'Canonical link', feature_category: :workspaces do
|
|||
let_it_be(:project_request) { project_url(project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,11 @@ RSpec.describe 'Dashboard Issues filtering', :js, feature_category: :team_planni
|
|||
let_it_be(:label2) { create(:label, title: 'bug') }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.labels << label
|
||||
project2.labels << label2
|
||||
project.add_maintainer(user)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,11 @@ RSpec.describe 'Group empty states', feature_category: :groups_and_projects do
|
|||
let(:user) { create(:group_member, :developer, user: create(:user), group: group).user }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -1,30 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe 'User browse group projects page', feature_category: :groups_and_projects do
|
||||
let(:user) { create :user }
|
||||
let(:group) { create :group }
|
||||
|
||||
context 'when user is owner' do
|
||||
before do
|
||||
group.add_owner(user)
|
||||
end
|
||||
|
||||
context 'when user signed in' do
|
||||
before do
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
context 'when group has archived project', :js do
|
||||
let!(:project) { create :project, :archived, namespace: group }
|
||||
|
||||
it 'redirects to the groups overview page' do
|
||||
visit projects_group_path(group)
|
||||
|
||||
expect(page).to have_current_path(group_path(group))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -22,6 +22,11 @@ RSpec.describe 'Project Issues Calendar Feed', feature_category: :groups_and_pro
|
|||
let!(:issue) { create(:issue, author: user, assignees: [assignee], project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_developer(user)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -22,6 +22,11 @@ RSpec.describe 'Incident details', :js, feature_category: :incident_management d
|
|||
end
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
sign_in(developer)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,11 @@ RSpec.describe "User views incident", feature_category: :incident_management do
|
|||
let(:incident) { create(:incident, project: project, description: description, author: author) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
sign_in(user)
|
||||
|
||||
visit(incident_project_issues_path(project, incident))
|
||||
|
|
|
|||
|
|
@ -9,6 +9,11 @@ RSpec.describe 'issuable list', :js, feature_category: :team_planning do
|
|||
issuable_types = [:issue, :merge_request]
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_member(user, :developer)
|
||||
sign_in(user)
|
||||
issuable_types.each { |type| create_issuables(type) }
|
||||
|
|
|
|||
|
|
@ -13,6 +13,13 @@ RSpec.describe 'Sort Issuable List', feature_category: :team_planning do
|
|||
let(:first_updated_issuable) { issuables.order_updated_asc.first }
|
||||
let(:last_updated_issuable) { issuables.order_updated_desc.first }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
context 'for merge requests' do
|
||||
include MergeRequestHelpers
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,11 @@ RSpec.describe 'Issue rebalancing', feature_category: :team_planning do
|
|||
before do
|
||||
sign_in(user)
|
||||
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
stub_feature_flags(block_issue_repositioning: true)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,11 @@ RSpec.describe 'Issues csv', :js, feature_category: :team_planning do
|
|||
let!(:issue) { create(:issue, project: project, author: user) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
sign_in(user)
|
||||
visit project_issues_path(project)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -9,6 +9,13 @@ RSpec.describe 'Dropdown assignee', :js, feature_category: :team_planning do
|
|||
let_it_be(:user) { create(:user) }
|
||||
let_it_be(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
describe 'behavior' do
|
||||
before do
|
||||
project.add_maintainer(user)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,11 @@ RSpec.describe 'Dropdown author', :js, feature_category: :team_planning do
|
|||
let_it_be(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_maintainer(user)
|
||||
sign_in(user)
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,11 @@ RSpec.describe 'Dropdown base', :js, feature_category: :team_planning do
|
|||
let_it_be(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_maintainer(user)
|
||||
sign_in(user)
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@ RSpec.describe 'Dropdown emoji', :js, feature_category: :team_planning do
|
|||
let_it_be(:award_emoji_star) { create(:award_emoji, name: 'star', user: user, awardable: issue) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_maintainer(user)
|
||||
create_list(:award_emoji, 2, user: user, name: AwardEmoji::THUMBS_UP)
|
||||
create_list(:award_emoji, 1, user: user, name: AwardEmoji::THUMBS_DOWN)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,11 @@ RSpec.describe 'Dropdown hint', :js, feature_category: :team_planning do
|
|||
let_it_be(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_maintainer(user)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,11 @@ RSpec.describe 'Dropdown label', :js, feature_category: :team_planning do
|
|||
let_it_be(:label) { create(:label, project: project, title: 'bug-label') }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_maintainer(user)
|
||||
sign_in(user)
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,11 @@ RSpec.describe 'Dropdown milestone', :js, feature_category: :team_planning do
|
|||
let_it_be(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_maintainer(user)
|
||||
sign_in(user)
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,11 @@ RSpec.describe 'Dropdown release', :js, feature_category: :team_planning do
|
|||
let_it_be(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_maintainer(user)
|
||||
sign_in(user)
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,11 @@ RSpec.describe 'Filter issues', :js, feature_category: :team_planning do
|
|||
end
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_maintainer(user)
|
||||
|
||||
create(:issue, project: project, author: user2, title: "Bug report 1")
|
||||
|
|
|
|||
|
|
@ -13,6 +13,11 @@ RSpec.describe 'Recent searches', :js, feature_category: :team_planning do
|
|||
let(:project_1_local_storage_key) { "#{project_1.full_path}-issue-recent-searches" }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
# Visit any fast-loading page so we can clear local storage without a DOM exception
|
||||
visit '/404'
|
||||
remove_recent_searches
|
||||
|
|
|
|||
|
|
@ -10,6 +10,11 @@ RSpec.describe 'Search bar', :js, feature_category: :team_planning do
|
|||
let_it_be(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_maintainer(user)
|
||||
sign_in(user)
|
||||
|
||||
|
|
|
|||
|
|
@ -15,6 +15,11 @@ RSpec.describe 'Visual tokens', :js, feature_category: :team_planning do
|
|||
let_it_be(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_member(user, :maintainer)
|
||||
project.add_member(user_rock, :maintainer)
|
||||
sign_in(user)
|
||||
|
|
|
|||
|
|
@ -4,6 +4,11 @@ require 'spec_helper'
|
|||
|
||||
RSpec.describe 'Group label on issue', :with_license, feature_category: :team_planning do
|
||||
it 'renders link to the project issues page', :js do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
group = create(:group)
|
||||
project = create(:project, :public, namespace: group)
|
||||
feature = create(:group_label, group: group, title: 'feature')
|
||||
|
|
|
|||
|
|
@ -24,6 +24,13 @@ RSpec.describe 'Incident Detail', :js, feature_category: :team_planning do
|
|||
let_it_be(:alert) { create(:alert_management_alert, project: project, payload: payload, started_at: started_at) }
|
||||
let_it_be(:incident) { create(:incident, project: project, description: 'hello', alert_management_alert: alert) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
context 'when user displays the incident' do
|
||||
before do
|
||||
project.add_developer(user)
|
||||
|
|
|
|||
|
|
@ -9,6 +9,13 @@ RSpec.describe 'Issue Detail', :js, feature_category: :team_planning do
|
|||
let(:issue) { create(:issue, project: project, author: user) }
|
||||
let(:incident) { create(:incident, project: project, author: user) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
context 'when user displays the issue' do
|
||||
before do
|
||||
visit project_issue_path(project, issue)
|
||||
|
|
|
|||
|
|
@ -9,6 +9,13 @@ RSpec.describe 'Project Issues RSS', :js, feature_category: :team_planning do
|
|||
let_it_be(:path) { project_issues_path(project) }
|
||||
let_it_be(:issue) { create(:issue, project: project, assignees: [user]) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
context 'when signed in' do
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,11 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des
|
|||
let_it_be(:support_bot) { Users::Internal.support_bot }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
# The following two conditions equate to ServiceDesk.supported == true
|
||||
allow(Gitlab::Email::IncomingEmail).to receive(:enabled?).and_return(true)
|
||||
allow(Gitlab::Email::IncomingEmail).to receive(:supports_wildcard?).and_return(true)
|
||||
|
|
|
|||
|
|
@ -15,6 +15,13 @@ RSpec.describe 'Issues > Labels bulk assignment', feature_category: :team_planni
|
|||
let(:issue_1_selector) { "#issuable_#{issue1.id}" }
|
||||
let(:issue_2_selector) { "#issuable_#{issue2.id}" }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
context 'as an allowed user', :js do
|
||||
before do
|
||||
project.add_maintainer(user)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,11 @@ RSpec.describe 'Multiple issue updating from issues#index', :js, feature_categor
|
|||
let!(:user) { create(:user) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_maintainer(user)
|
||||
sign_in(user)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -7,6 +7,11 @@ RSpec.describe 'Issues > User creates issue by email', feature_category: :team_p
|
|||
let_it_be(:project) { create(:project, :public) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
sign_in(user)
|
||||
|
||||
project.add_developer(user)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,13 @@ RSpec.describe "User creates issue", feature_category: :team_planning do
|
|||
let_it_be(:project) { create(:project_empty_repo, :public) }
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
context "when unauthenticated" do
|
||||
before do
|
||||
sign_out(:user)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,11 @@ RSpec.describe 'User filters issues', :js, feature_category: :team_planning do
|
|||
let_it_be(:project) { create(:project_empty_repo, :public) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need these tests for issues, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
%w[foobar barbaz].each do |title|
|
||||
create(
|
||||
:issue,
|
||||
|
|
|
|||
|
|
@ -8,6 +8,11 @@ RSpec.describe 'Issues > User resets their incoming email token', feature_catego
|
|||
let_it_be(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
stub_incoming_email_setting(enabled: true, address: "p+%{key}@gl.ab")
|
||||
project.add_maintainer(user)
|
||||
sign_in(user)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,11 @@ RSpec.describe 'New issue breadcrumb', :js, feature_category: :team_planning do
|
|||
let(:user) { project.creator }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
sign_in(user)
|
||||
visit(new_project_issue_path(project))
|
||||
end
|
||||
|
|
|
|||
|
|
@ -6,6 +6,13 @@ RSpec.describe 'Issues > User sees empty state', :js, feature_category: :team_pl
|
|||
let_it_be(:project) { create(:project, :public) }
|
||||
let_it_be(:user) { project.creator }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
shared_examples_for 'empty state with filters' do
|
||||
it 'user sees empty state with filters' do
|
||||
create(:issue, author: user, project: project)
|
||||
|
|
|
|||
|
|
@ -17,6 +17,11 @@ RSpec.describe "User sorts issues", feature_category: :team_planning do
|
|||
let_it_be(:later_due_milestone) { create(:milestone, project: project, due_date: '2013-12-12') }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
create_list(:award_emoji, 2, :upvote, awardable: issue1)
|
||||
create_list(:award_emoji, 2, :downvote, awardable: issue2)
|
||||
create(:award_emoji, :downvote, awardable: issue1)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,13 @@ RSpec.describe "User views issues", feature_category: :team_planning do
|
|||
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
shared_examples "opens issue from list" do
|
||||
it "opens issue" do
|
||||
click_link(issue.title)
|
||||
|
|
|
|||
|
|
@ -21,6 +21,11 @@ RSpec.describe 'Labels Hierarchy', :js, feature_category: :team_planning do
|
|||
let!(:project_label_1) { create(:label, project: project_1, title: 'Label_4') }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
grandparent.add_owner(user)
|
||||
|
||||
sign_in(user)
|
||||
|
|
|
|||
|
|
@ -17,6 +17,11 @@ RSpec.describe 'User sorts merge requests', :js, feature_category: :code_review_
|
|||
let_it_be(:project) { create(:project, :public, group: group) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
sign_in(user)
|
||||
|
||||
visit(project_merge_requests_path(project))
|
||||
|
|
|
|||
|
|
@ -10,6 +10,11 @@ RSpec.describe "User views milestone", feature_category: :team_planning do
|
|||
let_it_be(:labels) { create_list(:label, 2, project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,11 @@ RSpec.describe 'Monitor dropdown sidebar', :js, feature_category: :shared do
|
|||
let(:role) { nil }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
project.add_role(user, role) if role
|
||||
sign_in(user)
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,13 @@ RSpec.describe 'Issue prioritization', feature_category: :team_planning do
|
|||
let(:label_4) { create(:label, title: 'label_4', project: project, priority: 4) }
|
||||
let(:label_5) { create(:label, title: 'label_5', project: project) } # no priority
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
# According to https://gitlab.com/gitlab-org/gitlab-foss/issues/14189#note_4360653
|
||||
context 'when issues have one label', :js do
|
||||
it 'are sorted properly' do
|
||||
|
|
|
|||
|
|
@ -39,6 +39,11 @@ RSpec.describe 'Task Lists', :js, feature_category: :team_planning do
|
|||
end
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe 'Redirect from issues', :js, feature_category: :team_planning do
|
||||
let_it_be(:user) { create(:user) }
|
||||
let_it_be(:group) { create(:group) }
|
||||
let_it_be(:project) { create(:project, :public, group: group, developers: [user]) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
context 'for signed in user' do
|
||||
before do
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
context 'when work_item_planning_view feature flag if disabled' do
|
||||
before do
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
it 'do not redirect to work items', :aggregate_failures do
|
||||
visit project_issues_path(project)
|
||||
|
||||
expect(page).to have_current_path(project_issues_path(project))
|
||||
end
|
||||
end
|
||||
|
||||
context 'when work_item_planning_view feature flag if enabled' do
|
||||
before do
|
||||
stub_feature_flags(work_item_planning_view: true)
|
||||
end
|
||||
|
||||
it 'redirects to work items', :aggregate_failures do
|
||||
visit project_issues_path(project)
|
||||
|
||||
expect(page).to have_current_path(project_work_items_path(project, 'type[]': 'issue'))
|
||||
end
|
||||
|
||||
context 'and the original request has a sorting parameter' do
|
||||
it 'redirects to work items', :aggregate_failures do
|
||||
visit project_issues_path(project, sort: 'updated_desc')
|
||||
|
||||
expect(page).to have_current_path(project_work_items_path(project, 'type[]': 'issue', sort: 'updated_desc'))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -23,6 +23,13 @@ RSpec.describe 'Work item detail', :js, feature_category: :team_planning do
|
|||
let(:list_path) { project_issues_path(project) }
|
||||
let(:work_items_path) { project_work_item_path(project, work_item.iid) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
shared_examples 'change type action is not displayed' do
|
||||
it 'change type action is not displayed' do
|
||||
click_button _('More actions'), match: :first
|
||||
|
|
|
|||
|
|
@ -1517,6 +1517,8 @@ export const workItemResponseFactory = ({
|
|||
descriptionHtml = '<p data-sourcepos="1:1-1:19" dir="auto">some <strong>great</strong> text</p>',
|
||||
developmentWidgetPresent = false,
|
||||
customFieldsWidgetPresent = true,
|
||||
statusWidgetPresent = false,
|
||||
statusWidgetValues = null,
|
||||
customFieldValues = null,
|
||||
movedToWorkItemUrl = null,
|
||||
duplicatedToWorkItemUrl = null,
|
||||
|
|
@ -1864,6 +1866,13 @@ export const workItemResponseFactory = ({
|
|||
customFieldsWidgetPresent
|
||||
? customFieldsWidgetResponseFactory(customFieldValues)
|
||||
: { type: 'MOCK TYPE' },
|
||||
statusWidgetPresent
|
||||
? {
|
||||
__typename: 'WorkItemWidgetStatus',
|
||||
status: statusWidgetValues,
|
||||
type: 'STATUS',
|
||||
}
|
||||
: { type: 'MOCK TYPE' },
|
||||
],
|
||||
},
|
||||
},
|
||||
|
|
@ -5932,6 +5941,7 @@ export const createWorkItemQueryResponse = (widgets = []) => ({
|
|||
},
|
||||
{
|
||||
type: 'STATUS',
|
||||
status: null,
|
||||
__typename: 'WorkItemWidgetStatus',
|
||||
},
|
||||
{
|
||||
|
|
@ -6013,6 +6023,11 @@ export const createWorkItemQueryResponse = (widgets = []) => ({
|
|||
},
|
||||
__typename: 'WorkItemWidgetWeight',
|
||||
},
|
||||
{
|
||||
__typename: 'WorkItemWidgetStatus',
|
||||
status: null,
|
||||
type: 'STATUS',
|
||||
},
|
||||
...widgets,
|
||||
],
|
||||
__typename: 'WorkItem',
|
||||
|
|
|
|||
|
|
@ -6,6 +6,13 @@ RSpec.describe IssuablesHelper, feature_category: :team_planning do
|
|||
let(:label) { build_stubbed(:label) }
|
||||
let(:label2) { build_stubbed(:label) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
describe '#users_dropdown_label' do
|
||||
let(:user) { build_stubbed(:user) }
|
||||
let(:user2) { build_stubbed(:user) }
|
||||
|
|
|
|||
|
|
@ -10,6 +10,13 @@ RSpec.describe IssuesHelper, feature_category: :team_planning do
|
|||
let_it_be(:project) { create(:project) }
|
||||
let_it_be_with_reload(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
describe '#award_user_list' do
|
||||
it 'returns a comma-separated list of the first X users' do
|
||||
user = build_stubbed(:user, name: 'Joe')
|
||||
|
|
|
|||
|
|
@ -11,6 +11,13 @@ RSpec.describe Projects::AlertManagementHelper do
|
|||
let(:project_path) { project.full_path }
|
||||
let(:project_id) { project.id }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
describe '#alert_management_data' do
|
||||
let(:user_can_enable_alert_management) { true }
|
||||
let(:setting_path) { project_settings_operations_path(project, anchor: 'js-alert-management-settings') }
|
||||
|
|
|
|||
|
|
@ -8,6 +8,13 @@ RSpec.describe Projects::ErrorTrackingHelper do
|
|||
let(:project) { build_stubbed(:project) }
|
||||
let(:current_user) { build_stubbed(:user) }
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
describe '#error_tracking_data' do
|
||||
let(:can_enable_error_tracking) { true }
|
||||
let(:setting_path) { project_settings_operations_path(project) }
|
||||
|
|
|
|||
|
|
@ -19,6 +19,11 @@ RSpec.describe Projects::IncidentsHelper do
|
|||
end
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
|
||||
allow(helper).to receive(:current_user).and_return(user)
|
||||
allow(helper).to receive(:can?)
|
||||
.with(user, :create_incident, project)
|
||||
|
|
|
|||
|
|
@ -6,6 +6,13 @@ RSpec.describe SearchHelper, feature_category: :global_search do
|
|||
include MarkupHelper
|
||||
include BadgesHelper
|
||||
|
||||
before do
|
||||
# TODO: When removing the feature flag,
|
||||
# we won't need the tests for the issues listing page, since we'll be using
|
||||
# the work items listing page.
|
||||
stub_feature_flags(work_item_planning_view: false)
|
||||
end
|
||||
|
||||
# Override simple_sanitize for our testing purposes
|
||||
def simple_sanitize(str)
|
||||
str
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue