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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab/issue_templates/Migrations.md4
-rw-r--r--.gitlab/issue_templates/Snowplow event tracking.md2
-rw-r--r--app/assets/javascripts/ide/lib/languages/README.md4
-rw-r--r--app/assets/stylesheets/_page_specific_files.scss1
-rw-r--r--app/assets/stylesheets/framework/variables.scss1
-rw-r--r--app/assets/stylesheets/pages/graph.scss74
-rw-r--r--app/finders/README.md2
-rw-r--r--app/finders/projects_finder.rb13
-rw-r--r--app/graphql/resolvers/projects_resolver.rb11
-rw-r--r--app/serializers/README.md4
-rw-r--r--app/services/admin/propagate_integration_service.rb23
-rw-r--r--app/services/projects/overwrite_project_service.rb12
-rw-r--r--app/views/projects/deployments/_actions.haml2
-rw-r--r--app/views/projects/deployments/_confirm_rollback_modal.html.haml4
-rw-r--r--app/views/projects/deployments/_rollback.haml2
-rw-r--r--app/views/projects/network/show.html.haml6
-rw-r--r--app/workers/propagate_integration_group_worker.rb8
-rw-r--r--app/workers/propagate_integration_project_worker.rb3
-rw-r--r--changelogs/unreleased/-231225-projects-deployments.yml5
-rw-r--r--changelogs/unreleased/235676-prioritize-exact-matches.yml5
-rw-r--r--config/feature_flags/development/deploy_boards_dedupe_instances.yml7
-rw-r--r--config/feature_flags/development/project_finder_similarity_sort.yml7
-rw-r--r--doc/.vale/gitlab/spelling-exceptions.txt4
-rw-r--r--doc/administration/gitaly/praefect.md2
-rw-r--r--doc/administration/troubleshooting/tracing_correlation_id.md2
-rw-r--r--doc/api/graphql/reference/gitlab_schema.graphql5
-rw-r--r--doc/api/graphql/reference/gitlab_schema.json10
-rw-r--r--doc/ci/README.md2
-rw-r--r--doc/ci/docker/using_docker_build.md2
-rw-r--r--doc/ci/environments/index.md2
-rw-r--r--doc/ci/yaml/README.md19
-rw-r--r--doc/development/architecture.md2
-rw-r--r--doc/development/cicd/templates.md2
-rw-r--r--doc/development/database/add_foreign_key_to_existing_column.md2
-rw-r--r--doc/development/database/table_partitioning.md2
-rw-r--r--doc/development/documentation/graphql_styleguide.md2
-rw-r--r--doc/development/feature_categorization/index.md2
-rw-r--r--doc/development/multi_version_compatibility.md2
-rw-r--r--doc/development/redis.md2
-rw-r--r--doc/development/telemetry/usage_ping.md2
-rw-r--r--doc/development/testing_guide/end_to_end/style_guide.md4
-rw-r--r--doc/gitlab-geo/README.md5
-rw-r--r--doc/security/asset_proxy.md2
-rw-r--r--doc/security/passwords_for_integrated_authentication_methods.md2
-rw-r--r--doc/subscriptions/gitlab_com/index.md36
-rw-r--r--doc/user/application_security/container_scanning/index.md2
-rw-r--r--doc/user/clusters/applications.md388
-rw-r--r--doc/user/infrastructure/index.md2
-rw-r--r--doc/user/packages/container_registry/index.md197
-rw-r--r--doc/user/project/badges.md2
-rw-r--r--doc/user/project/deploy_boards.md5
-rw-r--r--doc/workflow/README.md5
-rw-r--r--doc/workflow/add-user/add-user.md5
-rw-r--r--doc/workflow/authorization_for_merge_requests.md5
-rw-r--r--doc/workflow/award_emoji.md5
-rw-r--r--doc/workflow/cherry_pick_changes.md5
-rw-r--r--doc/workflow/ff_merge.md5
-rw-r--r--doc/workflow/file_finder.md5
-rw-r--r--doc/workflow/forking_workflow.md5
-rw-r--r--doc/workflow/git_annex.md5
-rw-r--r--doc/workflow/git_lfs.md5
-rw-r--r--doc/workflow/gitlab_flow.md5
-rw-r--r--doc/workflow/groups.md5
-rw-r--r--doc/workflow/importing/README.md5
-rw-r--r--doc/workflow/importing/import_projects_from_bitbucket.md5
-rw-r--r--doc/workflow/importing/import_projects_from_fogbugz.md5
-rw-r--r--doc/workflow/importing/import_projects_from_gitea.md5
-rw-r--r--doc/workflow/importing/import_projects_from_github.md5
-rw-r--r--doc/workflow/importing/import_projects_from_gitlab_com.md5
-rw-r--r--doc/workflow/importing/migrating_from_svn.md5
-rw-r--r--doc/workflow/issue_weight.md5
-rw-r--r--doc/workflow/labels.md7
-rw-r--r--doc/workflow/lfs/lfs_administration.md5
-rw-r--r--doc/workflow/lfs/manage_large_binaries_with_git_lfs.md5
-rw-r--r--doc/workflow/lfs/migrate_from_git_annex_to_git_lfs.md5
-rw-r--r--doc/workflow/merge_request_approvals.md5
-rw-r--r--doc/workflow/merge_requests.md5
-rw-r--r--doc/workflow/merge_when_build_succeeds.md5
-rw-r--r--doc/workflow/milestones.md5
-rw-r--r--doc/workflow/notifications.md5
-rw-r--r--doc/workflow/project_features.md5
-rw-r--r--doc/workflow/protected_branches.md5
-rw-r--r--doc/workflow/rebase_before_merge.md5
-rw-r--r--doc/workflow/releases.md5
-rw-r--r--doc/workflow/repository_mirroring.md5
-rw-r--r--doc/workflow/revert_changes.md5
-rw-r--r--doc/workflow/share_projects_with_other_groups.md5
-rw-r--r--doc/workflow/share_with_group.md5
-rw-r--r--doc/workflow/shortcuts.md5
-rw-r--r--doc/workflow/time_tracking.md5
-rw-r--r--doc/workflow/timezone.md5
-rw-r--r--doc/workflow/todos.md5
-rw-r--r--doc/workflow/web_editor.md5
-rw-r--r--doc/workflow/wip_merge_requests.md5
-rw-r--r--doc/workflow/workflow.md5
-rw-r--r--lib/gitlab/kubernetes/pod.rb36
-rw-r--r--qa/README.md2
-rwxr-xr-xscripts/lint-doc.sh2
-rw-r--r--spec/finders/projects_finder_spec.rb32
-rw-r--r--spec/graphql/resolvers/projects_resolver_spec.rb23
-rw-r--r--spec/models/integration_spec.rb8
-rw-r--r--spec/services/admin/propagate_integration_service_spec.rb86
-rw-r--r--spec/workers/propagate_integration_group_worker_spec.rb31
-rw-r--r--spec/workers/propagate_integration_inherit_worker_spec.rb8
-rw-r--r--spec/workers/propagate_integration_project_worker_spec.rb29
105 files changed, 651 insertions, 739 deletions
diff --git a/.gitlab/issue_templates/Migrations.md b/.gitlab/issue_templates/Migrations.md
index 38fc7a31b24..822722a0f71 100644
--- a/.gitlab/issue_templates/Migrations.md
+++ b/.gitlab/issue_templates/Migrations.md
@@ -16,7 +16,7 @@ Please add information here about why you're planning on migrating. Include any
<!-- Please complete as many items in this list as possible. If you're not sure yet, add "TBD" (To be Decided) or "Unknown" -->
* **Timeline.** -
- * **Product.** - GitLab Gold/Ultimate or Commnunity Edition
+ * **Product.** - GitLab Gold/Ultimate or Community Edition
* **Project's License.** What kind of OSI-approved license does your project use?
## Current Tooling and Replacements
@@ -64,4 +64,4 @@ Here is an example of what this list might look like once populated: https://git
------
/label ~"Open Source" ~movingtogitlab
-/cc @nuritzi \ No newline at end of file
+/cc @nuritzi
diff --git a/.gitlab/issue_templates/Snowplow event tracking.md b/.gitlab/issue_templates/Snowplow event tracking.md
index 71fa880e087..47b97f377c2 100644
--- a/.gitlab/issue_templates/Snowplow event tracking.md
+++ b/.gitlab/issue_templates/Snowplow event tracking.md
@@ -8,7 +8,7 @@
-->
<!--
-We generally recommend events be tracked using a [structured event](https://docs.snowplowanalytics.com/docs/understanding-tracking-design/out-of-the-box-vs-custom-events-and-entities/#structured-events) which has 5 properties you can use. There may be instances where structured events are not sufficient. You may want to track an event where the property changes frequently or is general something very unique. In those cases, use a [self-decribing event](https://docs.snowplowanalytics.com/docs/understanding-tracking-design/out-of-the-box-vs-custom-events-and-entities/#self-describing-events)
+We generally recommend events be tracked using a [structured event](https://docs.snowplowanalytics.com/docs/understanding-tracking-design/out-of-the-box-vs-custom-events-and-entities/#structured-events) which has 5 properties you can use. There may be instances where structured events are not sufficient. You may want to track an event where the property changes frequently or is general something very unique. In those cases, use a [self-describing event](https://docs.snowplowanalytics.com/docs/understanding-tracking-design/out-of-the-box-vs-custom-events-and-entities/#self-describing-events)
-->
diff --git a/app/assets/javascripts/ide/lib/languages/README.md b/app/assets/javascripts/ide/lib/languages/README.md
index e4d1a4c7818..c4f3de00783 100644
--- a/app/assets/javascripts/ide/lib/languages/README.md
+++ b/app/assets/javascripts/ide/lib/languages/README.md
@@ -1,7 +1,7 @@
# Web IDE Languages
The Web IDE uses the [Monaco editor](https://microsoft.github.io/monaco-editor/) which uses the [Monarch library](https://microsoft.github.io/monaco-editor/monarch.html) for syntax highlighting.
-The Web IDE currently supports all langauges defined in the [monaco-languages](https://github.com/microsoft/monaco-languages/tree/master/src) repository.
+The Web IDE currently supports all languages defined in the [monaco-languages](https://github.com/microsoft/monaco-languages/tree/master/src) repository.
## Adding New Languages
@@ -14,7 +14,7 @@ Should you be willing to help us and add support to GitLab for any missing langu
2. Create a new file in this folder called `{languageName}.js`, where `{languageName}` is the name of the language you want to add support for.
3. Follow the [Monarch documentation](https://microsoft.github.io/monaco-editor/monarch.html) to add a configuration for the new language.
- Example: The [`vue.js`](./vue.js) file in the current directory adds support for Vue.js Syntax Highlighting.
-4. Add tests for the new langauge implementation in `spec/frontend/ide/lib/languages/{langaugeName}.js`.
+4. Add tests for the new language implementation in `spec/frontend/ide/lib/languages/{langaugeName}.js`.
- Example: See [`vue_spec.js`](spec/frontend/ide/lib/languages/vue_spec.js).
5. Create a [Merge Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) with your newly added language.
diff --git a/app/assets/stylesheets/_page_specific_files.scss b/app/assets/stylesheets/_page_specific_files.scss
index d13112903a5..0da620fecfd 100644
--- a/app/assets/stylesheets/_page_specific_files.scss
+++ b/app/assets/stylesheets/_page_specific_files.scss
@@ -18,7 +18,6 @@
@import './pages/events';
@import './pages/experience_level';
@import './pages/experimental_separate_sign_up';
-@import './pages/graph';
@import './pages/groups';
@import './pages/help';
@import './pages/import';
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index 66267d8a8bc..f0b1e859139 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -780,7 +780,6 @@ $login-brand-holder-color: #888;
* Projects
*/
$project-option-descr-color: #54565b;
-$project-network-controls-color: #888;
/*
* Monitor Charts
diff --git a/app/assets/stylesheets/pages/graph.scss b/app/assets/stylesheets/pages/graph.scss
deleted file mode 100644
index bca4d50973a..00000000000
--- a/app/assets/stylesheets/pages/graph.scss
+++ /dev/null
@@ -1,74 +0,0 @@
-.project-network {
- border: 1px solid $border-color;
-
- .controls {
- color: $project-network-controls-color;
- font-size: 14px;
- padding: 5px;
- border-bottom: 1px solid $border-color;
- background: $gray-darker;
- }
-
- .network-graph {
- background: $white;
- height: 500px;
- overflow-y: scroll;
- overflow-x: hidden;
- }
-}
-
-.svg-graph-container {
- width: 100%;
-
- .axis-tick {
- opacity: 0.4;
- }
-
- .tick-text {
- fill: $gl-text-color-secondary;
- }
-
- .x-axis-text {
- fill: $gray-900;
- }
-
- .bar-rect {
- fill: rgba($blue-500, 0.1);
- stroke: $blue-500;
- }
-
- .bar-rect:hover {
- fill: rgba($blue-700, 0.3);
- }
-
- .y-axis-label {
- line {
- stroke: $gray-300;
- }
-
- text {
- font-weight: bold;
- font-size: 12px;
- fill: $gray-700;
- }
- }
-}
-
-.svg-graph-container-with-grab {
- cursor: grab;
-}
-
-.svg-graph-container-grabbed {
- cursor: grabbing;
-}
-
-@keyframes flickerAnimation {
- 0% { opacity: 1; }
- 50% { opacity: 0; }
- 100% { opacity: 1; }
-}
-
-.animate-flicker {
- animation: flickerAnimation 1.5s infinite;
- fill: $gray-300;
-}
diff --git a/app/finders/README.md b/app/finders/README.md
index 1a1c69dea38..a5a6fd8fe74 100644
--- a/app/finders/README.md
+++ b/app/finders/README.md
@@ -19,4 +19,4 @@ Better use this:
issues = IssuesFinder.new(project, user, filter).execute
```
-It will help keep models thiner.
+It will help keep models thinner.
diff --git a/app/finders/projects_finder.rb b/app/finders/projects_finder.rb
index 471029c1ef9..14b84d0bfa6 100644
--- a/app/finders/projects_finder.rb
+++ b/app/finders/projects_finder.rb
@@ -50,7 +50,12 @@ class ProjectsFinder < UnionFinder
use_cte = params.delete(:use_cte)
collection = Project.wrap_with_cte(collection) if use_cte
collection = filter_projects(collection)
- sort(collection)
+
+ if params[:sort] == 'similarity' && params[:search] && Feature.enabled?(:project_finder_similarity_sort)
+ collection.sorted_by_similarity_desc(params[:search])
+ else
+ sort(collection)
+ end
end
private
@@ -209,7 +214,11 @@ class ProjectsFinder < UnionFinder
end
def sort(items)
- params[:sort].present? ? items.sort_by_attribute(params[:sort]) : items.projects_order_id_desc
+ if params[:sort].present?
+ items.sort_by_attribute(params[:sort])
+ else
+ items.projects_order_id_desc
+ end
end
def by_archived(projects)
diff --git a/app/graphql/resolvers/projects_resolver.rb b/app/graphql/resolvers/projects_resolver.rb
index f6afe945fe8..69438229a50 100644
--- a/app/graphql/resolvers/projects_resolver.rb
+++ b/app/graphql/resolvers/projects_resolver.rb
@@ -13,13 +13,17 @@ module Resolvers
description: 'Search query for project name, path, or description'
argument :ids, [GraphQL::ID_TYPE],
- required: false,
- description: 'Filter projects by IDs'
+ required: false,
+ description: 'Filter projects by IDs'
argument :search_namespaces, GraphQL::BOOLEAN_TYPE,
required: false,
description: 'Include namespace in project search'
+ argument :sort, GraphQL::STRING_TYPE,
+ required: false,
+ description: 'Sort order of results'
+
def resolve(**args)
ProjectsFinder
.new(current_user: current_user, params: project_finder_params(args), project_ids_relation: parse_gids(args[:ids]))
@@ -33,7 +37,8 @@ module Resolvers
without_deleted: true,
non_public: params[:membership],
search: params[:search],
- search_namespaces: params[:search_namespaces]
+ search_namespaces: params[:search_namespaces],
+ sort: params[:sort]
}.compact
end
diff --git a/app/serializers/README.md b/app/serializers/README.md
index 2cbe6f9d263..89721f572e0 100644
--- a/app/serializers/README.md
+++ b/app/serializers/README.md
@@ -47,11 +47,11 @@ representation. It rarely happens that a serialization entity exists without
a corresponding domain model class. As an example, we have an `Issue` class and
a corresponding `IssueSerializer`.
-Serialization entites are designed to reuse other serialization entities, which
+Serialization entities are designed to reuse other serialization entities, which
is a convenient way to create a multi-level JSON representation of a piece of
a domain model you want to serialize.
-See [documentation for Grape Entites][grape-entity-readme] for more details.
+See [documentation for Grape Entities][grape-entity-readme] for more details.
## How to implement a serializer?
diff --git a/app/services/admin/propagate_integration_service.rb b/app/services/admin/propagate_integration_service.rb
index 80e27c21d5b..96a6d861e47 100644
--- a/app/services/admin/propagate_integration_service.rb
+++ b/app/services/admin/propagate_integration_service.rb
@@ -7,8 +7,13 @@ module Admin
def propagate
update_inherited_integrations
- create_integration_for_groups_without_integration if Feature.enabled?(:group_level_integrations)
- create_integration_for_projects_without_integration
+ if integration.instance?
+ create_integration_for_groups_without_integration if Feature.enabled?(:group_level_integrations)
+ create_integration_for_projects_without_integration
+ else
+ create_integration_for_groups_without_integration_belonging_to_group
+ create_integration_for_projects_without_integration_belonging_to_group
+ end
end
private
@@ -28,5 +33,19 @@ module Admin
PropagateIntegrationGroupWorker.perform_async(integration.id, min_id, max_id)
end
end
+
+ def create_integration_for_groups_without_integration_belonging_to_group
+ integration.group.descendants.without_integration(integration).each_batch(of: BATCH_SIZE) do |groups|
+ min_id, max_id = groups.pick("MIN(namespaces.id), MAX(namespaces.id)")
+ PropagateIntegrationGroupWorker.perform_async(integration.id, min_id, max_id)
+ end
+ end
+
+ def create_integration_for_projects_without_integration_belonging_to_group
+ Project.without_integration(integration).in_namespace(integration.group.self_and_descendants).each_batch(of: BATCH_SIZE) do |projects|
+ min_id, max_id = projects.pick("MIN(projects.id), MAX(projects.id)")
+ PropagateIntegrationProjectWorker.perform_async(integration.id, min_id, max_id)
+ end
+ end
end
end
diff --git a/app/services/projects/overwrite_project_service.rb b/app/services/projects/overwrite_project_service.rb
index 958a00afbb8..e681b5643ee 100644
--- a/app/services/projects/overwrite_project_service.rb
+++ b/app/services/projects/overwrite_project_service.rb
@@ -32,12 +32,12 @@ module Projects
def move_before_destroy_relationships(source_project)
options = { remove_remaining_elements: false }
- ::Projects::MoveUsersStarProjectsService.new(@project, @current_user).execute(source_project, options)
- ::Projects::MoveAccessService.new(@project, @current_user).execute(source_project, options)
- ::Projects::MoveDeployKeysProjectsService.new(@project, @current_user).execute(source_project, options)
- ::Projects::MoveNotificationSettingsService.new(@project, @current_user).execute(source_project, options)
- ::Projects::MoveForksService.new(@project, @current_user).execute(source_project, options)
- ::Projects::MoveLfsObjectsProjectsService.new(@project, @current_user).execute(source_project, options)
+ ::Projects::MoveUsersStarProjectsService.new(@project, @current_user).execute(source_project, **options)
+ ::Projects::MoveAccessService.new(@project, @current_user).execute(source_project, **options)
+ ::Projects::MoveDeployKeysProjectsService.new(@project, @current_user).execute(source_project, **options)
+ ::Projects::MoveNotificationSettingsService.new(@project, @current_user).execute(source_project, **options)
+ ::Projects::MoveForksService.new(@project, @current_user).execute(source_project, **options)
+ ::Projects::MoveLfsObjectsProjectsService.new(@project, @current_user).execute(source_project, **options)
add_source_project_to_fork_network(source_project)
end
diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml
index 5127d8b77d5..7f4b99f1a3f 100644
--- a/app/views/projects/deployments/_actions.haml
+++ b/app/views/projects/deployments/_actions.haml
@@ -3,7 +3,7 @@
- if actions.present?
.btn-group
.dropdown
- %button.dropdown.dropdown-new.btn.btn-default.has-tooltip{ type: 'button', 'data-toggle' => 'dropdown', title: s_('Environments|Deploy to...') }
+ %button.dropdown.dropdown-new.btn.gl-button.btn-default.has-tooltip{ type: 'button', 'data-toggle' => 'dropdown', title: s_('Environments|Deploy to...') }
= sprite_icon('play')
= icon('caret-down')
%ul.dropdown-menu.dropdown-menu-right
diff --git a/app/views/projects/deployments/_confirm_rollback_modal.html.haml b/app/views/projects/deployments/_confirm_rollback_modal.html.haml
index 3735ead1559..23729d6ebf9 100644
--- a/app/views/projects/deployments/_confirm_rollback_modal.html.haml
+++ b/app/views/projects/deployments/_confirm_rollback_modal.html.haml
@@ -15,8 +15,8 @@
%p
= s_('Environments|This action will run the job defined by %{environment_name} for commit %{commit_id}, putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?').html_safe % {commit_id: commit_sha, environment_name: @environment.name}
.modal-footer
- = button_tag _('Cancel'), type: 'button', class: 'btn btn-cancel', data: { dismiss: 'modal' }
- = link_to [:retry, @project, deployment.deployable], method: :post, class: 'btn btn-danger' do
+ = button_tag _('Cancel'), type: 'button', class: 'btn gl-button btn-danger', data: { dismiss: 'modal' }
+ = link_to [:retry, @project, deployment.deployable], method: :post, class: 'btn gl-button btn-danger' do
- if deployment.last?
= s_('Environments|Re-deploy')
- else
diff --git a/app/views/projects/deployments/_rollback.haml b/app/views/projects/deployments/_rollback.haml
index dffa5e4ba40..c5e884473ff 100644
--- a/app/views/projects/deployments/_rollback.haml
+++ b/app/views/projects/deployments/_rollback.haml
@@ -1,6 +1,6 @@
- if deployment.deployable && can?(current_user, :create_deployment, deployment)
- tooltip = deployment.last? ? s_('Environments|Re-deploy to environment') : s_('Environments|Rollback environment')
- = button_tag class: 'btn btn-default btn-build has-tooltip', type: 'button', data: { toggle: 'modal', target: "#confirm-rollback-modal-#{deployment.id}" }, title: tooltip do
+ = button_tag class: 'btn gl-button btn-default btn-build has-tooltip', type: 'button', data: { toggle: 'modal', target: "#confirm-rollback-modal-#{deployment.id}" }, title: tooltip do
- if deployment.last?
= sprite_icon('repeat')
- else
diff --git a/app/views/projects/network/show.html.haml b/app/views/projects/network/show.html.haml
index d134bfb488e..b07ce3ae78c 100644
--- a/app/views/projects/network/show.html.haml
+++ b/app/views/projects/network/show.html.haml
@@ -2,8 +2,8 @@
- page_title _("Graph"), @ref
= render "head"
%div{ class: container_class }
- .project-network
- .controls
+ .project-network.gl-border-1.gl-border-solid.gl-border-gray-300
+ .controls.gl-bg-gray-50.gl-p-2.gl-font-base.gl-text-gray-400.gl-border-b-1.gl-border-b-solid.gl-border-b-gray-300
= form_tag project_network_path(@project, @id), method: :get, class: 'form-inline network-form' do |f|
= text_field_tag :extended_sha1, @options[:extended_sha1], placeholder: _("Git revision"), class: 'search-input form-control input-mx-250 search-sha'
= button_tag class: 'btn btn-success' do
@@ -15,6 +15,6 @@
%span= _("Begin with the selected commit")
- if @commit
- .network-graph{ data: { url: @url, commit_url: @commit_url, ref: @ref, commit_id: @commit.id } }
+ .network-graph.gl-bg-white.gl-overflow-scroll.gl-overflow-x-hidden{ data: { url: @url, commit_url: @commit_url, ref: @ref, commit_id: @commit.id } }
.text-center.gl-mt-3
.spinner.spinner-md
diff --git a/app/workers/propagate_integration_group_worker.rb b/app/workers/propagate_integration_group_worker.rb
index e539c6d4719..01155753877 100644
--- a/app/workers/propagate_integration_group_worker.rb
+++ b/app/workers/propagate_integration_group_worker.rb
@@ -11,7 +11,13 @@ class PropagateIntegrationGroupWorker
integration = Service.find_by_id(integration_id)
return unless integration
- batch = Group.where(id: min_id..max_id).without_integration(integration)
+ batch = if integration.instance?
+ Group.where(id: min_id..max_id).without_integration(integration)
+ else
+ integration.group.descendants.where(id: min_id..max_id).without_integration(integration)
+ end
+
+ return if batch.empty?
BulkCreateIntegrationService.new(integration, batch, 'group').execute
end
diff --git a/app/workers/propagate_integration_project_worker.rb b/app/workers/propagate_integration_project_worker.rb
index c1e286b24fc..188d81e5fc1 100644
--- a/app/workers/propagate_integration_project_worker.rb
+++ b/app/workers/propagate_integration_project_worker.rb
@@ -12,6 +12,9 @@ class PropagateIntegrationProjectWorker
return unless integration
batch = Project.where(id: min_id..max_id).without_integration(integration)
+ batch = batch.in_namespace(integration.group.self_and_descendants) if integration.group_id
+
+ return if batch.empty?
BulkCreateIntegrationService.new(integration, batch, 'project').execute
end
diff --git a/changelogs/unreleased/-231225-projects-deployments.yml b/changelogs/unreleased/-231225-projects-deployments.yml
new file mode 100644
index 00000000000..140f1e9672c
--- /dev/null
+++ b/changelogs/unreleased/-231225-projects-deployments.yml
@@ -0,0 +1,5 @@
+---
+title: Add gl-button class to app/views/projects/deployments
+merge_request: 44203
+author: Lakshit
+type: other
diff --git a/changelogs/unreleased/235676-prioritize-exact-matches.yml b/changelogs/unreleased/235676-prioritize-exact-matches.yml
new file mode 100644
index 00000000000..88ee99fd839
--- /dev/null
+++ b/changelogs/unreleased/235676-prioritize-exact-matches.yml
@@ -0,0 +1,5 @@
+---
+title: Add sort by similarity to getProjects GraphQL call
+merge_request: 43136
+author:
+type: changed
diff --git a/config/feature_flags/development/deploy_boards_dedupe_instances.yml b/config/feature_flags/development/deploy_boards_dedupe_instances.yml
new file mode 100644
index 00000000000..04cbd6f6602
--- /dev/null
+++ b/config/feature_flags/development/deploy_boards_dedupe_instances.yml
@@ -0,0 +1,7 @@
+---
+name: deploy_boards_dedupe_instances
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40768
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/258214
+type: development
+group: group::progressive-delivery
+default_enabled: false
diff --git a/config/feature_flags/development/project_finder_similarity_sort.yml b/config/feature_flags/development/project_finder_similarity_sort.yml
new file mode 100644
index 00000000000..967a7766f44
--- /dev/null
+++ b/config/feature_flags/development/project_finder_similarity_sort.yml
@@ -0,0 +1,7 @@
+---
+name: project_finder_similarity_sort
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43136
+rollout_issue_url:
+type: development
+group: group::threat_insights
+default_enabled: false
diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt
index ef14aabcfa2..e0233907bd5 100644
--- a/doc/.vale/gitlab/spelling-exceptions.txt
+++ b/doc/.vale/gitlab/spelling-exceptions.txt
@@ -142,6 +142,7 @@ Facebook
failover
failovers
failsafe
+Falco
fastlane
favicon
Filebeat
@@ -513,6 +514,9 @@ unprioritized
unprotect
unprotected
unprotects
+unprovision
+unprovisioned
+unprovisions
unpublish
unpublished
unpublishes
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index 953669f3f95..7361579c280 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -356,7 +356,7 @@ application server, or a Gitaly node.
If you want to use a TLS client certificate, the options below can be used:
```ruby
- # Connect to PostreSQL using a TLS client certificate
+ # Connect to PostgreSQL using a TLS client certificate
# praefect['database_sslcert'] = '/path/to/client-cert'
# praefect['database_sslkey'] = '/path/to/client-key'
diff --git a/doc/administration/troubleshooting/tracing_correlation_id.md b/doc/administration/troubleshooting/tracing_correlation_id.md
index 03c342595a3..c59ce97e2b8 100644
--- a/doc/administration/troubleshooting/tracing_correlation_id.md
+++ b/doc/administration/troubleshooting/tracing_correlation_id.md
@@ -122,5 +122,5 @@ If you have done some horizontal scaling in your GitLab infrastructure, then
you will need to search across _all_ of your GitLab nodes. You can do this with
some sort of log aggregation software like Loki, ELK, Splunk, or others.
-You can use a tool like Ansible or PSSH (parellel SSH) that can execute identical commands across your servers in
+You can use a tool like Ansible or PSSH (parallel SSH) that can execute identical commands across your servers in
parallel, or craft your own solution.
diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql
index 3622501a227..c55ab5e6d80 100644
--- a/doc/api/graphql/reference/gitlab_schema.graphql
+++ b/doc/api/graphql/reference/gitlab_schema.graphql
@@ -15010,6 +15010,11 @@ type Query {
Include namespace in project search
"""
searchNamespaces: Boolean
+
+ """
+ Sort order of results
+ """
+ sort: String
): ProjectConnection
"""
diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json
index 4ca34d124e6..124bbc9643e 100644
--- a/doc/api/graphql/reference/gitlab_schema.json
+++ b/doc/api/graphql/reference/gitlab_schema.json
@@ -43594,6 +43594,16 @@
"defaultValue": null
},
{
+ "name": "sort",
+ "description": "Sort order of results",
+ "type": {
+ "kind": "SCALAR",
+ "name": "String",
+ "ofType": null
+ },
+ "defaultValue": null
+ },
+ {
"name": "after",
"description": "Returns the elements in the list that come after the specified cursor.",
"type": {
diff --git a/doc/ci/README.md b/doc/ci/README.md
index ec8697224b8..769390ce2c3 100644
--- a/doc/ci/README.md
+++ b/doc/ci/README.md
@@ -94,7 +94,7 @@ GitLab CI/CD uses a number of concepts to describe and run your build and deploy
| [Job artifacts](pipelines/job_artifacts.md) | Output, use, and reuse job artifacts. |
| [Cache dependencies](caching/index.md) | Cache your dependencies for a faster execution. |
| [GitLab Runner](https://docs.gitlab.com/runner/) | Configure your own runners to execute your scripts. |
-| [Pipeline efficiency](pipelines/pipeline_efficiency.md) | Configure your pipelines to run quickly and effienctly. |
+| [Pipeline efficiency](pipelines/pipeline_efficiency.md) | Configure your pipelines to run quickly and efficiently. |
## Configuration
diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md
index a319c5f09ab..e3123cde1cd 100644
--- a/doc/ci/docker/using_docker_build.md
+++ b/doc/ci/docker/using_docker_build.md
@@ -503,7 +503,7 @@ and [using the OverlayFS storage driver](https://docs.docker.com/engine/userguid
## Using the GitLab Container Registry
Once you've built a Docker image, you can push it up to the built-in
-[GitLab Container Registry](../../user/packages/container_registry/index.md#build-and-push-images-using-gitlab-cicd).
+[GitLab Container Registry](../../user/packages/container_registry/index.md#build-and-push-by-using-gitlab-cicd).
## Troubleshooting
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index 589607fbed8..b39fb69d64c 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -855,7 +855,7 @@ exist, you should see something like:
### Environment incident management
-You have successfuly setup a Continous Delivery/Deployment workflow in your project.
+You have successfully setup a Continuous Delivery/Deployment workflow in your project.
Production environments can go down unexpectedly, including for reasons outside
of your own control. For example, issues with external dependencies, infrastructure,
or human error can cause major issues with an environment. This could include:
diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md
index 7e1eb383da3..ca6e05402cf 100644
--- a/doc/ci/yaml/README.md
+++ b/doc/ci/yaml/README.md
@@ -492,8 +492,8 @@ include:
file: '/templates/.gitlab-ci-template.yml'
```
-All [nested includes](#nested-includes) are executed in the scope of the target project,
-so it's possible to use local (relative to target project), project, remote
+All [nested includes](#nested-includes) are executed in the scope of the target project.
+This means you can use local (relative to target project), project, remote,
or template includes.
#### `include:remote`
@@ -632,10 +632,9 @@ job:
- bundle exec rspec
```
-NOTE: **Note:**
Sometimes, `script` commands must be wrapped in single or double quotes.
-For example, commands that contain a colon (`:`) must be wrapped in quotes so
-that the YAML parser knows to interpret the whole thing as a string rather than
+For example, commands that contain a colon (`:`) must be wrapped in quotes.
+The YAML parser needs to interpret the text as a string rather than
a "key: value" pair. Be careful when using special characters:
`:`, `{`, `}`, `[`, `]`, `,`, `&`, `*`, `#`, `?`, `|`, `-`, `<`, `>`, `=`, `!`, `%`, `@`, `` ` ``.
@@ -741,11 +740,11 @@ using [`|` (literal) and `>` (folded) YAML multi-line block scalar indicators](h
CAUTION: **Warning:**
If multiple commands are combined into one command string, only the last command's
-failure or success is reported,
-[incorrectly ignoring failures from earlier commands due to a bug](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/25394).
-If the success of the job depends on the success or failure of these commands,
-you can run the commands as separate `script:` items, or add `exit 1` commands
-as appropriate to the command string where needed.
+failure or success is reported.
+[Failures from earlier commands are ignored due to a bug](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/25394).
+To work around this,
+run each command as a separate `script:` item, or add an `exit 1` command
+to each command string.
You can use the `|` (literal) YAML multiline block scalar indicator to write
commands over multiple lines in the `script` section of a job description.
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
index 2646ad7052b..2e0c60da33e 100644
--- a/doc/development/architecture.md
+++ b/doc/development/architecture.md
@@ -620,7 +620,7 @@ Redis is packaged to provide a place to store:
- [Source](../administration/packages/container_registry.md#enable-the-container-registry)
- [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/doc/howto/registry.md)
- Layer: Core Service (Processor)
-- GitLab.com: [GitLab Container Registry](../user/packages/container_registry/index.md#build-and-push-images-using-gitlab-cicd)
+- GitLab.com: [GitLab Container Registry](../user/packages/container_registry/index.md#build-and-push-by-using-gitlab-cicd)
The registry is what users use to store their own Docker images. The bundled
registry uses NGINX as a load balancer and GitLab as an authentication manager.
diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md
index aff4405dc51..7d522a55559 100644
--- a/doc/development/cicd/templates.md
+++ b/doc/development/cicd/templates.md
@@ -111,7 +111,7 @@ to include older template versions. If other templates are included with `includ
they can be combined with the `include: remote`:
```yaml
-# To use the v13 stable template, which is not included in v14, fetch the specifc
+# To use the v13 stable template, which is not included in v14, fetch the specific
# template from the remote template repository with the `include:remote:` keyword.
# If you fetch from the GitLab canonical project, use the following URL format:
# https://gitlab.com/gitlab-org/gitlab/-/raw/<version>/lib/gitlab/ci/templates/<template-name>
diff --git a/doc/development/database/add_foreign_key_to_existing_column.md b/doc/development/database/add_foreign_key_to_existing_column.md
index 70743bf3d6e..85411ff9aa7 100644
--- a/doc/development/database/add_foreign_key_to_existing_column.md
+++ b/doc/development/database/add_foreign_key_to_existing_column.md
@@ -109,7 +109,7 @@ class RemoveRecordsWithoutUserFromEmailsTable < ActiveRecord::Migration[5.2]
end
def down
- # Can be a no-op when data inconsistency is not affecting the pre and post deploymnet version of the application.
+ # Can be a no-op when data inconsistency is not affecting the pre and post deployment version of the application.
# In this case we might have records in the `emails` table where the associated record in the `users` table is not there anymore.
end
end
diff --git a/doc/development/database/table_partitioning.md b/doc/development/database/table_partitioning.md
index 8e0740d1a0d..30d0b0a2f5b 100644
--- a/doc/development/database/table_partitioning.md
+++ b/doc/development/database/table_partitioning.md
@@ -85,7 +85,7 @@ ORDER BY created_at DESC
LIMIT 100
```
-If the table is partioned on the `created_at` column the base table would
+If the table is partitioned on the `created_at` column the base table would
look like:
```sql
diff --git a/doc/development/documentation/graphql_styleguide.md b/doc/development/documentation/graphql_styleguide.md
index 53a645a2936..11e6b159359 100644
--- a/doc/development/documentation/graphql_styleguide.md
+++ b/doc/development/documentation/graphql_styleguide.md
@@ -78,7 +78,7 @@ You should include a link for your new document in the global navigation (the li
left side of the documentation website). To do so, open a second MR, against the
[GitLab documentation repository](https://gitlab.com/gitlab-org/gitlab-docs/).
-We store our global navgation in the [`default-nav.yaml`](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/master/content/_data/default-nav.yaml) file, in the
+We store our global navigation in the [`default-nav.yaml`](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/master/content/_data/default-nav.yaml) file, in the
`content/_data` subdirectory. You can find the GraphQL section under the
following line:
diff --git a/doc/development/feature_categorization/index.md b/doc/development/feature_categorization/index.md
index 31ec9ee65b6..95dabf13114 100644
--- a/doc/development/feature_categorization/index.md
+++ b/doc/development/feature_categorization/index.md
@@ -23,7 +23,7 @@ product categories. When this occurs, you can automatically update
and generate a new version of the file, which needs to be committed to
the repository.
-The [Scalabilitity
+The [Scalability
team](https://about.gitlab.com/handbook/engineering/infrastructure/team/scalability/)
currently maintains the `stages.yml` file. They will automatically be
notified on Slack when the file becomes outdated.
diff --git a/doc/development/multi_version_compatibility.md b/doc/development/multi_version_compatibility.md
index 5ca43b9b818..714be296b40 100644
--- a/doc/development/multi_version_compatibility.md
+++ b/doc/development/multi_version_compatibility.md
@@ -122,7 +122,7 @@ If we look at this schema from a database point of view, we can see two deployme
And these deployments align perfectly with application changes.
1. At the beginning we have `Version N` on `Schema A`.
-1. Then we have a _long_ transition periond with both `Version N` and `Version N+1` on `Schema B`.
+1. Then we have a _long_ transition period with both `Version N` and `Version N+1` on `Schema B`.
1. When we only have `Version N+1` on `Schema B` the schema changes again.
1. Finally we have `Version N+1` on `Schema C`.
diff --git a/doc/development/redis.md b/doc/development/redis.md
index 530a97c33a7..a0ae84beb8d 100644
--- a/doc/development/redis.md
+++ b/doc/development/redis.md
@@ -121,7 +121,7 @@ passing to fluentd (and ultimately Elasticsearch).
The [Redis Keyspace
Analyzer](https://gitlab.com/gitlab-com/gl-infra/redis-keyspace-analyzer)
project contains tools for dumping the full key list and memory usage of a Redis
-instance, and then analyzing those lists while elimating potentially sensitive
+instance, and then analyzing those lists while eliminating potentially sensitive
data from the results. It can be used to find the most frequent key patterns, or
those that use the most memory.
diff --git a/doc/development/telemetry/usage_ping.md b/doc/development/telemetry/usage_ping.md
index a671ac17621..ec60c92e2cd 100644
--- a/doc/development/telemetry/usage_ping.md
+++ b/doc/development/telemetry/usage_ping.md
@@ -650,7 +650,7 @@ build in a [downstream pipeline of the `omnibus-gitlab-mirror` project](https://
1. In the downstream pipeline, wait for the `gitlab-docker` job to finish.
1. Open the job logs and locate the full container name including the version. It will take the following form: `registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`.
1. On your local machine, make sure you are logged in to the GitLab Docker registry. You can find the instructions for this in
-[Authenticating to the GitLab Container Registry](../../user/packages/container_registry/index.md#authenticating-to-the-gitlab-container-registry).
+[Authenticate to the GitLab Container Registry](../../user/packages/container_registry/index.md#authenticate-with-the-container-registry).
1. Once logged in, download the new image via `docker pull registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`
1. For more information about working with and running Omnibus GitLab containers in Docker, please refer to [GitLab Docker images](https://docs.gitlab.com/omnibus/docker/README.html) in the Omnibus documentation.
diff --git a/doc/development/testing_guide/end_to_end/style_guide.md b/doc/development/testing_guide/end_to_end/style_guide.md
index 7e9f097f624..645c2633831 100644
--- a/doc/development/testing_guide/end_to_end/style_guide.md
+++ b/doc/development/testing_guide/end_to_end/style_guide.md
@@ -141,7 +141,7 @@ end
```
```ruby
-Page::Project::New.peform do |new_page|
+Page::Project::New.perform do |new_page|
new_page.do_something
end
```
@@ -155,7 +155,7 @@ end
```
```ruby
-Page::Project::New.peform do |page|
+Page::Project::New.perform do |page|
page.do_something
end
```
diff --git a/doc/gitlab-geo/README.md b/doc/gitlab-geo/README.md
deleted file mode 100644
index 67e919fc136..00000000000
--- a/doc/gitlab-geo/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../administration/geo/index.md'
----
-
-This document was moved to [another location](../administration/geo/index.md).
diff --git a/doc/security/asset_proxy.md b/doc/security/asset_proxy.md
index 91a35c2f2a9..fdceecdf386 100644
--- a/doc/security/asset_proxy.md
+++ b/doc/security/asset_proxy.md
@@ -25,7 +25,7 @@ A Camo server is used to act as the proxy.
To install a Camo server as an asset proxy:
1. Deploy a `go-camo` server. Helpful instructions can be found in
- [building catus/go-camo](https://github.com/cactus/go-camo#building).
+ [building cactus/go-camo](https://github.com/cactus/go-camo#building).
1. Make sure your instance of GitLab is running, and that you have created a private API token.
Using the API, configure the asset proxy settings on your GitLab instance. For example:
diff --git a/doc/security/passwords_for_integrated_authentication_methods.md b/doc/security/passwords_for_integrated_authentication_methods.md
index 704af49b2d2..f2597ef1578 100644
--- a/doc/security/passwords_for_integrated_authentication_methods.md
+++ b/doc/security/passwords_for_integrated_authentication_methods.md
@@ -11,4 +11,4 @@ However, to maintain data consistency, GitLab requires passwords for all user ac
For such accounts, we use the [`friendly_token`](https://github.com/heartcombo/devise/blob/f26e05c20079c9acded3c0ee16da0df435a28997/lib/devise.rb#L492) method provided by the Devise gem to generate a random, unique and secure password and sets it as the account password during sign up.
-The length of the generated password is the set based on the value of [maximum password length](password_length_limits.md#modify-maximum-password-length-using-configuration-file) as set in the Devise configuation. The default value is 128 characters.
+The length of the generated password is the set based on the value of [maximum password length](password_length_limits.md#modify-maximum-password-length-using-configuration-file) as set in the Device configuration. The default value is 128 characters.
diff --git a/doc/subscriptions/gitlab_com/index.md b/doc/subscriptions/gitlab_com/index.md
index bce61cdad66..5344996a2af 100644
--- a/doc/subscriptions/gitlab_com/index.md
+++ b/doc/subscriptions/gitlab_com/index.md
@@ -149,17 +149,6 @@ as the number of _users over license_, you must pay for the excess number of
users either before renewal, or at the time of renewal. This is also known the
_true up_ process.
-There is no self-service option for purchasing additional seats. You must
-request a quotation from GitLab Sales. To do so, contact GitLab via our
-[support form](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293).
-
-The amount charged per seat is calculated by one of the following methods:
-
-- If paid before renewal, the amount per seat is calculated on a prorated basis.
- For example, if the user was added 3 months before the end of the subscription
- period, the amount owing is calculated as: (3 / 12) x annual fee.
-- If paid on renewal, the amount per seat is the standard annual fee.
-
### Renew or change a GitLab.com subscription
NOTE: **Note:**
@@ -187,12 +176,35 @@ generated for the renewal and available for viewing or download in the
during the renewal process, contact our
[support team](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293) for assistance.
+## Add users to your subscription
+
+You can add users to your subscription at any time during the subscription period. The cost of
+additional users added during the subscription period is prorated from the date of purchase through
+the end of the subscription period.
+
+To add users to a subscription:
+
+1. Log in to the [Customers Portal](https://customers.gitlab.com/).
+1. Navigate to the **Manage Purchases** page.
+1. Select **Add more seats** on the relevant subscription card.
+1. Enter the number of additional users.
+1. Select **Proceed to checkout**.
+1. Review the **Subscription Upgrade Detail**. The system lists the total price for all users on the
+ system and a credit for what you've already paid. You will only be charged for the net change.
+1. Select **Confirm Upgrade**.
+
+The following will be emailed to you:
+
+- A payment receipt. You can also access this information in the Customers Portal under
+ [**View invoices**](https://customers.gitlab.com/receipts).
+
## Upgrade your GitLab.com subscription tier
To upgrade your [GitLab tier](https://about.gitlab.com/pricing/):
1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
-1. Select the **Upgrade** button on the relevant subscription card on the [Manage purchases](https://customers.gitlab.com/subscriptions) page.
+1. Select **Upgrade** on the relevant subscription card on the
+ [Manage purchases](https://customers.gitlab.com/subscriptions) page.
1. Select the desired upgrade.
1. Confirm the active form of payment, or add a new form of payment.
1. Check the **I accept the Privacy Policy and Terms of Service** checkbox.
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index 47b7347deba..73f5404713f 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -43,7 +43,7 @@ To enable container scanning in your pipeline, you need the following:
or [`kubernetes`](https://docs.gitlab.com/runner/install/kubernetes.html) executor.
- Docker `18.09.03` or higher installed on the same computer as the runner. If you're using the
shared runners on GitLab.com, then this is already the case.
-- [Build and push](../../packages/container_registry/index.md#container-registry-examples-with-gitlab-cicd)
+- [Build and push](../../packages/container_registry/index.md#build-and-push-by-using-gitlab-cicd)
your Docker image to your project's container registry. The name of the Docker image should use
the following [predefined environment variables](../../../ci/variables/predefined_variables.md):
diff --git a/doc/user/clusters/applications.md b/doc/user/clusters/applications.md
index 1a6956284ab..f4e3c13aed5 100644
--- a/doc/user/clusters/applications.md
+++ b/doc/user/clusters/applications.md
@@ -47,13 +47,12 @@ namespace called `gitlab-managed-apps`.
Some applications are installable only for a project-level cluster.
Support for installing these applications in a group-level cluster is
planned for future releases.
-For updates, see [the issue tracking
-progress](https://gitlab.com/gitlab-org/gitlab/-/issues/24411).
+For updates, see the [issue tracking progress](https://gitlab.com/gitlab-org/gitlab/-/issues/24411).
CAUTION: **Caution:**
If you have an existing Kubernetes cluster with Helm already installed,
you should be careful as GitLab cannot detect it. In this case, installing
-Helm via the applications will result in the cluster having it twice, which
+Helm with the applications results in the cluster having it twice, which
can lead to confusion during deployments.
In GitLab versions 11.6 and greater, Helm is upgraded to the latest version
@@ -120,7 +119,7 @@ needs. If a project-specific runner is desired, or there are no shared runners,
you can deploy one.
The deployed runner is set as **privileged**. Root access to the underlying
-server is required to build Docker images, so it is the default. Be sure to read
+server is required to build Docker images, so it's the default. Be sure to read
the [security implications](../project/clusters/index.md#security-implications)
before deploying one.
@@ -175,18 +174,17 @@ If the endpoint doesn't appear and your cluster runs on Google Kubernetes Engine
1. Review [Google Cloud's Status](https://status.cloud.google.com/) for service
disruptions.
+The [`stable/nginx-ingress`](https://github.com/helm/charts/tree/master/stable/nginx-ingress)
+chart is used to install this application with a
+[`values.yaml`](https://gitlab.com/gitlab-org/gitlab/blob/master/vendor/ingress/values.yaml)
+file.
+
After installing, you may see a `?` for **Ingress IP Address** depending on the
cloud provider. For EKS specifically, this is because the ELB is created
with a DNS name, not an IP address. If GitLab is still unable to
determine the endpoint of your Ingress or Knative application, you can
[determine it manually](#determining-the-external-endpoint-manually).
-NOTE: **Note:**
-The [`stable/nginx-ingress`](https://github.com/helm/charts/tree/master/stable/nginx-ingress)
-chart is used to install this application with a
-[`values.yaml`](https://gitlab.com/gitlab-org/gitlab/blob/master/vendor/ingress/values.yaml)
-file.
-
#### Determining the external endpoint manually
If the cluster is on GKE, click the **Google Kubernetes Engine** link in the
@@ -197,7 +195,7 @@ the `gcloud` command in a local terminal or using the **Cloud Shell**.
If the cluster is not on GKE, follow the specific instructions for your
Kubernetes provider to configure `kubectl` with the right credentials.
-The output of the following examples will show the external endpoint of your
+The output of the following examples show the external endpoint of your
cluster. This information can then be used to set up DNS entries and forwarding
rules that allow external access to your deployed applications.
@@ -218,7 +216,7 @@ rules that allow external access to your deployed applications.
If EKS is used, an [Elastic Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/)
is also created, which will incur additional AWS costs.
-- For Istio/Knative, the command will be different:
+- For Istio/Knative, the command is different:
```shell
kubectl get svc --namespace=istio-system istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip} '
@@ -291,7 +289,7 @@ There is a small performance overhead by enabling ModSecurity. If this is
considered significant for your application, you can disable ModSecurity's
rule engine for your deployed application in any of the following ways:
-1. Set [the deployment variable](../../topics/autodevops/index.md)
+1. Set the [deployment variable](../../topics/autodevops/index.md)
`AUTO_DEVOPS_MODSECURITY_SEC_RULE_ENGINE` to `Off` to prevent ModSecurity
from processing any requests for the given application or environment.
1. Switch its respective toggle to the disabled position, and then apply changes
@@ -341,7 +339,7 @@ You can view Web Application Firewall traffic by navigating to your project's
tracked over time:
- The total amount of traffic to your application.
-- The proportion of traffic that is considered anomalous by the Web Application
+- The proportion of traffic that's considered anomalous by the Web Application
Firewall's default [OWASP ruleset](https://www.modsecurity.org/CRS/Documentation/).
If a significant percentage of traffic is anomalous, investigate it for potential threats
@@ -369,8 +367,9 @@ for project-level clusters and group members for group-level clusters with
[Developer or higher](../permissions.md) access to the associated project or group.
GitLab uses a [custom Jupyter image](https://gitlab.com/gitlab-org/jupyterhub-user-image/blob/master/Dockerfile)
-that installs additional useful packages on top of the base Jupyter. You
-will also see ready-to-use DevOps Runbooks built with Nurtch's [Rubix library](https://github.com/Nurtch/rubix).
+that installs additional useful packages on top of the base Jupyter. Ready-to-use
+DevOps Runbooks built with Nurtch's [Rubix library](https://github.com/Nurtch/rubix)
+are also available.
More information on creating executable runbooks can be found in
[our Runbooks documentation](../project/clusters/runbooks/index.md#configure-an-executable-runbook-with-gitlab).
@@ -413,7 +412,7 @@ You can clone repositories from the files tab in Jupyter:
[Knative](https://cloud.google.com/knative/) provides a platform to
create, deploy, and manage serverless workloads from a Kubernetes
-cluster. It is used in conjunction with, and includes
+cluster. It's used in conjunction with, and includes
[Istio](https://istio.io) to provide an external IP address for all
programs hosted by Knative.
@@ -436,10 +435,10 @@ your Kubernetes cluster to have
open-source monitoring and alerting system useful to supervise your
deployed applications.
-GitLab is able to monitor applications automatically, using the
+GitLab is able to monitor applications by using the
[Prometheus integration](../project/integrations/prometheus.md). Kubernetes container CPU and
-memory metrics are automatically collected, and response metrics are retrieved
-from NGINX Ingress as well.
+memory metrics are collected, and response metrics are also retrieved
+from NGINX Ingress.
The [`stable/prometheus`](https://github.com/helm/charts/tree/master/stable/prometheus)
chart is used to install this application with a
@@ -470,7 +469,7 @@ The Crossplane GitLab-managed application:
project repository.
- Can then be used to provision infrastructure or managed applications such as
PostgreSQL (for example, CloudSQL from GCP or RDS from AWS) and other services
- required by the application via the Auto DevOps pipeline.
+ required by the application with the Auto DevOps pipeline.
[`alpha/crossplane`](https://github.com/crossplane/crossplane/tree/v0.4.1/cluster/charts/crossplane) chart v0.4.1 is used to
install Crossplane using the
@@ -494,6 +493,10 @@ querying. GitLab then connects to Elasticsearch for logs, instead of the
Kubernetes API, giving you access to more advanced querying capabilities. Log
data is deleted after 30 days, using [Curator](https://www.elastic.co/guide/en/elasticsearch/client/curator/5.5/about.html).
+The Elastic Stack cluster application is intended as a log aggregation solution
+and is not related to our [Advanced Search](../search/advanced_global_search.md)
+functionality, which uses a separate Elasticsearch cluster.
+
To enable log shipping:
1. Ensure your cluster contains at least three nodes of instance types larger
@@ -511,11 +514,6 @@ colocated, and each requires one CPU and 2 GB of RAM, making them
incompatible with clusters containing fewer than three nodes, or consisting of
`f1-micro`, `g1-small`, `n1-standard-1`, or `*-highcpu-2` instance types.
-NOTE: **Note:**
-The Elastic Stack cluster application is intended as a log aggregation solution
-and is not related to our [Advanced Search](../search/advanced_global_search.md)
-functionality, which uses a separate Elasticsearch cluster.
-
#### Optional: deploy Kibana to perform advanced queries
If you are an advanced user and have direct access to your Kubernetes cluster using `kubectl` and `helm`, you can deploy Kibana manually.
@@ -562,8 +560,8 @@ your data. Fluentd sends logs in syslog format.
To enable Fluentd:
1. Navigate to **Operations > Kubernetes** and click
- **Applications**. You will be prompted to enter a host, port and protocol
- where the WAF logs will be sent to via syslog.
+ **Applications**. Enter a host, port, and protocol
+ for sending the WAF logs with syslog.
1. Provide the host domain name or URL in **SIEM Hostname**.
1. Provide the host port number in **SIEM Port**.
1. Select a **SIEM Protocol**.
@@ -583,7 +581,7 @@ to get started.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20822) in GitLab 12.6.
CAUTION: **Warning:**
-This is an _alpha_ feature, and it is subject to change at any time without
+This is an _alpha_ feature, and is subject to change at any time without
prior notice.
This alternative method allows users to install GitLab-managed
@@ -623,7 +621,6 @@ To install applications using GitLab CI/CD:
- template: Managed-Cluster-Applications.gitlab-ci.yml
```
- NOTE: **Note:**
The job provided by this template connects to the cluster using tools provided
in a custom Docker image. It requires that you have a runner registered with the Docker,
Kubernetes, or Docker Machine executor.
@@ -641,11 +638,10 @@ To install applications using GitLab CI/CD:
1. Optionally, define `.gitlab/managed-apps/<application>/values.yaml` file to
customize values for the installed application.
-A GitLab CI/CD pipeline will then run on the `master` branch to install the
+A GitLab CI/CD pipeline runs on the `master` branch to install the
applications you have configured. In case of pipeline failure, the
-output of the [Helm
-Tiller](https://v2.helm.sh/docs/install/#running-tiller-locally) binary
-will be saved as a [CI job artifact](../../ci/pipelines/job_artifacts.md).
+output of the [Helm Tiller](https://v2.helm.sh/docs/install/#running-tiller-locally) binary
+is saved as a [CI job artifact](../../ci/pipelines/job_artifacts.md).
### Important notes
@@ -653,10 +649,10 @@ Note the following:
- We recommend using the cluster management project exclusively for managing deployments to a cluster.
Do not add your application's source code to such projects.
-- When you set the value for `installed` key back to `false`, the application will be
+- When you set the value for `installed` key back to `false`, the application is
unprovisioned from the cluster.
- If you update `.gitlab/managed-apps/<application>/values.yaml` with new values, the
- application will be redeployed.
+ application is redeployed.
### Install Ingress using GitLab CI/CD
@@ -668,7 +664,7 @@ ingress:
installed: true
```
-Ingress will then be installed into the `gitlab-managed-apps` namespace
+Ingress is installed into the `gitlab-managed-apps` namespace
of your cluster.
You can customize the installation of Ingress by defining a
@@ -677,9 +673,10 @@ management project. Refer to the
[chart](https://github.com/helm/charts/tree/master/stable/nginx-ingress)
for the available configuration options.
-NOTE: **Note:**
Support for installing the Ingress managed application is provided by the GitLab Configure group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [Configure group](https://about.gitlab.com/handbook/product/product-categories/#configure-group).
+If you run into unknown issues, [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new),
+and ping at least 2 people from the
+[Configure group](https://about.gitlab.com/handbook/product/product-categories/#configure-group).
### Install cert-manager using GitLab CI/CD
@@ -689,7 +686,8 @@ cert-manager is installed using GitLab CI/CD by defining configuration in
cert-manager:
- Is installed into the `gitlab-managed-apps` namespace of your cluster.
-- Can be installed with or without a default [Let's Encrypt `ClusterIssuer`](https://cert-manager.io/docs/configuration/acme/), which requires an
+- Can be installed with or without a default
+ [Let's Encrypt `ClusterIssuer`](https://cert-manager.io/docs/configuration/acme/), which requires an
email address to be specified. The email address is used by Let's Encrypt to
contact you about expiring certificates and issues related to your account.
@@ -718,9 +716,11 @@ management project. Refer to the
[chart](https://hub.helm.sh/charts/jetstack/cert-manager) for the
available configuration options.
-NOTE: **Note:**
-Support for installing the Cert Manager managed application is provided by the GitLab Configure group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [Configure group](https://about.gitlab.com/handbook/product/product-categories/#configure-group).
+Support for installing the Cert Manager managed application is provided by the
+GitLab Configure group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the
+[Configure group](https://about.gitlab.com/handbook/product/product-categories/#configure-group).
### Install Sentry using GitLab CI/CD
@@ -735,7 +735,7 @@ sentry:
installed: true
```
-Sentry will then be installed into the `gitlab-managed-apps` namespace
+Sentry is installed into the `gitlab-managed-apps` namespace
of your cluster.
You can customize the installation of Sentry by defining
@@ -750,8 +750,10 @@ We recommend you pay close attention to the following configuration options:
- `user`. Where you can set the login credentials for the default admin user.
- `postgresql`. For a PostgreSQL password that can be used when running future updates.
-NOTE: **Note:**
-When upgrading it is important to provide the existing PostgreSQL password (given using the `postgresql.postgresqlPassword` key) or you will receive authentication errors. See the [PostgreSQL chart documentation](https://github.com/helm/charts/tree/master/stable/postgresql#upgrade) for more information.
+When upgrading, it's important to provide the existing PostgreSQL password (given
+using the `postgresql.postgresqlPassword` key) to avoid authentication errors.
+Read the [PostgreSQL chart documentation](https://github.com/helm/charts/tree/master/stable/postgresql#upgrade)
+for more information.
Here is an example configuration for Sentry:
@@ -783,9 +785,11 @@ postgresql:
postgresqlPassword: example-postgresql-password
```
-NOTE: **Note:**
-Support for installing the Sentry managed application is provided by the GitLab Health group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [Health group](https://about.gitlab.com/handbook/product/product-categories/#health-group).
+Support for installing the Sentry managed application is provided by the
+GitLab Health group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the
+[Health group](https://about.gitlab.com/handbook/product/product-categories/#health-group).
### Install PostHog using GitLab CI/CD
@@ -800,13 +804,14 @@ posthog:
```
You can customize the installation of PostHog by defining `.gitlab/managed-apps/posthog/values.yaml`
-in your cluster management project. Refer to the [Configuration section of the PostHog chart's README](https://github.com/PostHog/charts/tree/master/charts/posthog)
+in your cluster management project. Refer to the
+[Configuration section of the PostHog chart's README](https://github.com/PostHog/charts/tree/master/charts/posthog)
for the available configuration options.
-NOTE: **Note:**
You must provide a PostgreSQL password in `postgresql.postgresqlPassword`
-or you will receive authentication errors.
-See the [PostgreSQL chart documentation](https://github.com/helm/charts/tree/master/stable/postgresql#upgrade) for more information.
+to avoid authentication errors. Read the
+[PostgreSQL chart documentation](https://github.com/helm/charts/tree/master/stable/postgresql#upgrade)
+for more information.
Redis pods are restarted between upgrades. To prevent downtime, provide a Redis
password using the `redis.password` key. This prevents a new password from
@@ -832,9 +837,9 @@ redis:
password: example-redis-password
```
-NOTE: **Note:**
Support for the PostHog managed application is provided by the PostHog team.
-If you run into issues, please [open a support ticket](https://github.com/PostHog/posthog/issues/new/choose) directly.
+If you run into issues,
+[open a support ticket](https://github.com/PostHog/posthog/issues/new/choose) directly.
### Install Prometheus using GitLab CI/CD
@@ -858,9 +863,10 @@ project. Refer to the
[Configuration section of the Prometheus chart's README](https://github.com/helm/charts/tree/master/stable/prometheus#configuration)
for the available configuration options.
-NOTE: **Note:**
-Support for installing the Prometheus managed application is provided by the GitLab APM group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [APM group](https://about.gitlab.com/handbook/product/product-categories/#apm-group).
+Support for installing the Prometheus managed application is provided by the
+GitLab APM group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the [APM group](https://about.gitlab.com/handbook/product/product-categories/#apm-group).
### Install GitLab Runner using GitLab CI/CD
@@ -876,16 +882,17 @@ gitlabRunner:
GitLab Runner is installed into the `gitlab-managed-apps` namespace of your cluster.
-In order for GitLab Runner to function, you **must** specify the following:
+For GitLab Runner to function, you _must_ specify the following:
-- `gitlabUrl` - the GitLab server full URL (for example, `https://gitlab.example.com`) to register the Runner against.
-- `runnerRegistrationToken` - The registration token for adding new runners to GitLab. This must be
- [retrieved from your GitLab instance](../../ci/runners/README.md).
+- `gitlabUrl`: The GitLab server full URL (for example, `https://gitlab.example.com`)
+ to register the Runner against.
+- `runnerRegistrationToken`: The registration token for adding new runners to GitLab.
+ This must be [retrieved from your GitLab instance](../../ci/runners/README.md).
These values can be specified using [CI variables](../../ci/variables/README.md):
-- `GITLAB_RUNNER_GITLAB_URL` will be used for `gitlabUrl`.
-- `GITLAB_RUNNER_REGISTRATION_TOKEN` will be used for `runnerRegistrationToken`
+- `GITLAB_RUNNER_GITLAB_URL` is used for `gitlabUrl`.
+- `GITLAB_RUNNER_REGISTRATION_TOKEN` is used for `runnerRegistrationToken`
You can customize the installation of GitLab Runner by defining
`.gitlab/managed-apps/gitlab-runner/values.yaml` file in your cluster
@@ -893,9 +900,11 @@ management project. Refer to the
[chart](https://gitlab.com/gitlab-org/charts/gitlab-runner) for the
available configuration options.
-NOTE: **Note:**
-Support for installing the GitLab Runner managed application is provided by the GitLab Runner group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [Runner group](https://about.gitlab.com/handbook/product/product-categories/#runner-group).
+Support for installing the GitLab Runner managed application is provided by the
+GitLab Runner group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the
+[Runner group](https://about.gitlab.com/handbook/product/product-categories/#runner-group).
### Install Cilium using GitLab CI/CD
@@ -932,8 +941,10 @@ for the available configuration options.
You can check Cilium's installation status on the cluster management page:
-- [Project-level cluster](../project/clusters/index.md): Navigate to your project's **Operations > Kubernetes** page.
-- [Group-level cluster](../group/clusters/index.md): Navigate to your group's **Kubernetes** page.
+- [Project-level cluster](../project/clusters/index.md): Navigate to your project's
+ **Operations > Kubernetes** page.
+- [Group-level cluster](../group/clusters/index.md): Navigate to your group's
+ **Kubernetes** page.
CAUTION: **Caution:**
Installation and removal of the Cilium requires a **manual**
@@ -943,12 +954,11 @@ of all affected pods in all namespaces to ensure that they are
by the correct networking plugin.
NOTE: **Note:**
-Major upgrades might require additional setup steps, please consult
-the official [upgrade guide](https://docs.cilium.io/en/stable/install/upgrade/) for more
-information.
+Major upgrades might require additional setup steps. For more information, see
+the official [upgrade guide](https://docs.cilium.io/en/stable/install/upgrade/).
-By default, Cilium's [audit
-mode](https://docs.cilium.io/en/v1.8/gettingstarted/policy-creation/?highlight=policy-audit#enable-policy-audit-mode)
+By default, Cilium's
+[audit mode](https://docs.cilium.io/en/v1.8/gettingstarted/policy-creation/?highlight=policy-audit#enable-policy-audit-mode)
is enabled. In audit mode, Cilium doesn't drop disallowed packets. You
can use `policy-verdict` log to observe policy-related decisions. You
can disable audit mode by adding the following to
@@ -990,7 +1000,7 @@ global:
enabled: false
```
-You can also adjust Helm values for Hubble via
+You can also adjust Helm values for Hubble by using
`.gitlab/managed-apps/cilium/values.yaml`:
```yaml
@@ -1002,9 +1012,11 @@ global:
- 'flow:sourceContext=namespace;destinationContext=namespace'
```
-NOTE: **Note:**
-Support for installing the Cilium managed application is provided by the GitLab Container Security group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [Container Security group](https://about.gitlab.com/handbook/product/product-categories/#container-security-group).
+Support for installing the Cilium managed application is provided by the
+GitLab Container Security group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the
+[Container Security group](https://about.gitlab.com/handbook/product/product-categories/#container-security-group).
### Install Falco using GitLab CI/CD
@@ -1030,17 +1042,20 @@ management project. Refer to the
for the available configuration options.
CAUTION: **Caution:**
-By default eBPF support is enabled and Falco will use an [eBPF probe](https://falco.org/docs/event-sources/drivers/#using-the-ebpf-probe) to pass system calls to userspace.
-If your cluster doesn't support this, you can configure it to use Falco kernel module instead by adding the following to `.gitlab/managed-apps/falco/values.yaml`:
+By default eBPF support is enabled and Falco uses an
+[eBPF probe](https://falco.org/docs/event-sources/drivers/#using-the-ebpf-probe)
+to pass system calls to user space. If your cluster doesn't support this, you can
+configure it to use Falco kernel module instead by adding the following to
+`.gitlab/managed-apps/falco/values.yaml`:
```yaml
ebpf:
enabled: false
```
-In rare cases where automatic probe installation on your cluster isn't possible and the kernel/probe
-isn't precompiled, you may need to manually prepare the kernel module or eBPF probe with
-[driverkit](https://github.com/falcosecurity/driverkit#against-a-kubernetes-cluster)
+In rare cases where probe installation on your cluster isn't possible and the kernel/probe
+isn't pre-compiled, you may need to manually prepare the kernel module or eBPF probe with
+[`driverkit`](https://github.com/falcosecurity/driverkit#against-a-kubernetes-cluster)
and install it on each cluster node.
By default, Falco is deployed with a limited set of rules. To add more rules, add the following to
@@ -1093,16 +1108,18 @@ You can check these logs with the following command:
kubectl -n gitlab-managed-apps logs -l app=falco
```
-NOTE: **Note:**
-Support for installing the Falco managed application is provided by the GitLab Container Security group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [Container Security group](https://about.gitlab.com/handbook/product/product-categories/#container-security-group).
+Support for installing the Falco managed application is provided by the
+GitLab Container Security group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the
+[Container Security group](https://about.gitlab.com/handbook/product/product-categories/#container-security-group).
### Install Vault using GitLab CI/CD
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9982) in GitLab 12.9.
-[Hashicorp Vault](https://www.vaultproject.io/) is a secrets management solution which
-can be used to safely manage and store passwords, credentials, certificates and more. A Vault
+[HashiCorp Vault](https://www.vaultproject.io/) is a secrets management solution which
+can be used to safely manage and store passwords, credentials, certificates, and more. A Vault
installation could be leveraged to provide a single secure data store for credentials
used in your applications, GitLab CI/CD jobs, and more. It could also serve as a way of
providing SSL/TLS certificates to systems and deployments in your infrastructure. Leveraging
@@ -1120,24 +1137,25 @@ vault:
installed: true
```
-By default you will get a basic Vault setup with no scalable
-storage backend. This is enough for simple testing and small-scale deployments, though has limits
-to how much it can scale, and as it is a single instance deployment, you will experience downtime
-when upgrading the Vault application.
+By default you receive a basic Vault setup with no scalable storage backend. This
+is enough for simple testing and small-scale deployments, though has limits
+to how much it can scale, and as it's a single instance deployment, upgrading the
+Vault application causes downtime.
To optimally use Vault in a production environment, it's ideal to have a good understanding
-of the internals of Vault and how to configure it. This can be done by reading the [Vault Configuration guide](../../ci/secrets/#configure-your-vault-server),
-[the Vault documentation](https://www.vaultproject.io/docs/internals) as well as
+of the internals of Vault and how to configure it. This can be done by reading
+the [Vault Configuration guide](../../ci/secrets/#configure-your-vault-server),
+the [Vault documentation](https://www.vaultproject.io/docs/internals) and
the Vault Helm chart [`values.yaml` file](https://github.com/hashicorp/vault-helm/blob/v0.3.3/values.yaml).
-At a minimum you will likely set up:
+At a minimum, most users set up:
- A [seal](https://www.vaultproject.io/docs/configuration/seal) for extra encryption
- of the master key.
-- A [storage backend](https://www.vaultproject.io/docs/configuration/storage) that is
+ of the main key.
+- A [storage backend](https://www.vaultproject.io/docs/configuration/storage) that's
suitable for environment and storage security requirements.
- [HA Mode](https://www.vaultproject.io/docs/concepts/ha).
-- [The Vault UI](https://www.vaultproject.io/docs/configuration/ui).
+- The [Vault UI](https://www.vaultproject.io/docs/configuration/ui).
The following is an example values file (`.gitlab/managed-apps/vault/values.yaml`)
that configures Google Key Management Service for auto-unseal, using a Google Cloud Storage backend, enabling
@@ -1167,7 +1185,7 @@ server:
path = "gcs://my-vault-storage/vault-bucket"
ha_enabled = "true"
}
- # Configure Vault to automatically unseal storage using a GKMS key
+ # Configure Vault to unseal storage using a GKMS key
seal "gcpckms" {
project = "vault-helm-dev-246514"
region = "global"
@@ -1176,10 +1194,13 @@ server:
}
```
-Once you have successfully installed Vault, you will need to [initialize the Vault](https://learn.hashicorp.com/tutorials/vault/getting-started-deploy#initializing-the-vault)
-and obtain the initial root token. You will need access to your Kubernetes cluster that Vault has been deployed into in order to do this.
-To initialize the Vault, get a shell to one of the Vault pods running inside Kubernetes (typically this is done by using the `kubectl` command line tool).
-Once you have a shell into the pod, run the `vault operator init` command:
+Once you have successfully installed Vault, you must
+[initialize the Vault](https://learn.hashicorp.com/tutorials/vault/getting-started-deploy#initializing-the-vault)
+and obtain the initial root token. You need access to your Kubernetes cluster that
+Vault has been deployed into in order to do this. To initialize the Vault, get a
+shell to one of the Vault pods running inside Kubernetes (typically this is done
+by using the `kubectl` command line tool). Once you have a shell into the pod,
+run the `vault operator init` command:
```shell
kubectl -n gitlab-managed-apps exec -it vault-0 sh
@@ -1187,11 +1208,13 @@ kubectl -n gitlab-managed-apps exec -it vault-0 sh
```
This should give you your unseal keys and initial root token. Make sure to note these down
-and keep these safe as you will need them to unseal the Vault throughout its lifecycle.
+and keep these safe, as they're required to unseal the Vault throughout its lifecycle.
-NOTE: **Note:**
-Support for installing the Vault managed application is provided by the GitLab Release Management group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [Release Management group](https://about.gitlab.com/handbook/product/product-categories/#release-management-group).
+Support for installing the Vault managed application is provided by the
+GitLab Release Management group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the
+[Release Management group](https://about.gitlab.com/handbook/product/product-categories/#release-management-group).
### Install JupyterHub using GitLab CI/CD
@@ -1211,7 +1234,7 @@ In the configuration:
- `gitlabProjectIdWhitelist` restricts GitLab authentication to only members of the specified projects.
- `gitlabGroupWhitelist` restricts GitLab authentication to only members of the specified groups.
-- Specifying an empty array for both will allow any user on the GitLab instance to sign in.
+- Specifying an empty array for both allows any user on the GitLab instance to sign in.
JupyterHub is installed into the `gitlab-managed-apps` namespace of your cluster.
@@ -1223,17 +1246,19 @@ Set:
In addition, the following variables must be specified using [CI variables](../../ci/variables/README.md):
-| CI Variable | Description |
-|:---------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `JUPYTERHUB_PROXY_SECRET_TOKEN` | Secure string used for signing communications from the hub. See[`proxy.secretToken`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#proxy-secrettoken). |
-| `JUPYTERHUB_COOKIE_SECRET` | Secure string used for signing secure cookies. See [`hub.cookieSecret`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#hub-cookiesecret). |
-| `JUPYTERHUB_HOST` | Hostname used for the installation. For example, `jupyter.gitlab.example.com`. |
-| `JUPYTERHUB_GITLAB_HOST` | Hostname of the GitLab instance used for authentication. For example, `gitlab.example.com`. |
-| `JUPYTERHUB_AUTH_CRYPTO_KEY` | A 32-byte encryption key used to set [`auth.state.cryptoKey`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#auth-state-cryptokey). |
-| `JUPYTERHUB_AUTH_GITLAB_CLIENT_ID` | "Application ID" for the OAuth Application. |
-| `JUPYTERHUB_AUTH_GITLAB_CLIENT_SECRET` | "Secret" for the OAuth Application. |
-
-By default, JupyterHub will be installed using a
+- `JUPYTERHUB_PROXY_SECRET_TOKEN` - Secure string used for signing communications
+ from the hub. Read [`proxy.secretToken`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#proxy-secrettoken).
+- `JUPYTERHUB_COOKIE_SECRET` - Secure string used for signing secure cookies. Read
+ [`hub.cookieSecret`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#hub-cookiesecret).
+- `JUPYTERHUB_HOST` - Hostname used for the installation. For example, `jupyter.gitlab.example.com`.
+- `JUPYTERHUB_GITLAB_HOST` - Hostname of the GitLab instance used for authentication.
+ For example, `gitlab.example.com`.
+- `JUPYTERHUB_AUTH_CRYPTO_KEY` - A 32-byte encryption key used to set
+ [`auth.state.cryptoKey`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#auth-state-cryptokey).
+- `JUPYTERHUB_AUTH_GITLAB_CLIENT_ID` - "Application ID" for the OAuth Application.
+- `JUPYTERHUB_AUTH_GITLAB_CLIENT_SECRET` - "Secret" for the OAuth Application.
+
+By default, JupyterHub is installed using a
[default values file](https://gitlab.com/gitlab-org/cluster-integration/cluster-applications/-/blob/master/src/default-data/jupyterhub/values.yaml.gotmpl).
You can customize the installation of JupyterHub by defining a
`.gitlab/managed-apps/jupyterhub/values.yaml` file in your cluster management project.
@@ -1242,9 +1267,11 @@ Refer to the
[chart reference](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html) for the
available configuration options.
-NOTE: **Note:**
Support for installing the JupyterHub managed application is provided by the GitLab Configure group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [Configure group](https://about.gitlab.com/handbook/product/product-categories/#configure-group).
+If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the
+[Configure group](https://about.gitlab.com/handbook/product/product-categories/#configure-group).
### Install Elastic Stack using GitLab CI/CD
@@ -1262,7 +1289,9 @@ elasticStack:
Elastic Stack is installed into the `gitlab-managed-apps` namespace of your cluster.
-You can check the default [`values.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/vendor/elastic_stack/values.yaml) we set for this chart.
+You can check the default
+[`values.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/vendor/elastic_stack/values.yaml)
+we set for this chart.
You can customize the installation of Elastic Stack by defining
`.gitlab/managed-apps/elastic-stack/values.yaml` file in your cluster
@@ -1271,11 +1300,14 @@ management project. Refer to the
available configuration options.
NOTE: **Note:**
-In this alpha implementation of installing Elastic Stack through CI, reading the environment logs through Elasticsearch is unsupported. This is supported if [installed via the UI](#elastic-stack).
+In this alpha implementation of installing Elastic Stack through CI, reading the
+environment logs through Elasticsearch is unsupported. This is supported if
+[installed with the UI](#elastic-stack).
-NOTE: **Note:**
-Support for installing the Elastic Stack managed application is provided by the GitLab APM group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [APM group](https://about.gitlab.com/handbook/product/product-categories/#apm-group).
+Support for installing the Elastic Stack managed application is provided by the
+GitLab APM group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the [APM group](https://about.gitlab.com/handbook/product/product-categories/#apm-group).
### Install Crossplane using GitLab CI/CD
@@ -1303,22 +1335,24 @@ management project. Refer to the
[chart](https://github.com/crossplane/crossplane/tree/master/cluster/charts/crossplane#configuration) for the
available configuration options. Note that this link points to the documentation for the current development release, which may differ from the version you have installed.
-NOTE: **Note:**
Support for the Crossplane managed application is provided by the Crossplane team.
-If you run into issues, please [open a support ticket](https://github.com/crossplane/crossplane/issues/new/choose) directly.
+If you run into issues,
+[open a support ticket](https://github.com/crossplane/crossplane/issues/new/choose) directly.
### Install Fluentd using GitLab CI/CD
> [Introduced](https://gitlab.com/gitlab-org/cluster-integration/cluster-applications/-/merge_requests/76) in GitLab 12.10.
-To install Fluentd into the `gitlab-managed-apps` namespace of your cluster using GitLab CI/CD, define the following configuration in `.gitlab/managed-apps/config.yaml`:
+To install Fluentd into the `gitlab-managed-apps` namespace of your cluster using
+GitLab CI/CD, define the following configuration in `.gitlab/managed-apps/config.yaml`:
```yaml
Fluentd:
installed: true
```
-You can also review the default values set for this chart in the [`values.yaml`](https://github.com/helm/charts/blob/master/stable/fluentd/values.yaml) file.
+You can also review the default values set for this chart in the
+[`values.yaml`](https://github.com/helm/charts/blob/master/stable/fluentd/values.yaml) file.
You can customize the installation of Fluentd by defining
`.gitlab/managed-apps/fluentd/values.yaml` file in your cluster management
@@ -1326,14 +1360,15 @@ project. Refer to the
[configuration chart for the current development release of Fluentd](https://github.com/helm/charts/tree/master/stable/fluentd#configuration)
for all available configuration options.
-NOTE: **Note:**
The configuration chart link points to the current development release, which
may differ from the version you have installed. To ensure compatibility, switch
to the specific branch or tag you are using.
-NOTE: **Note:**
-Support for installing the Fluentd managed application is provided by the GitLab Container Security group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [Container Security group](https://about.gitlab.com/handbook/product/product-categories/#container-security-group).
+Support for installing the Fluentd managed application is provided by the
+GitLab Container Security group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the
+[Container Security group](https://about.gitlab.com/handbook/product/product-categories/#container-security-group).
### Install Knative using GitLab CI/CD
@@ -1355,11 +1390,14 @@ Here is an example configuration for Knative:
domain: 'my.wildcard.A.record.dns'
```
-If you plan to use GitLab Serverless capabilities, be sure to set an A record wildcard domain on your custom configuration.
+If you plan to use GitLab Serverless capabilities, be sure to set an `A record`
+wildcard domain on your custom configuration.
-NOTE: **Note:**
-Support for installing the Knative managed application is provided by the GitLab Configure group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [Configure group](https://about.gitlab.com/handbook/product/product-categories/#configure-group).
+Support for installing the Knative managed application is provided by the
+GitLab Configure group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the
+[Configure group](https://about.gitlab.com/handbook/product/product-categories/#configure-group).
#### Knative Metrics
@@ -1385,14 +1423,16 @@ kubectl delete -f https://gitlab.com/gitlab-org/cluster-integration/cluster-appl
> [Introduced](https://gitlab.com/gitlab-org/cluster-integration/cluster-applications/-/merge_requests/100) in GitLab 13.1.
-To install AppArmor into the `gitlab-managed-apps` namespace of your cluster using GitLab CI/CD, define the following configuration in `.gitlab/managed-apps/config.yaml`:
+To install AppArmor into the `gitlab-managed-apps` namespace of your cluster using
+GitLab CI/CD, define the following configuration in `.gitlab/managed-apps/config.yaml`:
```yaml
apparmor:
installed: true
```
-You can define one or more AppArmor profiles by adding them into `.gitlab/managed-apps/apparmor/values.yaml` as the following:
+You can define one or more AppArmor profiles by adding them into
+`.gitlab/managed-apps/apparmor/values.yaml` as the following:
```yaml
profiles:
@@ -1406,25 +1446,27 @@ Refer to the [AppArmor chart](https://gitlab.com/gitlab-org/charts/apparmor) for
#### Using AppArmor profiles in your deployments
-After installing AppAmor, you can use profiles by adding Pod Annotations. If you're using Auto
-DevOps, you can [customize `auto-deploy-values.yaml`](../../topics/autodevops/customize.md#customize-values-for-helm-chart)
-to annotate your pods. Although it's helpful to be aware of the [list of custom attributes](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app#gitlabs-auto-deploy-helm-chart), you're only required to set
-`podAnnotations` as follows:
+After installing AppAmor, you can use profiles by adding Pod Annotations. If you're using
+Auto DevOps, you can [customize `auto-deploy-values.yaml`](../../topics/autodevops/customize.md#customize-values-for-helm-chart)
+to annotate your pods. Although it's helpful to be aware of the
+[list of custom attributes](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app#gitlabs-auto-deploy-helm-chart),
+you're only required to set `podAnnotations` as follows:
```yaml
podAnnotations:
container.apparmor.security.beta.kubernetes.io/auto-deploy-app: localhost/profile-one
```
-The only information to be changed here is the profile name which is `profile-one` in this example. Refer to the [AppArmor tutorial](https://kubernetes.io/docs/tutorials/clusters/apparmor/#securing-a-pod) for more information on how AppArmor is integrated in Kubernetes.
+The only information to be changed here is the profile name which is `profile-one`
+in this example. Refer to the [AppArmor tutorial](https://kubernetes.io/docs/tutorials/clusters/apparmor/#securing-a-pod)
+for more information on how AppArmor is integrated in Kubernetes.
#### Using PodSecurityPolicy in your deployments
-NOTE: **Note:**
To enable AppArmor annotations on a Pod Security Policy you must first
-load the correspondingAppArmor profile.
+load the corresponding AppArmor profile.
-[Pod Security Policies](https://kubernetes.io/docs/concepts/policy/pod-security-policy/)are
+[Pod Security Policies](https://kubernetes.io/docs/concepts/policy/pod-security-policy/) are
resources at the cluster level that control security-related
properties of deployed pods. You can use such a policy to enable
loaded AppArmor profiles and apply necessary pod restrictions across a
@@ -1452,14 +1494,14 @@ securityPolicies:
- '*'
```
-This example creates a single policy named `example` with the provided
-specification, and enables [AppArmor
-annotations](https://kubernetes.io/docs/tutorials/clusters/apparmor/#podsecuritypolicy-annotations)on
-it.
+This example creates a single policy named `example` with the provided specification,
+and enables [AppArmor annotations](https://kubernetes.io/docs/tutorials/clusters/apparmor/#podsecuritypolicy-annotations) on it.
-NOTE: **Note:**
-Support for installing the AppArmor managed application is provided by the GitLab Container Security group.
-If you run into unknown issues, please [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new) and ping at least 2 people from the [Container Security group](https://about.gitlab.com/handbook/product/product-categories/#container-security-group).
+Support for installing the AppArmor managed application is provided by the
+GitLab Container Security group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping
+at least 2 people from the
+[Container Security group](https://about.gitlab.com/handbook/product/product-categories/#container-security-group).
## Browse applications logs
@@ -1487,9 +1529,7 @@ To upgrade an application:
1. Select your cluster.
1. If an upgrade is available, the **Upgrade** button is displayed. Click the button to upgrade.
-NOTE: **Note:**
-Upgrades will reset values back to the values built into the `runner`
-chart plus the values set by
+Upgrades reset values back to the values built into the `runner` chart, plus the values set by
[`values.yaml`](https://gitlab.com/gitlab-org/gitlab/blob/master/vendor/runner/values.yaml)
## Uninstalling applications
@@ -1500,16 +1540,16 @@ The applications below can be uninstalled.
| Application | GitLab version | Notes |
| ----------- | -------------- | ----- |
-| cert-manager | 12.2+ | The associated private key will be deleted and cannot be restored. Deployed applications will continue to use HTTPS, but certificates will not be renewed. Before uninstalling, you may wish to [back up your configuration](https://cert-manager.io/docs/tutorials/backup/) or [revoke your certificates](https://letsencrypt.org/docs/revoking/). |
-| GitLab Runner | 12.2+ | Any running pipelines will be canceled. |
-| Helm | 12.2+ | The associated Tiller pod, the `gitlab-managed-apps` namespace, and all of its resources will be deleted and cannot be restored. |
-| Ingress | 12.1+ | The associated load balancer and IP will be deleted and cannot be restored. Furthermore, it can only be uninstalled if JupyterHub is not installed. |
-| JupyterHub | 12.1+ | All data not committed to GitLab will be deleted and cannot be restored. |
-| Knative | 12.1+ | The associated IP will be deleted and cannot be restored. |
-| Prometheus | 11.11+ | All data will be deleted and cannot be restored. |
-| Crossplane | 12.5+ | All data will be deleted and cannot be restored. |
-| Elastic Stack | 12.7+ | All data will be deleted and cannot be restored. |
-| Sentry | 12.6+ | The PostgreSQL persistent volume will remain and should be manually removed for complete uninstall. |
+| cert-manager | 12.2+ | The associated private key is deleted and cannot be restored. Deployed applications continue to use HTTPS, but certificates aren't renewed. Before uninstalling, you may want to [back up your configuration](https://cert-manager.io/docs/tutorials/backup/) or [revoke your certificates](https://letsencrypt.org/docs/revoking/). |
+| GitLab Runner | 12.2+ | Any running pipelines are canceled. |
+| Helm | 12.2+ | The associated Tiller pod, the `gitlab-managed-apps` namespace, and all of its resources are deleted and cannot be restored. |
+| Ingress | 12.1+ | The associated load balancer and IP are deleted and cannot be restored. Furthermore, it can only be uninstalled if JupyterHub is not installed. |
+| JupyterHub | 12.1+ | All data not committed to GitLab are deleted and cannot be restored. |
+| Knative | 12.1+ | The associated IP are deleted and cannot be restored. |
+| Prometheus | 11.11+ | All data are deleted and cannot be restored. |
+| Crossplane | 12.5+ | All data are deleted and cannot be restored. |
+| Elastic Stack | 12.7+ | All data are deleted and cannot be restored. |
+| Sentry | 12.6+ | The PostgreSQL persistent volume remains and should be manually removed for complete uninstall. |
To uninstall an application:
@@ -1522,8 +1562,7 @@ To uninstall an application:
1. Click the **Uninstall** button for the application.
Support for uninstalling all applications is planned for progressive rollout.
-To follow progress, see [the relevant
-epic](https://gitlab.com/groups/gitlab-org/-/epics/1201).
+To follow progress, see the [relevant epic](https://gitlab.com/groups/gitlab-org/-/epics/1201).
## Troubleshooting applications
@@ -1537,9 +1576,10 @@ To avoid installation errors:
- Before starting the installation of applications, make sure that time is synchronized
between your GitLab server and your Kubernetes cluster.
-- Ensure certificates are not out of sync. When installing applications, GitLab expects a new cluster with no previous installation of Helm.
+- Ensure certificates are not out of sync. When installing applications, GitLab
+ expects a new cluster with no previous installation of Helm.
- You can confirm that the certificates match via `kubectl`:
+ You can confirm that the certificates match by using `kubectl`:
```shell
kubectl get configmaps/values-content-configuration-ingress -n gitlab-managed-apps -o \
@@ -1577,5 +1617,5 @@ Installing Prometheus is failing with the following error:
Error: Could not get apiVersions from Kubernetes: unable to retrieve the complete list of server APIs: admission.certmanager.k8s.io/v1beta1: the server is currently unable to handle the request
```
-This is a bug that was introduced in Helm `2.15` and fixed in `3.0.2`. As a workaround, you'll need
-to make sure that [`cert-manager`](#cert-manager) is installed successfully prior to installing Prometheus.
+This is a bug that was introduced in Helm `2.15` and fixed in `3.0.2`. As a workaround,
+ensure [`cert-manager`](#cert-manager) is installed successfully prior to installing Prometheus.
diff --git a/doc/user/infrastructure/index.md b/doc/user/infrastructure/index.md
index 216cf9ed607..7c5e10ea7e3 100644
--- a/doc/user/infrastructure/index.md
+++ b/doc/user/infrastructure/index.md
@@ -202,7 +202,7 @@ recommends encrypting plan output or modifying the project visibility settings.
## Example project
-See [this reference project](https://gitlab.com/nicholasklick/gitlab-terraform-aws) using GitLab and Terraform to deploy a basic AWS EC2 within a custom VPC.
+See [this reference project](https://gitlab.com/gitlab-org/configure/examples/gitlab-terraform-aws) using GitLab and Terraform to deploy a basic AWS EC2 within a custom VPC.
## Copy Terraform state between backends
diff --git a/doc/user/packages/container_registry/index.md b/doc/user/packages/container_registry/index.md
index 690db3986f1..c755e8c3344 100644
--- a/doc/user/packages/container_registry/index.md
+++ b/doc/user/packages/container_registry/index.md
@@ -9,11 +9,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/4040) in GitLab 8.8.
> - Docker Registry manifest `v1` support was added in GitLab 8.9 to support Docker
> versions earlier than 1.10.
-> - Starting from GitLab 8.12, if you have 2FA enabled in your account, you need
-> to pass a [personal access token](../../profile/personal_access_tokens.md) instead of your password in order to
-> login to GitLab's Container Registry.
-> - Multiple level image names support was added in GitLab 9.1.
-> - The group level Container Registry was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23315) in GitLab 12.10.
+> - Starting in GitLab 8.12, if you have [two-factor authentication](../../profile/account/two_factor_authentication.md) enabled in your account, you need
+> to pass a [personal access token](../../profile/personal_access_tokens.md) instead of your password to
+> sign in to the Container Registry.
+> - Support for multiple level image names was added in GitLab 9.1.
+> - The group-level Container Registry was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23315) in GitLab 12.10.
> - Searching by image repository name was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31322) in GitLab 13.0.
With the Docker Container Registry integrated into GitLab, every GitLab project can
@@ -21,7 +21,6 @@ have its own space to store its Docker images.
You can read more about Docker Registry at <https://docs.docker.com/registry/introduction/>.
-NOTE: **Note:**
This document is the user guide. To learn how to enable the Container
Registry for your GitLab instance, visit the
[administrator documentation](../../../administration/packages/container_registry.md).
@@ -35,7 +34,8 @@ You can view the Container Registry for a project or group.
You can search, sort, filter, and [delete](#delete-images-from-within-gitlab) containers on this page.
-CAUTION: **Warning:**
+Only members of the project or group can access a private project's Container Registry.
+
If a project is public, so is the Container Registry.
## Use images from the Container Registry
@@ -58,134 +58,137 @@ To download and run a container image hosted in the GitLab Container Registry:
For more information on running Docker containers, visit the
[Docker documentation](https://docs.docker.com/engine/userguide/intro/).
-## Authenticating to the GitLab Container Registry
+## Image naming convention
+
+Images follow this naming convention:
-If you visit the **Packages & Registries > Container Registry** link under your project's
-menu, you can see the explicit instructions to login to the Container Registry
-by using your GitLab credentials.
+```plaintext
+<registry URL>/<namespace>/<project>/<image>
+```
-For example if the Registry's URL is `registry.example.com`, then you should be
-able to log in with:
+If your project is `gitlab.example.com/mynamespace/myproject`, for example,
+then your image must be named `gitlab.example.com/mynamespace/myproject/my-app` at a mimimum.
-```shell
-docker login registry.example.com
+You can append additional names to the end of an image name, up to three levels deep.
+
+For example, these are all valid image names for images within the project named `myproject`:
+
+```plaintext
+registry.example.com/mynamespace/myproject:some-tag
```
-NOTE: **Note:**
-If you have [2 Factor Authentication](../../profile/account/two_factor_authentication.md)
-enabled in your account, you need to pass a
-[personal access token](../../profile/personal_access_tokens.md) instead
-of your password in order to login to GitLab's Container Registry.
+```plaintext
+registry.example.com/mynamespace/myproject/image:latest
+```
-Credentials must be provided for authorization to any non-public registry. Only project members can access private,
-GitLab-hosted registries.
+```plaintext
+registry.example.com/mynamespace/myproject/my/image:rc1
+```
-There are two ways to authenticate:
+## Build and push images by using Docker commands
-- By using a [personal access token](../../profile/personal_access_tokens.md).
-- By using a [deploy token](../../project/deploy_tokens/index.md).
+To build and push to the Container Registry, you can use Docker commands.
-The minimum scope needed for both of them is `read_registry`.
+### Authenticate with the Container Registry
-Example of using a token:
+Before you can build and push images, you must authenticate with the Container Registry.
-```shell
-docker login registry.example.com -u <username> -p <token>
-```
+To authenticate, you can use:
-## Build and push images from your local machine
+- A [personal access token](../../profile/personal_access_tokens.md).
+- A [deploy token](../../project/deploy_tokens/index.md).
-Building and publishing images should be a straightforward process. Just make
-sure that you are using the Registry URL with the namespace and project name
-that is hosted on GitLab:
+Both of these require the minimum scope to be:
-```shell
-docker build -t registry.example.com/group/project/image .
-docker push registry.example.com/group/project/image
-```
+- For read (pull) access, `read_registry`.
+- For write (push) access, `write_registry`.
-Your image is named after the following scheme:
+To authenticate, run the `docker` command. For example:
-```plaintext
-<registry URL>/<namespace>/<project>/<image>
-```
+ ```shell
+ docker login registry.example.com -u <username> -p <token>
+ ```
-GitLab supports up to three levels of image repository names.
-The following examples of image tags are valid:
+### Build and push images by using Docker commands
-```plaintext
-registry.example.com/group/project:some-tag
-registry.example.com/group/project/image:latest
-registry.example.com/group/project/my/image:rc1
-```
+To build and push to the Container Registry:
-NOTE: **Note:**
-Currently there is a soft (10GB) size restriction for
-the Container Registry on GitLab.com, as part of the [repository size limit](../../project/repository/index.md).
-
-## Build and push images using GitLab CI/CD
-
-While you can build and push your images from your local machine, take
-full advantage of the Container Registry by combining it with GitLab CI/CD.
-You can then create workflows and automate any processes that involve testing,
-building, and eventually deploying your project from the Docker image you
-created.
-
-Before diving into details, some things you should be aware of:
-
-- You must [authenticate to the container registry](#authenticating-to-the-container-registry-with-gitlab-cicd)
- before running any commands. You can do this in the `before_script` if multiple
- jobs depend on it.
-- Using `docker build --pull` fetches any changes to base
- images before building in case your cache is stale. It takes slightly
- longer, but it means you don’t get stuck without security patches for base images.
-- Doing an explicit `docker pull` before each `docker run` fetches
- the latest image that was just built. This is especially important if you are
- using multiple runners that cache images locally. Using the Git SHA in your
- image tag makes this less necessary since each job is unique and you
- shouldn't ever have a stale image. However, it's still possible to have a
- stale image if you re-build a given commit after a dependency has changed.
-- You don't want to build directly to `latest` tag in case there are multiple jobs
- happening simultaneously.
+1. Authenticate with the Container Registry.
+
+1. Run the command to build or push. For example, to build:
+
+ ```shell
+ docker build -t registry.example.com/group/project/image .
+ ```
+
+ Or to push:
+
+ ```shell
+ docker push registry.example.com/group/project/image
+ ```
+
+You can also view these commands by going to your project's **Packages & Registries > Container Registry**.
+
+## Build and push by using GitLab CI/CD
+
+Use [GitLab CI/CD](../../../ci/yaml/README.md) to build and push images to the
+Container Registry. Use it to test, build, and deploy your project from the Docker
+image you created.
-### Authenticating to the Container Registry with GitLab CI/CD
+### Authenticate by using GitLab CI/CD
-There are three ways to authenticate to the Container Registry via
-[GitLab CI/CD](../../../ci/yaml/README.md):
+Before you can build and push images by using GitLab CI/CD, you must authenticate with the Container Registry.
-- **Using the special `CI_REGISTRY_USER` variable**: The user specified by this variable is created for you in order to
- push to the Registry connected to your project. Its password is automatically
- set with the `CI_REGISTRY_PASSWORD` variable. This allows you to automate building and deploying
- your Docker images and has read/write access to the Registry. This is ephemeral,
- so it's only valid for one job. You can use the following example as-is:
+To use CI/CD to authenticate, you can use:
+
+- The `CI_REGISTRY_USER` variable.
+
+ This variable has read-write access to the Container Registry and is valid for
+ one job only. Its password is also automatically created and assigned to `CI_REGISTRY_PASSWORD`.
```shell
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
```
-- **Using the GitLab Deploy Token**: You can create and use a
- [special deploy token](../../project/deploy_tokens/index.md#gitlab-deploy-token)
- with your projects.
- Once created, you can use the special environment variables, and GitLab CI/CD
- fills them in for you. You can use the following example as-is:
+- A [CI job token](../../../ci/triggers/README.md#ci-job-token).
```shell
- docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
+ docker login -u $CI_JOB_USER -p $CI_JOB_TOKEN $CI_REGISTRY
```
-- **Using a personal access token**: You can create and use a
- [personal access token](../../profile/personal_access_tokens.md)
- in case your project is private:
+- A [deploy token](../../project/deploy_tokens/index.md#gitlab-deploy-token) with the minimum scope of:
+ - For read (pull) access, `read_registry`.
+ - For write (push) access, `write_registry`.
- - For read (pull) access, the scope should be `read_registry`.
- - For write (push) access, the scope should be `write_registry`.
+ ```shell
+ docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
+ ```
- Replace the `<username>` and `<access_token>` in the following example:
+- A [personal access token](../../profile/personal_access_tokens.md) with the minimum scope of:
+ - For read (pull) access, `read_registry`.
+ - For write (push) access, `write_registry`.
```shell
docker login -u <username> -p <access_token> $CI_REGISTRY
```
+### Configure your `.gitlab-ci.yml` file
+
+You can configure your `.gitlab-ci.yml` file to build and push images to the Container Registry.
+
+- If multiple jobs require authentication, put the authentication command in the `before_script`.
+- Before building, use `docker build --pull` to fetch changes to base images. It takes slightly
+ longer, but it ensures your image is up-to-date.
+- Before each `docker run`, do an explicit `docker pull` to fetch
+ the image that was just built. This is especially important if you are
+ using multiple runners that cache images locally.
+
+ If you use the Git SHA in your image tag, each job is unique and you
+ should never have a stale image. However, it's still possible to have a
+ stale image if you re-build a given commit after a dependency has changed.
+- Don't build directly to the `latest` tag because multiple jobs may be
+ happening simultaneously.
+
### Container Registry examples with GitLab CI/CD
If you're using Docker-in-Docker on your runners, this is how your `.gitlab-ci.yml`
diff --git a/doc/user/project/badges.md b/doc/user/project/badges.md
index ed6e2460554..fd0287fb5fb 100644
--- a/doc/user/project/badges.md
+++ b/doc/user/project/badges.md
@@ -10,7 +10,7 @@ type: reference, howto
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41174) in GitLab 10.7.
Badges are a unified way to present condensed pieces of information about your
-projects. They consist of a small image and additionally a URL that the image
+projects. They consist of a small image and a URL that the image
points to. Examples for badges can be the [pipeline status](../../ci/pipelines/settings.md#pipeline-status-badge),
[test coverage](../../ci/pipelines/settings.md#test-coverage-report-badge), or ways to contact the
project maintainers.
diff --git a/doc/user/project/deploy_boards.md b/doc/user/project/deploy_boards.md
index 8146f39ef87..b23f2269599 100644
--- a/doc/user/project/deploy_boards.md
+++ b/doc/user/project/deploy_boards.md
@@ -42,8 +42,9 @@ knowledge. In particular, you should be familiar with:
- [Kubernetes canary deployments](https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/#canary-deployments)
NOTE: **Note:**
-Apps that consist of multiple deployments are shown as duplicates on the deploy board.
-Follow [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/8463) for details.
+In GitLab 13.4 and earlier, apps that consist of multiple deployments are shown as
+duplicates on the deploy board. This is [fixed](https://gitlab.com/gitlab-org/gitlab/-/issues/8463)
+in GitLab 13.5.
## Use cases
diff --git a/doc/workflow/README.md b/doc/workflow/README.md
deleted file mode 100644
index ce129f0663b..00000000000
--- a/doc/workflow/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../README.md'
----
-
-This document was moved to [another location](../README.md).
diff --git a/doc/workflow/add-user/add-user.md b/doc/workflow/add-user/add-user.md
deleted file mode 100644
index f1ec771dd9a..00000000000
--- a/doc/workflow/add-user/add-user.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../../user/project/members/index.md'
----
-
-This document was moved to [../../user/project/members/index.md](../../user/project/members/index.md)
diff --git a/doc/workflow/authorization_for_merge_requests.md b/doc/workflow/authorization_for_merge_requests.md
deleted file mode 100644
index 8e43d340613..00000000000
--- a/doc/workflow/authorization_for_merge_requests.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/merge_requests/authorization_for_merge_requests.md'
----
-
-This document was moved to [user/project/merge_requests/authorization_for_merge_requests](../user/project/merge_requests/authorization_for_merge_requests.md)
diff --git a/doc/workflow/award_emoji.md b/doc/workflow/award_emoji.md
deleted file mode 100644
index 02db97b8dd6..00000000000
--- a/doc/workflow/award_emoji.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/award_emojis.md'
----
-
-This document was moved to [another location](../user/award_emojis.md).
diff --git a/doc/workflow/cherry_pick_changes.md b/doc/workflow/cherry_pick_changes.md
deleted file mode 100644
index 29c4f854416..00000000000
--- a/doc/workflow/cherry_pick_changes.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/merge_requests/cherry_pick_changes.md'
----
-
-This document was moved to [another location](../user/project/merge_requests/cherry_pick_changes.md).
diff --git a/doc/workflow/ff_merge.md b/doc/workflow/ff_merge.md
deleted file mode 100644
index 11e9e1bbd6b..00000000000
--- a/doc/workflow/ff_merge.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/merge_requests/fast_forward_merge.md'
----
-
-This document was moved to [user/project/merge_requests/fast_forward_merge](../user/project/merge_requests/fast_forward_merge.md).
diff --git a/doc/workflow/file_finder.md b/doc/workflow/file_finder.md
deleted file mode 100644
index f7098c88fd1..00000000000
--- a/doc/workflow/file_finder.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/repository/file_finder.md'
----
-
-This document was moved to [another location](../user/project/repository/file_finder.md).
diff --git a/doc/workflow/forking_workflow.md b/doc/workflow/forking_workflow.md
deleted file mode 100644
index fa617d859a5..00000000000
--- a/doc/workflow/forking_workflow.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/repository/forking_workflow.md'
----
-
-This document was moved to [another location](../user/project/repository/forking_workflow.md).
diff --git a/doc/workflow/git_annex.md b/doc/workflow/git_annex.md
deleted file mode 100644
index e54d52ea70d..00000000000
--- a/doc/workflow/git_annex.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../administration/git_annex.md'
----
-
-This document was moved to [another location](../administration/git_annex.md).
diff --git a/doc/workflow/git_lfs.md b/doc/workflow/git_lfs.md
deleted file mode 100644
index 69939c0efd0..00000000000
--- a/doc/workflow/git_lfs.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../topics/git/lfs/index.md'
----
-
-This document was moved to [another location](../topics/git/lfs/index.md).
diff --git a/doc/workflow/gitlab_flow.md b/doc/workflow/gitlab_flow.md
deleted file mode 100644
index e03281c0ffc..00000000000
--- a/doc/workflow/gitlab_flow.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../topics/gitlab_flow.md'
----
-
-This document was moved to [another location](../topics/gitlab_flow.md).
diff --git a/doc/workflow/groups.md b/doc/workflow/groups.md
deleted file mode 100644
index c7f4647baa9..00000000000
--- a/doc/workflow/groups.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/group/index.md'
----
-
-This document was moved to [another location](../user/group/index.md).
diff --git a/doc/workflow/importing/README.md b/doc/workflow/importing/README.md
deleted file mode 100644
index 29da321ba46..00000000000
--- a/doc/workflow/importing/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../../user/project/import/index.md'
----
-
-This document was moved to [another location](../../user/project/import/index.md).
diff --git a/doc/workflow/importing/import_projects_from_bitbucket.md b/doc/workflow/importing/import_projects_from_bitbucket.md
deleted file mode 100644
index a42ba7d4518..00000000000
--- a/doc/workflow/importing/import_projects_from_bitbucket.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../../user/project/import/bitbucket.md'
----
-
-This document was moved to [another location](../../user/project/import/bitbucket.md).
diff --git a/doc/workflow/importing/import_projects_from_fogbugz.md b/doc/workflow/importing/import_projects_from_fogbugz.md
deleted file mode 100644
index f5c791dc6de..00000000000
--- a/doc/workflow/importing/import_projects_from_fogbugz.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../../user/project/import/fogbugz.md'
----
-
-This document was moved to [another location](../../user/project/import/fogbugz.md).
diff --git a/doc/workflow/importing/import_projects_from_gitea.md b/doc/workflow/importing/import_projects_from_gitea.md
deleted file mode 100644
index df053835b44..00000000000
--- a/doc/workflow/importing/import_projects_from_gitea.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../../user/project/import/gitea.md'
----
-
-This document was moved to [another location](../../user/project/import/gitea.md).
diff --git a/doc/workflow/importing/import_projects_from_github.md b/doc/workflow/importing/import_projects_from_github.md
deleted file mode 100644
index 6397fcc74b8..00000000000
--- a/doc/workflow/importing/import_projects_from_github.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../../user/project/import/github.md'
----
-
-This document was moved to [another location](../../user/project/import/github.md).
diff --git a/doc/workflow/importing/import_projects_from_gitlab_com.md b/doc/workflow/importing/import_projects_from_gitlab_com.md
deleted file mode 100644
index 135b9704df9..00000000000
--- a/doc/workflow/importing/import_projects_from_gitlab_com.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../../user/project/import/gitlab_com.md'
----
-
-This document was moved to [another location](../../user/project/import/gitlab_com.md).
diff --git a/doc/workflow/importing/migrating_from_svn.md b/doc/workflow/importing/migrating_from_svn.md
deleted file mode 100644
index 99f13d6354c..00000000000
--- a/doc/workflow/importing/migrating_from_svn.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../../user/project/import/svn.md'
----
-
-This document was moved to [another location](../../user/project/import/svn.md).
diff --git a/doc/workflow/issue_weight.md b/doc/workflow/issue_weight.md
deleted file mode 100644
index 94eb38356e8..00000000000
--- a/doc/workflow/issue_weight.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/issues/issue_weight.md'
----
-
-This document was moved to [another location](../user/project/issues/issue_weight.md).
diff --git a/doc/workflow/labels.md b/doc/workflow/labels.md
deleted file mode 100644
index 3d07d411dd4..00000000000
--- a/doc/workflow/labels.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-redirect_to: '../user/project/labels.md'
----
-
-# Labels
-
-This document was moved to [user/project/labels.md](../user/project/labels.md).
diff --git a/doc/workflow/lfs/lfs_administration.md b/doc/workflow/lfs/lfs_administration.md
deleted file mode 100644
index 4a784409eff..00000000000
--- a/doc/workflow/lfs/lfs_administration.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../../administration/lfs/index.md'
----
-
-This document was moved to [another location](../../administration/lfs/index.md).
diff --git a/doc/workflow/lfs/manage_large_binaries_with_git_lfs.md b/doc/workflow/lfs/manage_large_binaries_with_git_lfs.md
deleted file mode 100644
index 4656bccf5e6..00000000000
--- a/doc/workflow/lfs/manage_large_binaries_with_git_lfs.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../../topics/git/lfs/index.md'
----
-
-This document was moved to [another location](../../topics/git/lfs/index.md).
diff --git a/doc/workflow/lfs/migrate_from_git_annex_to_git_lfs.md b/doc/workflow/lfs/migrate_from_git_annex_to_git_lfs.md
deleted file mode 100644
index dd98a50e353..00000000000
--- a/doc/workflow/lfs/migrate_from_git_annex_to_git_lfs.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../../topics/git/lfs/migrate_from_git_annex_to_git_lfs.md'
----
-
-This document was moved to [another location](../../topics/git/lfs/migrate_from_git_annex_to_git_lfs.md).
diff --git a/doc/workflow/merge_request_approvals.md b/doc/workflow/merge_request_approvals.md
deleted file mode 100644
index bfcd8faf236..00000000000
--- a/doc/workflow/merge_request_approvals.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/merge_requests/merge_request_approvals.md'
----
-
-This document was moved to [another location](../user/project/merge_requests/merge_request_approvals.md).
diff --git a/doc/workflow/merge_requests.md b/doc/workflow/merge_requests.md
deleted file mode 100644
index fd9f9b81bc9..00000000000
--- a/doc/workflow/merge_requests.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/merge_requests/index.md'
----
-
-This document was moved to [user/project/merge_requests/index.md](../user/project/merge_requests/index.md).
diff --git a/doc/workflow/merge_when_build_succeeds.md b/doc/workflow/merge_when_build_succeeds.md
deleted file mode 100644
index 41e6ff0cdd6..00000000000
--- a/doc/workflow/merge_when_build_succeeds.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/merge_requests/merge_when_pipeline_succeeds.md'
----
-
-This document was moved to [merge_when_pipeline_succeeds](../user/project/merge_requests/merge_when_pipeline_succeeds.md).
diff --git a/doc/workflow/milestones.md b/doc/workflow/milestones.md
deleted file mode 100644
index 18dc15f7327..00000000000
--- a/doc/workflow/milestones.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/milestones/index.md'
----
-
-This document was moved to [another location](../user/project/milestones/index.md).
diff --git a/doc/workflow/notifications.md b/doc/workflow/notifications.md
deleted file mode 100644
index 23f96360484..00000000000
--- a/doc/workflow/notifications.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/profile/notifications.md'
----
-
-This document was moved to [another location](../user/profile/notifications.md).
diff --git a/doc/workflow/project_features.md b/doc/workflow/project_features.md
deleted file mode 100644
index f54afb768a1..00000000000
--- a/doc/workflow/project_features.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/index.md'
----
-
-This document was moved to [../user/project/index.md](../user/project/index.md)
diff --git a/doc/workflow/protected_branches.md b/doc/workflow/protected_branches.md
deleted file mode 100644
index 1bcac4a2de5..00000000000
--- a/doc/workflow/protected_branches.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/protected_branches.md'
----
-
-This document was moved to [another location](../user/project/protected_branches.md).
diff --git a/doc/workflow/rebase_before_merge.md b/doc/workflow/rebase_before_merge.md
deleted file mode 100644
index 10e768d3371..00000000000
--- a/doc/workflow/rebase_before_merge.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/merge_requests/fast_forward_merge.md'
----
-
-This document was moved to [another location](../user/project/merge_requests/fast_forward_merge.md).
diff --git a/doc/workflow/releases.md b/doc/workflow/releases.md
deleted file mode 100644
index f3ba61f6a5c..00000000000
--- a/doc/workflow/releases.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/releases/index.md#add-release-notes-to-git-tags'
----
-
-This document was moved to [another location](../user/project/releases/index.md#add-release-notes-to-git-tags).
diff --git a/doc/workflow/repository_mirroring.md b/doc/workflow/repository_mirroring.md
deleted file mode 100644
index dc77f4f47af..00000000000
--- a/doc/workflow/repository_mirroring.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/repository/repository_mirroring.md'
----
-
-This document was moved to [another location](../user/project/repository/repository_mirroring.md).
diff --git a/doc/workflow/revert_changes.md b/doc/workflow/revert_changes.md
deleted file mode 100644
index 15f199af703..00000000000
--- a/doc/workflow/revert_changes.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/merge_requests/revert_changes.md'
----
-
-This document was moved to [user/project/merge_requests/revert_changes](../user/project/merge_requests/revert_changes.md).
diff --git a/doc/workflow/share_projects_with_other_groups.md b/doc/workflow/share_projects_with_other_groups.md
deleted file mode 100644
index c39cd78f32d..00000000000
--- a/doc/workflow/share_projects_with_other_groups.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/members/share_project_with_groups.md'
----
-
-This document was moved to [../user/project/members/share_project_with_groups.md](../user/project/members/share_project_with_groups.md)
diff --git a/doc/workflow/share_with_group.md b/doc/workflow/share_with_group.md
deleted file mode 100644
index c39cd78f32d..00000000000
--- a/doc/workflow/share_with_group.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/members/share_project_with_groups.md'
----
-
-This document was moved to [../user/project/members/share_project_with_groups.md](../user/project/members/share_project_with_groups.md)
diff --git a/doc/workflow/shortcuts.md b/doc/workflow/shortcuts.md
deleted file mode 100644
index 4b35c61ec5e..00000000000
--- a/doc/workflow/shortcuts.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/shortcuts.md'
----
-
-This document was moved to [another location](../user/shortcuts.md).
diff --git a/doc/workflow/time_tracking.md b/doc/workflow/time_tracking.md
deleted file mode 100644
index e109410e22d..00000000000
--- a/doc/workflow/time_tracking.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/time_tracking.md'
----
-
-This document was moved to [another location](../user/project/time_tracking.md).
diff --git a/doc/workflow/timezone.md b/doc/workflow/timezone.md
deleted file mode 100644
index f1a2e1af66a..00000000000
--- a/doc/workflow/timezone.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../administration/timezone.md'
----
-
-This document was moved to [another location](../administration/timezone.md).
diff --git a/doc/workflow/todos.md b/doc/workflow/todos.md
deleted file mode 100644
index 48c9a3faf1d..00000000000
--- a/doc/workflow/todos.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/todos.md'
----
-
-This document was moved to [another location](../user/todos.md).
diff --git a/doc/workflow/web_editor.md b/doc/workflow/web_editor.md
deleted file mode 100644
index 2366372d984..00000000000
--- a/doc/workflow/web_editor.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/repository/web_editor.md'
----
-
-This document was moved to [user/project/repository/web_editor](../user/project/repository/web_editor.md).
diff --git a/doc/workflow/wip_merge_requests.md b/doc/workflow/wip_merge_requests.md
deleted file mode 100644
index 020455dcbdc..00000000000
--- a/doc/workflow/wip_merge_requests.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../user/project/merge_requests/work_in_progress_merge_requests.md'
----
-
-This document was moved to [user/project/merge_requests/work_in_progress_merge_requests](../user/project/merge_requests/work_in_progress_merge_requests.md).
diff --git a/doc/workflow/workflow.md b/doc/workflow/workflow.md
deleted file mode 100644
index c77d95cd326..00000000000
--- a/doc/workflow/workflow.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-redirect_to: '../gitlab-basics/feature_branch_workflow.md'
----
-
-This document was moved to [another location](../gitlab-basics/feature_branch_workflow.md).
diff --git a/lib/gitlab/kubernetes/pod.rb b/lib/gitlab/kubernetes/pod.rb
index d247662dc3b..a5651f2f184 100644
--- a/lib/gitlab/kubernetes/pod.rb
+++ b/lib/gitlab/kubernetes/pod.rb
@@ -2,13 +2,47 @@
module Gitlab
module Kubernetes
- module Pod
+ class Pod
PENDING = 'Pending'
RUNNING = 'Running'
SUCCEEDED = 'Succeeded'
FAILED = 'Failed'
UNKNOWN = 'Unknown'
PHASES = [PENDING, RUNNING, SUCCEEDED, FAILED, UNKNOWN].freeze
+
+ STABLE_TRACK_VALUE = 'stable'
+
+ def initialize(attributes = {})
+ @attributes = attributes
+ end
+
+ def track
+ attributes.dig('metadata', 'labels', 'track') || STABLE_TRACK_VALUE
+ end
+
+ def name
+ metadata['name'] || metadata['generateName']
+ end
+
+ def stable?
+ track == STABLE_TRACK_VALUE
+ end
+
+ def status
+ attributes.dig('status', 'phase')
+ end
+
+ def order
+ stable? ? 1 : 0
+ end
+
+ private
+
+ attr_reader :attributes
+
+ def metadata
+ attributes.fetch('metadata', {})
+ end
end
end
end
diff --git a/qa/README.md b/qa/README.md
index 7ed4d63a589..5070e1ee9bd 100644
--- a/qa/README.md
+++ b/qa/README.md
@@ -50,7 +50,7 @@ the browser to use. You will need to have Chrome (or Chromium) and
- [Best practices](../doc/development/testing_guide/best_practices.md)
- [Using page objects](../doc/development/testing_guide/end_to_end/page_objects.md)
- [Guidelines](../doc/development/testing_guide/index.md)
- - [Tests with special setup for local environemnts](../doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md)
+ - [Tests with special setup for local environments](../doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md)
### Run the end-to-end tests in a local development environment
diff --git a/scripts/lint-doc.sh b/scripts/lint-doc.sh
index 4886323c836..7104a0bf584 100755
--- a/scripts/lint-doc.sh
+++ b/scripts/lint-doc.sh
@@ -41,7 +41,7 @@ fi
# Do not use 'README.md', instead use 'index.md'
# Number of 'README.md's as of 2020-05-28
-NUMBER_READMES=44
+NUMBER_READMES=41
FIND_READMES=$(find doc/ -name "README.md" | wc -l)
echo '=> Checking for new README.md files...'
echo
diff --git a/spec/finders/projects_finder_spec.rb b/spec/finders/projects_finder_spec.rb
index 8ae19757c25..2d712bd44ce 100644
--- a/spec/finders/projects_finder_spec.rb
+++ b/spec/finders/projects_finder_spec.rb
@@ -31,6 +31,10 @@ RSpec.describe ProjectsFinder, :do_not_mock_admin_mode do
let(:use_cte) { true }
let(:finder) { described_class.new(params: params.merge(use_cte: use_cte), current_user: current_user, project_ids_relation: project_ids_relation) }
+ before do
+ stub_feature_flags(project_finder_similarity_sort: false)
+ end
+
subject { finder.execute }
shared_examples 'ProjectFinder#execute examples' do
@@ -304,9 +308,33 @@ RSpec.describe ProjectsFinder, :do_not_mock_admin_mode do
end
describe 'sorting' do
- let(:params) { { sort: 'name_asc' } }
+ context 'when sorting by a field' do
+ let(:params) { { sort: 'name_asc' } }
+
+ it { is_expected.to eq([internal_project, public_project]) }
+ end
- it { is_expected.to eq([internal_project, public_project]) }
+ context 'when sorting by similarity' do
+ let(:params) { { sort: 'similarity', search: 'pro' } }
+
+ let_it_be(:internal_project2) do
+ create(:project, :internal, group: group, name: 'projA', path: 'projA')
+ end
+
+ let_it_be(:internal_project3) do
+ create(:project, :internal, group: group, name: 'projABC', path: 'projABC')
+ end
+
+ let_it_be(:internal_project4) do
+ create(:project, :internal, group: group, name: 'projAB', path: 'projAB')
+ end
+
+ before do
+ stub_feature_flags(project_finder_similarity_sort: true)
+ end
+
+ it { is_expected.to eq([internal_project2, internal_project4, internal_project3]) }
+ end
end
describe 'with admin user' do
diff --git a/spec/graphql/resolvers/projects_resolver_spec.rb b/spec/graphql/resolvers/projects_resolver_spec.rb
index 07069bb1b06..83a26062957 100644
--- a/spec/graphql/resolvers/projects_resolver_spec.rb
+++ b/spec/graphql/resolvers/projects_resolver_spec.rb
@@ -15,7 +15,6 @@ RSpec.describe Resolvers::ProjectsResolver do
let_it_be(:group_project) { create(:project, :public, group: group) }
let_it_be(:private_project) { create(:project, :private) }
let_it_be(:other_private_project) { create(:project, :private) }
- let_it_be(:other_private_project) { create(:project, :private) }
let_it_be(:private_group_project) { create(:project, :private, group: private_group) }
let_it_be(:user) { create(:user) }
@@ -28,6 +27,10 @@ RSpec.describe Resolvers::ProjectsResolver do
private_group.add_developer(user)
end
+ before do
+ stub_feature_flags(project_finder_similarity_sort: false)
+ end
+
context 'when user is not logged in' do
let(:current_user) { nil }
@@ -117,6 +120,24 @@ RSpec.describe Resolvers::ProjectsResolver do
is_expected.to contain_exactly(project)
end
end
+
+ context 'when sort is similarity' do
+ let_it_be(:named_project1) { create(:project, :public, name: 'projAB', path: 'projAB') }
+ let_it_be(:named_project2) { create(:project, :public, name: 'projABC', path: 'projABC') }
+ let_it_be(:named_project3) { create(:project, :public, name: 'projA', path: 'projA') }
+
+ let(:filters) { { search: 'projA', sort: 'similarity' } }
+
+ it 'returns projects in order of similarity to search' do
+ stub_feature_flags(project_finder_similarity_sort: true)
+
+ is_expected.to eq([named_project3, named_project1, named_project2])
+ end
+
+ it 'returns projects not in order of similarity to search if flag is off' do
+ is_expected.not_to eq([named_project3, named_project1, named_project2])
+ end
+ end
end
end
end
diff --git a/spec/models/integration_spec.rb b/spec/models/integration_spec.rb
index e4bb6522689..d89b323f525 100644
--- a/spec/models/integration_spec.rb
+++ b/spec/models/integration_spec.rb
@@ -3,10 +3,10 @@
require 'spec_helper'
RSpec.describe Integration do
- let!(:project_1) { create(:project) }
- let!(:project_2) { create(:project) }
- let!(:project_3) { create(:project) }
- let(:instance_integration) { create(:jira_service, :instance) }
+ let_it_be(:project_1) { create(:project) }
+ let_it_be(:project_2) { create(:project) }
+ let_it_be(:project_3) { create(:project) }
+ let_it_be(:instance_integration) { create(:jira_service, :instance) }
before do
create(:jira_service, project: project_1, inherit_from_id: instance_integration.id)
diff --git a/spec/services/admin/propagate_integration_service_spec.rb b/spec/services/admin/propagate_integration_service_spec.rb
index 5dfe39aebbc..5df4d9db8b1 100644
--- a/spec/services/admin/propagate_integration_service_spec.rb
+++ b/spec/services/admin/propagate_integration_service_spec.rb
@@ -10,56 +10,16 @@ RSpec.describe Admin::PropagateIntegrationService do
stub_jira_service_test
end
+ let(:group) { create(:group) }
+
let_it_be(:project) { create(:project) }
- let!(:instance_integration) do
- JiraService.create!(
- instance: true,
- active: true,
- push_events: true,
- url: 'http://update-jira.instance.com',
- username: 'user',
- password: 'secret'
- )
+ let_it_be(:instance_integration) { create(:jira_service, :instance) }
+ let_it_be(:not_inherited_integration) { create(:jira_service, project: project) }
+ let_it_be(:inherited_integration) do
+ create(:jira_service, project: create(:project), inherit_from_id: instance_integration.id)
end
-
- let!(:inherited_integration) do
- JiraService.create!(
- project: create(:project),
- inherit_from_id: instance_integration.id,
- instance: false,
- active: true,
- push_events: false,
- url: 'http://jira.instance.com',
- username: 'user',
- password: 'secret'
- )
- end
-
- let!(:not_inherited_integration) do
- JiraService.create!(
- project: project,
- inherit_from_id: nil,
- instance: false,
- active: true,
- push_events: false,
- url: 'http://jira.instance.com',
- username: 'user',
- password: 'secret'
- )
- end
-
- let!(:different_type_inherited_integration) do
- BambooService.create!(
- project: project,
- inherit_from_id: instance_integration.id,
- instance: false,
- active: true,
- push_events: false,
- bamboo_url: 'http://gitlab.com',
- username: 'mic',
- password: 'password',
- build_key: 'build'
- )
+ let_it_be(:different_type_inherited_integration) do
+ create(:redmine_service, project: project, inherit_from_id: instance_integration.id)
end
context 'with inherited integration' do
@@ -74,7 +34,7 @@ RSpec.describe Admin::PropagateIntegrationService do
end
context 'with a project without integration' do
- let!(:another_project) { create(:project) }
+ let(:another_project) { create(:project) }
it 'calls to PropagateIntegrationProjectWorker' do
expect(PropagateIntegrationProjectWorker).to receive(:perform_async)
@@ -85,8 +45,6 @@ RSpec.describe Admin::PropagateIntegrationService do
end
context 'with a group without integration' do
- let!(:group) { create(:group) }
-
it 'calls to PropagateIntegrationProjectWorker' do
expect(PropagateIntegrationGroupWorker).to receive(:perform_async)
.with(instance_integration.id, group.id, group.id)
@@ -94,5 +52,31 @@ RSpec.describe Admin::PropagateIntegrationService do
described_class.propagate(instance_integration)
end
end
+
+ context 'for a group-level integration' do
+ let(:group_integration) { create(:jira_service, group: group, project: nil) }
+
+ context 'with a project without integration' do
+ let(:another_project) { create(:project, group: group) }
+
+ it 'calls to PropagateIntegrationProjectWorker' do
+ expect(PropagateIntegrationProjectWorker).to receive(:perform_async)
+ .with(group_integration.id, another_project.id, another_project.id)
+
+ described_class.propagate(group_integration)
+ end
+ end
+
+ context 'with a group without integration' do
+ let(:subgroup) { create(:group, parent: group) }
+
+ it 'calls to PropagateIntegrationGroupWorker' do
+ expect(PropagateIntegrationGroupWorker).to receive(:perform_async)
+ .with(group_integration.id, subgroup.id, subgroup.id)
+
+ described_class.propagate(group_integration)
+ end
+ end
+ end
end
end
diff --git a/spec/workers/propagate_integration_group_worker_spec.rb b/spec/workers/propagate_integration_group_worker_spec.rb
index b3c9255db57..fbf1fbf1fea 100644
--- a/spec/workers/propagate_integration_group_worker_spec.rb
+++ b/spec/workers/propagate_integration_group_worker_spec.rb
@@ -4,33 +4,40 @@ require 'spec_helper'
RSpec.describe PropagateIntegrationGroupWorker do
describe '#perform' do
- let_it_be(:group1) { create(:group) }
- let_it_be(:group2) { create(:group) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:another_group) { create(:group) }
+ let_it_be(:subgroup1) { create(:group, parent: group) }
+ let_it_be(:subgroup2) { create(:group, parent: group) }
let_it_be(:integration) { create(:redmine_service, :instance) }
-
- before do
- allow(BulkCreateIntegrationService).to receive(:new)
- .with(integration, match_array([group1, group2]), 'group')
- .and_return(double(execute: nil))
- end
+ let(:job_args) { [integration.id, group.id, subgroup2.id] }
it_behaves_like 'an idempotent worker' do
- let(:job_args) { [integration.id, group1.id, group2.id] }
-
it 'calls to BulkCreateIntegrationService' do
expect(BulkCreateIntegrationService).to receive(:new)
- .with(integration, match_array([group1, group2]), 'group')
+ .with(integration, match_array([group, another_group, subgroup1, subgroup2]), 'group').twice
.and_return(double(execute: nil))
subject
end
+
+ context 'with a group integration' do
+ let_it_be(:integration) { create(:redmine_service, group: group, project: nil) }
+
+ it 'calls to BulkCreateIntegrationService' do
+ expect(BulkCreateIntegrationService).to receive(:new)
+ .with(integration, match_array([subgroup1, subgroup2]), 'group').twice
+ .and_return(double(execute: nil))
+
+ subject
+ end
+ end
end
context 'with an invalid integration id' do
it 'returns without failure' do
expect(BulkCreateIntegrationService).not_to receive(:new)
- subject.perform(0, group1.id, group2.id)
+ subject.perform(0, 1, 100)
end
end
end
diff --git a/spec/workers/propagate_integration_inherit_worker_spec.rb b/spec/workers/propagate_integration_inherit_worker_spec.rb
index 88946b9926e..cbfee29a6a0 100644
--- a/spec/workers/propagate_integration_inherit_worker_spec.rb
+++ b/spec/workers/propagate_integration_inherit_worker_spec.rb
@@ -9,18 +9,12 @@ RSpec.describe PropagateIntegrationInheritWorker do
let_it_be(:integration2) { create(:bugzilla_service, inherit_from_id: integration.id) }
let_it_be(:integration3) { create(:redmine_service) }
- before do
- allow(BulkUpdateIntegrationService).to receive(:new)
- .with(integration, match_array(integration1))
- .and_return(double(execute: nil))
- end
-
it_behaves_like 'an idempotent worker' do
let(:job_args) { [integration.id, integration1.id, integration3.id] }
it 'calls to BulkCreateIntegrationService' do
expect(BulkUpdateIntegrationService).to receive(:new)
- .with(integration, match_array(integration1))
+ .with(integration, match_array(integration1)).twice
.and_return(double(execute: nil))
subject
diff --git a/spec/workers/propagate_integration_project_worker_spec.rb b/spec/workers/propagate_integration_project_worker_spec.rb
index 3742ce5fde8..0302af2acc9 100644
--- a/spec/workers/propagate_integration_project_worker_spec.rb
+++ b/spec/workers/propagate_integration_project_worker_spec.rb
@@ -4,33 +4,40 @@ require 'spec_helper'
RSpec.describe PropagateIntegrationProjectWorker do
describe '#perform' do
+ let_it_be(:group) { create(:group) }
let_it_be(:project1) { create(:project) }
- let_it_be(:project2) { create(:project) }
+ let_it_be(:project2) { create(:project, group: group) }
+ let_it_be(:project3) { create(:project, group: group) }
let_it_be(:integration) { create(:redmine_service, :instance) }
-
- before do
- allow(BulkCreateIntegrationService).to receive(:new)
- .with(integration, match_array([project1, project2]), 'project')
- .and_return(double(execute: nil))
- end
+ let(:job_args) { [integration.id, project1.id, project3.id] }
it_behaves_like 'an idempotent worker' do
- let(:job_args) { [integration.id, project1.id, project2.id] }
-
it 'calls to BulkCreateIntegrationService' do
expect(BulkCreateIntegrationService).to receive(:new)
- .with(integration, match_array([project1, project2]), 'project')
+ .with(integration, match_array([project1, project2, project3]), 'project').twice
.and_return(double(execute: nil))
subject
end
+
+ context 'with a group integration' do
+ let_it_be(:integration) { create(:redmine_service, group: group, project: nil) }
+
+ it 'calls to BulkCreateIntegrationService' do
+ expect(BulkCreateIntegrationService).to receive(:new)
+ .with(integration, match_array([project2, project3]), 'project').twice
+ .and_return(double(execute: nil))
+
+ subject
+ end
+ end
end
context 'with an invalid integration id' do
it 'returns without failure' do
expect(BulkCreateIntegrationService).not_to receive(:new)
- subject.perform(0, project1.id, project2.id)
+ subject.perform(0, 1, 100)
end
end
end