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:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-09-08 21:10:02 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-09-08 21:10:02 +0300
commit375b68fe813abba5e362aa6054eae7b325e92e03 (patch)
tree3d02fc54f6c38beb92f6e592452dd5f5884fab0b
parent132b8909c81349a88317a00b94c1de97e2db4b74 (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/commit_block.vue39
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/job_container_item.vue8
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/job_sidebar_retry_button.vue1
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/jobs_container.vue3
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/sidebar.vue30
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/sidebar_detail_row.vue29
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/sidebar_header.vue5
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/sidebar_job_details_container.vue12
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/stages_dropdown.vue30
-rw-r--r--app/assets/javascripts/jobs/components/job/sidebar/trigger_block.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_badge_link.vue3
-rw-r--r--app/assets/stylesheets/page_bundles/build.scss65
-rw-r--r--app/controllers/projects/commits_controller.rb2
-rw-r--r--app/controllers/projects/jobs_controller.rb2
-rw-r--r--app/models/ci/runner.rb4
-rw-r--r--app/models/concerns/ci/has_runner_executor.rb4
-rw-r--r--app/models/concerns/routable.rb55
-rw-r--r--app/models/packages/nuget/symbol.rb32
-rw-r--r--app/models/packages/package.rb1
-rw-r--r--app/uploaders/packages/nuget/symbol_uploader.rb25
-rw-r--r--config/feature_flags/development/optimize_routable.yml8
-rw-r--r--db/docs/packages_nuget_symbols.yml10
-rw-r--r--db/migrate/20230821133549_create_packages_nuget_symbols.rb24
-rw-r--r--db/migrate/20230906185552_add_markdown_fields_to_review_llm_summary.rb23
-rw-r--r--db/schema_migrations/202308211335491
-rw-r--r--db/schema_migrations/202309061855521
-rw-r--r--db/structure.sql42
-rw-r--r--doc/administration/postgresql/database_load_balancing.md6
-rw-r--r--doc/administration/settings/usage_statistics.md2
-rw-r--r--doc/api/error_tracking.md2
-rw-r--r--doc/api/usage_data.md2
-rw-r--r--doc/development/fe_guide/customizable_dashboards.md2
-rw-r--r--doc/development/internal_analytics/index.md2
-rw-r--r--doc/development/internal_analytics/internal_event_tracking/architecture.md2
-rw-r--r--doc/development/internal_analytics/internal_event_tracking/event_definition_guide.md2
-rw-r--r--doc/development/internal_analytics/internal_event_tracking/index.md2
-rw-r--r--doc/development/internal_analytics/internal_event_tracking/introduction.md2
-rw-r--r--doc/development/internal_analytics/internal_event_tracking/migration.md2
-rw-r--r--doc/development/internal_analytics/internal_event_tracking/quick_start.md2
-rw-r--r--doc/development/internal_analytics/service_ping/implement.md2
-rw-r--r--doc/development/internal_analytics/service_ping/index.md2
-rw-r--r--doc/development/internal_analytics/service_ping/metrics_dictionary.md2
-rw-r--r--doc/development/internal_analytics/service_ping/metrics_instrumentation.md2
-rw-r--r--doc/development/internal_analytics/service_ping/metrics_lifecycle.md2
-rw-r--r--doc/development/internal_analytics/service_ping/performance_indicator_metrics.md2
-rw-r--r--doc/development/internal_analytics/service_ping/review_guidelines.md2
-rw-r--r--doc/development/internal_analytics/service_ping/troubleshooting.md2
-rw-r--r--doc/development/internal_analytics/service_ping/usage_data.md2
-rw-r--r--doc/development/internal_analytics/snowplow/event_dictionary_guide.md2
-rw-r--r--doc/development/internal_analytics/snowplow/implementation.md2
-rw-r--r--doc/development/internal_analytics/snowplow/index.md2
-rw-r--r--doc/development/internal_analytics/snowplow/infrastructure.md2
-rw-r--r--doc/development/internal_analytics/snowplow/review_guidelines.md2
-rw-r--r--doc/development/internal_analytics/snowplow/schemas.md2
-rw-r--r--doc/development/internal_analytics/snowplow/troubleshooting.md2
-rw-r--r--doc/operations/error_tracking.md2
-rw-r--r--doc/operations/tracing.md2
-rw-r--r--doc/user/project/issues/csv_export.md151
-rw-r--r--doc/user/project/issues/img/csv_export_button_v12_9.pngbin12951 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/csv_export_modal.pngbin16825 -> 0 bytes
-rw-r--r--lib/gitlab/metrics/samplers/database_sampler.rb4
-rw-r--r--locale/gitlab.pot22
-rw-r--r--qa/qa/page/component/ci_badge_link.rb4
-rw-r--r--spec/factories/packages/nuget/symbol.rb11
-rw-r--r--spec/features/projects/jobs_spec.rb4
-rw-r--r--spec/fixtures/packages/nuget/symbol/package.pdbbin0 -> 10588 bytes
-rw-r--r--spec/frontend/jobs/components/job/job_sidebar_details_container_spec.js3
-rw-r--r--spec/frontend/jobs/components/job/stages_dropdown_spec.js4
-rw-r--r--spec/graphql/resolvers/branch_commit_resolver_spec.rb2
-rw-r--r--spec/lib/gitlab/metrics/samplers/database_sampler_spec.rb78
-rw-r--r--spec/models/concerns/routable_spec.rb49
-rw-r--r--spec/models/packages/nuget/symbol_spec.rb70
-rw-r--r--spec/models/packages/package_spec.rb1
-rw-r--r--spec/uploaders/packages/nuget/symbol_uploader_spec.rb28
74 files changed, 652 insertions, 304 deletions
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/commit_block.vue b/app/assets/javascripts/jobs/components/job/sidebar/commit_block.vue
index 95616a4c706..7f25ca8a94d 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/commit_block.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/commit_block.vue
@@ -22,32 +22,25 @@ export default {
</script>
<template>
<div>
- <p class="gl-display-flex gl-flex-wrap gl-align-items-baseline gl-gap-2 gl-mb-0">
- <span class="gl-display-flex gl-font-weight-bold">{{ __('Commit') }}</span>
+ <span class="gl-font-weight-bold">{{ __('Commit') }}</span>
- <gl-link
- :href="commit.commit_path"
- class="gl-text-blue-500! gl-font-monospace"
- data-testid="commit-sha"
- >
- {{ commit.short_id }}
- </gl-link>
+ <gl-link :href="commit.commit_path" class="gl-text-blue-600!" data-testid="commit-sha">
+ {{ commit.short_id }}
+ </gl-link>
- <clipboard-button
- :text="commit.id"
- :title="__('Copy commit SHA')"
- category="tertiary"
- size="small"
- class="gl-align-self-center"
- />
+ <clipboard-button
+ :text="commit.id"
+ :title="__('Copy commit SHA')"
+ category="tertiary"
+ size="small"
+ />
- <span v-if="mergeRequest">
- {{ __('in') }}
- <gl-link :href="mergeRequest.path" class="gl-text-blue-500!" data-testid="link-commit"
- >!{{ mergeRequest.iid }}</gl-link
- >
- </span>
- </p>
+ <span v-if="mergeRequest">
+ {{ __('in') }}
+ <gl-link :href="mergeRequest.path" class="gl-text-blue-600!" data-testid="link-commit"
+ >!{{ mergeRequest.iid }}</gl-link
+ >
+ </span>
<p class="gl-mb-0">{{ commit.title }}</p>
</div>
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/job_container_item.vue b/app/assets/javascripts/jobs/components/job/sidebar/job_container_item.vue
index b941f7a882d..097ab3b4cf6 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/job_container_item.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/job_container_item.vue
@@ -40,7 +40,7 @@ export default {
},
classes() {
return {
- 'retried gl-text-secondary': this.job.retried,
+ retried: this.job.retried,
'gl-font-weight-bold': this.isActive,
};
},
@@ -57,7 +57,7 @@ export default {
v-gl-tooltip.left.viewport
:href="job.status.details_path"
:title="tooltipText"
- class="gl-display-flex gl-align-items-center gl-py-3 gl-pl-7"
+ class="gl-display-flex gl-align-items-center"
:data-testid="dataTestId"
>
<gl-icon
@@ -67,11 +67,11 @@ export default {
:size="14"
/>
- <ci-icon :status="job.status" class="gl-mr-3" :size="14" />
+ <ci-icon :status="job.status" class="gl-mr-2" :size="14" />
<span class="gl-text-truncate gl-w-full">{{ jobName }}</span>
- <gl-icon v-if="job.retried" name="retry" class="gl-mr-4" />
+ <gl-icon v-if="job.retried" name="retry" />
</gl-link>
</div>
</template>
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/job_sidebar_retry_button.vue b/app/assets/javascripts/jobs/components/job/sidebar/job_sidebar_retry_button.vue
index 87c47f592aa..f8486bf16f3 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/job_sidebar_retry_button.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/job_sidebar_retry_button.vue
@@ -65,6 +65,7 @@ export default {
icon="retry"
category="primary"
placement="right"
+ positioning-strategy="fixed"
variant="confirm"
:items="dropdownItems"
/>
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/jobs_container.vue b/app/assets/javascripts/jobs/components/job/sidebar/jobs_container.vue
index 18bd2593c2a..df64b6422c7 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/jobs_container.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/jobs_container.vue
@@ -24,8 +24,7 @@ export default {
};
</script>
<template>
- <div class="block builds-container">
- <b class="gl-display-flex gl-mb-2 gl-font-weight-semibold">{{ __('Related jobs') }}</b>
+ <div class="builds-container">
<job-container-item
v-for="job in jobs"
:key="job.id"
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/sidebar.vue b/app/assets/javascripts/jobs/components/job/sidebar/sidebar.vue
index 1c99aa5e19d..530109f9dfd 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/sidebar.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/sidebar.vue
@@ -17,6 +17,7 @@ export default {
i18n: {
...JOB_SIDEBAR_COPY,
},
+ borderTopClass: ['gl-border-t-solid', 'gl-border-t-1', 'gl-border-t-gray-100'],
forwardDeploymentFailureModalId,
components: {
ArtifactsBlock,
@@ -73,38 +74,49 @@ export default {
<template>
<aside class="right-sidebar build-sidebar" data-offset-top="101" data-spy="affix">
<div class="sidebar-container">
- <div class="blocks-container gl-p-4">
+ <div class="blocks-container">
<sidebar-header
- class="block gl-pb-4! gl-mb-2"
:rest-job="job"
:job-id="job.id"
@updateVariables="$emit('updateVariables')"
/>
- <job-sidebar-details-container class="block gl-mb-2" />
+ <job-sidebar-details-container class="gl-py-4" :class="$options.borderTopClass" />
<artifacts-block
v-if="hasArtifact"
- class="block gl-mb-2"
+ class="gl-py-4"
+ :class="$options.borderTopClass"
:artifact="job.artifact"
:help-url="artifactHelpUrl"
/>
- <trigger-block v-if="hasTriggers" class="block gl-mb-2" :trigger="job.trigger" />
+ <trigger-block
+ v-if="hasTriggers"
+ class="gl-py-4"
+ :class="$options.borderTopClass"
+ :trigger="job.trigger"
+ />
- <commit-block class="block gl-mb-2" :commit="commit" :merge-request="job.merge_request" />
+ <commit-block
+ :commit="commit"
+ class="gl-py-4"
+ :class="$options.borderTopClass"
+ :merge-request="job.merge_request"
+ />
<stages-dropdown
v-if="job.pipeline"
- class="block gl-mb-2"
+ class="gl-py-4"
+ :class="$options.borderTopClass"
:pipeline="job.pipeline"
:selected-stage="selectedStage"
:stages="stages"
@requestSidebarStageDropdown="fetchJobsForStage"
/>
-
- <jobs-container v-if="jobs.length" :job-id="job.id" :jobs="jobs" />
</div>
+
+ <jobs-container v-if="jobs.length" :job-id="job.id" :jobs="jobs" />
</div>
<job-retry-forward-deployment-modal
v-if="shouldShowJobRetryForwardDeploymentModal"
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/sidebar_detail_row.vue b/app/assets/javascripts/jobs/components/job/sidebar/sidebar_detail_row.vue
index 5b1bf354fd4..0ba34eafa58 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/sidebar_detail_row.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/sidebar_detail_row.vue
@@ -39,26 +39,21 @@ export default {
};
</script>
<template>
- <p class="build-sidebar-item gl-mb-2">
- <b v-if="hasTitle" class="gl-display-flex">{{ title }}:</b>
- <gl-link
- v-if="path"
- :href="path"
- class="gl-text-blue-600!"
- data-testid="job-sidebar-value-link"
- >
- {{ value }}
- </gl-link>
- <span v-else
- >{{ value }}
+ <p class="gl-display-flex gl-justify-content-space-between gl-mb-2">
+ <span v-if="hasTitle">
+ <b>{{ title }}:</b>
<gl-link
- v-if="hasHelpURL"
- :href="helpUrl"
- target="_blank"
- data-testid="job-sidebar-help-link"
+ v-if="path"
+ :href="path"
+ class="gl-text-blue-600!"
+ data-testid="job-sidebar-value-link"
>
- <gl-icon name="question-o" class="gl-ml-2 gl-text-blue-500" />
+ {{ value }}
</gl-link>
+ <span v-else>{{ value }}</span>
</span>
+ <gl-link v-if="hasHelpURL" :href="helpUrl" target="_blank" data-testid="job-sidebar-help-link">
+ <gl-icon name="question-o" />
+ </gl-link>
</p>
</template>
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/sidebar_header.vue b/app/assets/javascripts/jobs/components/job/sidebar/sidebar_header.vue
index 3a6551a0128..4ffb8ded8ba 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/sidebar_header.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/sidebar_header.vue
@@ -90,7 +90,7 @@ export default {
</script>
<template>
- <div>
+ <div class="gl-py-4">
<tooltip-on-truncate :title="job.name" truncate-target="child"
><h4 class="gl-mt-0 gl-mb-3 gl-text-truncate" data-testid="job-name">{{ job.name }}</h4>
</tooltip-on-truncate>
@@ -138,7 +138,6 @@ export default {
:href="restJob.retry_path"
:modal-id="$options.forwardDeploymentFailureModalId"
variant="confirm"
- data-qa-selector="retry_button"
data-testid="retry-button"
@updateVariablesClicked="$emit('updateVariables')"
/>
@@ -156,7 +155,7 @@ export default {
/>
<gl-button
:aria-label="$options.i18n.toggleSidebar"
- category="secondary"
+ category="tertiary"
class="gl-md-display-none gl-ml-2"
icon="chevron-double-lg-right"
@click="toggleSidebar"
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/sidebar_job_details_container.vue b/app/assets/javascripts/jobs/components/job/sidebar/sidebar_job_details_container.vue
index ebef3ecaa3f..09335476008 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/sidebar_job_details_container.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/sidebar_job_details_container.vue
@@ -44,14 +44,10 @@ export default {
this.job.finished_at ||
this.job.erased_at ||
this.job.queued_duration ||
- this.job.id ||
this.job.runner ||
this.job.coverage,
);
},
- jobId() {
- return this.job?.id ? `#${this.job.id}` : '';
- },
runnerId() {
const { id, short_sha: token, description } = this.job.runner;
@@ -85,9 +81,8 @@ export default {
ERASED: __('Erased'),
QUEUED: __('Queued'),
RUNNER: __('Runner'),
- TAGS: __('Tags'),
+ TAGS: __('Tags:'),
TIMEOUT: __('Timeout'),
- ID: __('Job ID'),
},
TIMEOUT_HELP_URL: helpPagePath('/ci/pipelines/settings.md', {
anchor: 'set-a-limit-for-how-long-jobs-can-run',
@@ -113,7 +108,6 @@ export default {
data-testid="job-timeout"
:title="$options.i18n.TIMEOUT"
/>
- <detail-row v-if="job.id" :value="jobId" :title="$options.i18n.ID" />
<detail-row
v-if="job.runner"
:value="runnerId"
@@ -123,8 +117,8 @@ export default {
<detail-row v-if="job.coverage" :value="coverage" :title="$options.i18n.COVERAGE" />
<p v-if="hasTags" class="build-detail-row" data-testid="job-tags">
- <span class="font-weight-bold">{{ $options.i18n.TAGS }}:</span>
- <gl-badge v-for="(tag, i) in job.tags" :key="i" variant="info" size="sm">{{ tag }}</gl-badge>
+ <span class="font-weight-bold">{{ $options.i18n.TAGS }}</span>
+ <gl-badge v-for="(tag, i) in job.tags" :key="i" variant="info">{{ tag }}</gl-badge>
</p>
</div>
</template>
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/stages_dropdown.vue b/app/assets/javascripts/jobs/components/job/sidebar/stages_dropdown.vue
index 2a91dea861c..3fee1427256 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/stages_dropdown.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/stages_dropdown.vue
@@ -1,20 +1,20 @@
<script>
import { GlLink, GlDisclosureDropdown, GlSprintf } from '@gitlab/ui';
import { isEmpty } from 'lodash';
-import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
import { Mousetrap } from '~/lib/mousetrap';
import { s__ } from '~/locale';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import { clickCopyToClipboardButton } from '~/behaviors/copy_to_clipboard';
import { keysFor, MR_COPY_SOURCE_BRANCH_NAME } from '~/behaviors/shortcuts/keybindings';
export default {
components: {
+ CiIcon,
ClipboardButton,
GlDisclosureDropdown,
GlLink,
GlSprintf,
- CiBadgeLink,
},
props: {
pipeline: {
@@ -51,13 +51,13 @@ export default {
},
pipelineInfo() {
if (!this.hasRef) {
- return s__('Job|%{boldStart}Pipeline%{boldEnd} %{id} %{status}');
+ return s__('Job|%{boldStart}Pipeline%{boldEnd} %{id}');
}
if (!this.isTriggeredByMergeRequest) {
- return s__('Job|%{boldStart}Pipeline%{boldEnd} %{id} %{status} for %{ref}');
+ return s__('Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}');
}
if (!this.isMergeRequestPipeline) {
- return s__('Job|%{boldStart}Pipeline%{boldEnd} %{id} %{status} for %{mrId} with %{source}');
+ return s__('Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source}');
}
return s__(
@@ -94,26 +94,24 @@ export default {
</script>
<template>
<div class="dropdown">
- <div class="gl-display-flex gl-flex-wrap gl-gap-2 js-pipeline-info" data-testid="pipeline-info">
+ <div class="js-pipeline-info" data-testid="pipeline-info">
+ <ci-icon :status="pipeline.details.status" />
<gl-sprintf :message="pipelineInfo">
<template #bold="{ content }">
- <span class="gl-display-flex gl-font-weight-bold">{{ content }}</span>
+ <span class="font-weight-bold">{{ content }}</span>
</template>
<template #id>
<gl-link
:href="pipeline.path"
- class="js-pipeline-path link-commit gl-text-blue-500!"
+ class="js-pipeline-path link-commit"
data-testid="pipeline-path"
>#{{ pipeline.id }}</gl-link
>
</template>
- <template #status>
- <ci-badge-link :status="pipeline.details.status" badge-size="sm" />
- </template>
<template #mrId>
<gl-link
:href="pipeline.merge_request.path"
- class="link-commit ref-name gl-text-blue-500!"
+ class="link-commit ref-name"
data-testid="mr-link"
>!{{ pipeline.merge_request.iid }}</gl-link
>
@@ -121,7 +119,7 @@ export default {
<template #ref>
<gl-link
:href="pipeline.ref.path"
- class="link-commit ref-name gl-mt-1"
+ class="link-commit ref-name"
data-testid="source-ref-link"
>{{ pipeline.ref.name }}</gl-link
><clipboard-button
@@ -136,7 +134,7 @@ export default {
<template #source>
<gl-link
:href="pipeline.merge_request.source_branch_path"
- class="link-commit ref-name gl-mt-1"
+ class="link-commit ref-name"
data-testid="source-branch-link"
>{{ pipeline.merge_request.source_branch }}</gl-link
><clipboard-button
@@ -151,7 +149,7 @@ export default {
<template #target>
<gl-link
:href="pipeline.merge_request.target_branch_path"
- class="link-commit ref-name gl-mt-1"
+ class="link-commit ref-name"
data-testid="target-branch-link"
>{{ pipeline.merge_request.target_branch }}</gl-link
><clipboard-button
@@ -169,7 +167,7 @@ export default {
:toggle-text="selectedStage"
:items="dropdownItems"
block
- class="gl-mt-2"
+ class="gl-mt-3"
/>
</div>
</template>
diff --git a/app/assets/javascripts/jobs/components/job/sidebar/trigger_block.vue b/app/assets/javascripts/jobs/components/job/sidebar/trigger_block.vue
index 315587a3376..c9172fe0322 100644
--- a/app/assets/javascripts/jobs/components/job/sidebar/trigger_block.vue
+++ b/app/assets/javascripts/jobs/components/job/sidebar/trigger_block.vue
@@ -68,7 +68,7 @@ export default {
<template v-if="hasVariables">
<p class="gl-display-flex gl-justify-content-space-between gl-align-items-center">
- <span class="gl-display-flex gl-font-weight-bold">{{ __('Trigger variables') }}</span>
+ <span class="gl-font-weight-bold">{{ __('Trigger variables:') }}</span>
<gl-button
v-if="hasValues"
diff --git a/app/assets/javascripts/vue_shared/components/ci_badge_link.vue b/app/assets/javascripts/vue_shared/components/ci_badge_link.vue
index d25f40b1af9..9a3f1672d01 100644
--- a/app/assets/javascripts/vue_shared/components/ci_badge_link.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_badge_link.vue
@@ -120,12 +120,13 @@ export default {
<template>
<gl-badge
v-gl-tooltip
- :class="{ 'gl-pl-2': isSmallBadgeSize }"
+ :class="{ 'gl-pl-0!': isSmallBadgeSize }"
:title="title"
:href="detailsPath"
:size="badgeSize"
:variant="badgeStyles.variant"
data-testid="ci-badge-link"
+ data-qa-selector="status_badge_link"
@click="$emit('ciStatusBadgeClick')"
>
<ci-icon :status="status" />
diff --git a/app/assets/stylesheets/page_bundles/build.scss b/app/assets/stylesheets/page_bundles/build.scss
index 6c80209bc5c..4f968197d4e 100644
--- a/app/assets/stylesheets/page_bundles/build.scss
+++ b/app/assets/stylesheets/page_bundles/build.scss
@@ -89,6 +89,8 @@
}
.right-sidebar.build-sidebar {
+ padding: 0;
+
&.right-sidebar-collapsed {
display: none;
}
@@ -101,6 +103,29 @@
-webkit-overflow-scrolling: touch;
}
+ .blocks-container {
+ padding: 0 $gl-padding;
+ width: 289px;
+ }
+
+ .trigger-variables-btn-container {
+ justify-content: space-between;
+ align-items: center;
+
+ .trigger-variables-btn {
+ margin-top: -5px;
+ margin-bottom: -5px;
+ }
+ }
+
+ .trigger-build-variables {
+ margin: 0;
+ overflow-x: auto;
+ width: 100%;
+ -ms-overflow-style: scrollbar;
+ -webkit-overflow-scrolling: touch;
+ }
+
.trigger-build-variable {
font-weight: $gl-font-weight-normal;
color: var(--gray-950, $gray-950);
@@ -120,20 +145,38 @@
vertical-align: top;
}
- .blocks-container {
- width: 289px;
+ .badge.badge-pill {
+ margin-left: 2px;
}
- .block {
- width: 262px;
+ .stage-item {
+ cursor: pointer;
+
+ &:hover {
+ color: var(--gl-text-color, $gl-text-color);
+ }
}
.builds-container {
+ background-color: var(--white, $white);
+ border-top: 1px solid var(--border-color, $border-color);
+ border-bottom: 1px solid var(--border-color, $border-color);
+ max-height: 300px;
+ width: 289px;
overflow: auto;
+ a {
+ padding: $gl-padding 10px $gl-padding 40px;
+ width: 270px;
+
+ &:hover {
+ color: var(--gl-text-color, $gl-text-color);
+ }
+ }
+
.icon-arrow-right {
- left: 8px;
- top: 12px;
+ left: 15px;
+ top: 20px;
}
.build-job {
@@ -152,15 +195,9 @@
.container-fluid.container-limited {
max-width: 100%;
}
-}
-
-.build-sidebar-item {
- display: grid;
- grid-template-columns: 1fr 2fr;
- grid-gap: $gl-padding-8;
- &:last-of-type {
- @include gl-mb-0;
+ .content-wrapper {
+ padding-bottom: 6px;
}
}
diff --git a/app/controllers/projects/commits_controller.rb b/app/controllers/projects/commits_controller.rb
index 94cd324f312..2d2712ebe4d 100644
--- a/app/controllers/projects/commits_controller.rb
+++ b/app/controllers/projects/commits_controller.rb
@@ -45,6 +45,8 @@ class Projects::CommitsController < Projects::ApplicationController
# rubocop: enable CodeReuse/ActiveRecord
def signatures
+ Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/424527')
+
respond_to do |format|
format.json do
render json: {
diff --git a/app/controllers/projects/jobs_controller.rb b/app/controllers/projects/jobs_controller.rb
index cdce9f883f2..5a2bda27582 100644
--- a/app/controllers/projects/jobs_controller.rb
+++ b/app/controllers/projects/jobs_controller.rb
@@ -78,6 +78,8 @@ class Projects::JobsController < Projects::ApplicationController
end
def retry
+ Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/424184')
+
response = Ci::RetryJobService.new(project, current_user).execute(@build)
if response.success?
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index 8d93429fd24..36b45d15921 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -532,7 +532,9 @@ module Ci
'virtualbox' => :virtualbox,
'docker+machine' => :docker_machine,
'docker-ssh+machine' => :docker_ssh_machine,
- 'kubernetes' => :kubernetes
+ 'kubernetes' => :kubernetes,
+ 'docker-autoscaler' => :docker_autoscaler,
+ 'instance' => :instance
}.freeze
EXECUTOR_TYPE_TO_NAMES = EXECUTOR_NAME_TO_TYPES.invert.freeze
diff --git a/app/models/concerns/ci/has_runner_executor.rb b/app/models/concerns/ci/has_runner_executor.rb
index dc70cdb2018..6d4622945fe 100644
--- a/app/models/concerns/ci/has_runner_executor.rb
+++ b/app/models/concerns/ci/has_runner_executor.rb
@@ -17,7 +17,9 @@ module Ci
virtualbox: 8,
docker_machine: 9,
docker_ssh_machine: 10,
- kubernetes: 11
+ kubernetes: 11,
+ docker_autoscaler: 12,
+ instance: 13
}, _suffix: true
end
end
diff --git a/app/models/concerns/routable.rb b/app/models/concerns/routable.rb
index f2badfe48dd..2d39c8a82c8 100644
--- a/app/models/concerns/routable.rb
+++ b/app/models/concerns/routable.rb
@@ -14,6 +14,9 @@ module Routable
# Routable.find_by_full_path('groupname/projectname') # -> Project
#
# Returns a single object, or nil.
+
+ # rubocop:disable Metrics/CyclomaticComplexity
+ # rubocop:disable Metrics/PerceivedComplexity
def self.find_by_full_path(path, follow_redirects: false, route_scope: Route, redirect_route_scope: RedirectRoute)
return unless path.present?
@@ -25,20 +28,46 @@ module Routable
#
# We need to qualify the columns with the table name, to support both direct lookups on
# Route/RedirectRoute, and scoped lookups through the Routable classes.
- Gitlab::Database.allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/420046") do
+ if Feature.enabled?(:optimize_routable)
+ path_condition = { path: path }
+
+ source_type_condition = if route_scope == Route
+ {}
+ else
+ { source_type: route_scope.klass.base_class }
+ end
+
route =
- route_scope.find_by(routes: { path: path }) ||
- route_scope.iwhere(Route.arel_table[:path] => path).take
+ Route.where(source_type_condition).find_by(path_condition) ||
+ Route.where(source_type_condition).iwhere(path_condition).take
if follow_redirects
- route ||= redirect_route_scope.iwhere(RedirectRoute.arel_table[:path] => path).take
+ route ||= RedirectRoute.where(source_type_condition).iwhere(path_condition).take
end
- next unless route
+ return unless route
+ return route.source if route_scope == Route
+
+ route_scope.find_by(id: route.source_id)
+ else
+ Gitlab::Database.allow_cross_joins_across_databases(url:
+ "https://gitlab.com/gitlab-org/gitlab/-/issues/420046") do
+ route =
+ route_scope.find_by(routes: { path: path }) ||
+ route_scope.iwhere(Route.arel_table[:path] => path).take
+
+ if follow_redirects
+ route ||= redirect_route_scope.iwhere(RedirectRoute.arel_table[:path] => path).take
+ end
+
+ next unless route
- route.is_a?(Routable) ? route : route.source
+ route.is_a?(Routable) ? route : route.source
+ end
end
end
+ # rubocop:enable Metrics/PerceivedComplexity
+ # rubocop:enable Metrics/CyclomaticComplexity
included do
# Remove `inverse_of: source` when upgraded to rails 5.2
@@ -67,13 +96,19 @@ module Routable
#
# Returns a single object, or nil.
def find_by_full_path(path, follow_redirects: false)
- # TODO: Optimize these queries by avoiding joins
- # https://gitlab.com/gitlab-org/gitlab/-/issues/292252
+ if Feature.enabled?(:optimize_routable)
+ route_scope = all
+ redirect_route_scope = RedirectRoute
+ else
+ route_scope = includes(:route).references(:routes)
+ redirect_route_scope = joins(:redirect_routes)
+ end
+
Routable.find_by_full_path(
path,
follow_redirects: follow_redirects,
- route_scope: includes(:route).references(:routes),
- redirect_route_scope: joins(:redirect_routes)
+ route_scope: route_scope,
+ redirect_route_scope: redirect_route_scope
)
end
diff --git a/app/models/packages/nuget/symbol.rb b/app/models/packages/nuget/symbol.rb
new file mode 100644
index 00000000000..643b5552d84
--- /dev/null
+++ b/app/models/packages/nuget/symbol.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Packages
+ module Nuget
+ class Symbol < ApplicationRecord
+ include FileStoreMounter
+
+ belongs_to :package, -> { where(package_type: :nuget) }, inverse_of: :nuget_symbols
+
+ delegate :project_id, to: :package
+
+ validates :package, :file, :file_path, :signature, :object_storage_key, :size, presence: true
+ validates :signature, uniqueness: { scope: :file_path }
+ validates :object_storage_key, uniqueness: true
+
+ mount_file_store_uploader SymbolUploader
+
+ before_validation :set_object_storage_key, on: :create
+
+ private
+
+ def set_object_storage_key
+ return unless project_id && signature
+
+ self.object_storage_key = Gitlab::HashedPath.new(
+ 'packages', 'nuget', package_id, 'symbols', OpenSSL::Digest::SHA256.hexdigest(signature),
+ root_hash: project_id
+ ).to_s
+ end
+ end
+ end
+end
diff --git a/app/models/packages/package.rb b/app/models/packages/package.rb
index 7665f30be62..02e3908b3bf 100644
--- a/app/models/packages/package.rb
+++ b/app/models/packages/package.rb
@@ -49,6 +49,7 @@ class Packages::Package < ApplicationRecord
has_one :pypi_metadatum, inverse_of: :package, class_name: 'Packages::Pypi::Metadatum'
has_one :maven_metadatum, inverse_of: :package, class_name: 'Packages::Maven::Metadatum'
has_one :nuget_metadatum, inverse_of: :package, class_name: 'Packages::Nuget::Metadatum'
+ has_many :nuget_symbols, inverse_of: :package, class_name: 'Packages::Nuget::Symbol'
has_one :composer_metadatum, inverse_of: :package, class_name: 'Packages::Composer::Metadatum'
has_one :rubygems_metadatum, inverse_of: :package, class_name: 'Packages::Rubygems::Metadatum'
has_one :rpm_metadatum, inverse_of: :package, class_name: 'Packages::Rpm::Metadatum'
diff --git a/app/uploaders/packages/nuget/symbol_uploader.rb b/app/uploaders/packages/nuget/symbol_uploader.rb
new file mode 100644
index 00000000000..1d6ec9a8de8
--- /dev/null
+++ b/app/uploaders/packages/nuget/symbol_uploader.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Packages
+ module Nuget
+ class SymbolUploader < GitlabUploader
+ include ObjectStorage::Concern
+
+ storage_location :packages
+
+ alias_method :upload, :model
+
+ def store_dir
+ dynamic_segment
+ end
+
+ private
+
+ def dynamic_segment
+ raise ObjectNotReadyError, 'Packages::Nuget::Symbol model not ready' unless model.object_storage_key
+
+ model.object_storage_key
+ end
+ end
+ end
+end
diff --git a/config/feature_flags/development/optimize_routable.yml b/config/feature_flags/development/optimize_routable.yml
new file mode 100644
index 00000000000..1191d389fa2
--- /dev/null
+++ b/config/feature_flags/development/optimize_routable.yml
@@ -0,0 +1,8 @@
+---
+name: optimize_routable
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/130842
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/424138
+milestone: '16.4'
+type: development
+group: group::tenant scale
+default_enabled: false
diff --git a/db/docs/packages_nuget_symbols.yml b/db/docs/packages_nuget_symbols.yml
new file mode 100644
index 00000000000..d78b52ce826
--- /dev/null
+++ b/db/docs/packages_nuget_symbols.yml
@@ -0,0 +1,10 @@
+---
+table_name: packages_nuget_symbols
+classes:
+- Packages::Nuget::Symbol
+feature_categories:
+- package_registry
+description: Nuget package symbols
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/129916
+milestone: '16.4'
+gitlab_schema: gitlab_main
diff --git a/db/migrate/20230821133549_create_packages_nuget_symbols.rb b/db/migrate/20230821133549_create_packages_nuget_symbols.rb
new file mode 100644
index 00000000000..1ff43cdd93f
--- /dev/null
+++ b/db/migrate/20230821133549_create_packages_nuget_symbols.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class CreatePackagesNugetSymbols < Gitlab::Database::Migration[2.1]
+ enable_lock_retries!
+
+ def change
+ create_table :packages_nuget_symbols do |t|
+ t.timestamps_with_timezone null: false
+
+ t.references :package,
+ foreign_key: { to_table: :packages_packages, on_delete: :nullify },
+ index: true,
+ type: :bigint
+ t.integer :size, null: false
+ t.integer :file_store, default: 1, limit: 2
+ t.text :file, null: false, limit: 255
+ t.text :file_path, null: false, limit: 255
+ t.text :signature, null: false, limit: 255
+ t.text :object_storage_key, null: false, limit: 255, index: { unique: true }
+
+ t.index [:signature, :file_path], unique: true
+ end
+ end
+end
diff --git a/db/migrate/20230906185552_add_markdown_fields_to_review_llm_summary.rb b/db/migrate/20230906185552_add_markdown_fields_to_review_llm_summary.rb
new file mode 100644
index 00000000000..6e0c0fa5675
--- /dev/null
+++ b/db/migrate/20230906185552_add_markdown_fields_to_review_llm_summary.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddMarkdownFieldsToReviewLlmSummary < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ def up
+ # rubocop:disable Migration/AddLimitToTextColumns
+ add_column :merge_request_review_llm_summaries,
+ :cached_markdown_version,
+ :integer,
+ null: true
+ add_column :merge_request_review_llm_summaries,
+ :content_html,
+ :text,
+ null: true
+ # rubocop:enable Migration/AddLimitToTextColumns
+ end
+
+ def down
+ remove_column :merge_request_review_llm_summaries, :cached_markdown_version
+ remove_column :merge_request_review_llm_summaries, :content_html
+ end
+end
diff --git a/db/schema_migrations/20230821133549 b/db/schema_migrations/20230821133549
new file mode 100644
index 00000000000..5025710f689
--- /dev/null
+++ b/db/schema_migrations/20230821133549
@@ -0,0 +1 @@
+57f97aa12f9a41286512b32b1d038d246139cd7ae3852f1642960187643bffb3 \ No newline at end of file
diff --git a/db/schema_migrations/20230906185552 b/db/schema_migrations/20230906185552
new file mode 100644
index 00000000000..a2c58d5f740
--- /dev/null
+++ b/db/schema_migrations/20230906185552
@@ -0,0 +1 @@
+114a9f959d66c7a5b0e31b3ab07bd08eb0ebcca7952359368facf35a5890eb3f \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index e036032874f..b04e4548746 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -18548,6 +18548,8 @@ CREATE TABLE merge_request_review_llm_summaries (
updated_at timestamp with time zone NOT NULL,
provider smallint NOT NULL,
content text NOT NULL,
+ cached_markdown_version integer,
+ content_html text,
CONSTRAINT check_72802358e9 CHECK ((char_length(content) <= 2056))
);
@@ -20161,6 +20163,32 @@ CREATE TABLE packages_nuget_metadata (
CONSTRAINT packages_nuget_metadata_project_url_constraint CHECK ((char_length(project_url) <= 255))
);
+CREATE TABLE packages_nuget_symbols (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ package_id bigint,
+ size integer NOT NULL,
+ file_store smallint DEFAULT 1,
+ file text NOT NULL,
+ file_path text NOT NULL,
+ signature text NOT NULL,
+ object_storage_key text NOT NULL,
+ CONSTRAINT check_0e93ca58b7 CHECK ((char_length(file) <= 255)),
+ CONSTRAINT check_28b82b08fa CHECK ((char_length(object_storage_key) <= 255)),
+ CONSTRAINT check_30b0ef2ca2 CHECK ((char_length(file_path) <= 255)),
+ CONSTRAINT check_8dc7152679 CHECK ((char_length(signature) <= 255))
+);
+
+CREATE SEQUENCE packages_nuget_symbols_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_nuget_symbols_id_seq OWNED BY packages_nuget_symbols.id;
+
CREATE TABLE packages_package_file_build_infos (
id bigint NOT NULL,
package_file_id bigint NOT NULL,
@@ -26112,6 +26140,8 @@ ALTER TABLE ONLY packages_maven_metadata ALTER COLUMN id SET DEFAULT nextval('pa
ALTER TABLE ONLY packages_npm_metadata_caches ALTER COLUMN id SET DEFAULT nextval('packages_npm_metadata_caches_id_seq'::regclass);
+ALTER TABLE ONLY packages_nuget_symbols ALTER COLUMN id SET DEFAULT nextval('packages_nuget_symbols_id_seq'::regclass);
+
ALTER TABLE ONLY packages_package_file_build_infos ALTER COLUMN id SET DEFAULT nextval('packages_package_file_build_infos_id_seq'::regclass);
ALTER TABLE ONLY packages_package_files ALTER COLUMN id SET DEFAULT nextval('packages_package_files_id_seq'::regclass);
@@ -28449,6 +28479,9 @@ ALTER TABLE ONLY packages_nuget_dependency_link_metadata
ALTER TABLE ONLY packages_nuget_metadata
ADD CONSTRAINT packages_nuget_metadata_pkey PRIMARY KEY (package_id);
+ALTER TABLE ONLY packages_nuget_symbols
+ ADD CONSTRAINT packages_nuget_symbols_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY packages_package_file_build_infos
ADD CONSTRAINT packages_package_file_build_infos_pkey PRIMARY KEY (id);
@@ -32867,6 +32900,12 @@ CREATE INDEX index_packages_npm_metadata_caches_on_project_id ON packages_npm_me
CREATE INDEX index_packages_nuget_dl_metadata_on_dependency_link_id ON packages_nuget_dependency_link_metadata USING btree (dependency_link_id);
+CREATE UNIQUE INDEX index_packages_nuget_symbols_on_object_storage_key ON packages_nuget_symbols USING btree (object_storage_key);
+
+CREATE INDEX index_packages_nuget_symbols_on_package_id ON packages_nuget_symbols USING btree (package_id);
+
+CREATE UNIQUE INDEX index_packages_nuget_symbols_on_signature_and_file_path ON packages_nuget_symbols USING btree (signature, file_path);
+
CREATE INDEX index_packages_on_available_pypi_packages ON packages_packages USING btree (project_id, id) WHERE ((status = ANY (ARRAY[0, 1])) AND (package_type = 5) AND (version IS NOT NULL));
CREATE INDEX index_packages_package_file_build_infos_on_package_file_id ON packages_package_file_build_infos USING btree (package_file_id);
@@ -37841,6 +37880,9 @@ ALTER TABLE ONLY ci_running_builds
ALTER TABLE ONLY epic_issues
ADD CONSTRAINT fk_rails_5d942936b4 FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE CASCADE;
+ALTER TABLE ONLY packages_nuget_symbols
+ ADD CONSTRAINT fk_rails_5df972da14 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY resource_weight_events
ADD CONSTRAINT fk_rails_5eb5cb92a1 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
diff --git a/doc/administration/postgresql/database_load_balancing.md b/doc/administration/postgresql/database_load_balancing.md
index f8b6be1fb21..d640dbe9341 100644
--- a/doc/administration/postgresql/database_load_balancing.md
+++ b/doc/administration/postgresql/database_load_balancing.md
@@ -182,9 +182,9 @@ To configure these options with a hosts list, use the following example:
```ruby
gitlab_rails['db_load_balancing'] = {
- 'hosts' => ['primary.example.com', 'secondary1.example.com', 'secondary2.example.com']
- 'max_replication_difference' => 16777216 # 16 MB
- 'max_replication_lag_time' => 30
+ 'hosts' => ['primary.example.com', 'secondary1.example.com', 'secondary2.example.com'],
+ 'max_replication_difference' => 16777216, # 16 MB
+ 'max_replication_lag_time' => 30,
'replica_check_interval' => 30
}
```
diff --git a/doc/administration/settings/usage_statistics.md b/doc/administration/settings/usage_statistics.md
index 4415d5b39a6..b8b87f42475 100644
--- a/doc/administration/settings/usage_statistics.md
+++ b/doc/administration/settings/usage_statistics.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/api/error_tracking.md b/doc/api/error_tracking.md
index 0858e105a1f..fb22e96c20b 100644
--- a/doc/api/error_tracking.md
+++ b/doc/api/error_tracking.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Observability
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/api/usage_data.md b/doc/api/usage_data.md
index 1a2c3e95002..a8e6c6ac205 100644
--- a/doc/api/usage_data.md
+++ b/doc/api/usage_data.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: reference, api
diff --git a/doc/development/fe_guide/customizable_dashboards.md b/doc/development/fe_guide/customizable_dashboards.md
index 91983b12818..211a5ffd5ce 100644
--- a/doc/development/fe_guide/customizable_dashboards.md
+++ b/doc/development/fe_guide/customizable_dashboards.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Product Analytics
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/index.md b/doc/development/internal_analytics/index.md
index c7cf907ca92..d24ecf5a99c 100644
--- a/doc/development/internal_analytics/index.md
+++ b/doc/development/internal_analytics/index.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/internal_event_tracking/architecture.md b/doc/development/internal_analytics/internal_event_tracking/architecture.md
index de5672a4895..0265e39745a 100644
--- a/doc/development/internal_analytics/internal_event_tracking/architecture.md
+++ b/doc/development/internal_analytics/internal_event_tracking/architecture.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/internal_event_tracking/event_definition_guide.md b/doc/development/internal_analytics/internal_event_tracking/event_definition_guide.md
index 7e4222ead2e..591c6672810 100644
--- a/doc/development/internal_analytics/internal_event_tracking/event_definition_guide.md
+++ b/doc/development/internal_analytics/internal_event_tracking/event_definition_guide.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/internal_event_tracking/index.md b/doc/development/internal_analytics/internal_event_tracking/index.md
index 73e9e2d1a4c..e35d5f6f084 100644
--- a/doc/development/internal_analytics/internal_event_tracking/index.md
+++ b/doc/development/internal_analytics/internal_event_tracking/index.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/internal_event_tracking/introduction.md b/doc/development/internal_analytics/internal_event_tracking/introduction.md
index ebb3caa198a..e776691fdf0 100644
--- a/doc/development/internal_analytics/internal_event_tracking/introduction.md
+++ b/doc/development/internal_analytics/internal_event_tracking/introduction.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/internal_event_tracking/migration.md b/doc/development/internal_analytics/internal_event_tracking/migration.md
index 7566c44a1c8..4b8a726768f 100644
--- a/doc/development/internal_analytics/internal_event_tracking/migration.md
+++ b/doc/development/internal_analytics/internal_event_tracking/migration.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/internal_event_tracking/quick_start.md b/doc/development/internal_analytics/internal_event_tracking/quick_start.md
index bdd6c1f8f6e..19c76ecc045 100644
--- a/doc/development/internal_analytics/internal_event_tracking/quick_start.md
+++ b/doc/development/internal_analytics/internal_event_tracking/quick_start.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/service_ping/implement.md b/doc/development/internal_analytics/service_ping/implement.md
index 9dbfa02854d..c6da26f86c2 100644
--- a/doc/development/internal_analytics/service_ping/implement.md
+++ b/doc/development/internal_analytics/service_ping/implement.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/service_ping/index.md b/doc/development/internal_analytics/service_ping/index.md
index 22e66a247c9..f532bb1ac31 100644
--- a/doc/development/internal_analytics/service_ping/index.md
+++ b/doc/development/internal_analytics/service_ping/index.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/service_ping/metrics_dictionary.md b/doc/development/internal_analytics/service_ping/metrics_dictionary.md
index 8103db5113f..468522dc0d2 100644
--- a/doc/development/internal_analytics/service_ping/metrics_dictionary.md
+++ b/doc/development/internal_analytics/service_ping/metrics_dictionary.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/service_ping/metrics_instrumentation.md b/doc/development/internal_analytics/service_ping/metrics_instrumentation.md
index dc225a40d1b..ada7cc566a1 100644
--- a/doc/development/internal_analytics/service_ping/metrics_instrumentation.md
+++ b/doc/development/internal_analytics/service_ping/metrics_instrumentation.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/service_ping/metrics_lifecycle.md b/doc/development/internal_analytics/service_ping/metrics_lifecycle.md
index bb3d6797011..4980a8cf63d 100644
--- a/doc/development/internal_analytics/service_ping/metrics_lifecycle.md
+++ b/doc/development/internal_analytics/service_ping/metrics_lifecycle.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/service_ping/performance_indicator_metrics.md b/doc/development/internal_analytics/service_ping/performance_indicator_metrics.md
index d7811c52bb1..63177f093e2 100644
--- a/doc/development/internal_analytics/service_ping/performance_indicator_metrics.md
+++ b/doc/development/internal_analytics/service_ping/performance_indicator_metrics.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/service_ping/review_guidelines.md b/doc/development/internal_analytics/service_ping/review_guidelines.md
index 8a46de7086e..c816c905097 100644
--- a/doc/development/internal_analytics/service_ping/review_guidelines.md
+++ b/doc/development/internal_analytics/service_ping/review_guidelines.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/service_ping/troubleshooting.md b/doc/development/internal_analytics/service_ping/troubleshooting.md
index b6b0620fc92..e685635c5f7 100644
--- a/doc/development/internal_analytics/service_ping/troubleshooting.md
+++ b/doc/development/internal_analytics/service_ping/troubleshooting.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/service_ping/usage_data.md b/doc/development/internal_analytics/service_ping/usage_data.md
index b6ec3e00670..8742bc03fbb 100644
--- a/doc/development/internal_analytics/service_ping/usage_data.md
+++ b/doc/development/internal_analytics/service_ping/usage_data.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/snowplow/event_dictionary_guide.md b/doc/development/internal_analytics/snowplow/event_dictionary_guide.md
index 6e8947e0210..c0d5e3efdfa 100644
--- a/doc/development/internal_analytics/snowplow/event_dictionary_guide.md
+++ b/doc/development/internal_analytics/snowplow/event_dictionary_guide.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/snowplow/implementation.md b/doc/development/internal_analytics/snowplow/implementation.md
index 5ad97cf528c..5d328f22ca5 100644
--- a/doc/development/internal_analytics/snowplow/implementation.md
+++ b/doc/development/internal_analytics/snowplow/implementation.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/snowplow/index.md b/doc/development/internal_analytics/snowplow/index.md
index 6b53cca0f70..17d3f3f2cfc 100644
--- a/doc/development/internal_analytics/snowplow/index.md
+++ b/doc/development/internal_analytics/snowplow/index.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/snowplow/infrastructure.md b/doc/development/internal_analytics/snowplow/infrastructure.md
index 462dee2c39b..b856ccec78e 100644
--- a/doc/development/internal_analytics/snowplow/infrastructure.md
+++ b/doc/development/internal_analytics/snowplow/infrastructure.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/snowplow/review_guidelines.md b/doc/development/internal_analytics/snowplow/review_guidelines.md
index 03d1812cbfc..a0bdad8fafb 100644
--- a/doc/development/internal_analytics/snowplow/review_guidelines.md
+++ b/doc/development/internal_analytics/snowplow/review_guidelines.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/snowplow/schemas.md b/doc/development/internal_analytics/snowplow/schemas.md
index 21142f68d39..2cc09500c36 100644
--- a/doc/development/internal_analytics/snowplow/schemas.md
+++ b/doc/development/internal_analytics/snowplow/schemas.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/development/internal_analytics/snowplow/troubleshooting.md b/doc/development/internal_analytics/snowplow/troubleshooting.md
index b531c6dcd56..5eabba04792 100644
--- a/doc/development/internal_analytics/snowplow/troubleshooting.md
+++ b/doc/development/internal_analytics/snowplow/troubleshooting.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Analytics Instrumentation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/operations/error_tracking.md b/doc/operations/error_tracking.md
index 87acf3dfbef..f0000ea19db 100644
--- a/doc/operations/error_tracking.md
+++ b/doc/operations/error_tracking.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Observability
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/operations/tracing.md b/doc/operations/tracing.md
index d68882befb7..aca10690a7f 100644
--- a/doc/operations/tracing.md
+++ b/doc/operations/tracing.md
@@ -1,5 +1,5 @@
---
-stage: Analytics
+stage: Analyze
group: Observability
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/issues/csv_export.md b/doc/user/project/issues/csv_export.md
index 86370cab963..34a9b69038b 100644
--- a/doc/user/project/issues/csv_export.md
+++ b/doc/user/project/issues/csv_export.md
@@ -1,97 +1,102 @@
---
-stage: none
-group: unassigned
+stage: Plan
+group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
# Export issues to CSV **(FREE ALL)**
-> Moved to GitLab Free in 12.10.
-
-You can export issues as CSV files from GitLab, which are sent to your default
-notification email address as an attachment.
-
-**Export Issues to CSV** enables you and your team to export all the data
-collected from issues into a **[comma-separated values](https://en.wikipedia.org/wiki/Comma-separated_values)** (CSV)
-file, which stores tabular data in plain text.
+You can export issues from GitLab to a plain-text CSV
+([comma-separated values](https://en.wikipedia.org/wiki/Comma-separated_values))
+file. The CSV file is attached to an email, and sent to your default
+notification email address.
<!-- vale gitlab.Spelling = NO -->
-CSV files can be used with any plotter or spreadsheet-based program, such as
-Microsoft Excel, Open Office Calc, or Google Sheets.
+CSV files can be used with any plotter or spreadsheet-based program, like
+Microsoft Excel, OpenOffice Calc, or Google Sheets. Use a CSV list of issues to:
<!-- vale gitlab.Spelling = YES -->
-Here are some of the uses of exporting issues as CSV files:
-
-- Make a snapshot of issues for offline analysis or to communicate with other
- teams who may not be in GitLab.
+- Create a snapshot of issues for offline analysis, or to share with other
+ teams who might not be in GitLab.
- Create diagrams, graphs, and charts from the CSV data.
-- Present the data in any other format for auditing or sharing reasons.
-- Import the issues elsewhere to a system outside of GitLab.
-- Long-term issues' data analysis with multiple snapshots created along the
- time.
+- Convert the data to other formats for auditing or sharing.
+- Import the issues to a system outside of GitLab.
+- Analyze long-term trends with multiple snapshots created over time.
- Use the long-term data to gather relevant feedback given in the issues, and
improve your product based on real metrics.
-## Choosing which issues to include
-
-After selecting a project, from the issues page you can narrow down which
-issues to export using the search bar, along with the All/Open/Closed tabs. All
-issues returned are exported, including those not shown on the first page.
+## Select issues to export
-![CSV export button](img/csv_export_button_v12_9.png)
+You can export issues from individual projects, but not groups.
-GitLab asks you to confirm the number of issues and email address for the
-export, after which the email is prepared.
+Prerequisites:
-![CSV export modal dialog](img/csv_export_modal.png)
+- You must have at least the Reporter role.
-## Sorting
+1. On the left sidebar, select **Search or go to** and find your project.
+1. Select **Plan > Issues**.
+1. Above the list of issues, select **Search or filter results...**.
+1. In the dropdown list that appears, select the attributes to filter by.
+ For more information about filter options, see
+ [Filter the list of issues](managing_issues.md#filter-the-list-of-issues).
+1. In the upper right, select **Actions** (**{ellipsis_v}**) **> Export as CSV**.
+1. In the dialog, verify that the email address is correct, then select **Export issues**.
-Exported issues are always sorted by `Title`.
+All matching issues are exported, including those not shown on the first page.
+The exported CSV does not contain attachments from issues.
## Format
-Data is encoded with a comma as the column delimiter, with `"` used to quote
-fields if needed, and newlines to separate rows. The first row contains the
-headers, which are listed in the following table along with a description of
-the values:
-
-| Column | Description |
-|------------------------------------------|-----------------------------------------------------------|
-| Title | Issue `title` |
-| Description | Issue `description` |
-| Issue ID | Issue `iid` |
-| URL | A link to the issue on GitLab |
-| State | `Open` or `Closed` |
-| Author | Full name of the issue author |
-| Author Username | Username of the author, with the `@` symbol omitted |
-| Assignee | Full name of the issue assignee |
-| Assignee Username | Username of the author, with the `@` symbol omitted |
-| Confidential | `Yes` or `No` |
-| Locked | `Yes` or `No` |
-| Due Date | Formatted as `YYYY-MM-DD` |
-| Created At (UTC) | Formatted as `YYYY-MM-DD HH:MM:SS` |
-| Updated At (UTC) | Formatted as `YYYY-MM-DD HH:MM:SS` |
-| Milestone | Title of the issue milestone |
-| Weight | Issue weight |
-| Labels | Title of any labels joined with a `,` |
-| Time Estimate | [Time estimate](../time_tracking.md#estimates) in seconds |
-| Time Spent | [Time spent](../time_tracking.md#time-spent) in seconds |
-| [Epic](../../group/epics/index.md) ID | ID of the parent epic, introduced in 12.7 |
-| [Epic](../../group/epics/index.md) Title | Title of the parent epic, introduced in 12.7 |
-
-In GitLab 14.7 and earlier, the first two columns were `Issue ID` and `URL`,
-which [caused an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/34769)
-when importing back into GitLab.
-
-## Limitations
-
-- Export Issues to CSV is not available at the Group's Issues List.
-- Issues are sent as an email attachment, with a 15 MB export limit to ensure
- successful delivery across a range of email providers. If you reach the limit,
- we suggest narrowing the search before export, perhaps by exporting open and
- closed issues separately.
-- CSV files are plain text files. This means that the exported CSV file doesn't
- contain any issue attachments.
+The CSV file has this format:
+
+- Sort is by title.
+- Columns are delimited with commas.
+- Fields are quoted with double quotes (`"`) if needed.
+- Newline characters separate rows.
+
+## Columns
+
+The following columns are included in the CSV file.
+
+| Column | Description |
+|-------------------|-------------|
+| Title | Issue `title` |
+| Description | Issue `description` |
+| Issue ID | Issue `iid` |
+| URL | A link to the issue on GitLab |
+| State | `Open` or `Closed` |
+| Author | Full name of the issue author |
+| Author Username | Username of the author, with the `@` symbol omitted |
+| Assignee | Full name of the issue assignee |
+| Assignee Username | Username of the author, with the `@` symbol omitted |
+| Confidential | `Yes` or `No` |
+| Locked | `Yes` or `No` |
+| Due Date | Formatted as `YYYY-MM-DD` |
+| Created At (UTC) | Formatted as `YYYY-MM-DD HH:MM:SS` |
+| Updated At (UTC) | Formatted as `YYYY-MM-DD HH:MM:SS` |
+| Milestone | Title of the issue milestone |
+| Weight | Issue weight |
+| Labels | Labels, separated by commas |
+| Time Estimate | [Time estimate](../time_tracking.md#estimates) in seconds |
+| Time Spent | [Time spent](../time_tracking.md#time-spent) in seconds |
+| Epic ID | ID of the parent epic |
+| Epic Title | Title of the parent epic |
+
+## Troubleshooting
+
+When working with exported issues, you might encounter the following issues.
+
+### Column order
+
+In GitLab 14.7 and earlier, the first two columns in exported files were `Issue ID` and `URL`,
+which caused problems importing data back into GitLab. For more information, see
+[issue 34769](https://gitlab.com/gitlab-org/gitlab/-/issues/34769).
+
+### Size of export
+
+Issues are sent as an email attachment, with a 15 MB export limit to ensure
+successful delivery across a range of email providers. If you reach the limit,
+narrow your search before export. For example, consider exporting open and
+closed issues separately.
diff --git a/doc/user/project/issues/img/csv_export_button_v12_9.png b/doc/user/project/issues/img/csv_export_button_v12_9.png
deleted file mode 100644
index 702b6439d7c..00000000000
--- a/doc/user/project/issues/img/csv_export_button_v12_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issues/img/csv_export_modal.png b/doc/user/project/issues/img/csv_export_modal.png
deleted file mode 100644
index f988deec966..00000000000
--- a/doc/user/project/issues/img/csv_export_modal.png
+++ /dev/null
Binary files differ
diff --git a/lib/gitlab/metrics/samplers/database_sampler.rb b/lib/gitlab/metrics/samplers/database_sampler.rb
index 86372973c82..8d4f4570c21 100644
--- a/lib/gitlab/metrics/samplers/database_sampler.rb
+++ b/lib/gitlab/metrics/samplers/database_sampler.rb
@@ -54,7 +54,7 @@ module Gitlab
next if load_balancer.primary_only?
load_balancer.host_list.hosts.each do |host|
- stats << { labels: labels_for_replica_host(load_balancer, host), stats: host.connection.pool.stat }
+ stats << { labels: labels_for_replica_host(load_balancer, host), stats: host.pool.stat }
end
end
end
@@ -73,7 +73,7 @@ module Gitlab
host: host.host,
port: host.port,
class: load_balancer.configuration.connection_specification_name,
- db_config_name: Gitlab::Database.db_config_name(host.connection)
+ db_config_name: host.pool.db_config.name
}
end
end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index aad53d5e947..ad5c6ac1c71 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -26639,9 +26639,6 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
-msgid "Job ID"
-msgstr ""
-
msgid "Job artifacts"
msgstr ""
@@ -26837,16 +26834,16 @@ msgstr ""
msgid "Jobs|You're about to retry a job that failed because it attempted to deploy code that is older than the latest deployment. Retrying this job could result in overwriting the environment with the older source code."
msgstr ""
-msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} %{status}"
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id}"
msgstr ""
-msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} %{status} for %{mrId} with %{source}"
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source}"
msgstr ""
-msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} %{status} for %{ref}"
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source} into %{target}"
msgstr ""
-msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source} into %{target}"
+msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
msgstr ""
msgid "Job|%{searchLength} results found for %{searchTerm}"
@@ -38679,9 +38676,6 @@ msgstr ""
msgid "Related issues"
msgstr ""
-msgid "Related jobs"
-msgstr ""
-
msgid "Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch}"
msgstr ""
@@ -46287,6 +46281,9 @@ msgstr ""
msgid "Tags this commit to %{tag_name}."
msgstr ""
+msgid "Tags:"
+msgstr ""
+
msgid "TagsPage|Are you sure you want to delete this tag?"
msgstr ""
@@ -46433,6 +46430,9 @@ msgstr ""
msgid "Target branch rule"
msgstr ""
+msgid "Target branch rule created."
+msgstr ""
+
msgid "Target branch rules"
msgstr ""
@@ -49727,7 +49727,7 @@ msgstr ""
msgid "Trigger token:"
msgstr ""
-msgid "Trigger variables"
+msgid "Trigger variables:"
msgstr ""
msgid "Trigger was created successfully."
diff --git a/qa/qa/page/component/ci_badge_link.rb b/qa/qa/page/component/ci_badge_link.rb
index 0fddd1cbf12..485e363d960 100644
--- a/qa/qa/page/component/ci_badge_link.rb
+++ b/qa/qa/page/component/ci_badge_link.rb
@@ -32,12 +32,12 @@ module QA
super
base.view 'app/assets/javascripts/vue_shared/components/ci_badge_link.vue' do
- element 'ci-badge-link'
+ element :status_badge_link
end
end
def status_badge
- find_element('ci-badge-link').text
+ find_element(:status_badge_link).text
end
def completed?(timeout: 60)
diff --git a/spec/factories/packages/nuget/symbol.rb b/spec/factories/packages/nuget/symbol.rb
new file mode 100644
index 00000000000..7ab1e026cda
--- /dev/null
+++ b/spec/factories/packages/nuget/symbol.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :nuget_symbol, class: 'Packages::Nuget::Symbol' do
+ package { association(:nuget_package) }
+ file { fixture_file_upload('spec/fixtures/packages/nuget/symbol/package.pdb') }
+ file_path { 'lib/net7.0/package.pdb' }
+ size { 100.bytes }
+ sequence(:signature) { |n| "b91a152048fc4b3883bf3cf73fbc03f#{n}FFFFFFFF" }
+ end
+end
diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb
index 5a8cee5ef6e..67486b545c9 100644
--- a/spec/features/projects/jobs_spec.rb
+++ b/spec/features/projects/jobs_spec.rb
@@ -93,7 +93,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state, feature_category: :grou
visit project_job_path(project, job)
within '.js-pipeline-info' do
- expect(page).to have_content("Pipeline ##{pipeline.id} #{pipeline.status} for #{pipeline.ref}")
+ expect(page).to have_content("Pipeline ##{pipeline.id} for #{pipeline.ref}")
end
end
@@ -239,7 +239,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state, feature_category: :grou
href = new_project_issue_path(project, options)
- page.within('aside.right-sidebar') do
+ page.within('.build-sidebar') do
expect(find('[data-testid="job-new-issue"]')['href']).to include(href)
end
end
diff --git a/spec/fixtures/packages/nuget/symbol/package.pdb b/spec/fixtures/packages/nuget/symbol/package.pdb
new file mode 100644
index 00000000000..dc82bf418a2
--- /dev/null
+++ b/spec/fixtures/packages/nuget/symbol/package.pdb
Binary files differ
diff --git a/spec/frontend/jobs/components/job/job_sidebar_details_container_spec.js b/spec/frontend/jobs/components/job/job_sidebar_details_container_spec.js
index 0b704890d57..c1028f3929d 100644
--- a/spec/frontend/jobs/components/job/job_sidebar_details_container_spec.js
+++ b/spec/frontend/jobs/components/job/job_sidebar_details_container_spec.js
@@ -53,7 +53,6 @@ describe('Job Sidebar Details Container', () => {
['erased_at', 'Erased: 3 weeks ago'],
['finished_at', 'Finished: 3 weeks ago'],
['queued_duration', 'Queued: 9 seconds'],
- ['id', 'Job ID: #4757'],
['runner', 'Runner: #1 (ABCDEFGH) local ci runner'],
['coverage', 'Coverage: 20%'],
])('uses %s to render job-%s', async (detail, value) => {
@@ -78,7 +77,7 @@ describe('Job Sidebar Details Container', () => {
createWrapper();
await store.dispatch('receiveJobSuccess', job);
- expect(findAllDetailsRow()).toHaveLength(8);
+ expect(findAllDetailsRow()).toHaveLength(7);
});
describe('duration row', () => {
diff --git a/spec/frontend/jobs/components/job/stages_dropdown_spec.js b/spec/frontend/jobs/components/job/stages_dropdown_spec.js
index 780193b33d0..c42edc62183 100644
--- a/spec/frontend/jobs/components/job/stages_dropdown_spec.js
+++ b/spec/frontend/jobs/components/job/stages_dropdown_spec.js
@@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import { Mousetrap } from '~/lib/mousetrap';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import StagesDropdown from '~/jobs/components/job/sidebar/stages_dropdown.vue';
-import CiBadgeLink from '~/vue_shared/components/ci_badge_link.vue';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
import * as copyToClipboard from '~/behaviors/copy_to_clipboard';
import {
mockPipelineWithoutRef,
@@ -15,7 +15,7 @@ import {
describe('Stages Dropdown', () => {
let wrapper;
- const findStatus = () => wrapper.findComponent(CiBadgeLink);
+ const findStatus = () => wrapper.findComponent(CiIcon);
const findDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
const findSelectedStageText = () => findDropdown().props('toggleText');
diff --git a/spec/graphql/resolvers/branch_commit_resolver_spec.rb b/spec/graphql/resolvers/branch_commit_resolver_spec.rb
index 3d5702539fa..f901306a355 100644
--- a/spec/graphql/resolvers/branch_commit_resolver_spec.rb
+++ b/spec/graphql/resolvers/branch_commit_resolver_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe Resolvers::BranchCommitResolver do
commit_a = repository.commits('master', limit: 1).last
commit_b = repository.commits('spooky-stuff', limit: 1).last
- commits = batch_sync(max_queries: 1) do
+ commits = batch_sync(max_queries: 2) do
[
resolve(described_class, obj: branch),
resolve(described_class, obj: repository.find_branch('spooky-stuff'))
diff --git a/spec/lib/gitlab/metrics/samplers/database_sampler_spec.rb b/spec/lib/gitlab/metrics/samplers/database_sampler_spec.rb
index 57790ad78a8..85e8b366f29 100644
--- a/spec/lib/gitlab/metrics/samplers/database_sampler_spec.rb
+++ b/spec/lib/gitlab/metrics/samplers/database_sampler_spec.rb
@@ -8,6 +8,32 @@ RSpec.describe Gitlab::Metrics::Samplers::DatabaseSampler do
it_behaves_like 'metrics sampler', 'DATABASE_SAMPLER'
describe '#sample' do
+ let(:main_load_balancer) do
+ double(:main_load_balancer, host_list: main_host_list, configuration: main_configuration, primary_only?: false)
+ end
+
+ let(:main_configuration) { double(:configuration, connection_specification_name: 'ActiveRecord::Base') }
+ let(:main_host_list) { double(:host_list, hosts: [main_replica_host]) }
+ let(:main_replica_host) { double(:host, pool: main_replica_pool, host: 'main-replica-host', port: 2345) }
+ let(:main_replica_pool) do
+ double(:main_replica_pool, db_config: double(:main_replica_db_config, name: 'main_replica'), stat: stats)
+ end
+
+ let(:stats) do
+ { size: 123, connections: 100, busy: 10, dead: 5, idle: 85, waiting: 1 }
+ end
+
+ let(:ci_load_balancer) do
+ double(:ci_load_balancer, host_list: ci_host_list, configuration: ci_configuration, primary_only?: false)
+ end
+
+ let(:ci_configuration) { double(:configuration, connection_specification_name: 'Ci::ApplicationRecord') }
+ let(:ci_host_list) { double(:host_list, hosts: [ci_replica_host]) }
+ let(:ci_replica_host) { double(:host, pool: ci_replica_pool, host: 'ci-replica-host', port: 3456) }
+ let(:ci_replica_pool) do
+ double(:ci_replica_pool, db_config: double(:ci_replica_db_config, name: 'ci_replica'), stat: stats)
+ end
+
let(:main_labels) do
{
class: 'ActiveRecord::Base',
@@ -62,35 +88,9 @@ RSpec.describe Gitlab::Metrics::Samplers::DatabaseSampler do
end
context 'when replica hosts are configured' do
- let(:main_load_balancer) { ApplicationRecord.load_balancer }
- let(:main_replica_host) { main_load_balancer.host }
-
- let(:ci_load_balancer) { double(:load_balancer, host_list: ci_host_list, configuration: configuration) }
- let(:configuration) { double(:configuration, connection_specification_name: 'Ci::ApplicationRecord') }
- let(:ci_host_list) { double(:host_list, hosts: [ci_replica_host]) }
- let(:ci_replica_host) { double(:host, connection: ci_connection) }
- let(:ci_connection) { double(:connection, pool: Ci::ApplicationRecord.connection_pool) }
-
before do
allow(Gitlab::Database::LoadBalancing).to receive(:each_load_balancer)
.and_return([main_load_balancer, ci_load_balancer].to_enum)
-
- allow(main_load_balancer).to receive(:primary_only?).and_return(false)
- allow(ci_load_balancer).to receive(:primary_only?).and_return(false)
-
- allow(main_replica_host).to receive(:host).and_return('main-replica-host')
- allow(ci_replica_host).to receive(:host).and_return('ci-replica-host')
-
- allow(main_replica_host).to receive(:port).and_return(2345)
- allow(ci_replica_host).to receive(:port).and_return(3456)
-
- allow(Gitlab::Database).to receive(:db_config_name)
- .with(main_replica_host.connection)
- .and_return('main_replica')
-
- allow(Gitlab::Database).to receive(:db_config_name)
- .with(ci_replica_host.connection)
- .and_return('ci_replica')
end
it 'samples connection pool statistics for primaries and replicas' do
@@ -117,35 +117,9 @@ RSpec.describe Gitlab::Metrics::Samplers::DatabaseSampler do
end
context 'when the base model has replica connections' do
- let(:main_load_balancer) { ApplicationRecord.load_balancer }
- let(:main_replica_host) { main_load_balancer.host }
-
- let(:ci_load_balancer) { double(:load_balancer, host_list: ci_host_list, configuration: configuration) }
- let(:configuration) { double(:configuration, connection_specification_name: 'Ci::ApplicationRecord') }
- let(:ci_host_list) { double(:host_list, hosts: [ci_replica_host]) }
- let(:ci_replica_host) { double(:host, connection: ci_connection) }
- let(:ci_connection) { double(:connection, pool: Ci::ApplicationRecord.connection_pool) }
-
before do
allow(Gitlab::Database::LoadBalancing).to receive(:each_load_balancer)
.and_return([main_load_balancer, ci_load_balancer].to_enum)
-
- allow(main_load_balancer).to receive(:primary_only?).and_return(false)
- allow(ci_load_balancer).to receive(:primary_only?).and_return(false)
-
- allow(main_replica_host).to receive(:host).and_return('main-replica-host')
- allow(ci_replica_host).to receive(:host).and_return('ci-replica-host')
-
- allow(main_replica_host).to receive(:port).and_return(2345)
- allow(ci_replica_host).to receive(:port).and_return(3456)
-
- allow(Gitlab::Database).to receive(:db_config_name)
- .with(main_replica_host.connection)
- .and_return('main_replica')
-
- allow(Gitlab::Database).to receive(:db_config_name)
- .with(ci_replica_host.connection)
- .and_return('ci_replica')
end
it 'still records the replica metrics' do
diff --git a/spec/models/concerns/routable_spec.rb b/spec/models/concerns/routable_spec.rb
index 0bbe3dea812..64812454b1a 100644
--- a/spec/models/concerns/routable_spec.rb
+++ b/spec/models/concerns/routable_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.shared_examples 'routable resource' do
- describe '.find_by_full_path', :aggregate_failures do
+ shared_examples_for '.find_by_full_path' do
it 'finds records by their full path' do
expect(described_class.find_by_full_path(record.full_path)).to eq(record)
expect(described_class.find_by_full_path(record.full_path.upcase)).to eq(record)
@@ -13,16 +13,6 @@ RSpec.shared_examples 'routable resource' do
expect(described_class.find_by_full_path('unknown')).to be_nil
end
- it 'includes route information when loading a record' do
- control_count = ActiveRecord::QueryRecorder.new do
- described_class.find_by_full_path(record.full_path)
- end.count
-
- expect do
- described_class.find_by_full_path(record.full_path).route
- end.not_to exceed_all_query_limit(control_count)
- end
-
context 'when path is a negative number' do
it 'returns nil' do
expect(described_class.find_by_full_path(-1)).to be_nil
@@ -56,6 +46,26 @@ RSpec.shared_examples 'routable resource' do
end
end
end
+
+ it_behaves_like '.find_by_full_path', :aggregate_failures
+
+ context 'when the `optimize_routable` feature flag is turned OFF' do
+ before do
+ stub_feature_flags(optimize_routable: false)
+ end
+
+ it_behaves_like '.find_by_full_path', :aggregate_failures
+
+ it 'includes route information when loading a record' do
+ control_count = ActiveRecord::QueryRecorder.new do
+ described_class.find_by_full_path(record.full_path)
+ end.count
+
+ expect do
+ described_class.find_by_full_path(record.full_path).route
+ end.not_to exceed_all_query_limit(control_count)
+ end
+ end
end
RSpec.shared_examples 'routable resource with parent' do
@@ -93,7 +103,7 @@ RSpec.shared_examples 'routable resource with parent' do
end
end
-RSpec.describe Group, 'Routable', :with_clean_rails_cache do
+RSpec.describe Group, 'Routable', :with_clean_rails_cache, feature_category: :groups_and_projects do
let_it_be_with_reload(:group) { create(:group, name: 'foo') }
let_it_be(:nested_group) { create(:group, parent: group) }
@@ -223,7 +233,7 @@ RSpec.describe Group, 'Routable', :with_clean_rails_cache do
end
end
-RSpec.describe Project, 'Routable', :with_clean_rails_cache do
+RSpec.describe Project, 'Routable', :with_clean_rails_cache, feature_category: :groups_and_projects do
let_it_be(:namespace) { create(:namespace) }
let_it_be(:project) { create(:project, namespace: namespace) }
@@ -235,9 +245,20 @@ RSpec.describe Project, 'Routable', :with_clean_rails_cache do
expect(project.route).not_to be_nil
expect(project.route.namespace).to eq(project.project_namespace)
end
+
+ describe '.find_by_full_path' do
+ it 'does not return a record if the sources are different, but the IDs match' do
+ group = create(:group, id: 1992)
+ project = create(:project, id: 1992)
+
+ record = described_class.where(id: project.id).find_by_full_path(group.full_path)
+
+ expect(record).to be_nil
+ end
+ end
end
-RSpec.describe Namespaces::ProjectNamespace, 'Routable', :with_clean_rails_cache do
+RSpec.describe Namespaces::ProjectNamespace, 'Routable', :with_clean_rails_cache, feature_category: :groups_and_projects do
let_it_be(:group) { create(:group) }
it 'skips route creation for the resource' do
diff --git a/spec/models/packages/nuget/symbol_spec.rb b/spec/models/packages/nuget/symbol_spec.rb
new file mode 100644
index 00000000000..52e95c11939
--- /dev/null
+++ b/spec/models/packages/nuget/symbol_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Nuget::Symbol, type: :model, feature_category: :package_registry do
+ subject(:symbol) { create(:nuget_symbol) }
+
+ it { is_expected.to be_a FileStoreMounter }
+
+ describe 'relationships' do
+ it { is_expected.to belong_to(:package).inverse_of(:nuget_symbols) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:file) }
+ it { is_expected.to validate_presence_of(:file_path) }
+ it { is_expected.to validate_presence_of(:signature) }
+ it { is_expected.to validate_presence_of(:object_storage_key) }
+ it { is_expected.to validate_presence_of(:size) }
+ it { is_expected.to validate_uniqueness_of(:signature).scoped_to(:file_path) }
+ it { is_expected.to validate_uniqueness_of(:object_storage_key).case_insensitive }
+ end
+
+ describe 'delegations' do
+ it { is_expected.to delegate_method(:project_id).to(:package) }
+ end
+
+ describe 'callbacks' do
+ describe 'before_validation' do
+ describe '#set_object_storage_key' do
+ context 'when signature and project_id are present' do
+ it 'sets the object_storage_key' do
+ expected_key = Gitlab::HashedPath.new(
+ 'packages', 'nuget', symbol.package_id, 'symbols', OpenSSL::Digest::SHA256.hexdigest(symbol.signature),
+ root_hash: symbol.project_id
+ ).to_s
+
+ symbol.valid?
+
+ expect(symbol.object_storage_key).to eq(expected_key)
+ end
+ end
+
+ context 'when signature is not present' do
+ subject(:symbol) { build(:nuget_symbol, signature: nil) }
+
+ it 'does not set the object_storage_key' do
+ symbol.valid?
+
+ expect(symbol.object_storage_key).to be_nil
+ end
+ end
+
+ context 'when project_id is not present' do
+ subject(:symbol) { build(:nuget_symbol) }
+
+ before do
+ allow(symbol).to receive(:project_id).and_return(nil)
+ end
+
+ it 'does not set the object_storage_key' do
+ symbol.valid?
+
+ expect(symbol.object_storage_key).to be_nil
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index 74ad2925058..e113218e828 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -25,6 +25,7 @@ RSpec.describe Packages::Package, type: :model, feature_category: :package_regis
it { is_expected.to have_one(:rubygems_metadatum).inverse_of(:package) }
it { is_expected.to have_one(:npm_metadatum).inverse_of(:package) }
it { is_expected.to have_one(:rpm_metadatum).inverse_of(:package) }
+ it { is_expected.to have_many(:nuget_symbols).inverse_of(:package) }
end
describe '.with_debian_codename' do
diff --git a/spec/uploaders/packages/nuget/symbol_uploader_spec.rb b/spec/uploaders/packages/nuget/symbol_uploader_spec.rb
new file mode 100644
index 00000000000..bdcb5245c1c
--- /dev/null
+++ b/spec/uploaders/packages/nuget/symbol_uploader_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Nuget::SymbolUploader, feature_category: :package_registry do
+ let(:object_storage_key) { 'object/storage/key' }
+ let(:symbol) { build_stubbed(:nuget_symbol, object_storage_key: object_storage_key) }
+
+ subject { described_class.new(symbol, :file) }
+
+ describe '#store_dir' do
+ it 'uses the object_storage_key' do
+ expect(subject.store_dir).to eq(object_storage_key)
+ end
+
+ context 'without the object_storage_key' do
+ let(:object_storage_key) { nil }
+
+ it 'raises the error' do
+ expect { subject.store_dir }
+ .to raise_error(
+ described_class::ObjectNotReadyError,
+ 'Packages::Nuget::Symbol model not ready'
+ )
+ end
+ end
+ end
+end