Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									c1d4ac2519
								
							
						
					
					
						commit
						e55ef824f5
					
				|  | @ -54,6 +54,7 @@ workflow: | ||||||
|       variables: |       variables: | ||||||
|         RUBY_VERSION: "3.0" |         RUBY_VERSION: "3.0" | ||||||
|         NOTIFY_PIPELINE_FAILURE_CHANNEL: "f_ruby3" |         NOTIFY_PIPELINE_FAILURE_CHANNEL: "f_ruby3" | ||||||
|  |         OMNIBUS_GITLAB_RUBY3_BUILD: "true" | ||||||
|     # For `$CI_DEFAULT_BRANCH` branch, create a pipeline (this includes on schedules, pushes, merges, etc.). |     # For `$CI_DEFAULT_BRANCH` branch, create a pipeline (this includes on schedules, pushes, merges, etc.). | ||||||
|     - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' |     - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' | ||||||
|     # For tags, create a pipeline. |     # For tags, create a pipeline. | ||||||
|  |  | ||||||
|  | @ -47,6 +47,7 @@ stages: | ||||||
|       echo "SECURITY_SOURCES=${SECURITY_SOURCES:-false}" > $BUILD_ENV |       echo "SECURITY_SOURCES=${SECURITY_SOURCES:-false}" > $BUILD_ENV | ||||||
|       echo "OMNIBUS_GITLAB_CACHE_UPDATE=${OMNIBUS_GITLAB_CACHE_UPDATE:-false}" >> $BUILD_ENV |       echo "OMNIBUS_GITLAB_CACHE_UPDATE=${OMNIBUS_GITLAB_CACHE_UPDATE:-false}" >> $BUILD_ENV | ||||||
|       for version_file in *_VERSION; do echo "$version_file=$(cat $version_file)" >> $BUILD_ENV; done |       for version_file in *_VERSION; do echo "$version_file=$(cat $version_file)" >> $BUILD_ENV; done | ||||||
|  |       echo "OMNIBUS_GITLAB_RUBY3_BUILD=${OMNIBUS_GITLAB_RUBY3_BUILD:-false}" >> $BUILD_ENV | ||||||
|       echo "Built environment file for omnibus build:" |       echo "Built environment file for omnibus build:" | ||||||
|       cat $BUILD_ENV |       cat $BUILD_ENV | ||||||
|   artifacts: |   artifacts: | ||||||
|  | @ -116,6 +117,7 @@ trigger-omnibus: | ||||||
|     TOP_UPSTREAM_SOURCE_PROJECT: $CI_PROJECT_PATH |     TOP_UPSTREAM_SOURCE_PROJECT: $CI_PROJECT_PATH | ||||||
|     SECURITY_SOURCES: $SECURITY_SOURCES |     SECURITY_SOURCES: $SECURITY_SOURCES | ||||||
|     CACHE_UPDATE: $OMNIBUS_GITLAB_CACHE_UPDATE |     CACHE_UPDATE: $OMNIBUS_GITLAB_CACHE_UPDATE | ||||||
|  |     RUBY3_BUILD: $OMNIBUS_GITLAB_RUBY3_BUILD | ||||||
|     SKIP_QA_DOCKER: "true" |     SKIP_QA_DOCKER: "true" | ||||||
|     SKIP_QA_TEST: "true" |     SKIP_QA_TEST: "true" | ||||||
|     ee: "true" |     ee: "true" | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ variables: | ||||||
|   RELEASE: "${REGISTRY_HOST}/${REGISTRY_GROUP}/build/omnibus-gitlab-mirror/gitlab-ee:${CI_COMMIT_SHA}" |   RELEASE: "${REGISTRY_HOST}/${REGISTRY_GROUP}/build/omnibus-gitlab-mirror/gitlab-ee:${CI_COMMIT_SHA}" | ||||||
|   SKIP_REPORT_IN_ISSUES: "true" |   SKIP_REPORT_IN_ISSUES: "true" | ||||||
|   OMNIBUS_GITLAB_CACHE_UPDATE: "false" |   OMNIBUS_GITLAB_CACHE_UPDATE: "false" | ||||||
|  |   OMNIBUS_GITLAB_RUBY3_BUILD: "false" | ||||||
|   QA_LOG_LEVEL: "info" |   QA_LOG_LEVEL: "info" | ||||||
|   QA_TESTS: "" |   QA_TESTS: "" | ||||||
|   QA_FEATURE_FLAGS: "" |   QA_FEATURE_FLAGS: "" | ||||||
|  |  | ||||||
|  | @ -130,6 +130,9 @@ | ||||||
| .if-dot-com-gitlab-org-and-security-tag: &if-dot-com-gitlab-org-and-security-tag | .if-dot-com-gitlab-org-and-security-tag: &if-dot-com-gitlab-org-and-security-tag | ||||||
|   if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/security$)/ && $CI_COMMIT_TAG' |   if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/security$)/ && $CI_COMMIT_TAG' | ||||||
| 
 | 
 | ||||||
|  | .if-ruby3-branch: &if-ruby3-branch | ||||||
|  |   if: '$CI_COMMIT_BRANCH == "ruby3"' | ||||||
|  | 
 | ||||||
| # For Security merge requests, the gitlab-release-tools-bot triggers a new | # For Security merge requests, the gitlab-release-tools-bot triggers a new | ||||||
| # pipeline for the "Pipelines for merged results" feature. If the pipeline | # pipeline for the "Pipelines for merged results" feature. If the pipeline | ||||||
| # fails, we notify release managers. | # fails, we notify release managers. | ||||||
|  | @ -652,6 +655,7 @@ | ||||||
|     - <<: *if-default-branch-or-tag |     - <<: *if-default-branch-or-tag | ||||||
|     - <<: *if-dot-com-gitlab-org-schedule |     - <<: *if-dot-com-gitlab-org-schedule | ||||||
|     - <<: *if-force-ci |     - <<: *if-force-ci | ||||||
|  |     - <<: *if-ruby3-branch | ||||||
| 
 | 
 | ||||||
| .build-images:rules:build-assets-image: | .build-images:rules:build-assets-image: | ||||||
|   rules: |   rules: | ||||||
|  | @ -660,6 +664,7 @@ | ||||||
|     - <<: *if-merge-request-targeting-stable-branch |     - <<: *if-merge-request-targeting-stable-branch | ||||||
|     - <<: *if-merge-request-labels-run-review-app |     - <<: *if-merge-request-labels-run-review-app | ||||||
|     - <<: *if-auto-deploy-branches |     - <<: *if-auto-deploy-branches | ||||||
|  |     - <<: *if-ruby3-branch | ||||||
|     - changes: *ci-build-images-patterns |     - changes: *ci-build-images-patterns | ||||||
|     - changes: *code-qa-patterns |     - changes: *code-qa-patterns | ||||||
| 
 | 
 | ||||||
|  | @ -964,6 +969,7 @@ | ||||||
|       allow_failure: true |       allow_failure: true | ||||||
|     - <<: *if-force-ci |     - <<: *if-force-ci | ||||||
|       allow_failure: true |       allow_failure: true | ||||||
|  |     - <<: *if-ruby3-branch | ||||||
| 
 | 
 | ||||||
| .qa:rules:package-and-test: | .qa:rules:package-and-test: | ||||||
|   rules: |   rules: | ||||||
|  | @ -975,6 +981,7 @@ | ||||||
|       when: never |       when: never | ||||||
|     - <<: *if-merge-request-targeting-stable-branch |     - <<: *if-merge-request-targeting-stable-branch | ||||||
|       allow_failure: true |       allow_failure: true | ||||||
|  |     - <<: *if-ruby3-branch | ||||||
|     - <<: *if-dot-com-gitlab-org-and-security-merge-request-manual-ff-package-and-e2e |     - <<: *if-dot-com-gitlab-org-and-security-merge-request-manual-ff-package-and-e2e | ||||||
|       changes: *feature-flag-development-config-patterns |       changes: *feature-flag-development-config-patterns | ||||||
|       when: manual |       when: manual | ||||||
|  |  | ||||||
|  | @ -1 +1 @@ | ||||||
| 1d200302f736b50b48bf7e9ec7eb28f0e01dc559 | e49ea29543b2d8e71bfe4bdc3b295f785bd24fb1 | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								Gemfile
								
								
								
								
							
							
						
						
									
										2
									
								
								Gemfile
								
								
								
								
							|  | @ -364,7 +364,7 @@ gem 'prometheus-client-mmap', '~> 0.16', require: 'prometheus/client' | ||||||
| gem 'warning', '~> 1.3.0' | gem 'warning', '~> 1.3.0' | ||||||
| 
 | 
 | ||||||
| group :development do | group :development do | ||||||
|   gem 'lefthook', '~> 1.1.1', require: false |   gem 'lefthook', '~> 1.1.2', require: false | ||||||
|   gem 'rubocop' |   gem 'rubocop' | ||||||
|   gem 'solargraph', '~> 0.47.2', require: false |   gem 'solargraph', '~> 0.47.2', require: false | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -299,7 +299,7 @@ | ||||||
| {"name":"kramdown-parser-gfm","version":"1.1.0","platform":"ruby","checksum":"fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729"}, | {"name":"kramdown-parser-gfm","version":"1.1.0","platform":"ruby","checksum":"fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729"}, | ||||||
| {"name":"kubeclient","version":"4.9.3","platform":"ruby","checksum":"d5d38e719fbac44f396851aa57cd1b9f4f7dab4410ab680ccd21c9b741230046"}, | {"name":"kubeclient","version":"4.9.3","platform":"ruby","checksum":"d5d38e719fbac44f396851aa57cd1b9f4f7dab4410ab680ccd21c9b741230046"}, | ||||||
| {"name":"launchy","version":"2.5.0","platform":"ruby","checksum":"954243c4255920982ce682f89a42e76372dba94770bf09c23a523e204bdebef5"}, | {"name":"launchy","version":"2.5.0","platform":"ruby","checksum":"954243c4255920982ce682f89a42e76372dba94770bf09c23a523e204bdebef5"}, | ||||||
| {"name":"lefthook","version":"1.1.1","platform":"ruby","checksum":"fa7dcd2c55dc14f6f164f96cf1404e712be84a2ac256e75947213093e080d05b"}, | {"name":"lefthook","version":"1.1.2","platform":"ruby","checksum":"fdbe2a62faf6ae2a9f9be64e105ca8f06c527c5ba9a3edb2cdcf024025227897"}, | ||||||
| {"name":"letter_opener","version":"1.7.0","platform":"ruby","checksum":"095bc0d58e006e5b43ea7d219e64ecf2de8d1f7d9dafc432040a845cf59b4725"}, | {"name":"letter_opener","version":"1.7.0","platform":"ruby","checksum":"095bc0d58e006e5b43ea7d219e64ecf2de8d1f7d9dafc432040a845cf59b4725"}, | ||||||
| {"name":"letter_opener_web","version":"2.0.0","platform":"ruby","checksum":"33860ad41e1785d75456500e8ca8bba8ed71ee6eaf08a98d06bbab67c5577b6f"}, | {"name":"letter_opener_web","version":"2.0.0","platform":"ruby","checksum":"33860ad41e1785d75456500e8ca8bba8ed71ee6eaf08a98d06bbab67c5577b6f"}, | ||||||
| {"name":"libyajl2","version":"1.2.0","platform":"ruby","checksum":"1117cd1e48db013b626e36269bbf1cef210538ca6d2e62d3fa3db9ded005b258"}, | {"name":"libyajl2","version":"1.2.0","platform":"ruby","checksum":"1117cd1e48db013b626e36269bbf1cef210538ca6d2e62d3fa3db9ded005b258"}, | ||||||
|  |  | ||||||
|  | @ -802,7 +802,7 @@ GEM | ||||||
|       rest-client (~> 2.0) |       rest-client (~> 2.0) | ||||||
|     launchy (2.5.0) |     launchy (2.5.0) | ||||||
|       addressable (~> 2.7) |       addressable (~> 2.7) | ||||||
|     lefthook (1.1.1) |     lefthook (1.1.2) | ||||||
|     letter_opener (1.7.0) |     letter_opener (1.7.0) | ||||||
|       launchy (~> 2.2) |       launchy (~> 2.2) | ||||||
|     letter_opener_web (2.0.0) |     letter_opener_web (2.0.0) | ||||||
|  | @ -1673,7 +1673,7 @@ DEPENDENCIES | ||||||
|   knapsack (~> 1.21.1) |   knapsack (~> 1.21.1) | ||||||
|   kramdown (~> 2.3.1) |   kramdown (~> 2.3.1) | ||||||
|   kubeclient (~> 4.9.3) |   kubeclient (~> 4.9.3) | ||||||
|   lefthook (~> 1.1.1) |   lefthook (~> 1.1.2) | ||||||
|   letter_opener_web (~> 2.0.0) |   letter_opener_web (~> 2.0.0) | ||||||
|   license_finder (~> 7.0) |   license_finder (~> 7.0) | ||||||
|   licensee (~> 9.15) |   licensee (~> 9.15) | ||||||
|  |  | ||||||
|  | @ -142,7 +142,7 @@ export default { | ||||||
|               :edited-at="discussion.resolved_at" |               :edited-at="discussion.resolved_at" | ||||||
|               :edited-by="discussion.resolved_by" |               :edited-by="discussion.resolved_by" | ||||||
|               :action-text="resolvedText" |               :action-text="resolvedText" | ||||||
|               class-name="discussion-headline-light js-discussion-headline discussion-resolved-text gl-mb-2" |               class-name="discussion-headline-light js-discussion-headline discussion-resolved-text gl-mb-2 gl-ml-3" | ||||||
|             /> |             /> | ||||||
|           </template> |           </template> | ||||||
|           <template #avatar-badge> |           <template #avatar-badge> | ||||||
|  |  | ||||||
|  | @ -442,6 +442,18 @@ $system-note-svg-size: 1rem; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .card .notes { | ||||||
|  |   .system-note { | ||||||
|  |     margin: 0; | ||||||
|  |     padding: 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   .timeline-icon { | ||||||
|  |     margin: 8px 0 0 14px; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| // Diff code in discussion view | // Diff code in discussion view | ||||||
| .discussion-body .diff-file { | .discussion-body .diff-file { | ||||||
|   .file-title { |   .file-title { | ||||||
|  | @ -1085,6 +1097,16 @@ $system-note-svg-size: 1rem; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   .draft-note-component .draft-note.timeline-entry { | ||||||
|  |     .timeline-content:not(.flash-container) { | ||||||
|  |       padding: $gl-padding-8 $gl-padding-8 $gl-padding-8 $gl-padding; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .timeline-avatar { | ||||||
|  |       margin: $gl-padding-8 0 0 $gl-padding; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   .diff-comment-form { |   .diff-comment-form { | ||||||
|     display: block; |     display: block; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -2,6 +2,8 @@ | ||||||
| 
 | 
 | ||||||
| module Members | module Members | ||||||
|   class DestroyService < Members::BaseService |   class DestroyService < Members::BaseService | ||||||
|  |     include Gitlab::ExclusiveLeaseHelpers | ||||||
|  | 
 | ||||||
|     def execute(member, skip_authorization: false, skip_subresources: false, unassign_issuables: false, destroy_bot: false) |     def execute(member, skip_authorization: false, skip_subresources: false, unassign_issuables: false, destroy_bot: false) | ||||||
|       unless skip_authorization |       unless skip_authorization | ||||||
|         raise Gitlab::Access::AccessDeniedError unless authorized?(member, destroy_bot) |         raise Gitlab::Access::AccessDeniedError unless authorized?(member, destroy_bot) | ||||||
|  | @ -11,13 +13,26 @@ module Members | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       @skip_auth = skip_authorization |       @skip_auth = skip_authorization | ||||||
|  |       last_owner = true | ||||||
| 
 | 
 | ||||||
|       return member if member.is_a?(GroupMember) && member.source.last_owner?(member.user) |       in_lock("delete_members:#{member.source.class}:#{member.source.id}") do | ||||||
|  |         break if member.is_a?(GroupMember) && member.source.last_owner?(member.user) | ||||||
| 
 | 
 | ||||||
|  |         last_owner = false | ||||||
|         member.destroy |         member.destroy | ||||||
| 
 |  | ||||||
|         member.user&.invalidate_cache_counts |         member.user&.invalidate_cache_counts | ||||||
|  |       end | ||||||
| 
 | 
 | ||||||
|  |       unless last_owner | ||||||
|  |         delete_member_associations(member, skip_subresources, unassign_issuables) | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       member | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     private | ||||||
|  | 
 | ||||||
|  |     def delete_member_associations(member, skip_subresources, unassign_issuables) | ||||||
|       if member.request? && member.user != current_user |       if member.request? && member.user != current_user | ||||||
|         notification_service.decline_access_request(member) |         notification_service.decline_access_request(member) | ||||||
|       end |       end | ||||||
|  | @ -28,12 +43,8 @@ module Members | ||||||
|       enqueue_unassign_issuables(member) if unassign_issuables |       enqueue_unassign_issuables(member) if unassign_issuables | ||||||
| 
 | 
 | ||||||
|       after_execute(member: member) |       after_execute(member: member) | ||||||
| 
 |  | ||||||
|       member |  | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     private |  | ||||||
| 
 |  | ||||||
|     def authorized?(member, destroy_bot) |     def authorized?(member, destroy_bot) | ||||||
|       return can_destroy_bot_member?(member) if destroy_bot |       return can_destroy_bot_member?(member) if destroy_bot | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | # rubocop:disable Migration/AddLimitToTextColumns | ||||||
|  | # limit is added in 20220914131449_add_text_limit_to_projects_jitsu_key.rb | ||||||
|  | class AddJitsuKeyToProjects < Gitlab::Database::Migration[2.0] | ||||||
|  |   disable_ddl_transaction! | ||||||
|  | 
 | ||||||
|  |   def up | ||||||
|  |     with_lock_retries do | ||||||
|  |       add_column :project_settings, :jitsu_key, :text | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def down | ||||||
|  |     with_lock_retries do | ||||||
|  |       remove_column :project_settings, :jitsu_key | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | # rubocop:enable Migration/AddLimitToTextColumns | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | class AddTextLimitToProjectsJitsuKey < Gitlab::Database::Migration[2.0] | ||||||
|  |   disable_ddl_transaction! | ||||||
|  | 
 | ||||||
|  |   def up | ||||||
|  |     add_text_limit :project_settings, :jitsu_key, 100 | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def down | ||||||
|  |     remove_text_limit :project_settings, :jitsu_key | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | c0a3269fbd44428439932f3b12b154425eafaab0b0638f7f27a03e784d0f0e32 | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | 205f1fee1ed33a2b069e51a76b94c72702300c72c4705569be2368f8804f3bce | ||||||
|  | @ -20099,7 +20099,9 @@ CREATE TABLE project_settings ( | ||||||
|     enforce_auth_checks_on_uploads boolean DEFAULT true NOT NULL, |     enforce_auth_checks_on_uploads boolean DEFAULT true NOT NULL, | ||||||
|     selective_code_owner_removals boolean DEFAULT false NOT NULL, |     selective_code_owner_removals boolean DEFAULT false NOT NULL, | ||||||
|     show_diff_preview_in_email boolean DEFAULT true NOT NULL, |     show_diff_preview_in_email boolean DEFAULT true NOT NULL, | ||||||
|  |     jitsu_key text, | ||||||
|     suggested_reviewers_enabled boolean DEFAULT false NOT NULL, |     suggested_reviewers_enabled boolean DEFAULT false NOT NULL, | ||||||
|  |     CONSTRAINT check_2981f15877 CHECK ((char_length(jitsu_key) <= 100)), | ||||||
|     CONSTRAINT check_3a03e7557a CHECK ((char_length(previous_default_branch) <= 4096)), |     CONSTRAINT check_3a03e7557a CHECK ((char_length(previous_default_branch) <= 4096)), | ||||||
|     CONSTRAINT check_b09644994b CHECK ((char_length(squash_commit_template) <= 500)), |     CONSTRAINT check_b09644994b CHECK ((char_length(squash_commit_template) <= 500)), | ||||||
|     CONSTRAINT check_bde223416c CHECK ((show_default_award_emojis IS NOT NULL)), |     CONSTRAINT check_bde223416c CHECK ((show_default_award_emojis IS NOT NULL)), | ||||||
|  |  | ||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 29 KiB | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 74 KiB | 
|  | @ -8,11 +8,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w | ||||||
| 
 | 
 | ||||||
| > [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/725) in GitLab 12.0. | > [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/725) in GitLab 12.0. | ||||||
| 
 | 
 | ||||||
| Configure Insights to explore data about you group's activity, such as | Configure insights to explore data about you group's activity, such as | ||||||
| triage hygiene, issues created or closed in a given period, and average time for merge | triage hygiene, issues created or closed in a given period, and average time for merge | ||||||
| requests to be merged. | requests to be merged. | ||||||
|  | You can also create custom insights reports that are relevant for your group. | ||||||
| 
 | 
 | ||||||
| ## View your group's Insights | ## View group insights | ||||||
| 
 | 
 | ||||||
| Prerequisites: | Prerequisites: | ||||||
| 
 | 
 | ||||||
|  | @ -20,20 +21,47 @@ Prerequisites: | ||||||
| - You must have access to a project to view information about its merge requests and issues, | - You must have access to a project to view information about its merge requests and issues, | ||||||
|   and permission to view them if they are confidential. |   and permission to view them if they are confidential. | ||||||
| 
 | 
 | ||||||
| To access your group's Insights: | To access your group's insights: | ||||||
| 
 | 
 | ||||||
| 1. On the top bar, select **Main menu > Groups** and find your group. | 1. On the top bar, select **Main menu > Groups** and find your group. | ||||||
| 1. On the left sidebar, select **Analytics > Insights**. | 1. On the left sidebar, select **Analytics > Insights**. | ||||||
| 
 | 
 | ||||||
|  | ## Interact with insights charts | ||||||
| 
 | 
 | ||||||
| ## Configure your Insights | You can interact with the insights charts to view details about your group's activity. | ||||||
| 
 | 
 | ||||||
| GitLab reads Insights from the |  | ||||||
|  | 
 | ||||||
|  | ### Display different reports | ||||||
|  | 
 | ||||||
|  | To display one of the available reports on the insights page, from the **Select report** dropdown list, | ||||||
|  | select the report you want to display. | ||||||
|  | 
 | ||||||
|  | ### View bar chart annotations | ||||||
|  | 
 | ||||||
|  | To view annotations, hover over each bar in the chart. | ||||||
|  | 
 | ||||||
|  | ### Zoom in on chart | ||||||
|  | 
 | ||||||
|  | Insights display data from the last 90 days. You can zoom in to display data only from a subset of the 90-day range. | ||||||
|  | 
 | ||||||
|  | To do this, select the pause icons (**{status-paused}**) and slide them along the horizontal axis: | ||||||
|  | 
 | ||||||
|  | - To select a later start date, slide the left pause icon to the right. | ||||||
|  | - To select an earlier end date, slide the right pause icon to the left. | ||||||
|  | 
 | ||||||
|  | ### Exclude dimensions from charts | ||||||
|  | 
 | ||||||
|  | By default, insights display all available dimensions on the chart. | ||||||
|  | 
 | ||||||
|  | To exclude a dimension, from the legend below the chart, select the name of the dimension. | ||||||
|  | 
 | ||||||
|  | ## Configure group insights | ||||||
|  | 
 | ||||||
|  | GitLab reads insights from the | ||||||
| [default configuration file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/fixtures/insights/default.yml). | [default configuration file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/fixtures/insights/default.yml). | ||||||
| You can also create custom Insights charts that are more relevant for your group. |  | ||||||
| 
 | 
 | ||||||
| To customize your Insights: | To configure group insights: | ||||||
| 
 | 
 | ||||||
| 1. Create a new file [`.gitlab/insights.yml`](../../project/insights/index.md#configure-project-insights) | 1. Create a new file [`.gitlab/insights.yml`](../../project/insights/index.md#configure-project-insights) | ||||||
| in a project that belongs to your group. | in a project that belongs to your group. | ||||||
|  |  | ||||||
|  | @ -34,7 +34,7 @@ Prerequisites: | ||||||
| 
 | 
 | ||||||
| - Depending on your project configuration, you must have at least the Developer role. | - Depending on your project configuration, you must have at least the Developer role. | ||||||
| 
 | 
 | ||||||
| Project insights are configured with the [`.gitlab/insights.yml`](#insights-configuration-file) file in the project. If a project doesn't have a configuration file, it uses the [group configuration](../../group/insights/index.md#configure-your-insights). | Project insights are configured with the [`.gitlab/insights.yml`](#insights-configuration-file) file in the project. If a project doesn't have a configuration file, it uses the [group configuration](../../group/insights/index.md#configure-group-insights). | ||||||
| 
 | 
 | ||||||
| The `.gitlab/insights.yml` file is a YAML file where you define: | The `.gitlab/insights.yml` file is a YAML file where you define: | ||||||
| 
 | 
 | ||||||
|  | @ -52,7 +52,7 @@ To configure project insights, either: | ||||||
|   1. Select **Commit changes**. |   1. Select **Commit changes**. | ||||||
| 
 | 
 | ||||||
| After you create the configuration file, you can also | After you create the configuration file, you can also | ||||||
| [use it for the project's group](../../group/insights/index.md#configure-your-insights). | [use it for the project's group](../../group/insights/index.md#configure-group-insights). | ||||||
| 
 | 
 | ||||||
| ## Insights configuration file | ## Insights configuration file | ||||||
| 
 | 
 | ||||||
|  | @ -396,7 +396,7 @@ Use `query.environment_tiers` to define an array of environments to include the | ||||||
| 
 | 
 | ||||||
| Use `projects` to limit where issuables are queried from: | Use `projects` to limit where issuables are queried from: | ||||||
| 
 | 
 | ||||||
| - If `.gitlab/insights.yml` is used for a [group's insights](../../group/insights/index.md#configure-your-insights), use `projects` to define the projects from which to query issuables. By default, all projects under the group are used. | - If `.gitlab/insights.yml` is used for a [group's insights](../../group/insights/index.md#configure-group-insights), use `projects` to define the projects from which to query issuables. By default, all projects under the group are used. | ||||||
| - If `.gitlab/insights.yml` is used for a project's insights, specifying other projects does not yield results. By default, the project is used. | - If `.gitlab/insights.yml` is used for a project's insights, specifying other projects does not yield results. By default, the project is used. | ||||||
| 
 | 
 | ||||||
| #### `projects.only` | #### `projects.only` | ||||||
|  |  | ||||||
|  | @ -78,6 +78,15 @@ Use these rules for your commit messages. | ||||||
|   the expression. To allow any commit message, leave empty. |   the expression. To allow any commit message, leave empty. | ||||||
|   Uses multiline mode, which can be disabled by using `(?-m)`. |   Uses multiline mode, which can be disabled by using `(?-m)`. | ||||||
| 
 | 
 | ||||||
|  | ## Reject commits that aren't DCO certified | ||||||
|  | 
 | ||||||
|  | > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98810) in GitLab 15.5. | ||||||
|  | 
 | ||||||
|  | Commits signed with the [Developer Certificate of Origin](https://developercertificate.org/) (DCO) | ||||||
|  | certify the contributor wrote, or has the right to submit, the code contributed in that commit. | ||||||
|  | You can require all commits to your project to comply with the DCO. This push rule requires a | ||||||
|  | `Signed-off-by:` trailer in every commit message, and rejects any commits that lack it. | ||||||
|  | 
 | ||||||
| ## Validate branch names | ## Validate branch names | ||||||
| 
 | 
 | ||||||
| To validate your branch names, enter a regular expression for **Branch name**. | To validate your branch names, enter a regular expression for **Branch name**. | ||||||
|  |  | ||||||
|  | @ -108,7 +108,7 @@ module Gitlab | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def branch_protection(repo_name, branch_name) |       def branch_protection(repo_name, branch_name) | ||||||
|         with_rate_limit { octokit.branch_protection(repo_name, branch_name) } |         with_rate_limit { octokit.branch_protection(repo_name, branch_name).to_h } | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       # Fetches data from the GitHub API and yields a Page object for every page |       # Fetches data from the GitHub API and yields a Page object for every page | ||||||
|  |  | ||||||
|  | @ -31683,6 +31683,9 @@ msgstr "" | ||||||
| msgid "ProjectSettings|Note: The container registry is always visible when a project is public and the container registry is set to '%{access_level_description}'" | msgid "ProjectSettings|Note: The container registry is always visible when a project is public and the container registry is set to '%{access_level_description}'" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | msgid "ProjectSettings|Only commits that include a %{code_block_start}Signed-off-by:%{code_block_end} element can be pushed to this repository." | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| msgid "ProjectSettings|Only signed commits can be pushed to this repository." | msgid "ProjectSettings|Only signed commits can be pushed to this repository." | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | @ -32814,6 +32817,9 @@ msgstr "" | ||||||
| msgid "PushRules|Reject any files likely to contain secrets. %{secret_files_link_start}What secret files are rejected?%{secret_files_link_end}" | msgid "PushRules|Reject any files likely to contain secrets. %{secret_files_link_start}What secret files are rejected?%{secret_files_link_end}" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | msgid "PushRules|Reject commits that aren't DCO certified" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| msgid "PushRules|Reject expression in commit messages" | msgid "PushRules|Reject expression in commit messages" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -59,7 +59,7 @@ | ||||||
|     "@rails/actioncable": "6.1.4-7", |     "@rails/actioncable": "6.1.4-7", | ||||||
|     "@rails/ujs": "6.1.4-7", |     "@rails/ujs": "6.1.4-7", | ||||||
|     "@sentry/browser": "5.30.0", |     "@sentry/browser": "5.30.0", | ||||||
|     "@sourcegraph/code-host-integration": "0.0.82", |     "@sourcegraph/code-host-integration": "0.0.60", | ||||||
|     "@tiptap/core": "^2.0.0-beta.182", |     "@tiptap/core": "^2.0.0-beta.182", | ||||||
|     "@tiptap/extension-blockquote": "^2.0.0-beta.29", |     "@tiptap/extension-blockquote": "^2.0.0-beta.29", | ||||||
|     "@tiptap/extension-bold": "^2.0.0-beta.28", |     "@tiptap/extension-bold": "^2.0.0-beta.28", | ||||||
|  |  | ||||||
|  | @ -148,7 +148,9 @@ RSpec.describe Gitlab::GithubImport::Client do | ||||||
|         .to receive(:branch_protection).with('org/repo', 'bar') |         .to receive(:branch_protection).with('org/repo', 'bar') | ||||||
|       expect(client).to receive(:with_rate_limit).and_yield |       expect(client).to receive(:with_rate_limit).and_yield | ||||||
| 
 | 
 | ||||||
|       client.branch_protection('org/repo', 'bar') |       branch_protection = client.branch_protection('org/repo', 'bar') | ||||||
|  | 
 | ||||||
|  |       expect(branch_protection).to be_a(Hash) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -546,6 +546,7 @@ project: | ||||||
| - path_locks | - path_locks | ||||||
| - approver_groups | - approver_groups | ||||||
| - repository_state | - repository_state | ||||||
|  | - wiki_repository_state | ||||||
| - source_pipelines | - source_pipelines | ||||||
| - sourced_pipelines | - sourced_pipelines | ||||||
| - prometheus_metrics | - prometheus_metrics | ||||||
|  |  | ||||||
|  | @ -160,6 +160,7 @@ project_setting: | ||||||
|     - selective_code_owner_removals |     - selective_code_owner_removals | ||||||
|     - show_diff_preview_in_email |     - show_diff_preview_in_email | ||||||
|     - suggested_reviewers_enabled |     - suggested_reviewers_enabled | ||||||
|  |     - jitsu_key | ||||||
| 
 | 
 | ||||||
| build_service_desk_setting: # service_desk_setting | build_service_desk_setting: # service_desk_setting | ||||||
|   unexposed_attributes: |   unexposed_attributes: | ||||||
|  |  | ||||||
|  | @ -95,6 +95,37 @@ RSpec.describe Members::DestroyService do | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   context 'With ExclusiveLeaseHelpers' do | ||||||
|  |     let(:service_object) { described_class.new(current_user) } | ||||||
|  |     let!(:member) { group_project.add_developer(member_user) } | ||||||
|  | 
 | ||||||
|  |     subject(:destroy_member) { service_object.execute(member, **opts) } | ||||||
|  | 
 | ||||||
|  |     before do | ||||||
|  |       group_project.add_maintainer(current_user) | ||||||
|  | 
 | ||||||
|  |       allow(service_object).to receive(:in_lock) do |_, &block| | ||||||
|  |         block.call if lock_obtained | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     context 'when lock is obtained' do | ||||||
|  |       let(:lock_obtained) { true } | ||||||
|  | 
 | ||||||
|  |       it 'destroys the membership' do | ||||||
|  |         expect { destroy_member }.to change { group_project.members.count }.by(-1) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     context 'when the lock can not be obtained' do | ||||||
|  |       let(:lock_obtained) { false } | ||||||
|  | 
 | ||||||
|  |       it 'does not destroy the membership' do | ||||||
|  |         expect { destroy_member }.not_to change { group_project.members.count } | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   context 'with a member with access' do |   context 'with a member with access' do | ||||||
|     before do |     before do | ||||||
|       group_project.update_attribute(:visibility_level, Gitlab::VisibilityLevel::PRIVATE) |       group_project.update_attribute(:visibility_level, Gitlab::VisibilityLevel::PRIVATE) | ||||||
|  |  | ||||||
|  | @ -1668,10 +1668,10 @@ | ||||||
|   dependencies: |   dependencies: | ||||||
|     "@sinonjs/commons" "^1.7.0" |     "@sinonjs/commons" "^1.7.0" | ||||||
| 
 | 
 | ||||||
| "@sourcegraph/code-host-integration@0.0.82": | "@sourcegraph/code-host-integration@0.0.60": | ||||||
|   version "0.0.82" |   version "0.0.60" | ||||||
|   resolved "https://registry.yarnpkg.com/@sourcegraph/code-host-integration/-/code-host-integration-0.0.82.tgz#9bf45d9a4bfb44be2ecbf86a63028df169f9dfc4" |   resolved "https://registry.yarnpkg.com/@sourcegraph/code-host-integration/-/code-host-integration-0.0.60.tgz#2043877fabb7eb986fcb61b67ee480afbb29f4f0" | ||||||
|   integrity sha512-HOdCo1SZ5H2AXIdao77G+Hh4nJW6UVNA3b1TrcXXHqfYvXoWn6yzEoI9aZjRVR6K5gBk5FD7amd/FKmqLmyo5A== |   integrity sha512-T+MvM8SUF7daA279hyQgwmva3J5LvPqwgQ/mWwxdVshehOQIPLUd310I0c6x6nZ0F/x4UjDWgRWzAqy6NLwV1w== | ||||||
| 
 | 
 | ||||||
| "@testing-library/dom@^7.16.2": | "@testing-library/dom@^7.16.2": | ||||||
|   version "7.24.5" |   version "7.24.5" | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue