Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
1219ecf0ae
commit
b335b9cc0f
|
|
@ -1257,8 +1257,30 @@ lib/gitlab/checks/**
|
|||
/app/assets/javascripts/packages_and_registries/container_registry/
|
||||
/app/assets/javascripts/packages_and_registries/dependency_proxy/
|
||||
/app/assets/javascripts/packages_and_registries/harbor_registry/
|
||||
/app/concerns/dependency_proxy/
|
||||
/app/concerns/harbor/
|
||||
/app/concerns/registry/
|
||||
/app/controllers/groups/dependency_proxy/
|
||||
/app/controllers/groups/harbor/
|
||||
/app/controllers/groups/registry/
|
||||
/app/controllers/projects/harbor/
|
||||
/app/controllers/projects/registry/repositories_controller.rb
|
||||
/app/graphql/mutations/container_registry/
|
||||
/app/graphql/types/container_registry/
|
||||
/app/helpers/container_registry/
|
||||
/app/models/container_registry/
|
||||
/app/policies/container_expiration_policy_policy.rb
|
||||
/app/policies/container_repository_policy.rb
|
||||
/app/services/auth/container_registry_authentication_service.rb
|
||||
/app/services/container_registry/
|
||||
/app/views/groups/dependency_proxy/
|
||||
/app/views/groups/harbor/
|
||||
/app/views/groups/registry/repositories/
|
||||
/app/views/projects/harbor/
|
||||
/app/views/projects/registry/repositories/
|
||||
/ee/app/helpers/ee/container_registry/
|
||||
/ee/app/services/ee/auth/container_registry_authentication_service.rb
|
||||
app/services/auth/container_registry_authentication_service.rb
|
||||
/lib/container_registry/
|
||||
|
||||
[Authentication] @gitlab-org/software-supply-chain-security/authentication/approvers
|
||||
/app/assets/javascripts/access_tokens/
|
||||
|
|
|
|||
4
Gemfile
4
Gemfile
|
|
@ -314,7 +314,7 @@ gem 'rainbow', '~> 3.0', feature_category: :shared
|
|||
gem 'ruby-progressbar', '~> 1.10', feature_category: :shared
|
||||
|
||||
# Linear-time regex library for untrusted regular expressions
|
||||
gem 're2', '2.7.0', feature_category: :shared
|
||||
gem 're2', '~> 2.15', feature_category: :shared
|
||||
|
||||
# Misc
|
||||
|
||||
|
|
@ -435,7 +435,7 @@ gem 'snowplow-tracker', '~> 0.8.0', feature_category: :product_analytics
|
|||
|
||||
# Metrics
|
||||
gem 'webrick', '~> 1.8.1', require: false, feature_category: :shared
|
||||
gem 'prometheus-client-mmap', '~> 1.1', '>= 1.1.1', require: 'prometheus/client', feature_category: :shared
|
||||
gem 'prometheus-client-mmap', '~> 1.2.8', require: 'prometheus/client', feature_category: :shared
|
||||
|
||||
# Event-driven reactor for Ruby
|
||||
# Required manually in config/initializers/require_async_gem
|
||||
|
|
|
|||
|
|
@ -227,13 +227,13 @@
|
|||
{"name":"gitlab-dangerfiles","version":"4.8.1","platform":"ruby","checksum":"bbad321c9638152a643d27a20b35ba1e2d8eddcc6bdfc4493d7b96e816ecf300"},
|
||||
{"name":"gitlab-experiment","version":"0.9.1","platform":"ruby","checksum":"f230ee742154805a755d5f2539dc44d93cdff08c5bbbb7656018d61f93d01f48"},
|
||||
{"name":"gitlab-fog-azure-rm","version":"2.2.0","platform":"ruby","checksum":"31aa7c2170f57874053144e7f716ec9e15f32e71ffbd2c56753dce46e2e78ba9"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"aarch64-linux-gnu","checksum":"7a878fad428f695b3009c074aefd11456fb342b50542c45c6ca75d9bf8525e4c"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"aarch64-linux-musl","checksum":"6f5e2729fc4ce56ee6c5fa9b84fcdad4acdee090a6b9a127cf57211075725c72"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"arm64-darwin","checksum":"93f8ce53e3fcf7ef41c4528567a700dc8b091f083eb203c0336f4955fb5bac0a"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"ruby","checksum":"255960e6ed9685564915ed36172bbfcdf953d5500331d919529d87f5108f7b77"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"x86_64-darwin","checksum":"af68baf750f76bd04aa095a2d9ba1e34cf5aaf27a487bb7c0af0c94baa31cdf3"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"x86_64-linux-gnu","checksum":"d705dbb9075acf2f6a9b03bd276dae9fa4a15c05cc71e924c7d923c3c63b33d2"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"x86_64-linux-musl","checksum":"f12c42e7c230b6e6fc086de2e16c4aae8bc7b1633ddd1394f4328dba3cb9a976"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"aarch64-linux-gnu","checksum":"bb954cb5dc995f4720edb84caba2112aa54e3d48c18fc1cb552f4ea994a9d518"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"aarch64-linux-musl","checksum":"53cc1b44658860dae476c27ea2e78a36d5e8d39c51003d98267821685665162b"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"arm64-darwin","checksum":"ea05243121cc05ae41fce162be2fd0b86be06b6edc122ac0688cbb0e45341c97"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"ruby","checksum":"82cf8ffc22092cf1e17eb28a1dae8b63a4a141acc1b2864a0c11efc544b53c0f"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"x86_64-darwin","checksum":"ec6775054481b3e07a97d4be945fe41d043f89dc1fa1d95cdfc6a70b439ea0e4"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"x86_64-linux-gnu","checksum":"ebcccc617db4f669cd2de900e6d31fae5de67acedeb178d242063e338cb57050"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"x86_64-linux-musl","checksum":"77cf356f2a2fc496ec17206d68a6a1fe4f4d680bc1aac2206c32ee5393611a15"},
|
||||
{"name":"gitlab-kas-grpc","version":"17.8.1","platform":"ruby","checksum":"fbb9cf7411d12a7dc491d688a80a1d4064bd92dfbbadce523a549b07d26226e6"},
|
||||
{"name":"gitlab-labkit","version":"0.37.0","platform":"ruby","checksum":"d2dd0a60db2149a9a8eebf2975dc23f54ac3ceb01bdba732eb1b26b86dfffa70"},
|
||||
{"name":"gitlab-license","version":"2.6.0","platform":"ruby","checksum":"2c1f8ae73835640ec77bf758c1d0c9730635043c01cf77902f7976e826d7d016"},
|
||||
|
|
@ -526,13 +526,13 @@
|
|||
{"name":"prime","version":"0.1.2","platform":"ruby","checksum":"d4e956cadfaf04de036dc7dc74f95bf6a285a62cc509b28b7a66b245d19fe3a4"},
|
||||
{"name":"prism","version":"1.2.0","platform":"ruby","checksum":"24ff9cd3232346e68052659f14c9a618022ea98935f774df465206aba5c06d2f"},
|
||||
{"name":"proc_to_ast","version":"0.1.0","platform":"ruby","checksum":"92a73fa66e2250a83f8589f818b0751bcf227c68f85916202df7af85082f8691"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"aarch64-linux-gnu","checksum":"6156d76ecc0a36f1f407180d50c0780497eef320d886e7af175c5ff7dc8903a4"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"aarch64-linux-musl","checksum":"7cf5c16c94f731fb5bafda3cb2701e5bae7361fc6ea2d0cee0dd49bce952c388"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"arm64-darwin","checksum":"9174d200c265522967764ea66189661915011defdae5ab8537c80b00aeacae30"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"ruby","checksum":"7ce1294c6b992f4c556f7217d904c38dbd7f530ec8b5a0447d3e1af6bd72503a"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"x86_64-darwin","checksum":"47a28c5eb7659a1f1eb1be87893fb454b780290dc8bd753a66117dd4c791af4d"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"x86_64-linux-gnu","checksum":"70d4782a5bc1762ac766f86b02dfe6e628281b2111ffb00ca312b5b11db641ea"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"x86_64-linux-musl","checksum":"95568e92bc59dccf0504d087b4a4b1412aae2884b24e4f337f80972574fc7586"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"aarch64-linux-gnu","checksum":"7a3e8d7e95f7e53a6870381135f5f4b6c8c3f3b244b7cd760e3582c5abd86512"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"aarch64-linux-musl","checksum":"87f1cf92f39ce2be861732820c6b719dda4ee9a97b5bf7a627510a45b5a50977"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"arm64-darwin","checksum":"d828fecea444373367e7d3c7c67c898479816a6400813f641634ba2f64ca91c5"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"ruby","checksum":"de402deeb56234fb8866bebe91c69410a8f8e377ac557305c688e8e1705f0a75"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"x86_64-darwin","checksum":"a4501fb9da7a89200e6f8aeaecdbe9e06f491083cac7a611a0c37feeb803adff"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"x86_64-linux-gnu","checksum":"68cd5e4d0c9be98129f27856f2746c4b21b7162edbe48d71dfd76143097c4b8e"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"x86_64-linux-musl","checksum":"3f618d48a631a72027d1cfd090a904d4abfd3e543eec10e0d89f456633e35510"},
|
||||
{"name":"pry","version":"0.14.2","platform":"java","checksum":"fd780670977ba04ff7ee32dabd4d02fe4bf02e977afe8809832d5dca1412862e"},
|
||||
{"name":"pry","version":"0.14.2","platform":"ruby","checksum":"c4fe54efedaca1d351280b45b8849af363184696fcac1c72e0415f9bdac4334d"},
|
||||
{"name":"pry-byebug","version":"3.10.1","platform":"ruby","checksum":"c8f975c32255bfdb29e151f5532130be64ff3d0042dc858d0907e849125581f8"},
|
||||
|
|
@ -563,22 +563,27 @@
|
|||
{"name":"railties","version":"7.0.8.7","platform":"ruby","checksum":"1ab985280b02bc4b176d36e1011148db600b763c646e3de88c02a665d864505f"},
|
||||
{"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"},
|
||||
{"name":"rb-fsevent","version":"0.11.2","platform":"ruby","checksum":"43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe"},
|
||||
{"name":"rb-inotify","version":"0.10.1","platform":"ruby","checksum":"050062d4f31d307cca52c3f6a7f4b946df8de25fc4bd373e1a5142e41034a7ca"},
|
||||
{"name":"rb_sys","version":"0.9.107","platform":"ruby","checksum":"f1a2fb89c3320e8b8075dbf3353c66b1f0e3fab17ac834579bb1fe56c49f40f6"},
|
||||
{"name":"rb_sys","version":"0.9.110","platform":"ruby","checksum":"8993fd1f49b5f6b394b49dafda77fb5c635458637f8effe508cca78ebc03427d"},
|
||||
{"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":"re2","version":"2.7.0","platform":"aarch64-linux","checksum":"778921298b6e8aba26a6230dd298c9b361b92e45024f81fa6aee788060fa307c"},
|
||||
{"name":"re2","version":"2.7.0","platform":"arm-linux","checksum":"d328b5286d83ae265e13b855da8e348a976f80f91b748045b52073a570577954"},
|
||||
{"name":"re2","version":"2.7.0","platform":"arm64-darwin","checksum":"7d993f27a1afac4001c539a829e2af211ced62604930c90df32a307cf74cb4a4"},
|
||||
{"name":"re2","version":"2.7.0","platform":"ruby","checksum":"319d88d2a8ff32eba45286e58a8d49bd8b59167afa718946165b67fec2ea13dc"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x64-mingw-ucrt","checksum":"30ac6e9831f2e2237f5c6f2813f1f708110b7b707e571504aae56083eb26011c"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x64-mingw32","checksum":"78c98a7d4d272eedb6b5779c25b55d8f8ddd4ba4b0b6f402616e4717f785841d"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x86-linux","checksum":"0c7ba10b907738402577e4a4d7b980fbaae05850f418a4d7061a7ba531a4fe57"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x86-mingw32","checksum":"3560795ee796386a50f5c5f002d0a8570995da48599d524cac23d3822b9a1d7f"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x86_64-darwin","checksum":"49afef32dbc8b0a0fe978668489bdc3f016c30afb20d0aecb75db0454297c4ff"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x86_64-linux","checksum":"be9095c33e9628644fd876c1e6379cbd6a99a1c786d496e087491471f78d53fc"},
|
||||
{"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"},
|
||||
{"name":"re2","version":"2.15.0","platform":"arm-linux-musl","checksum":"a5376b6655134d7320cc3282659035c20a26f2641643fe33c2d04417b07532a8"},
|
||||
{"name":"re2","version":"2.15.0","platform":"arm64-darwin","checksum":"184e2273699d6433aaeb8dcc2347ea794a14a34ae4cbb5f83a76c521ebb1a591"},
|
||||
{"name":"re2","version":"2.15.0","platform":"ruby","checksum":"049822aa6f7a64352624f632cb8e5693619c365d22f49087805411352a0d5bd8"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x64-mingw-ucrt","checksum":"e62a623b30b917f9845abf818c1d5c2d468859a1e3d9d4abf24fc2db40445322"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x64-mingw32","checksum":"29bed8b2711d9f8d442f1f00149393331698c9f2b82281b7df6c58b7cf4990a7"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86-linux-gnu","checksum":"2f1fbb0336eca29d3bfbe6883f4f8118f1c25f1e7d74f3bc0391dfe7334f9fc6"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86-linux-musl","checksum":"8470a2ca5019132114379fcef25117f703e20f8e25604d378a71e80746b9b22a"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86-mingw32","checksum":"f0c7ece48e92f6db2595dc2af733131371cd9e0d3dec87f1c3ab8dbe35de1076"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86_64-darwin","checksum":"c3c43f001b7fef3732d9992def52a125ca2c0fb6fcd88fcf258b5b3f6e70fd8f"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86_64-linux-gnu","checksum":"d7b7eb32c3b9aa7af7c826f51959781763191c86c07fe3714735d0e6d012766a"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86_64-linux-musl","checksum":"3c3d9afb96a8c13fa617cf273333fcf7344bb7831050d3e01b5ffcdef5cff3ce"},
|
||||
{"name":"recaptcha","version":"5.12.3","platform":"ruby","checksum":"37d1894add9e70a54d0c6c7f0ecbeedffbfa7d075acfbd4c509818dfdebdb7ee"},
|
||||
{"name":"recursive-open-struct","version":"1.1.3","platform":"ruby","checksum":"a3538a72552fcebcd0ada657bdff313641a4a5fbc482c08cfb9a65acb1c9de5a"},
|
||||
{"name":"redcarpet","version":"3.6.0","platform":"ruby","checksum":"8ad1889c0355ff4c47174af14edd06d62f45a326da1da6e8a121d59bdcd2e9e9"},
|
||||
|
|
|
|||
21
Gemfile.lock
21
Gemfile.lock
|
|
@ -746,8 +746,8 @@ GEM
|
|||
mime-types
|
||||
net-http-persistent (~> 4.0)
|
||||
nokogiri (~> 1, >= 1.10.8)
|
||||
gitlab-glfm-markdown (0.0.24)
|
||||
rb_sys (= 0.9.107)
|
||||
gitlab-glfm-markdown (0.0.27)
|
||||
rb_sys (~> 0.9.109)
|
||||
gitlab-kas-grpc (17.8.1)
|
||||
grpc (~> 1.0)
|
||||
gitlab-labkit (0.37.0)
|
||||
|
|
@ -1458,10 +1458,11 @@ GEM
|
|||
coderay
|
||||
parser
|
||||
unparser
|
||||
prometheus-client-mmap (1.2.6)
|
||||
prometheus-client-mmap (1.2.8)
|
||||
base64
|
||||
bigdecimal
|
||||
rb_sys (~> 0.9.86)
|
||||
logger
|
||||
rb_sys (~> 0.9.109)
|
||||
pry (0.14.2)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
|
|
@ -1539,10 +1540,12 @@ GEM
|
|||
zeitwerk (~> 2.5)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
rake-compiler-dock (1.9.1)
|
||||
rb-fsevent (0.11.2)
|
||||
rb-inotify (0.10.1)
|
||||
ffi (~> 1.0)
|
||||
rb_sys (0.9.107)
|
||||
rb_sys (0.9.110)
|
||||
rake-compiler-dock (= 1.9.1)
|
||||
rbs (3.6.1)
|
||||
logger
|
||||
rbtrace (0.5.1)
|
||||
|
|
@ -1550,8 +1553,8 @@ GEM
|
|||
msgpack (>= 0.4.3)
|
||||
optimist (>= 3.0.0)
|
||||
rchardet (1.8.0)
|
||||
re2 (2.7.0)
|
||||
mini_portile2 (~> 2.8.5)
|
||||
re2 (2.15.0)
|
||||
mini_portile2 (~> 2.8.7)
|
||||
recaptcha (5.12.3)
|
||||
json
|
||||
recursive-open-struct (1.1.3)
|
||||
|
|
@ -2252,7 +2255,7 @@ DEPENDENCIES
|
|||
pg_query (~> 6.0.0)
|
||||
png_quantizator (~> 0.2.1)
|
||||
premailer-rails (~> 1.12.0)
|
||||
prometheus-client-mmap (~> 1.1, >= 1.1.1)
|
||||
prometheus-client-mmap (~> 1.2.8)
|
||||
pry-byebug
|
||||
pry-rails (~> 0.3.9)
|
||||
pry-shell (~> 0.6.4)
|
||||
|
|
@ -2268,7 +2271,7 @@ DEPENDENCIES
|
|||
rails-i18n (~> 7.0, >= 7.0.9)
|
||||
rainbow (~> 3.0)
|
||||
rbtrace (~> 0.4)
|
||||
re2 (= 2.7.0)
|
||||
re2 (~> 2.15)
|
||||
recaptcha (~> 5.12)
|
||||
redis (~> 5.3.0)
|
||||
redis-actionpack (~> 5.5.0)
|
||||
|
|
|
|||
|
|
@ -227,13 +227,13 @@
|
|||
{"name":"gitlab-dangerfiles","version":"4.8.1","platform":"ruby","checksum":"bbad321c9638152a643d27a20b35ba1e2d8eddcc6bdfc4493d7b96e816ecf300"},
|
||||
{"name":"gitlab-experiment","version":"0.9.1","platform":"ruby","checksum":"f230ee742154805a755d5f2539dc44d93cdff08c5bbbb7656018d61f93d01f48"},
|
||||
{"name":"gitlab-fog-azure-rm","version":"2.2.0","platform":"ruby","checksum":"31aa7c2170f57874053144e7f716ec9e15f32e71ffbd2c56753dce46e2e78ba9"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"aarch64-linux-gnu","checksum":"7a878fad428f695b3009c074aefd11456fb342b50542c45c6ca75d9bf8525e4c"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"aarch64-linux-musl","checksum":"6f5e2729fc4ce56ee6c5fa9b84fcdad4acdee090a6b9a127cf57211075725c72"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"arm64-darwin","checksum":"93f8ce53e3fcf7ef41c4528567a700dc8b091f083eb203c0336f4955fb5bac0a"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"ruby","checksum":"255960e6ed9685564915ed36172bbfcdf953d5500331d919529d87f5108f7b77"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"x86_64-darwin","checksum":"af68baf750f76bd04aa095a2d9ba1e34cf5aaf27a487bb7c0af0c94baa31cdf3"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"x86_64-linux-gnu","checksum":"d705dbb9075acf2f6a9b03bd276dae9fa4a15c05cc71e924c7d923c3c63b33d2"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.24","platform":"x86_64-linux-musl","checksum":"f12c42e7c230b6e6fc086de2e16c4aae8bc7b1633ddd1394f4328dba3cb9a976"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"aarch64-linux-gnu","checksum":"bb954cb5dc995f4720edb84caba2112aa54e3d48c18fc1cb552f4ea994a9d518"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"aarch64-linux-musl","checksum":"53cc1b44658860dae476c27ea2e78a36d5e8d39c51003d98267821685665162b"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"arm64-darwin","checksum":"ea05243121cc05ae41fce162be2fd0b86be06b6edc122ac0688cbb0e45341c97"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"ruby","checksum":"82cf8ffc22092cf1e17eb28a1dae8b63a4a141acc1b2864a0c11efc544b53c0f"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"x86_64-darwin","checksum":"ec6775054481b3e07a97d4be945fe41d043f89dc1fa1d95cdfc6a70b439ea0e4"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"x86_64-linux-gnu","checksum":"ebcccc617db4f669cd2de900e6d31fae5de67acedeb178d242063e338cb57050"},
|
||||
{"name":"gitlab-glfm-markdown","version":"0.0.27","platform":"x86_64-linux-musl","checksum":"77cf356f2a2fc496ec17206d68a6a1fe4f4d680bc1aac2206c32ee5393611a15"},
|
||||
{"name":"gitlab-kas-grpc","version":"17.8.1","platform":"ruby","checksum":"fbb9cf7411d12a7dc491d688a80a1d4064bd92dfbbadce523a549b07d26226e6"},
|
||||
{"name":"gitlab-labkit","version":"0.37.0","platform":"ruby","checksum":"d2dd0a60db2149a9a8eebf2975dc23f54ac3ceb01bdba732eb1b26b86dfffa70"},
|
||||
{"name":"gitlab-license","version":"2.6.0","platform":"ruby","checksum":"2c1f8ae73835640ec77bf758c1d0c9730635043c01cf77902f7976e826d7d016"},
|
||||
|
|
@ -531,13 +531,13 @@
|
|||
{"name":"prime","version":"0.1.2","platform":"ruby","checksum":"d4e956cadfaf04de036dc7dc74f95bf6a285a62cc509b28b7a66b245d19fe3a4"},
|
||||
{"name":"prism","version":"1.2.0","platform":"ruby","checksum":"24ff9cd3232346e68052659f14c9a618022ea98935f774df465206aba5c06d2f"},
|
||||
{"name":"proc_to_ast","version":"0.1.0","platform":"ruby","checksum":"92a73fa66e2250a83f8589f818b0751bcf227c68f85916202df7af85082f8691"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"aarch64-linux-gnu","checksum":"6156d76ecc0a36f1f407180d50c0780497eef320d886e7af175c5ff7dc8903a4"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"aarch64-linux-musl","checksum":"7cf5c16c94f731fb5bafda3cb2701e5bae7361fc6ea2d0cee0dd49bce952c388"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"arm64-darwin","checksum":"9174d200c265522967764ea66189661915011defdae5ab8537c80b00aeacae30"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"ruby","checksum":"7ce1294c6b992f4c556f7217d904c38dbd7f530ec8b5a0447d3e1af6bd72503a"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"x86_64-darwin","checksum":"47a28c5eb7659a1f1eb1be87893fb454b780290dc8bd753a66117dd4c791af4d"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"x86_64-linux-gnu","checksum":"70d4782a5bc1762ac766f86b02dfe6e628281b2111ffb00ca312b5b11db641ea"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.6","platform":"x86_64-linux-musl","checksum":"95568e92bc59dccf0504d087b4a4b1412aae2884b24e4f337f80972574fc7586"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"aarch64-linux-gnu","checksum":"7a3e8d7e95f7e53a6870381135f5f4b6c8c3f3b244b7cd760e3582c5abd86512"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"aarch64-linux-musl","checksum":"87f1cf92f39ce2be861732820c6b719dda4ee9a97b5bf7a627510a45b5a50977"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"arm64-darwin","checksum":"d828fecea444373367e7d3c7c67c898479816a6400813f641634ba2f64ca91c5"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"ruby","checksum":"de402deeb56234fb8866bebe91c69410a8f8e377ac557305c688e8e1705f0a75"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"x86_64-darwin","checksum":"a4501fb9da7a89200e6f8aeaecdbe9e06f491083cac7a611a0c37feeb803adff"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"x86_64-linux-gnu","checksum":"68cd5e4d0c9be98129f27856f2746c4b21b7162edbe48d71dfd76143097c4b8e"},
|
||||
{"name":"prometheus-client-mmap","version":"1.2.8","platform":"x86_64-linux-musl","checksum":"3f618d48a631a72027d1cfd090a904d4abfd3e543eec10e0d89f456633e35510"},
|
||||
{"name":"pry","version":"0.14.2","platform":"java","checksum":"fd780670977ba04ff7ee32dabd4d02fe4bf02e977afe8809832d5dca1412862e"},
|
||||
{"name":"pry","version":"0.14.2","platform":"ruby","checksum":"c4fe54efedaca1d351280b45b8849af363184696fcac1c72e0415f9bdac4334d"},
|
||||
{"name":"pry-byebug","version":"3.10.1","platform":"ruby","checksum":"c8f975c32255bfdb29e151f5532130be64ff3d0042dc858d0907e849125581f8"},
|
||||
|
|
@ -571,23 +571,28 @@
|
|||
{"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"},
|
||||
{"name":"rb-fsevent","version":"0.11.2","platform":"ruby","checksum":"43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe"},
|
||||
{"name":"rb-inotify","version":"0.10.1","platform":"ruby","checksum":"050062d4f31d307cca52c3f6a7f4b946df8de25fc4bd373e1a5142e41034a7ca"},
|
||||
{"name":"rb_sys","version":"0.9.107","platform":"ruby","checksum":"f1a2fb89c3320e8b8075dbf3353c66b1f0e3fab17ac834579bb1fe56c49f40f6"},
|
||||
{"name":"rb_sys","version":"0.9.110","platform":"ruby","checksum":"8993fd1f49b5f6b394b49dafda77fb5c635458637f8effe508cca78ebc03427d"},
|
||||
{"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.11.0","platform":"ruby","checksum":"bec66fb9b019be64f7ba7d2cd2aecb283a3a01fef23a95b33e2349c6d1aa0040"},
|
||||
{"name":"re2","version":"2.7.0","platform":"aarch64-linux","checksum":"778921298b6e8aba26a6230dd298c9b361b92e45024f81fa6aee788060fa307c"},
|
||||
{"name":"re2","version":"2.7.0","platform":"arm-linux","checksum":"d328b5286d83ae265e13b855da8e348a976f80f91b748045b52073a570577954"},
|
||||
{"name":"re2","version":"2.7.0","platform":"arm64-darwin","checksum":"7d993f27a1afac4001c539a829e2af211ced62604930c90df32a307cf74cb4a4"},
|
||||
{"name":"re2","version":"2.7.0","platform":"ruby","checksum":"319d88d2a8ff32eba45286e58a8d49bd8b59167afa718946165b67fec2ea13dc"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x64-mingw-ucrt","checksum":"30ac6e9831f2e2237f5c6f2813f1f708110b7b707e571504aae56083eb26011c"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x64-mingw32","checksum":"78c98a7d4d272eedb6b5779c25b55d8f8ddd4ba4b0b6f402616e4717f785841d"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x86-linux","checksum":"0c7ba10b907738402577e4a4d7b980fbaae05850f418a4d7061a7ba531a4fe57"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x86-mingw32","checksum":"3560795ee796386a50f5c5f002d0a8570995da48599d524cac23d3822b9a1d7f"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x86_64-darwin","checksum":"49afef32dbc8b0a0fe978668489bdc3f016c30afb20d0aecb75db0454297c4ff"},
|
||||
{"name":"re2","version":"2.7.0","platform":"x86_64-linux","checksum":"be9095c33e9628644fd876c1e6379cbd6a99a1c786d496e087491471f78d53fc"},
|
||||
{"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"},
|
||||
{"name":"re2","version":"2.15.0","platform":"arm-linux-musl","checksum":"a5376b6655134d7320cc3282659035c20a26f2641643fe33c2d04417b07532a8"},
|
||||
{"name":"re2","version":"2.15.0","platform":"arm64-darwin","checksum":"184e2273699d6433aaeb8dcc2347ea794a14a34ae4cbb5f83a76c521ebb1a591"},
|
||||
{"name":"re2","version":"2.15.0","platform":"ruby","checksum":"049822aa6f7a64352624f632cb8e5693619c365d22f49087805411352a0d5bd8"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x64-mingw-ucrt","checksum":"e62a623b30b917f9845abf818c1d5c2d468859a1e3d9d4abf24fc2db40445322"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x64-mingw32","checksum":"29bed8b2711d9f8d442f1f00149393331698c9f2b82281b7df6c58b7cf4990a7"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86-linux-gnu","checksum":"2f1fbb0336eca29d3bfbe6883f4f8118f1c25f1e7d74f3bc0391dfe7334f9fc6"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86-linux-musl","checksum":"8470a2ca5019132114379fcef25117f703e20f8e25604d378a71e80746b9b22a"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86-mingw32","checksum":"f0c7ece48e92f6db2595dc2af733131371cd9e0d3dec87f1c3ab8dbe35de1076"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86_64-darwin","checksum":"c3c43f001b7fef3732d9992def52a125ca2c0fb6fcd88fcf258b5b3f6e70fd8f"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86_64-linux-gnu","checksum":"d7b7eb32c3b9aa7af7c826f51959781763191c86c07fe3714735d0e6d012766a"},
|
||||
{"name":"re2","version":"2.15.0","platform":"x86_64-linux-musl","checksum":"3c3d9afb96a8c13fa617cf273333fcf7344bb7831050d3e01b5ffcdef5cff3ce"},
|
||||
{"name":"recaptcha","version":"5.12.3","platform":"ruby","checksum":"37d1894add9e70a54d0c6c7f0ecbeedffbfa7d075acfbd4c509818dfdebdb7ee"},
|
||||
{"name":"recursive-open-struct","version":"1.1.3","platform":"ruby","checksum":"a3538a72552fcebcd0ada657bdff313641a4a5fbc482c08cfb9a65acb1c9de5a"},
|
||||
{"name":"redcarpet","version":"3.6.0","platform":"ruby","checksum":"8ad1889c0355ff4c47174af14edd06d62f45a326da1da6e8a121d59bdcd2e9e9"},
|
||||
|
|
|
|||
|
|
@ -758,8 +758,8 @@ GEM
|
|||
mime-types
|
||||
net-http-persistent (~> 4.0)
|
||||
nokogiri (~> 1, >= 1.10.8)
|
||||
gitlab-glfm-markdown (0.0.24)
|
||||
rb_sys (= 0.9.107)
|
||||
gitlab-glfm-markdown (0.0.27)
|
||||
rb_sys (~> 0.9.109)
|
||||
gitlab-kas-grpc (17.8.1)
|
||||
grpc (~> 1.0)
|
||||
gitlab-labkit (0.37.0)
|
||||
|
|
@ -1478,10 +1478,11 @@ GEM
|
|||
coderay
|
||||
parser
|
||||
unparser
|
||||
prometheus-client-mmap (1.2.6)
|
||||
prometheus-client-mmap (1.2.8)
|
||||
base64
|
||||
bigdecimal
|
||||
rb_sys (~> 0.9.86)
|
||||
logger
|
||||
rb_sys (~> 0.9.109)
|
||||
pry (0.14.2)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
|
|
@ -1567,10 +1568,12 @@ GEM
|
|||
zeitwerk (~> 2.6)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
rake-compiler-dock (1.9.1)
|
||||
rb-fsevent (0.11.2)
|
||||
rb-inotify (0.10.1)
|
||||
ffi (~> 1.0)
|
||||
rb_sys (0.9.107)
|
||||
rb_sys (0.9.110)
|
||||
rake-compiler-dock (= 1.9.1)
|
||||
rbs (3.6.1)
|
||||
logger
|
||||
rbtrace (0.5.1)
|
||||
|
|
@ -1580,8 +1583,8 @@ GEM
|
|||
rchardet (1.8.0)
|
||||
rdoc (6.11.0)
|
||||
psych (>= 4.0.0)
|
||||
re2 (2.7.0)
|
||||
mini_portile2 (~> 2.8.5)
|
||||
re2 (2.15.0)
|
||||
mini_portile2 (~> 2.8.7)
|
||||
recaptcha (5.12.3)
|
||||
json
|
||||
recursive-open-struct (1.1.3)
|
||||
|
|
@ -2287,7 +2290,7 @@ DEPENDENCIES
|
|||
pg_query (~> 6.0.0)
|
||||
png_quantizator (~> 0.2.1)
|
||||
premailer-rails (~> 1.12.0)
|
||||
prometheus-client-mmap (~> 1.1, >= 1.1.1)
|
||||
prometheus-client-mmap (~> 1.2.8)
|
||||
pry-byebug
|
||||
pry-rails (~> 0.3.9)
|
||||
pry-shell (~> 0.6.4)
|
||||
|
|
@ -2303,7 +2306,7 @@ DEPENDENCIES
|
|||
rails-i18n (~> 7.0, >= 7.0.9)
|
||||
rainbow (~> 3.0)
|
||||
rbtrace (~> 0.4)
|
||||
re2 (= 2.7.0)
|
||||
re2 (~> 2.15)
|
||||
recaptcha (~> 5.12)
|
||||
redis (~> 5.3.0)
|
||||
redis-actionpack (~> 5.5.0)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!-- eslint-disable vue/multi-word-component-names -->
|
||||
<script>
|
||||
import { GlButton, GlLoadingIcon } from '@gitlab/ui';
|
||||
import { GlButton, GlLoadingIcon, GlBroadcastMessage, GlLink, GlSprintf } from '@gitlab/ui';
|
||||
// eslint-disable-next-line no-restricted-imports
|
||||
import { mapActions, mapGetters, mapState } from 'vuex';
|
||||
import { __ } from '~/locale';
|
||||
|
|
@ -13,6 +13,7 @@ import {
|
|||
} from '~/performance/constants';
|
||||
import { performanceMarkAndMeasure } from '~/performance/utils';
|
||||
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
|
||||
import { helpPagePath } from '~/helpers/help_page_helper';
|
||||
import { modalTypes } from '../constants';
|
||||
import eventHub from '../eventhub';
|
||||
import { measurePerformance } from '../utils';
|
||||
|
|
@ -28,6 +29,10 @@ eventHub.$on(WEBIDE_MEASURE_FILE_AFTER_INTERACTION, () =>
|
|||
),
|
||||
);
|
||||
|
||||
const removalAnnouncementHelpPagePath = helpPagePath(
|
||||
'update/deprecations.md#legacy-web-ide-is-deprecated',
|
||||
);
|
||||
|
||||
export default {
|
||||
components: {
|
||||
IdeSidebar,
|
||||
|
|
@ -44,6 +49,9 @@ export default {
|
|||
RightPane: () => import(/* webpackChunkName: 'ide_runtime' */ './panes/right.vue'),
|
||||
NewModal: () => import(/* webpackChunkName: 'ide_runtime' */ './new_dropdown/modal.vue'),
|
||||
CannotPushCodeAlert,
|
||||
GlBroadcastMessage,
|
||||
GlLink,
|
||||
GlSprintf,
|
||||
},
|
||||
mixins: [glFeatureFlagsMixin()],
|
||||
data() {
|
||||
|
|
@ -129,6 +137,7 @@ export default {
|
|||
this.loadDeferred = true;
|
||||
},
|
||||
},
|
||||
removalAnnouncementHelpPagePath,
|
||||
};
|
||||
</script>
|
||||
|
||||
|
|
@ -137,6 +146,20 @@ export default {
|
|||
class="ide position-relative flex-column align-items-stretch gl-flex"
|
||||
:class="{ [`theme-${themeName}`]: themeName }"
|
||||
>
|
||||
<gl-broadcast-message icon-name="warning" theme="red" :dismissible="false">
|
||||
{{ __('The legacy Vue-based GitLab Web IDE will be removed in GitLab 18.0.') }}
|
||||
<gl-sprintf
|
||||
:message="
|
||||
__('To prepare for this removal, see %{linkStart}deprecations and removals%{linkEnd}.')
|
||||
"
|
||||
>
|
||||
<template #link="{ content }">
|
||||
<gl-link class="!gl-text-inherit" :href="$options.removalAnnouncementHelpPagePath">{{
|
||||
content
|
||||
}}</gl-link>
|
||||
</template>
|
||||
</gl-sprintf>
|
||||
</gl-broadcast-message>
|
||||
<cannot-push-code-alert
|
||||
v-if="!canPushCodeStatus.isAllowed"
|
||||
:message="canPushCodeStatus.message"
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
- breadcrumb_title "##{@pipeline.id}"
|
||||
- page_title _('Pipeline')
|
||||
- pipeline_has_errors = @pipeline.builds.empty? && @pipeline.error_messages.any?
|
||||
- pipeline_has_deprecated_dependency_scanning_enabled = @pipeline.builds.any? { |build| build.name.starts_with?('gemnasium') }
|
||||
- add_page_specific_style 'page_bundles/pipeline'
|
||||
- add_page_specific_style 'page_bundles/reports'
|
||||
- add_page_specific_style 'page_bundles/ci_status'
|
||||
|
|
@ -26,4 +27,13 @@
|
|||
= s_("Pipelines|Go to the pipeline editor")
|
||||
|
||||
- else
|
||||
- if pipeline_has_deprecated_dependency_scanning_enabled
|
||||
= render Pajamas::AlertComponent.new(title: _('You are using a deprecated Dependency Scanning analyzer'),
|
||||
variant: :warning,
|
||||
dismissible: true) do |c|
|
||||
- c.with_body do
|
||||
- help_page_link = help_page_url('user/application_security/dependency_scanning/dependency_scanning_sbom/index.md')
|
||||
- learn_more_link = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_link }
|
||||
= html_escape(s_('The Gemnasium analyzer has been replaced with a new Dependency Scanning analyzer. %{learn_more_link_start}Learn more%{link_end}.')) % { learn_more_link_start: learn_more_link, link_end: '</a>'.html_safe }
|
||||
|
||||
#js-pipeline-tabs{ data: js_pipeline_tabs_data(@project, @pipeline, @current_user) }
|
||||
|
|
|
|||
|
|
@ -189,19 +189,33 @@ information required to create your GitLab Dedicated instance.
|
|||
NOTE:
|
||||
Some configuration settings (like the option to bring your own keys and your tenant name) are permanent and cannot be changed once your instance has been created.
|
||||
|
||||
It can take up to 3 hours to create the GitLab Dedicated instance. When the setup is complete, you will receive a confirmation email with further instructions on how to access your instance.
|
||||
It can take up to 3 hours to create the GitLab Dedicated instance. When the setup is complete, you will receive a confirmation email.
|
||||
|
||||
## Step 3: Configure your GitLab Dedicated instance
|
||||
## Step 3: Access and configure your GitLab Dedicated instance
|
||||
|
||||
Once your GitLab Dedicated instance is created, follow our recommendations on:
|
||||
To access and configure your GitLab Dedicated instance:
|
||||
|
||||
- [Steps after installing GitLab](../../install/next_steps.md).
|
||||
- [Securing your GitLab installation](../../security/index.md).
|
||||
- [GitLab hardening](../../security/hardening.md).
|
||||
1. Sign in to [Switchboard](https://console.gitlab-dedicated.com/).
|
||||
1. In the **Access your GitLab Dedicated instance** banner, select **View credentials**.
|
||||
1. Copy the tenant URL and temporary root credentials for your instance.
|
||||
|
||||
Also plan ahead if you need the following features:
|
||||
NOTE:
|
||||
For security, you can retrieve the temporary root credentials from Switchboard only once. Be sure to store these credentials securely (for example, in a password manager) before leaving Switchboard.
|
||||
|
||||
1. Go to the tenant URL for your GitLab Dedicated instance and sign in with your temporary root credentials.
|
||||
1. [Change your temporary root password](../../user/profile/user_passwords.md#change-your-password) to a new secure password.
|
||||
1. Go to the Admin area and [add the license key](../../administration/license_file.md#add-license-in-the-admin-area) for your GitLab Dedicated subscription.
|
||||
1. Return to Switchboard and [add users](../../administration/dedicated/configure_instance/users_notifications.md#add-switchboard-users), if needed.
|
||||
1. Review the [release rollout schedule](../../administration/dedicated/maintenance.md#release-rollout-schedule) for upgrades and maintenance.
|
||||
|
||||
Also plan ahead if you need the following GitLab Dedicated features:
|
||||
|
||||
- [Inbound Private Link](../../administration/dedicated/configure_instance/network_security.md#inbound-private-link)
|
||||
- [Outbound Private Link](../../administration/dedicated/configure_instance/network_security.md#outbound-private-link)
|
||||
- [SAML SSO](../../administration/dedicated/configure_instance/saml.md)
|
||||
- [Bring your own domain](../../administration/dedicated/configure_instance/network_security.md#bring-your-own-domain-byod)
|
||||
|
||||
To view all available infrastructure configuration options, see [Configure your GitLab Dedicated instance](../../administration/dedicated/configure_instance.md).
|
||||
|
||||
NOTE:
|
||||
New GitLab Dedicated instances use default settings for a self-managed instance. A GitLab administrator can change these settings from the [Admin Area](../../administration/admin_area.md).
|
||||
|
|
|
|||
|
|
@ -33,6 +33,24 @@ With self-hosted models, you can:
|
|||
|
||||
This setup ensures enterprise-level privacy and flexibility, allowing seamless integration of your LLMs with GitLab Duo features.
|
||||
|
||||
### Supported GitLab Duo Chat features
|
||||
|
||||
You can use the following GitLab Duo Chat features with a self-hosted model:
|
||||
|
||||
- [Ask about GitLab](../../user/gitlab_duo_chat/examples.md#ask-about-gitlab)
|
||||
- [Ask about a specific issue](../../user/gitlab_duo_chat/examples.md#ask-about-a-specific-issue)
|
||||
- [Ask about a specific epic](../../user/gitlab_duo_chat/examples.md#ask-about-a-specific-epic)
|
||||
- [Explain selected code](../../user/gitlab_duo_chat/examples.md#explain-selected-code)
|
||||
- [Ask about or generate code](../../user/gitlab_duo_chat/examples.md#ask-about-or-generate-code)
|
||||
- [Ask follow up questions](../../user/gitlab_duo_chat/examples.md#ask-follow-up-questions)
|
||||
- [Ask about errors](../../user/gitlab_duo_chat/examples.md#ask-about-errors)
|
||||
- [Ask about specific files](../../user/gitlab_duo_chat/examples.md#ask-about-specific-files)
|
||||
- [Refactor code in the IDE](../../user/gitlab_duo_chat/examples.md#refactor-code-in-the-ide)
|
||||
- [Fix code in the IDE](../../user/gitlab_duo_chat/examples.md#fix-code-in-the-ide)
|
||||
- [Write tests in the IDE](../../user/gitlab_duo_chat/examples.md#write-tests-in-the-ide)
|
||||
- [Ask about CI/CD](../../user/gitlab_duo_chat/examples.md#ask-about-cicd)
|
||||
- [Use universal and IDE slash commands](../../user/gitlab_duo_chat/examples.md#gitlab-duo-chat-slash-commands)
|
||||
|
||||
### Prerequisites
|
||||
|
||||
Before setting up a self-hosted model infrastructure, you must have:
|
||||
|
|
|
|||
|
|
@ -629,10 +629,12 @@ Prerequisites:
|
|||
- Have a `README.md` file in the root directory for the commit SHA of the tag being released.
|
||||
- Have at least one [CI/CD component in the `templates/` directory](#directory-structure)
|
||||
for the commit SHA of the tag being released.
|
||||
- You must use the [`release` keyword](../yaml/index.md#release) in a CI/CD job to create the release,
|
||||
not the [Releases API](../../api/releases/index.md#create-a-release).
|
||||
|
||||
To publish a new version of the component to the catalog:
|
||||
|
||||
1. Add a job to the project's `.gitlab-ci.yml` file that uses the [`release`](../yaml/index.md#release)
|
||||
1. Add a job to the project's `.gitlab-ci.yml` file that uses the `release`
|
||||
keyword to create the new release when a tag is created.
|
||||
You should configure the tag pipeline to [test the components](#test-the-component) before
|
||||
running the release job. For example:
|
||||
|
|
|
|||
|
|
@ -120,3 +120,43 @@ Add any uploaded videos to the [Python Resources](https://www.youtube.com/playli
|
|||
### Mentorship Process
|
||||
|
||||
1:1 mentorship for Python is possible and encouraged. For more information on how to get started with a mentor, please refer to the [GitLab Mentoring Handbook](https://handbook.gitlab.com/handbook/engineering/careers/mentoring/#mentoring).
|
||||
|
||||
---
|
||||
|
||||
## More learning resources
|
||||
|
||||
If you are new to Python or looking to refresh your knowledge, this section provides variours materials for
|
||||
learning the language.
|
||||
|
||||
1. **[Python Cheatsheet](https://www.pythoncheatsheet.org)**
|
||||
A comprehensive reference covering essential Python syntax, built-in functions, and useful libraries.
|
||||
This is ideal for both beginners and experienced users who want a quick, organized summary of Python's key features.
|
||||
|
||||
1. **[A Whirlwind Tour of Python (Jupyter Notebook)](https://github.com/jakevdp/WhirlwindTourOfPython)**
|
||||
A fast-paced introduction to Python fundamentals, tailored especially for data science practitioners but works well for everyone who wants to get just the basic understanding of the language.
|
||||
This is a Jupiter Notebook which makes this guide an interactive resource as well as a good introduction to Jupiter Notebook itself.
|
||||
|
||||
1. **[100-page Python Intro](https://learnbyexample.github.io/100_page_python_intro)**
|
||||
Brief guide provides a straightforward introduction to Python, covering all the essentials needed to start programming effectively. It’s a beginner-friendly option that covers everything from syntax to debugging and testing.
|
||||
|
||||
1. **[Learn X in Y Minutes: Python](https://learnxinyminutes.com/docs/python)**
|
||||
A very brief, high-level introduction cuts directly to the core syntax and features of Python, making it a valuable quick start for developers transitioning to Python.
|
||||
|
||||
1. **[Exercism Python Track](https://exercism.io/tracks/python)**
|
||||
Use Exercism's Python track as a foundation for learning Python concepts and best practices. Exercism provides hands-on practice with mentoring support, making it an excellent resource for mastering Python through coding exercises and feedback.
|
||||
|
||||
When building Python APIs, we use FastAPI and Pydantic. To get started with building and reviewing these technologies, refer to the following resources:
|
||||
|
||||
1. **[FastAPI Documentation](https://fastapi.tiangolo.com/)**
|
||||
FastAPI is a modern web framework for building APIs with Python. This resource will help you learn how to create fast and efficient web applications and APIs. FastAPI is especially useful for building Python applications with high performance and scalability.
|
||||
|
||||
1. **[Pydantic Documentation](https://pydantic-docs.helpmanual.io/)**
|
||||
Pydantic is a Python library for data validation and settings management using Python type annotations. Learn how to integrate Pydantic into your Python projects for easier data validation and management, particularly when working with FastAPI.
|
||||
|
||||
We use pytest for testing Python code. To learn more about writing and running tests with pytest, refer to the following resources:
|
||||
|
||||
1. **[pytest Documentation](https://docs.pytest.org/en/stable/)**
|
||||
pytest is a popular testing framework for Python that makes it easy to write simple and scalable tests. This resource provides comprehensive documentation on how to write and run tests using pytest, including fixtures, plugins, and test discovery.
|
||||
|
||||
1. **[Python Testing with pytest (Book)](https://pragprog.com/titles/bopytest2/python-testing-with-pytest-second-edition/)**
|
||||
This book is a comprehensive guide to testing Python code with pytest. It covers everything from the basics of writing tests to advanced topics like fixtures, plugins, and test organization.
|
||||
|
|
|
|||
|
|
@ -29,232 +29,26 @@ Ruby should always be the first choice for development at GitLab, as we have a l
|
|||
when working with AI and ML, most of the open source uses Python, and using Ruby would require building and maintaining
|
||||
large codebases.
|
||||
|
||||
## Learning Python
|
||||
|
||||
[Resources to get started, examples and tips.](getting_started.md)
|
||||
|
||||
## Creating a new Python application
|
||||
|
||||
Scaffolding, libraries and pipelines for a new codebase.
|
||||
Scaffolding libraries and pipelines for a new codebase.
|
||||
|
||||
## Conventions Style Guidelines
|
||||
|
||||
Writing consistent codebases.
|
||||
|
||||
## Testing standards
|
||||
|
||||
### Overview
|
||||
|
||||
Testing at GitLab, including in Python codebases is a core priority rather than an afterthought. It is therefore important to consider test design quality alongside feature design from the start.
|
||||
|
||||
Use [Pytest](https://docs.pytest.org/en/stable/) for Python testing.
|
||||
|
||||
### Recommended reading
|
||||
|
||||
- [Five Factor Testing](https://madeintandem.com/blog/five-factor-testing/): Why do we need tests?
|
||||
- [Principles of Automated Testing](https://www.lihaoyi.com/post/PrinciplesofAutomatedTesting.html): Levels of testing. Prioritize tests. Cost of tests.
|
||||
|
||||
### Testing levels
|
||||
|
||||
Before writing tests, understand the different testing levels and determine the appropriate level for your changes.
|
||||
|
||||
[Learn more about the different testing levels](../testing_guide/testing_levels.md), and how to decide at what level your changes should be tested.
|
||||
|
||||
### Recommendation when mocking
|
||||
|
||||
- Use `unittest.mock` library.
|
||||
- Mock at the right level, for example, at method call boundaries.
|
||||
- Mock external services and APIs.
|
||||
|
||||
### Testing in Python vs. Ruby on Rails
|
||||
|
||||
- [Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/516193)
|
||||
|
||||
## Contributing to a Python codebase
|
||||
|
||||
Resources to get started, examples and tips.
|
||||
[Writing consistent codebases](styleguide.md)
|
||||
|
||||
## Code review and maintainership guidelines
|
||||
|
||||
**Note**: this section is currently in development. You can contribute or track its progress in [this epic](https://gitlab.com/groups/gitlab-org/-/epics/16090)
|
||||
|
||||
GitLab standard [code review guidelines](../code_review.md#approval-guidelines) apply to Python projects as well.
|
||||
|
||||
### How to find a reviewer
|
||||
|
||||
This section explains how to integrate your project with [reviewer roulette](../code_review.md#reviewer-roulette)
|
||||
and other resources to find reviewers with Python expertise.
|
||||
|
||||
[Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/514318).
|
||||
|
||||
### How to find a project to review
|
||||
|
||||
[Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/511513).
|
||||
|
||||
### Maintainer responsibilities
|
||||
|
||||
In addition to code reviews, maintainers are responsible for guiding architectural decisions and monitoring and adopting relevant engineering practices introduced in GitLab.com into their Python projects. This helps to ensure Python projects are consistent and aligned with company standards. Maintaining consistency simplifies transitions between GitLab.com and Python projects while reducing context switching overhead.
|
||||
|
||||
**Technical prerequisites for Maintainers:**
|
||||
|
||||
- Strong experience with the Python frameworks used in the specific project. Commonly used frameworks include: [FastAPI](https://fastapi.tiangolo.com/) and [Pydantic](https://docs.pydantic.dev/latest/), etc.
|
||||
- Proficiency with Python testing frameworks such as `pytest`, including advanced testing strategies (for example, mocking, integration tests, and test-driven development).
|
||||
- Understanding of backwards compatibility considerations ([Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/514689)).
|
||||
|
||||
**Code review objectives:**
|
||||
|
||||
- Verify and confirm changes adheres to style guide ([Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/506689)) and existing patterns in the project.
|
||||
- Where applicable, ensure test coverage is added for the changes introduced in the MR.
|
||||
- Review for performance implications.
|
||||
- Check for security vulnerabilities.
|
||||
- Assess code change impact on existing systems.
|
||||
- Verify that the MR has the correct [MR type label](../labels/index.md#type-labels) and is assigned to the current milestone.
|
||||
|
||||
**Additional responsibilities:**
|
||||
|
||||
- Maintain relevant documentation accuracy and completeness.
|
||||
- Monitor and update package dependencies as necessary.
|
||||
- Mentor other engineers on Python best practices.
|
||||
- Evaluate and propose new tools and libraries.
|
||||
- Monitor performance and propose optimizations.
|
||||
- Ensure security standards are maintained.
|
||||
- Ensure the project is consistent and aligned with GitLab standards by regularly monitoring and adopting relevant engineering practices introduced in GitLab.com.
|
||||
|
||||
### How to become a maintainer
|
||||
|
||||
Each project has its own process and maintainership program. We recommend reviewing the following guideline:
|
||||
|
||||
[Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/514316).
|
||||
|
||||
### Code review best practices
|
||||
|
||||
When writing and reviewing code, follow our Style Guides. Code authors and reviewers are encouraged to pay attention
|
||||
to these areas:
|
||||
|
||||
[Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/507548).
|
||||
[Guidelines on creating MRs and reviewing them](maintainership.md)
|
||||
|
||||
## Deploying a Python codebase
|
||||
|
||||
Deploying libraries, utilities and services.
|
||||
[Deploying libraries, utilities and services.](deployment.md)
|
||||
|
||||
## Python as part of the Monorepo
|
||||
|
||||
GitLab requires Python as a dependency for [reStructuredText](https://docutils.sourceforge.io/rst.html) markup rendering. It requires Python 3.
|
||||
|
||||
### Installation
|
||||
|
||||
There are several ways of installing Python on your system. To be able to use the same version we use in production,
|
||||
we suggest you use [`pyenv`](https://github.com/pyenv/pyenv). It works and behaves similarly to its counterpart in the
|
||||
Ruby world: [`rbenv`](https://github.com/rbenv/rbenv).
|
||||
|
||||
#### macOS
|
||||
|
||||
To install `pyenv` on macOS, you can use [Homebrew](https://brew.sh/) with:
|
||||
|
||||
```shell
|
||||
brew install pyenv
|
||||
```
|
||||
|
||||
#### Windows
|
||||
|
||||
`pyenv` does not officially support Windows and does not work in Windows outside the Windows Subsystem for Linux. If you are a Windows user, you can use `pyenv-win`.
|
||||
|
||||
To install `pyenv-win` on Windows, run the following PowerShell command:
|
||||
|
||||
```shell
|
||||
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
|
||||
```
|
||||
|
||||
[Learn more about `pyenv-win`](https://github.com/pyenv-win/pyenv-win).
|
||||
|
||||
#### Linux
|
||||
|
||||
To install `pyenv` on Linux, you can run the command below:
|
||||
|
||||
```shell
|
||||
curl "https://pyenv.run" | bash
|
||||
```
|
||||
|
||||
Alternatively, you may find `pyenv` available as a system package via your distribution's package manager.
|
||||
|
||||
You can read more about it in [the `pyenv` prerequisites](https://github.com/pyenv/pyenv-installer#prerequisites).
|
||||
|
||||
#### Shell integration
|
||||
|
||||
`Pyenv` installation adds required changes to Bash. If you use a different shell,
|
||||
check for any additional steps required for it.
|
||||
|
||||
For Fish, you can install a plugin for [Fisher](https://github.com/jorgebucaran/fisher):
|
||||
|
||||
```shell
|
||||
fisher add fisherman/pyenv
|
||||
```
|
||||
|
||||
Or for [Oh My Fish](https://github.com/oh-my-fish/oh-my-fish):
|
||||
|
||||
```shell
|
||||
omf install pyenv
|
||||
```
|
||||
|
||||
#### Dependency management
|
||||
|
||||
While GitLab doesn't directly contain any Python scripts, because we depend on Python to render
|
||||
[reStructuredText](https://docutils.sourceforge.io/rst.html) markup, we need to keep track on dependencies
|
||||
on the main project level, so we can run that on our development machines.
|
||||
|
||||
Recently, an equivalent to the `Gemfile` and the [Bundler](https://bundler.io/) project has been introduced to Python:
|
||||
`Pipfile` and [Pipenv](https://pipenv.readthedocs.io/en/latest/).
|
||||
|
||||
A `Pipfile` with the dependencies now exists in the root folder. To install them, run:
|
||||
|
||||
```shell
|
||||
pipenv install
|
||||
```
|
||||
|
||||
Running this command installs both the required Python version as well as required pip dependencies.
|
||||
|
||||
#### Use instructions
|
||||
|
||||
To run any Python code under the Pipenv environment, you need to first start a `virtualenv` based on the dependencies
|
||||
of the application. With Pipenv, this is a simple as running:
|
||||
|
||||
```shell
|
||||
pipenv shell
|
||||
```
|
||||
|
||||
After running that command, you can run GitLab on the same shell and it uses the Python and dependencies
|
||||
installed from the `pipenv install` command.
|
||||
|
||||
## Learning resources
|
||||
|
||||
If you are new to Python or looking to refresh your knowledge, this section provides various materials for
|
||||
learning the language.
|
||||
|
||||
1. **[Python Cheatsheet](https://www.pythoncheatsheet.org)**
|
||||
A comprehensive reference covering essential Python syntax, built-in functions, and useful libraries.
|
||||
This is ideal for both beginners and experienced users who want a quick, organized summary of Python's key features.
|
||||
|
||||
1. **[A Whirlwind Tour of Python (Jupyter Notebook)](https://github.com/jakevdp/WhirlwindTourOfPython)**
|
||||
A fast-paced introduction to Python fundamentals, tailored especially for data science practitioners but works well for everyone who wants to get just the basic understanding of the language.
|
||||
This is a Jupiter Notebook which makes this guide an interactive resource as well as a good introduction to Jupiter Notebook itself.
|
||||
|
||||
1. **[100-page Python Intro](https://learnbyexample.github.io/100_page_python_intro)**
|
||||
Brief guide provides a straightforward introduction to Python, covering all the essentials needed to start programming effectively. It’s a beginner-friendly option that covers everything from syntax to debugging and testing.
|
||||
|
||||
1. **[Learn X in Y Minutes: Python](https://learnxinyminutes.com/docs/python)**
|
||||
A very brief, high-level introduction cuts directly to the core syntax and features of Python, making it a valuable quick start for developers transitioning to Python.
|
||||
|
||||
1. **[Exercism Python Track](https://exercism.io/tracks/python)**
|
||||
Use Exercism's Python track as a foundation for learning Python concepts and best practices. Exercism provides hands-on practice with mentoring support, making it an excellent resource for mastering Python through coding exercises and feedback.
|
||||
|
||||
When building Python APIs, we use FastAPI and Pydantic. To get started with building and reviewing these technologies, refer to the following resources:
|
||||
|
||||
1. **[FastAPI Documentation](https://fastapi.tiangolo.com/)**
|
||||
FastAPI is a modern web framework for building APIs with Python. This resource will help you learn how to create fast and efficient web applications and APIs. FastAPI is especially useful for building Python applications with high performance and scalability.
|
||||
|
||||
1. **[Pydantic Documentation](https://pydantic-docs.helpmanual.io/)**
|
||||
Pydantic is a Python library for data validation and settings management using Python type annotations. Learn how to integrate Pydantic into your Python projects for easier data validation and management, particularly when working with FastAPI.
|
||||
|
||||
We use pytest for testing Python code. To learn more about writing and running tests with pytest, refer to the following resources:
|
||||
|
||||
1. **[pytest Documentation](https://docs.pytest.org/en/stable/)**
|
||||
pytest is a popular testing framework for Python that makes it easy to write simple and scalable tests. This resource provides comprehensive documentation on how to write and run tests using pytest, including fixtures, plugins, and test discovery.
|
||||
|
||||
1. **[Python Testing with pytest (Book)](https://pragprog.com/titles/bopytest2/python-testing-with-pytest-second-edition/)**
|
||||
This book is a comprehensive guide to testing Python code with pytest. It covers everything from the basics of writing tests to advanced topics like fixtures, plugins, and test organization.
|
||||
[Guide on libraries in the monorepo that use Python](monorepo.md)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,62 @@
|
|||
---
|
||||
stage: none
|
||||
group: unassigned
|
||||
info: Any user with at least the Maintainer role can merge updates to this content. For details, see https://docs.gitlab.com/ee/development/development_processes.html#development-guidelines-review.
|
||||
---
|
||||
|
||||
# Python Merge Requests Guidelines
|
||||
|
||||
GitLab standard [code review guidelines](../code_review.md#approval-guidelines) apply to Python projects as well.
|
||||
|
||||
## How to find a reviewer
|
||||
|
||||
This section explains how to integrate your project with [reviewer roulette](../code_review.md#reviewer-roulette)
|
||||
and other resources to find reviewers with Python expertise.
|
||||
|
||||
[Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/514318).
|
||||
|
||||
## How to find a project to review
|
||||
|
||||
[Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/511513).
|
||||
|
||||
## Maintainer responsibilities
|
||||
|
||||
In addition to code reviews, maintainers are responsible for guiding architectural decisions and monitoring and adopting relevant engineering practices introduced in GitLab.com into their Python projects. This helps to ensure Python projects are consistent and aligned with company standards. Maintaining consistency simplifies transitions between GitLab.com and Python projects while reducing context switching overhead.
|
||||
|
||||
**Technical prerequisites for Maintainers:**
|
||||
|
||||
- Strong experience with the Python frameworks used in the specific project. Commonly used frameworks include: [FastAPI](https://fastapi.tiangolo.com/) and [Pydantic](https://docs.pydantic.dev/latest/), etc.
|
||||
- Proficiency with Python testing frameworks such as `pytest`, including advanced testing strategies (for example, mocking, integration tests, and test-driven development).
|
||||
- Understanding of backwards compatibility considerations ([Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/514689)).
|
||||
|
||||
**Code review objectives:**
|
||||
|
||||
- Verify and confirm changes adheres to style guide ([Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/506689)) and existing patterns in the project.
|
||||
- Where applicable, ensure test coverage is added for the changes introduced in the MR.
|
||||
- Review for performance implications.
|
||||
- Check for security vulnerabilities.
|
||||
- Assess code change impact on existing systems.
|
||||
- Verify that the MR has the correct [MR type label](../labels/index.md#type-labels) and is assigned to the current milestone.
|
||||
|
||||
**Additional responsibilities:**
|
||||
|
||||
- Maintain relevant documentation accuracy and completeness.
|
||||
- Monitor and update package dependencies as necessary.
|
||||
- Mentor other engineers on Python best practices.
|
||||
- Evaluate and propose new tools and libraries.
|
||||
- Monitor performance and propose optimizations.
|
||||
- Ensure security standards are maintained.
|
||||
- Ensure the project is consistent and aligned with GitLab standards by regularly monitoring and adopting relevant engineering practices introduced in GitLab.com.
|
||||
|
||||
## How to become a maintainer
|
||||
|
||||
Each project has its own process and maintainership program. We recommend reviewing the following guideline:
|
||||
|
||||
[Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/514316).
|
||||
|
||||
## Code review best practices
|
||||
|
||||
When writing and reviewing code, follow our Style Guides. Code authors and reviewers are encouraged to pay attention
|
||||
to these areas:
|
||||
|
||||
[Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/507548).
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
---
|
||||
stage: none
|
||||
group: unassigned
|
||||
info: Any user with at least the Maintainer role can merge updates to this content. For details, see https://docs.gitlab.com/ee/development/development_processes.html#development-guidelines-review.
|
||||
---
|
||||
|
||||
# Python as part of the Monorepo
|
||||
|
||||
GitLab requires Python as a dependency for [reStructuredText](https://docutils.sourceforge.io/rst.html) markup rendering. It requires Python 3.
|
||||
|
||||
## Installation
|
||||
|
||||
There are several ways of installing Python on your system. To be able to use the same version we use in production,
|
||||
we suggest you use [`pyenv`](https://github.com/pyenv/pyenv). It works and behaves similarly to its counterpart in the
|
||||
Ruby world: [`rbenv`](https://github.com/rbenv/rbenv).
|
||||
|
||||
### macOS
|
||||
|
||||
To install `pyenv` on macOS, you can use [Homebrew](https://brew.sh/) with:
|
||||
|
||||
```shell
|
||||
brew install pyenv
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
`pyenv` does not officially support Windows and does not work in Windows outside the Windows Subsystem for Linux. If you are a Windows user, you can use `pyenv-win`.
|
||||
|
||||
To install `pyenv-win` on Windows, run the following PowerShell command:
|
||||
|
||||
```shell
|
||||
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
|
||||
```
|
||||
|
||||
[Learn more about `pyenv-win`](https://github.com/pyenv-win/pyenv-win).
|
||||
|
||||
### Linux
|
||||
|
||||
To install `pyenv` on Linux, you can run the command below:
|
||||
|
||||
```shell
|
||||
curl "https://pyenv.run" | bash
|
||||
```
|
||||
|
||||
Alternatively, you may find `pyenv` available as a system package via your distribution's package manager.
|
||||
|
||||
You can read more about it in [the `pyenv` prerequisites](https://github.com/pyenv/pyenv-installer#prerequisites).
|
||||
|
||||
### Shell integration
|
||||
|
||||
`Pyenv` installation adds required changes to Bash. If you use a different shell,
|
||||
check for any additional steps required for it.
|
||||
|
||||
For Fish, you can install a plugin for [Fisher](https://github.com/jorgebucaran/fisher):
|
||||
|
||||
```shell
|
||||
fisher add fisherman/pyenv
|
||||
```
|
||||
|
||||
Or for [Oh My Fish](https://github.com/oh-my-fish/oh-my-fish):
|
||||
|
||||
```shell
|
||||
omf install pyenv
|
||||
```
|
||||
|
||||
### Dependency management
|
||||
|
||||
While GitLab doesn't directly contain any Python scripts, because we depend on Python to render
|
||||
[reStructuredText](https://docutils.sourceforge.io/rst.html) markup, we need to keep track on dependencies
|
||||
on the main project level, so we can run that on our development machines.
|
||||
|
||||
Recently, an equivalent to the `Gemfile` and the [Bundler](https://bundler.io/) project has been introduced to Python:
|
||||
`Pipfile` and [Pipenv](https://pipenv.readthedocs.io/en/latest/).
|
||||
|
||||
A `Pipfile` with the dependencies now exists in the root folder. To install them, run:
|
||||
|
||||
```shell
|
||||
pipenv install
|
||||
```
|
||||
|
||||
Running this command installs both the required Python version as well as required pip dependencies.
|
||||
|
||||
### Use instructions
|
||||
|
||||
To run any Python code under the Pipenv environment, you need to first start a `virtualenv` based on the dependencies
|
||||
of the application. With Pipenv, this is a simple as running:
|
||||
|
||||
```shell
|
||||
pipenv shell
|
||||
```
|
||||
|
||||
After running that command, you can run GitLab on the same shell and it uses the Python and dependencies
|
||||
installed from the `pipenv install` command.
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
---
|
||||
stage: none
|
||||
group: unassigned
|
||||
info: Any user with at least the Maintainer role can merge updates to this content. For details, see https://docs.gitlab.com/ee/development/development_processes.html#development-guidelines-review.
|
||||
---
|
||||
|
||||
# Python style guide
|
||||
|
||||
## Testing
|
||||
|
||||
### Overview
|
||||
|
||||
Testing at GitLab, including in Python codebases is a core priority rather than an afterthought. It is therefore important to consider test design quality alongside feature design from the start.
|
||||
|
||||
Use [Pytest](https://docs.pytest.org/en/stable/) for Python testing.
|
||||
|
||||
### Recommended reading
|
||||
|
||||
- [Five Factor Testing](https://madeintandem.com/blog/five-factor-testing/): Why do we need tests?
|
||||
- [Principles of Automated Testing](https://www.lihaoyi.com/post/PrinciplesofAutomatedTesting.html): Levels of testing. Prioritize tests. Cost of tests.
|
||||
|
||||
### Testing levels
|
||||
|
||||
Before writing tests, understand the different testing levels and determine the appropriate level for your changes.
|
||||
|
||||
[Learn more about the different testing levels](../testing_guide/testing_levels.md), and how to decide at what level your changes should be tested.
|
||||
|
||||
### Recommendation when mocking
|
||||
|
||||
- Use `unittest.mock` library.
|
||||
- Mock at the right level, for example, at method call boundaries.
|
||||
- Mock external services and APIs.
|
||||
|
||||
### Testing in Python vs. Ruby on Rails
|
||||
|
||||
- [Work item](https://gitlab.com/gitlab-org/gitlab/-/issues/516193)
|
||||
|
|
@ -54,8 +54,8 @@ Neither OpenTofu nor GitLab encrypts the plan file by default. If your OpenTofu
|
|||
files include sensitive data like passwords, access tokens, or certificates, you should
|
||||
encrypt the plan output or modify the project visibility settings. You should also **disable**
|
||||
[public pipelines](../../../ci/pipelines/settings.md#change-pipeline-visibility-for-non-project-members-in-public-projects)
|
||||
and set the [artifact's public flag to false](../../../ci/yaml/index.md#artifactspublic) (`public: false`).
|
||||
This setting ensures artifacts are accessible only to GitLab administrators and project members with at least the Reporter role.
|
||||
and set the [artifact's access flag to 'developer'](../../../ci/yaml/index.md#artifactsaccess) (`access: 'developer'`).
|
||||
This setting ensures artifacts are accessible only to GitLab administrators and project members with at least the Developer role.
|
||||
|
||||
To configure GitLab CI/CD as a backend:
|
||||
|
||||
|
|
|
|||
|
|
@ -57073,6 +57073,9 @@ msgstr ""
|
|||
msgid "The CSV export will be created in the background. Once finished, it will be sent to %{email} in an attachment."
|
||||
msgstr ""
|
||||
|
||||
msgid "The Gemnasium analyzer has been replaced with a new Dependency Scanning analyzer. %{learn_more_link_start}Learn more%{link_end}."
|
||||
msgstr ""
|
||||
|
||||
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -57420,6 +57423,9 @@ msgstr ""
|
|||
msgid "The latest pipeline for this merge request has failed."
|
||||
msgstr ""
|
||||
|
||||
msgid "The legacy Vue-based GitLab Web IDE will be removed in GitLab 18.0."
|
||||
msgstr ""
|
||||
|
||||
msgid "The license key is invalid."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -59398,6 +59404,9 @@ msgstr ""
|
|||
msgid "To personalize your GitLab experience, we'd like to know a bit more about you. We won't share this information with anyone."
|
||||
msgstr ""
|
||||
|
||||
msgid "To prepare for this removal, see %{linkStart}deprecations and removals%{linkEnd}."
|
||||
msgstr ""
|
||||
|
||||
msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -65909,6 +65918,9 @@ msgstr ""
|
|||
msgid "You are trying to upload something other than an image. Please upload a .png, .jpg, .jpeg, .gif, .bmp, .tiff or .ico."
|
||||
msgstr ""
|
||||
|
||||
msgid "You are using a deprecated Dependency Scanning analyzer"
|
||||
msgstr ""
|
||||
|
||||
msgid "You are using a trial license. When you use a paid subscription, you'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd}."
|
||||
msgstr ""
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
ARG GDK_SHA=de4c31fe5d6a67d253610bdb46a6d80cf9c356fe
|
||||
ARG GDK_SHA=d2c7d9655805919511f234743ca2b3d8e178ac6f
|
||||
# Use tag prefix when running on 'stable' branch to make sure 'protected' image is used which is not deleted by registry cleanup
|
||||
ARG GDK_BASE_TAG_PREFIX
|
||||
|
||||
|
|
@ -50,8 +50,8 @@ RUN set -eux; \
|
|||
cd gitaly \
|
||||
&& go clean -cache -modcache -r \
|
||||
&& rm -rf _build/cache \
|
||||
_build/deps \
|
||||
_build/intermediate
|
||||
_build/deps \
|
||||
_build/intermediate
|
||||
|
||||
# Install gitlab gem dependencies
|
||||
#
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ module QA
|
|||
module Integration
|
||||
class ImportWithSMTP < Test::Instance::All
|
||||
tags :import_with_smtp
|
||||
|
||||
pipeline_mappings test_on_omnibus: %w[import-with-smtp]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ module QA
|
|||
|
||||
updated_pipeline_definitions(pipeline_types).each do |type, yaml|
|
||||
file_name = generated_yml_file_name(type)
|
||||
File.write(file_name, "#{yaml}\n#{variables_section}\n")
|
||||
File.write(file_name, yaml)
|
||||
logger.info("Pipeline definition file created: '#{file_name}'")
|
||||
end
|
||||
end
|
||||
|
|
@ -73,12 +73,7 @@ module QA
|
|||
#
|
||||
# @return [void]
|
||||
def create_noop(reason: nil)
|
||||
noop_yml = <<~YML
|
||||
variables:
|
||||
SKIP_MESSAGE: "#{reason || 'no-op run, nothing will be executed!'}"
|
||||
|
||||
#{File.read(noop_pipeline)}
|
||||
YML
|
||||
noop_yml = noop_pipeline_yml(reason || "no-op run, nothing will be executed!")
|
||||
|
||||
SUPPORTED_PIPELINES.each { |type| File.write(generated_yml_file_name(type), noop_yml) }
|
||||
logger.info("Created noop pipeline definitions for all E2E test pipelines")
|
||||
|
|
@ -105,11 +100,11 @@ module QA
|
|||
@project_root ||= File.expand_path("../", Runtime::Path.qa_root)
|
||||
end
|
||||
|
||||
# Path to noop pipeline definition file
|
||||
# Content of noop pipeline definition file
|
||||
#
|
||||
# @return [String]
|
||||
def noop_pipeline
|
||||
@noop_pipeline ||= File.join(File.join(project_root, ".gitlab", "ci"), "_skip.yml")
|
||||
@noop_pipeline ||= File.read(File.join(project_root, ".gitlab", "ci", "_skip.yml"))
|
||||
end
|
||||
|
||||
# Path for ci configuration files
|
||||
|
|
@ -230,11 +225,18 @@ module QA
|
|||
next unless pipeline_types.include?(pipeline_type)
|
||||
|
||||
logger.info("Processing pipeline '#{pipeline_type}'")
|
||||
definitions[pipeline_type] = jobs.reduce(pipeline_definitions[pipeline_type]) do |pipeline_yml, job|
|
||||
zero_runtime = jobs.all? { |job| job[:runtime] == 0 }
|
||||
if zero_runtime
|
||||
logger.info(" All jobs have zero runtime, creating 'no-op' pipeline")
|
||||
next definitions[pipeline_type] = noop_pipeline_yml("no-op run, pipeline has no executable tests")
|
||||
end
|
||||
|
||||
pipeline = jobs.reduce(pipeline_definitions[pipeline_type]) do |pipeline_yml, job|
|
||||
runtime_min = (job[:runtime] / 60).ceil
|
||||
logger.info(" Updating '#{job[:name]}' job based on total runtime of '#{runtime_min}' minutes")
|
||||
updated_job(job[:name], job[:runtime], pipeline_yml, pipeline_type)
|
||||
end
|
||||
definitions[pipeline_type] = "#{pipeline}\n#{variables_section}"
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -302,6 +304,19 @@ module QA
|
|||
def calculate_parallel_jobs_count(job_runtime, pipeline_type)
|
||||
(job_runtime / TEST_RUNTIME_TARGET * RUNTIME_COEFFICIENT.fetch(pipeline_type, 1.0)).ceil
|
||||
end
|
||||
|
||||
# No-op pipeline yml with skip reason message
|
||||
#
|
||||
# @param reason [String]
|
||||
# @return [String]
|
||||
def noop_pipeline_yml(reason)
|
||||
<<~YML
|
||||
variables:
|
||||
SKIP_MESSAGE: "#{reason}"
|
||||
|
||||
#{noop_pipeline}
|
||||
YML
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -21,19 +21,20 @@ module QA
|
|||
let(:cng_pipeline_file) { File.join(tmp_dir, "test-on-cng-pipeline.yml") }
|
||||
let(:generated_cng_yaml) { YAML.load_file(cng_pipeline_file) }
|
||||
|
||||
let(:skip_pipeline) { File.read(File.join(project_root, ".gitlab/ci/_skip.yml")) }
|
||||
let(:noop_reason) { "no-op run, nothing will be executed!" }
|
||||
let(:noop_pipeline) do
|
||||
<<~YML
|
||||
variables:
|
||||
SKIP_MESSAGE: "#{noop_reason}"
|
||||
|
||||
#{skip_pipeline}
|
||||
YML
|
||||
end
|
||||
|
||||
describe "#create_noop" do
|
||||
let(:scenario_examples) { {} }
|
||||
let(:noop_reason) { "no-op run, pipeline:skip-e2e label detected" }
|
||||
let(:skip_pipeline) { File.read(File.join(project_root, ".gitlab/ci/_skip.yml")) }
|
||||
|
||||
let(:noop_pipeline) do
|
||||
<<~YML
|
||||
variables:
|
||||
SKIP_MESSAGE: "#{noop_reason}"
|
||||
|
||||
#{skip_pipeline}
|
||||
YML
|
||||
end
|
||||
|
||||
before do
|
||||
allow(File).to receive(:write).with(/test-on-(gdk|cng|omnibus|omnibus-nightly)-pipeline.yml/, noop_pipeline)
|
||||
|
|
@ -167,27 +168,86 @@ module QA
|
|||
end
|
||||
end
|
||||
|
||||
context "with skipped job and existing rule" do
|
||||
let(:scenario_examples) { { scenario_class => [{ id: example, status: "pending" }] } }
|
||||
context "with skipped job" do
|
||||
let(:second_scenario_class) do
|
||||
Class.new(Scenario::Template) do
|
||||
pipeline_mappings test_on_cng: ['cng-second-job']
|
||||
end
|
||||
end
|
||||
|
||||
let(:cng_pipeline_definition) do
|
||||
let(:scenario_examples) do
|
||||
{
|
||||
"cng-instance" => {
|
||||
"stage" => "test",
|
||||
"rules" => [{ "if" => "condition" }, { "when" => "always" }],
|
||||
"script" => "echo 'test'"
|
||||
}
|
||||
scenario_class => [{ id: example, status: "pending" }],
|
||||
second_scenario_class => [{ id: example, status: "passed" }]
|
||||
}
|
||||
end
|
||||
|
||||
it "replaces existing rule with rule: never" do
|
||||
context "with existing rule" do
|
||||
let(:cng_pipeline_definition) do
|
||||
{
|
||||
"cng-instance" => {
|
||||
"stage" => "test",
|
||||
"rules" => [{ "if" => "condition" }, { "when" => "always" }],
|
||||
"script" => "echo 'test'"
|
||||
},
|
||||
"cng-second-job" => {
|
||||
"stage" => "test",
|
||||
"script" => "echo 'test'"
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
it "replaces existing rule with rule: never" do
|
||||
pipeline_creator.create
|
||||
|
||||
expect(generated_cng_yaml).to include(cng_pipeline_definition.deep_merge({
|
||||
"cng-instance" => {
|
||||
"rules" => [{ "when" => "never" }]
|
||||
},
|
||||
"cng-second-job" => {
|
||||
"parallel" => 1
|
||||
}
|
||||
}))
|
||||
end
|
||||
end
|
||||
|
||||
context "without existing rule" do
|
||||
let(:cng_pipeline_definition) do
|
||||
{
|
||||
"cng-instance" => {
|
||||
"stage" => "test",
|
||||
"script" => "echo 'test'"
|
||||
},
|
||||
"cng-second-job" => {
|
||||
"stage" => "test",
|
||||
"script" => "echo 'test'"
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
it "adds rule: never" do
|
||||
pipeline_creator.create
|
||||
|
||||
expect(generated_cng_yaml).to include(cng_pipeline_definition.deep_merge({
|
||||
"cng-instance" => {
|
||||
"rules" => [{ "when" => "never" }]
|
||||
},
|
||||
"cng-second-job" => {
|
||||
"parallel" => 1
|
||||
}
|
||||
}))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "with all jobs having 0 runtime" do
|
||||
let(:noop_reason) { "no-op run, pipeline has no executable tests" }
|
||||
let(:scenario_examples) { { scenario_class => [{ id: example, status: "pending" }] } }
|
||||
|
||||
it "create noop pipeline" do
|
||||
pipeline_creator.create
|
||||
|
||||
expect(generated_cng_yaml).to include(cng_pipeline_definition.deep_merge({
|
||||
"cng-instance" => {
|
||||
"rules" => [{ "when" => "never" }]
|
||||
}
|
||||
}))
|
||||
expect(generated_cng_yaml).to eq(YAML.safe_load(noop_pipeline))
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -309,20 +369,6 @@ module QA
|
|||
end
|
||||
end
|
||||
|
||||
context "with no executable examples" do
|
||||
let(:status) { "pending" }
|
||||
|
||||
it "skips the job" do
|
||||
pipeline_creator.create
|
||||
|
||||
expect(generated_cng_yaml).to include(cng_pipeline_definition.deep_merge({
|
||||
"cng-instance" => {
|
||||
"rules" => [{ "when" => "never" }]
|
||||
}
|
||||
}))
|
||||
end
|
||||
end
|
||||
|
||||
context "with existing parallel job count" do
|
||||
let(:cng_pipeline_definition) do
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import { shallowMount } from '@vue/test-utils';
|
||||
import { GlBroadcastMessage, GlLink, GlSprintf } from '@gitlab/ui';
|
||||
import Vue from 'vue';
|
||||
// eslint-disable-next-line no-restricted-imports
|
||||
import Vuex from 'vuex';
|
||||
|
|
@ -38,11 +39,15 @@ describe('WebIDE', () => {
|
|||
|
||||
wrapper = shallowMount(Ide, {
|
||||
store,
|
||||
stubs: {
|
||||
GlSprintf,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const findAlert = () => wrapper.findComponent(CannotPushCodeAlert);
|
||||
|
||||
const findBroadcastMessage = () => wrapper.findComponent(GlBroadcastMessage);
|
||||
const callOnBeforeUnload = (e = {}) => window.onbeforeunload(e);
|
||||
|
||||
beforeAll(() => {
|
||||
|
|
@ -62,6 +67,36 @@ describe('WebIDE', () => {
|
|||
window.onbeforeunload = null;
|
||||
});
|
||||
|
||||
describe('removal announcement', () => {
|
||||
beforeEach(() => {
|
||||
createComponent();
|
||||
});
|
||||
|
||||
it('displays removal announcement', () => {
|
||||
expect(findBroadcastMessage().text()).toMatch(
|
||||
/The legacy Vue-based GitLab Web IDE will be removed in GitLab 18.0/,
|
||||
);
|
||||
expect(findBroadcastMessage().text()).toMatch(
|
||||
/To prepare for this removal, see deprecations and removals./,
|
||||
);
|
||||
});
|
||||
|
||||
it('displays a banner with a link to the deprecation announcement', () => {
|
||||
const glLink = findBroadcastMessage().findComponent(GlLink);
|
||||
expect(glLink.attributes('href')).toBe(
|
||||
'/help/update/deprecations.md#legacy-web-ide-is-deprecated',
|
||||
);
|
||||
});
|
||||
|
||||
it('does not allow dismissing the announcement', () => {
|
||||
expect(findBroadcastMessage().props()).toMatchObject({
|
||||
dismissible: false,
|
||||
iconName: 'warning',
|
||||
theme: 'red',
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('ide component, empty repo', () => {
|
||||
beforeEach(() => {
|
||||
createComponent({
|
||||
|
|
|
|||
|
|
@ -33,11 +33,7 @@ RSpec.describe API::MavenPackages, feature_category: :package_registry do
|
|||
let(:sha1_checksum_header) { ::API::Helpers::Packages::Maven::SHA1_CHECKSUM_HEADER }
|
||||
let(:md5_checksum_header) { ::API::Helpers::Packages::Maven::MD5_CHECKSUM_HEADER }
|
||||
|
||||
let(:headers_with_deploy_token) do
|
||||
headers.merge(
|
||||
Gitlab::Auth::AuthFinders::DEPLOY_TOKEN_HEADER => deploy_token.token
|
||||
)
|
||||
end
|
||||
let(:headers_with_deploy_token) { headers.merge(Gitlab::Auth::AuthFinders::DEPLOY_TOKEN_HEADER => deploy_token.token) }
|
||||
|
||||
let(:version) { '1.0-SNAPSHOT' }
|
||||
let(:param_path) { "#{package_name}/#{version}" }
|
||||
|
|
@ -979,15 +975,17 @@ RSpec.describe API::MavenPackages, feature_category: :package_registry do
|
|||
end
|
||||
|
||||
context 'with basic auth' do
|
||||
where(:token_type) do
|
||||
%i[personal_access_token deploy_token job]
|
||||
let(:user_username) { user.username }
|
||||
|
||||
where(:username, :password) do
|
||||
ref(:user_username) | lazy { personal_access_token.token }
|
||||
ref(:user_username) | lazy { deploy_token.token }
|
||||
::Gitlab::Auth::CI_JOB_USER | lazy { job.token }
|
||||
end
|
||||
|
||||
with_them do
|
||||
let(:token) { send(token_type).token }
|
||||
|
||||
it "authorizes upload with #{params[:token_type]} token" do
|
||||
authorize_upload({}, headers.merge(basic_auth_header(token_type == :job ? ::Gitlab::Auth::CI_JOB_USER : user.username, token)))
|
||||
it 'authorizes upload' do
|
||||
authorize_upload({}, headers.merge(headers.merge(basic_auth_header(username, password))))
|
||||
|
||||
expect(response).to have_gitlab_http_status(:ok)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -63,5 +63,57 @@ RSpec.describe 'projects/pipelines/show', feature_category: :pipeline_compositio
|
|||
|
||||
expect(rendered).to have_selector('#js-pipeline-tabs')
|
||||
end
|
||||
|
||||
context 'when pipeline uses dependency scanning' do
|
||||
let(:build_name) { nil }
|
||||
let(:build) { create(:ci_build, name: build_name) }
|
||||
let(:pipeline) { create(:ci_pipeline, project: project, builds: [build]) }
|
||||
|
||||
shared_examples 'pipeline with deprecated dependency scanning job' do
|
||||
it 'shows deprecation warning' do
|
||||
render
|
||||
|
||||
expect(rendered).to have_content('You are using a deprecated Dependency Scanning analyzer')
|
||||
expect(rendered).to have_content(
|
||||
'The Gemnasium analyzer has been replaced with a new Dependency Scanning analyzer')
|
||||
end
|
||||
end
|
||||
|
||||
context 'when gemnasium job is defined' do
|
||||
let(:build_name) { 'gemnasium' }
|
||||
|
||||
it_behaves_like 'pipeline with deprecated dependency scanning job'
|
||||
end
|
||||
|
||||
context 'when gemnasium-maven job is defined' do
|
||||
let(:build_name) { 'gemnasium-maven' }
|
||||
|
||||
it_behaves_like 'pipeline with deprecated dependency scanning job'
|
||||
end
|
||||
|
||||
context 'when gemnasium-python job is defined' do
|
||||
let(:build_name) { 'gemnasium-python' }
|
||||
|
||||
it_behaves_like 'pipeline with deprecated dependency scanning job'
|
||||
end
|
||||
|
||||
context 'when a gemnasium job is defined using parallel:matrix' do
|
||||
let(:build_name) { 'gemnasium: [variable]' }
|
||||
|
||||
it_behaves_like 'pipeline with deprecated dependency scanning job'
|
||||
end
|
||||
|
||||
context 'when a custom dependency scanning job is defined' do
|
||||
let(:build_name) { 'custom-govulncheck-dependency-scanning-job' }
|
||||
|
||||
it 'shows deprecation warning' do
|
||||
render
|
||||
|
||||
expect(rendered).not_to have_content('You are using a deprecated Dependency Scanning analyzer')
|
||||
expect(rendered).not_to have_content(
|
||||
'The Gemnasium analyzer has been replaced with a new Dependency Scanning analyzer')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Reference in New Issue