Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-08-21 09:09:27 +00:00
parent 06e27155a5
commit 1839f3a844
112 changed files with 687 additions and 591 deletions

View File

@ -2,21 +2,6 @@
# Cop supports --autocorrect.
Graphql/Descriptions:
Exclude:
- 'app/graphql/types/alert_management/alert_type.rb'
- 'app/graphql/types/award_emojis/award_emoji_type.rb'
- 'app/graphql/types/board_list_type.rb'
- 'app/graphql/types/branch_protections/base_access_level_type.rb'
- 'app/graphql/types/branch_rules/branch_protection_type.rb'
- 'app/graphql/types/ci/job_token_scope_type.rb'
- 'app/graphql/types/ci/pipeline_type.rb'
- 'app/graphql/types/ci/runner_status_enum.rb'
- 'app/graphql/types/ci/runner_type.rb'
- 'app/graphql/types/ci/runner_web_url_edge.rb'
- 'app/graphql/types/ci/status_action_type.rb'
- 'app/graphql/types/clusters/agent_token_type.rb'
- 'app/graphql/types/clusters/agent_type.rb'
- 'app/graphql/types/container_expiration_policy_type.rb'
- 'app/graphql/types/container_repository_tag_type.rb'
- 'app/graphql/types/container_repository_type.rb'
- 'app/graphql/types/deployment_tag_type.rb'
- 'app/graphql/types/design_management/design_at_version_type.rb'

View File

@ -1 +1 @@
1a16fa05c2645a0abba4e2f028e1fdbe5d85be2f
c29c5ba968d141237000185734baa95e122db80b

View File

@ -5,12 +5,12 @@ function getTruncatedName(name) {
}
export function generateAgentRegistrationCommand({ name, token, version, address }) {
const versionValue = window.gon.dot_com ? '' : `\n --set image.tag=v${version} \\`;
return `helm repo add gitlab https://charts.gitlab.io
helm repo update
helm upgrade --install ${name} gitlab/gitlab-agent \\
--namespace gitlab-agent-${getTruncatedName(name)} \\
--create-namespace \\
--set image.tag=v${version} \\
--create-namespace \\${versionValue}
--set config.token=${token} \\
--set config.kasAddress=${address}`;
}

View File

@ -277,7 +277,7 @@ export default {
</template>
</template>
<div v-if="!isDeleteInProgress" class="gl-display-flex gl-justify-content-center">
<div v-if="!isDeleteInProgress" class="gl-flex gl-justify-center">
<persisted-pagination
class="gl-mt-3"
:pagination="tagsPageInfo"

View File

@ -98,7 +98,7 @@ export default {
{
text: this.$options.i18n.REMOVE_TAG_BUTTON_TITLE,
extraAttrs: {
class: 'gl-text-red-500!',
class: '!gl-text-red-500',
'data-testid': 'single-delete-button',
},
action: () => {
@ -177,11 +177,11 @@ export default {
/>
</template>
<template #left-primary>
<div class="gl-display-flex gl-align-items-center">
<div class="gl-flex gl-items-center">
<div
v-gl-tooltip="tag.name"
data-testid="name"
class="gl-text-overflow-ellipsis gl-overflow-hidden gl-whitespace-nowrap"
class="gl-overflow-hidden gl-text-ellipsis gl-whitespace-nowrap"
:class="mobileClasses"
>
{{ tag.name }}
@ -201,7 +201,7 @@ export default {
v-if="isInvalidTag"
v-gl-tooltip.d0="$options.i18n.MISSING_MANIFEST_WARNING_TOOLTIP"
name="warning"
class="gl-text-orange-500 gl-mr-2"
class="gl-mr-2 gl-text-orange-500"
/>
<gl-icon
@ -252,7 +252,7 @@ export default {
category="tertiary"
no-caret
placement="bottom-end"
:class="{ 'gl-opacity-0 gl-pointer-events-none': disabled }"
:class="{ 'gl-pointer-events-none gl-opacity-0': disabled }"
data-testid="additional-actions"
:items="items"
/>
@ -312,8 +312,8 @@ export default {
icon="pencil"
data-testid="signatures-detail"
>
<div class="gl-display-flex">
<span class="gl-text-truncate gl-mr-3 gl-flex-basis-0 gl-flex-grow-1">
<div class="gl-flex">
<span class="gl-mr-3 gl-grow gl-basis-0 gl-truncate">
<gl-sprintf :message="s__('ContainerRegistry|Signature digest: %{digest}')">
<template #digest>{{ digest }}</template>
</gl-sprintf>

View File

@ -78,8 +78,8 @@ export default {
</script>
<template>
<div v-if="showStatus" id="status-popover-container" class="gl-inline-flex gl-align-items-center">
<div class="gl-inline-flex gl-align-items-center">
<div v-if="showStatus" id="status-popover-container" class="gl-inline-flex gl-items-center">
<div class="gl-inline-flex gl-items-center">
<gl-icon :name="expireIconName" data-testid="main-icon" />
</div>
<span class="gl-mx-2">
@ -104,7 +104,7 @@ export default {
<gl-sprintf :message="$options.i18n.PARTIAL_CLEANUP_CONTINUE_MESSAGE">
<template #time>{{ calculatedTimeTilNextRun }}</template
><template #link="{ content }"
><gl-link :href="$options.cleanupPolicyHelpPage" class="gl-font-sm" target="_blank">{{
><gl-link :href="$options.cleanupPolicyHelpPage" class="gl-text-sm" target="_blank">{{
content
}}</gl-link></template
>

View File

@ -27,7 +27,7 @@ export default {
<template>
<ul class="gl-pl-0">
<li v-for="(listItem, index) in images" :key="index" class="gl-list-style-none">
<li v-for="(listItem, index) in images" :key="index" class="gl-list-none">
<image-list-row
:item="listItem"
:metadata-loading="metadataLoading"

View File

@ -152,7 +152,7 @@ export default {
<router-link
v-else
ref="imageName"
class="gl-text-body gl-font-bold"
class="gl-font-bold gl-text-primary"
data-testid="details-link"
:to="{ name: 'details', params: { id } }"
>
@ -172,7 +172,7 @@ export default {
<template v-if="!metadataLoading">
<span v-if="deleting">{{ $options.i18n.ROW_SCHEDULED_FOR_DELETION }}</span>
<template v-else>
<span class="gl-display-flex gl-align-items-center" data-testid="tags-count">
<span class="gl-flex gl-items-center" data-testid="tags-count">
<gl-sprintf :message="tagsCountText">
<template #count>
{{ item.tagsCount }}

View File

@ -75,7 +75,7 @@ export default {
<clipboard-button
:text="dockerLoginCommand"
:title="$options.i18n.copyLoginTitle"
class="gl-m-0!"
class="!gl-m-0"
/>
</template>
</gl-form-input-group>
@ -93,7 +93,7 @@ export default {
<clipboard-button
:text="dockerBuildCommand"
:title="$options.i18n.copyBuildTitle"
class="gl-m-0!"
class="!gl-m-0"
/>
</template>
</gl-form-input-group>
@ -103,7 +103,7 @@ export default {
<clipboard-button
:text="dockerPushCommand"
:title="$options.i18n.copyPushTitle"
class="gl-m-0!"
class="!gl-m-0"
/>
</template>
</gl-form-input-group>

View File

@ -348,7 +348,7 @@ export default {
</template>
</template>
<div v-if="!mutationLoading" class="gl-display-flex gl-justify-content-center">
<div v-if="!mutationLoading" class="gl-flex gl-justify-center">
<persisted-pagination
class="gl-mt-3"
:pagination="pageInfo"

View File

@ -59,14 +59,14 @@ export default {
id="code-example"
readonly
:value="$options.codeExample"
class="gl-w-7/10 gl-mx-auto"
class="gl-mx-auto gl-w-7/10"
select-on-click
>
<template #append>
<clipboard-button
:text="$options.codeExample"
:title="$options.i18n.copyExample"
class="gl-m-0!"
class="!gl-m-0"
/>
</template>
</gl-form-input-group>

View File

@ -42,7 +42,7 @@ export default {
<template>
<div class="gl-mt-6">
<h3 class="gl-font-base gl-pb-3 gl-mb-0 gl-border-b-1 gl-border-gray-100 gl-border-b-solid">
<h3 class="gl-mb-0 gl-border-b-1 gl-border-gray-100 gl-pb-3 gl-text-base gl-border-b-solid">
{{ $options.i18n.listTitle }}
</h3>
@ -61,7 +61,7 @@ export default {
/>
</li>
</ul>
<div class="gl-display-flex gl-justify-content-center">
<div class="gl-flex gl-justify-center">
<gl-keyset-pagination
v-bind="pagination"
class="gl-mt-3"

View File

@ -81,8 +81,12 @@ export default {
<template>
<list-item v-bind="$attrs">
<template #left-primary>
<div class="gl-display-flex gl-align-items-center">
<router-link class="gl-text-body gl-font-bold gl-break-all" data-testid="name" :to="linkTo">
<div class="gl-flex gl-items-center">
<router-link
class="gl-break-all gl-font-bold gl-text-primary"
data-testid="name"
:to="linkTo"
>
{{ artifact.digest }}
</router-link>
<clipboard-button
@ -98,7 +102,7 @@ export default {
<span class="gl-mr-3" data-testid="size">
{{ formattedSize }}
</span>
<span id="tagsCount" class="gl-display-flex gl-align-items-center" data-testid="tags-count">
<span id="tagsCount" class="gl-flex gl-items-center" data-testid="tags-count">
<gl-icon name="tag" class="gl-mr-2" />
{{ tagsCountText }}
</span>

View File

@ -44,7 +44,7 @@ export default {
<template>
<list-item v-bind="$attrs">
<template #left-primary>
<router-link class="gl-text-body gl-font-bold" data-testid="details-link" :to="linkTo">
<router-link class="gl-font-bold gl-text-primary" data-testid="details-link" :to="linkTo">
{{ item.name }}
</router-link>
<clipboard-button
@ -56,7 +56,7 @@ export default {
</template>
<template #left-secondary>
<template v-if="!metadataLoading">
<span class="gl-display-flex gl-align-items-center" data-testid="artifacts-count">
<span class="gl-flex gl-items-center" data-testid="artifacts-count">
<gl-icon name="package" class="gl-mr-2" />
{{ artifactCountText }}
</span>

View File

@ -46,11 +46,8 @@ export default {
<template>
<list-item v-bind="$attrs">
<template #left-primary>
<div class="gl-display-flex gl-align-items-center">
<div
data-testid="name"
class="gl-text-overflow-ellipsis gl-overflow-hidden gl-whitespace-nowrap"
>
<div class="gl-flex gl-items-center">
<div data-testid="name" class="gl-overflow-hidden gl-text-ellipsis gl-whitespace-nowrap">
{{ tag.name }}
</div>
<clipboard-button

View File

@ -189,7 +189,7 @@ export default {
<template v-else-if="hasVersions">
<ul class="gl-pl-0">
<li v-for="v in packageEntity.versions" :key="v.id" class="gl-list-style-none">
<li v-for="v in packageEntity.versions" :key="v.id" class="gl-list-none">
<package-list-row
:package-entity="packageEntityWithName(v)"
:package-link="v.id.toString()"

View File

@ -96,7 +96,7 @@ export default {
<template>
<div>
<h3 class="gl-font-lg gl-mt-5">{{ __('Assets') }}</h3>
<h3 class="gl-mt-5 gl-text-lg">{{ __('Assets') }}</h3>
<gl-table
:fields="filesTableHeaderFields"
:items="filesTableRows"
@ -120,7 +120,7 @@ export default {
<file-icon
:file-name="item.file_name"
css-classes="gl-relative file-icon"
class="gl-mr-1 gl-relative"
class="gl-relative gl-mr-1"
/>
<span>{{ item.file_name }}</span>
</gl-link>
@ -155,7 +155,7 @@ export default {
<template #row-details="{ item }">
<div
class="gl-display-flex gl-flex-direction-column gl-flex-grow-1 gl-bg-gray-10 gl-rounded-base gl-shadow-inner-1-gray-100"
class="gl-flex gl-grow gl-flex-col gl-rounded-base gl-bg-gray-10 gl-shadow-inner-1-gray-100"
>
<file-sha
v-if="item.file_sha256"

View File

@ -77,7 +77,7 @@ export default {
<template>
<div class="issuable-discussion">
<h3 class="gl-font-lg" data-testid="title">{{ __('History') }}</h3>
<h3 class="gl-text-lg" data-testid="title">{{ __('History') }}</h3>
<ul class="timeline main-notes-list notes gl-mb-4" data-testid="timeline">
<history-item icon="clock" data-testid="created-on">
<gl-sprintf :message="$options.i18n.createdOn">

View File

@ -47,7 +47,7 @@ export default {
<template>
<div>
<h3 class="gl-font-lg">{{ __('Provision instructions') }}</h3>
<h3 class="gl-text-lg">{{ __('Provision instructions') }}</h3>
<code-instruction
:label="
@ -60,7 +60,7 @@ export default {
multiline
/>
<h3 class="gl-font-lg">{{ __('Registry setup') }}</h3>
<h3 class="gl-text-lg">{{ __('Registry setup') }}</h3>
<code-instruction
:label="s__('InfrastructureRegistry|To authorize access to the Terraform registry:')"

View File

@ -71,7 +71,7 @@ export default {
</script>
<template>
<div class="gl-display-flex gl-flex-direction-column">
<div class="gl-flex gl-flex-col">
<slot v-if="isListEmpty && !isLoading" name="empty-state"></slot>
<div v-else-if="isLoading">
@ -80,7 +80,7 @@ export default {
<template v-else>
<ul data-testid="packages-table" class="gl-pl-0">
<li v-for="packageEntity in list" :key="packageEntity.id" class="gl-list-style-none">
<li v-for="packageEntity in list" :key="packageEntity.id" class="gl-list-none">
<packages-list-row
:package-entity="packageEntity"
:package-link="packageEntity._links.web_path"
@ -95,7 +95,7 @@ export default {
:per-page="perPage"
:total-items="totalItems"
align="center"
class="gl-w-full gl-mt-3"
class="gl-mt-3 gl-w-full"
/>
<delete-package-modal

View File

@ -10,7 +10,7 @@ export default {
</script>
<template>
<div class="gl-display-flex gl-align-items-center">
<div class="gl-flex gl-items-center">
<gl-icon name="infrastructure-registry" class="gl-ml-3 gl-mr-2" />
<span>{{ s__('InfrastructureRegistry|Terraform') }}</span>
</div>

View File

@ -80,10 +80,10 @@ export default {
<template>
<list-item data-testid="package-row" :disabled="disabledRow">
<template #left-primary>
<div class="gl-display-flex gl-align-items-center gl-mr-3 gl-min-w-0">
<div class="gl-mr-3 gl-flex gl-min-w-0 gl-items-center">
<gl-link
:href="packageLink"
class="gl-text-body gl-min-w-0"
class="gl-min-w-0 gl-text-primary"
data-testid="details-link"
:disabled="disabledRow"
>
@ -93,7 +93,7 @@ export default {
<gl-button
v-if="showWarningIcon"
v-gl-tooltip="{ title: $options.i18n.erroredPackageText }"
class="gl-hover-bg-transparent!"
class="hover:!gl-bg-transparent"
icon="warning"
category="tertiary"
data-testid="warning-icon"
@ -110,10 +110,10 @@ export default {
</div>
</template>
<template #left-secondary>
<div class="gl-display-flex">
<div class="gl-flex">
<span>{{ packageEntity.version }}</span>
<div v-if="hasPipeline" class="gl-hidden sm:g-flex gl-ml-2">
<div v-if="hasPipeline" class="sm:g-flex gl-ml-2 gl-hidden">
<gl-sprintf :message="s__('PackageRegistry|published by %{author}')">
<template #author>{{ packageEntity.pipeline.user.name }}</template>
</gl-sprintf>

View File

@ -87,7 +87,7 @@ export default {
<template>
<div>
<h3 v-if="isLoading || showMetadata" class="gl-font-lg" data-testid="title">
<h3 v-if="isLoading || showMetadata" class="gl-text-lg" data-testid="title">
{{ $options.i18n.componentTitle }}
</h3>
<gl-alert
@ -100,7 +100,7 @@ export default {
<additional-metadata-loader v-if="isLoading" />
<div
v-if="showMetadata"
class="gl-bg-gray-50 gl-shadow-inner-1-gray-100 gl-rounded-base"
class="gl-rounded-base gl-bg-gray-50 gl-shadow-inner-1-gray-100"
data-testid="main"
>
<component

View File

@ -14,13 +14,13 @@ export default {
</script>
<template>
<div class="gl-bg-gray-50 gl-shadow-inner-1-gray-100 gl-rounded-base">
<div class="gl-rounded-base gl-bg-gray-50 gl-shadow-inner-1-gray-100">
<div
v-for="index in $options.loader.repeat"
:key="index"
class="gl-display-flex gl-align-items-center gl-p-4 gl-border-gray-100 gl-border-b-1"
class="gl-flex gl-items-center gl-border-b-1 gl-border-gray-100 gl-p-4"
>
<div class="gl-md-max-w-30p">
<div class="md:gl-max-w-3/10">
<gl-skeleton-loader :width="$options.loader.width" :height="$options.loader.height">
<rect :width="$options.loader.width" :height="$options.loader.height" rx="4" />
</gl-skeleton-loader>

View File

@ -61,7 +61,7 @@ export default {
:tracking-label="$options.tracking.TRACKING_LABEL_CODE_INSTRUCTION"
/>
<h3 class="gl-font-lg">{{ __('Registry setup') }}</h3>
<h3 class="gl-text-lg">{{ __('Registry setup') }}</h3>
<code-instruction
:label="s__('PackageRegistry|Add Conan Remote')"

View File

@ -21,7 +21,7 @@ export default {
<template>
<div class="gl-responsive-table-row">
<div class="table-section section-50">
<strong class="gl-text-body">{{ dependencyLink.dependency.name }}</strong>
<strong class="gl-text-primary">{{ dependencyLink.dependency.name }}</strong>
<span v-if="showTargetFramework" data-testid="target-framework">
({{ dependencyLink.metadata.targetFramework }})
</span>
@ -29,10 +29,10 @@ export default {
<div
v-if="showVersion"
class="table-section section-50 gl-display-flex gl-md-justify-content-end"
class="table-section section-50 gl-flex md:gl-justify-end"
data-testid="version-pattern"
>
<span class="gl-text-body">{{ dependencyLink.dependency.versionPattern }}</span>
<span class="gl-text-primary">{{ dependencyLink.dependency.versionPattern }}</span>
</div>
</div>
</template>

View File

@ -25,8 +25,8 @@ export default {
</script>
<template>
<div class="gl-display-flex gl-justify-content-space-between gl-align-items-center">
<h3 class="gl-font-lg">{{ __('Installation') }}</h3>
<div class="gl-flex gl-items-center gl-justify-between">
<h3 class="gl-text-lg">{{ __('Installation') }}</h3>
<div>
<persisted-dropdown-selection
:storage-key="storageKey"

View File

@ -161,7 +161,7 @@ export default {
/>
<code-instruction
class="gl-w-20 gl-mt-5"
class="gl-mt-5 gl-w-20"
:label="s__('PackageRegistry|Maven Command')"
:instruction="$options.MAVEN_INSTALLATION_COMMAND"
:copy-text="s__('PackageRegistry|Copy Maven command')"
@ -169,7 +169,7 @@ export default {
:tracking-label="$options.tracking.TRACKING_LABEL_CODE_INSTRUCTION"
/>
<h3 class="gl-font-lg">{{ s__('PackageRegistry|Registry setup') }}</h3>
<h3 class="gl-text-lg">{{ s__('PackageRegistry|Registry setup') }}</h3>
<p>
<gl-sprintf :message="$options.i18n.setupText">
<template #code="{ content }">

View File

@ -37,7 +37,7 @@ export default {
:title="$options.i18n.targetShaCopyButton"
:text="packageMetadata.targetSha"
category="tertiary"
css-class="gl-p-0!"
css-class="!gl-p-0"
/>
</template>
</gl-sprintf>

View File

@ -128,7 +128,7 @@ export default {
:tracking-label="$options.tracking.TRACKING_LABEL_CODE_INSTRUCTION"
/>
<h3 class="gl-font-lg">{{ __('Registry setup') }}</h3>
<h3 class="gl-text-lg">{{ __('Registry setup') }}</h3>
<gl-form-radio-group
:options="$options.packageEndpointTypeOptions"

View File

@ -58,7 +58,7 @@ export default {
:tracking-action="$options.tracking.TRACKING_ACTION_COPY_NUGET_INSTALL_COMMAND"
:tracking-label="$options.tracking.TRACKING_LABEL_CODE_INSTRUCTION"
/>
<h3 class="gl-font-lg">{{ __('Registry setup') }}</h3>
<h3 class="gl-text-lg">{{ __('Registry setup') }}</h3>
<code-instruction
:label="s__('PackageRegistry|Add NuGet Source')"

View File

@ -364,8 +364,8 @@ export default {
<template>
<div class="gl-pt-6">
<div class="gl-display-flex gl-align-items-center gl-justify-content-space-between">
<h3 class="gl-font-lg gl-mt-5">{{ __('Assets') }}</h3>
<div class="gl-flex gl-items-center gl-justify-between">
<h3 class="gl-mt-5 gl-text-lg">{{ __('Assets') }}</h3>
<gl-button
v-if="!fetchPackageFilesError && canDelete"
:disabled="isLoading || !areFilesSelected"
@ -444,7 +444,7 @@ export default {
<file-icon
:file-name="item.fileName"
css-classes="gl-relative file-icon"
class="gl-mr-1 gl-relative"
class="gl-relative gl-mr-1"
/>
<span>{{ item.fileName }}</span>
</gl-link>
@ -477,7 +477,7 @@ export default {
<template #row-details="{ item }">
<div
class="gl-display-flex gl-flex-direction-column gl-flex-grow-1 gl-bg-gray-10 gl-rounded-base gl-shadow-inner-1-gray-100"
class="gl-flex gl-grow gl-flex-col gl-rounded-base gl-bg-gray-10 gl-shadow-inner-1-gray-100"
>
<file-sha
v-if="item.fileSha256"
@ -490,7 +490,7 @@ export default {
</div>
</template>
</gl-table>
<div class="gl-display-flex gl-justify-content-center">
<div class="gl-flex gl-justify-center">
<gl-keyset-pagination
:disabled="isLoading"
v-bind="pageInfo"

View File

@ -130,7 +130,7 @@ export default {
<template>
<div class="issuable-discussion">
<h3 class="gl-font-lg" data-testid="title">{{ __('History') }}</h3>
<h3 class="gl-text-lg" data-testid="title">{{ __('History') }}</h3>
<gl-alert
v-if="fetchPackagePipelinesError"
variant="danger"

View File

@ -13,7 +13,7 @@ export default {
</script>
<template>
<div class="gl-ml-5 gl-md-max-w-70p">
<div class="gl-ml-5 md:gl-max-w-7/10">
<gl-skeleton-loader :width="$options.loader.width" :height="$options.loader.height">
<rect x="49" y="9" width="531" height="16" rx="4" />
<circle cx="16" cy="16" r="16" />

View File

@ -89,10 +89,7 @@ export default {
:avatar="packageIcon"
>
<template #sub-header>
<div
data-testid="sub-header"
class="gl-display-flex gl-flex-wrap gl-gap-2 gl-align-items-baseline"
>
<div data-testid="sub-header" class="gl-flex gl-flex-wrap gl-items-baseline gl-gap-2">
<gl-sprintf :message="$options.i18n.packageInfo">
<template #version>{{ packageEntity.version }}</template>

View File

@ -91,7 +91,7 @@ password = <your personal access token>`;
</template>
</gl-form-group>
<h3 class="gl-font-lg">{{ __('Registry setup') }}</h3>
<h3 class="gl-text-lg">{{ __('Registry setup') }}</h3>
<p>
<gl-sprintf :message="$options.i18n.setupText">
<template #code="{ content }">

View File

@ -69,7 +69,7 @@ export default {
text: this.$options.i18n.deletePackage,
action: () => this.$emit('delete'),
extraAttrs: {
class: 'gl-text-red-500!',
class: '!gl-text-red-500',
'data-testid': 'action-delete',
},
},
@ -96,13 +96,10 @@ export default {
/>
</template>
<template #left-primary>
<div
class="gl-display-flex gl-align-items-center gl-gap-3 gl-mr-5 gl-min-w-0"
data-testid="package-name"
>
<div class="gl-mr-5 gl-flex gl-min-w-0 gl-items-center gl-gap-3" data-testid="package-name">
<gl-link
v-if="containsWebPathLink"
class="gl-text-body gl-min-w-0 gl-break-all"
class="gl-min-w-0 gl-break-all gl-text-primary"
:class="errorPackageStyle"
:href="packageLink"
>
@ -114,7 +111,7 @@ export default {
<div
v-if="packageEntity.tags.nodes && packageEntity.tags.nodes.length"
class="gl-display-flex gl-gap-2"
class="gl-flex gl-gap-2"
>
<package-tags :tags="packageEntity.tags.nodes" hide-label :tag-display-limit="1" />
</div>
@ -131,7 +128,7 @@ export default {
</div>
<gl-truncate
v-else
class="gl-max-w-15 gl-md-max-w-26"
class="gl-max-w-15 md:gl-max-w-26"
:text="packageEntity.version"
:with-tooltip="true"
/>

View File

@ -123,14 +123,11 @@ export default {
/>
</template>
<template #left-primary>
<div
class="gl-display-flex gl-align-items-center gl-gap-3 gl-mr-5 gl-min-w-0"
data-testid="package-name"
>
<div class="gl-mr-5 gl-flex gl-min-w-0 gl-items-center gl-gap-3" data-testid="package-name">
<router-link
v-if="containsWebPathLink"
:class="errorPackageStyle"
class="gl-text-body gl-min-w-0 gl-break-all"
class="gl-min-w-0 gl-break-all gl-text-primary"
data-testid="details-link"
:to="{ name: 'details', params: { id: packageId } }"
>
@ -162,11 +159,11 @@ export default {
<template #left-secondary>
<div
v-if="!errorStatusRow"
class="gl-display-flex gl-align-items-center"
class="gl-flex gl-items-center"
data-testid="left-secondary-infos"
>
<gl-truncate
class="gl-max-w-15 gl-md-max-w-26"
class="gl-max-w-15 md:gl-max-w-26"
:text="packageEntity.version"
:with-tooltip="true"
/>

View File

@ -197,7 +197,7 @@ export default {
</script>
<template>
<div class="gl-display-flex gl-flex-direction-column">
<div class="gl-flex gl-flex-col">
<slot v-if="isListEmpty && !isLoading" name="empty-state"></slot>
<div v-else-if="isLoading">

View File

@ -33,7 +33,7 @@ export default {
</script>
<template>
<div class="gl-display-flex gl-align-items-center">
<div class="gl-flex gl-items-center">
<template v-if="hasPipeline">
<gl-icon name="merge-request" class="gl-mr-2" />
<span data-testid="pipeline-ref" class="gl-mr-2">{{ pipeline.ref }}</span>

View File

@ -247,7 +247,7 @@ export default {
</package-list>
</template>
</delete-packages>
<div v-if="!isDeleteInProgress" class="gl-display-flex gl-justify-content-center">
<div v-if="!isDeleteInProgress" class="gl-flex gl-justify-center">
<persisted-pagination
class="gl-mt-3"
:pagination="pageInfo"

View File

@ -141,7 +141,7 @@ export default {
data-testid="dependency-proxy-setting-toggle"
>
<template v-if="enabled" #help>
<span class="gl-break-words gl-hyphens-auto gl-max-w-screen gl-inline-block">
<span class="gl-inline-block gl-max-w-screen gl-hyphens-auto gl-break-words">
<gl-sprintf :message="$options.i18n.enabledProxyHelpText">
<template #link="{ content }">
<gl-link data-testid="toggle-help-link" :href="groupDependencyProxyPath">{{

View File

@ -167,7 +167,7 @@ export default {
<template>
<settings-section :heading="$options.i18n.PACKAGE_FORWARDING_SETTINGS_HEADER">
<template #description>
<span class="gl-block gl-mb-2" data-testid="description">
<span class="gl-mb-2 gl-block" data-testid="description">
{{ $options.i18n.PACKAGE_FORWARDING_SETTINGS_DESCRIPTION }}
</span>
<gl-sprintf :message="$options.i18n.PACKAGE_FORWARDING_SECURITY_DESCRIPTION">

View File

@ -29,17 +29,17 @@ export default {
{
key: 'packageFormat',
label: PACKAGE_FORMATS_TABLE_HEADER,
thClass: 'gl-bg-gray-10!',
thClass: '!gl-bg-gray-10',
},
{
key: 'allowDuplicates',
label: DUPLICATES_TOGGLE_LABEL,
thClass: 'gl-bg-gray-10!',
thClass: '!gl-bg-gray-10',
},
{
key: 'exceptions',
label: DUPLICATES_SETTING_EXCEPTION_TITLE,
thClass: 'gl-bg-gray-10!',
thClass: '!gl-bg-gray-10',
},
],
components: {

View File

@ -198,26 +198,26 @@ export default {
<expiration-toggle
:value="prefilledForm.enabled"
:disabled="showLoadingIcon"
class="gl-mb-0!"
class="!gl-mb-0"
data-testid="enable-toggle"
@input="onModelChange($event, 'enabled')"
/>
<div class="gl-flex gl-mt-5">
<div class="gl-mt-5 gl-flex">
<expiration-dropdown
:value="prefilledForm.cadence"
:disabled="isFieldDisabled"
:form-options="$options.formOptions.cadence"
:label="$options.i18n.CADENCE_LABEL"
name="cadence"
class="gl-mr-7 gl-mb-0!"
class="!gl-mb-0 gl-mr-7"
data-testid="cadence-dropdown"
@input="onModelChange($event, 'cadence')"
/>
<expiration-run-text
:value="prefilledForm.nextRunAt"
:enabled="prefilledForm.enabled"
class="gl-mb-0!"
class="!gl-mb-0"
/>
</div>
<gl-alert class="gl-mt-5" :dismissible="false">

View File

@ -41,7 +41,7 @@ export default {
>
<gl-form-input
id="expiration-policy-info-text"
class="gl-pl-0!"
class="!gl-pl-0"
plaintext
:value="parsedValue"
/>

View File

@ -52,7 +52,7 @@ export default {
label-position="left"
:disabled="disabled"
/>
<div class="gl-text-subtle gl-mt-2" data-testid="description">
<div class="gl-mt-2 gl-text-subtle" data-testid="description">
<gl-sprintf :message="toggleText">
<template #strong="{ content }">
{{ content }}

View File

@ -139,7 +139,7 @@ export default {
:form-options="$options.formOptions.keepNDuplicatedPackageFiles"
:label="$options.i18n.KEEP_N_DUPLICATED_PACKAGE_FILES_LABEL"
:description="$options.i18n.KEEP_N_DUPLICATED_PACKAGE_FILES_DESCRIPTION"
dropdown-class="gl-md-max-w-50p"
dropdown-class="md:gl-max-w-1/2"
name="keep-n-duplicated-package-files"
data-testid="keep-n-duplicated-package-files-dropdown"
@input="onModelChange($event, 'keepNDuplicatedPackageFiles')"
@ -147,7 +147,7 @@ export default {
<p v-if="value.nextRunAt" data-testid="next-run-at">
{{ nextCleanupMessage }}
</p>
<div class="gl-mt-6 gl-display-flex gl-align-items-center">
<div class="gl-mt-6 gl-flex gl-items-center">
<gl-button
data-testid="save-button"
type="submit"

View File

@ -47,12 +47,12 @@ export default {
</script>
<template>
<div class="gl-display-flex gl-align-items-center">
<div class="gl-flex gl-items-center">
<gl-icon data-testid="base-icon" name="project" class="gl-mx-3 gl-min-w-0" />
<gl-link
data-testid="root-link"
class="gl-text-gray-500 gl-min-w-0"
class="gl-min-w-0 gl-text-gray-500"
:href="`/${rootLink}`"
:disabled="disabled"
>
@ -66,7 +66,7 @@ export default {
<span
v-gl-tooltip="{ title: path }"
data-testid="ellipsis-icon"
class="gl-shadow-inner-1-gray-200 gl-rounded-base gl-px-2 gl-min-w-0"
class="gl-min-w-0 gl-rounded-base gl-px-2 gl-shadow-inner-1-gray-200"
>
<gl-icon name="ellipsis_h" />
</span>
@ -75,7 +75,7 @@ export default {
<gl-link
data-testid="leaf-link"
class="gl-text-gray-500 gl-min-w-0"
class="gl-min-w-0 gl-text-gray-500"
:href="`/${path}`"
:disabled="disabled"
>

View File

@ -57,7 +57,7 @@ export default {
tagBadgeClass(index) {
return {
'gl-hidden': true,
'gl-display-flex': this.tagCount === 1,
'gl-flex': this.tagCount === 1,
'md:!gl-flex': this.tagCount > 1,
'gl-mr-2': index !== this.tagsToRender.length - 1,
'gl-ml-3': !this.hideLabel && index === 0,
@ -68,9 +68,9 @@ export default {
</script>
<template>
<div class="gl-display-flex gl-align-items-center">
<div v-if="!hideLabel" data-testid="tagLabel" class="gl-display-flex gl-align-items-center">
<gl-icon name="labels" class="gl-text-gray-500 gl-mr-3" />
<div class="gl-flex gl-items-center">
<div v-if="!hideLabel" data-testid="tagLabel" class="gl-flex gl-items-center">
<gl-icon name="labels" class="gl-mr-3 gl-text-gray-500" />
<span class="gl-font-bold">{{ tagsDisplay }}</span>
</div>
@ -89,7 +89,7 @@ export default {
data-testid="moreBadge"
variant="muted"
:title="moreTagsTooltip"
class="gl-hidden md:gl-flex gl-ml-2"
class="gl-ml-2 gl-hidden md:gl-flex"
><gl-sprintf :message="__('+%{tags} more')">
<template #tags>
{{ moreTagsDisplay }}
@ -101,7 +101,7 @@ export default {
v-if="moreTagsDisplay && hideLabel"
data-testid="moreBadge"
variant="muted"
class="md:gl-hidden gl-ml-2"
class="gl-ml-2 md:gl-hidden"
>{{ tagsDisplay }}</gl-badge
>
</div>

View File

@ -21,7 +21,7 @@ export default {
<template>
<div>
<div class="gl-flex-direction-column sm:gl-hidden" data-testid="mobile-loader">
<div class="gl-flex-col sm:gl-hidden" data-testid="mobile-loader">
<gl-skeleton-loader
v-for="index in $options.rowsToRender.mobile"
:key="index"
@ -36,7 +36,7 @@ export default {
<rect width="500" height="10" x="0" y="135" rx="4" />
</gl-skeleton-loader>
</div>
<div class="gl-hidden sm:gl-flex gl-flex-direction-column" data-testid="desktop-loader">
<div class="gl-hidden gl-flex-col sm:gl-flex" data-testid="desktop-loader">
<gl-skeleton-loader
v-for="index in $options.rowsToRender.desktop"
:key="index"

View File

@ -36,7 +36,7 @@ export default {
</script>
<template>
<div class="gl-display-flex gl-align-items-center">
<div class="gl-flex gl-items-center">
<template v-if="hasPipeline">
<gl-icon name="merge-request" class="gl-mr-2" />
<span data-testid="pipeline-ref" class="gl-mr-2">{{ packageEntity.pipeline.ref }}</span>

View File

@ -96,11 +96,8 @@ export default {
<template>
<div>
<div
v-if="!hiddenDelete"
class="gl-display-flex gl-justify-content-space-between gl-mb-3 gl-mt-5 gl-align-items-center"
>
<div class="gl-display-flex gl-align-items-center">
<div v-if="!hiddenDelete" class="gl-mb-3 gl-mt-5 gl-flex gl-items-center gl-justify-between">
<div class="gl-flex gl-items-center">
<gl-form-checkbox
class="gl-ml-2 gl-pt-2"
:aria-label="label"
@ -110,7 +107,7 @@ export default {
@change="onChange"
/>
<p class="gl-font-bold gl-mb-0">{{ title }}</p>
<p class="gl-mb-0 gl-font-bold">{{ title }}</p>
</div>
<gl-button
@ -124,7 +121,7 @@ export default {
</div>
<ul class="gl-pl-0">
<li v-for="(item, index) in items" :key="index" class="gl-list-style-none">
<li v-for="(item, index) in items" :key="index" class="gl-list-none">
<slot
:select-item="selectItem"
:is-selected="isSelected"
@ -134,7 +131,7 @@ export default {
</li>
</ul>
<div class="gl-display-flex gl-justify-content-center">
<div class="gl-flex gl-justify-center">
<gl-keyset-pagination
v-bind="pagination"
class="gl-mt-3"

View File

@ -95,6 +95,12 @@ export default {
descriptionVersion() {
return this.descriptionVersions[this.note.description_version_id];
},
singleLineDescription() {
return !this.descriptionVersion?.match(/\n/g);
},
deleteButtonClasses() {
return this.singleLineDescription ? 'gl-top-5 gl-right-2 gl-mt-2' : 'gl-top-6 gl-right-3';
},
isMergeRequest() {
return this.getNoteableData.noteableType === 'MergeRequest';
},
@ -212,11 +218,15 @@ export default {
<span>{{ __('Toggle commit list') }}</span>
</div>
</div>
<div v-if="shouldShowDescriptionVersion" class="description-version pt-2">
<div v-if="shouldShowDescriptionVersion" class="description-version gl-relative !gl-pt-3">
<pre v-if="isLoadingDescriptionVersion" class="loading-state">
<gl-skeleton-loader />
</pre>
<pre v-else v-safe-html="descriptionVersion" class="wrapper mt-2"></pre>
<pre
v-else
v-safe-html="descriptionVersion"
class="wrapper gl-mt-3 gl-whitespace-pre-wrap gl-pr-7"
></pre>
<gl-button
v-if="displayDeleteButton"
v-gl-tooltip
@ -225,7 +235,8 @@ export default {
variant="default"
category="tertiary"
icon="remove"
class="delete-description-history"
class="gl-absolute"
:class="deleteButtonClasses"
data-testid="delete-description-version-button"
@click="deleteDescriptionVersion"
/>

View File

@ -95,6 +95,12 @@ export default {
descriptionVersion() {
return this.descriptionVersions[this.descriptionVersionId];
},
singleLineDescription() {
return !this.descriptionVersion?.match(/\n/g);
},
deleteButtonClasses() {
return this.singleLineDescription ? 'gl-top-5 gl-right-2 gl-mt-2' : 'gl-top-6 gl-right-3';
},
},
mounted() {
renderGFM(this.$refs['gfm-content']);
@ -148,7 +154,10 @@ export default {
</note-header>
</div>
<div class="note-body">
<div v-if="shouldShowDescriptionVersion" class="description-version !gl-pt-3 gl-pl-4">
<div
v-if="shouldShowDescriptionVersion"
class="description-version gl-relative !gl-pt-3 gl-pl-4"
>
<pre v-if="isLoadingDescriptionVersion" class="loading-state">
<gl-skeleton-loader />
</pre>
@ -156,7 +165,7 @@ export default {
v-else
v-safe-html="descriptionVersion"
data-testid="description-version-diff"
class="wrapper gl-mt-3"
class="wrapper gl-mt-3 gl-whitespace-pre-wrap gl-pr-7"
></pre>
<gl-button
v-if="displayDeleteButton"
@ -166,7 +175,8 @@ export default {
variant="default"
category="tertiary"
icon="remove"
class="delete-description-history"
class="gl-absolute"
:class="deleteButtonClasses"
data-testid="delete-description-version-button"
@click="deleteDescriptionVersion"
/>

View File

@ -237,7 +237,7 @@ ul.related-merge-requests > li gl-emoji {
right: var(--application-bar-right);
width: auto;
top: $calc-application-header-height;
max-width: calc(100vw - #{$super-sidebar-width});
max-width: calc(100vw - var(--application-bar-left));
}
.limit-container-width {

View File

@ -415,20 +415,8 @@ $system-note-icon-m-left: $avatar-m-left + $icon-size-diff / $avatar-m-ratio;
margin-left: 1rem;
}
.description-version {
position: relative;
.btn.delete-description-history {
position: absolute;
top: 18px;
right: 10px;
}
pre {
max-height: $dropdown-max-height-lg;
white-space: pre-wrap;
padding-right: 30px;
}
.description-version pre {
max-height: $dropdown-max-height-lg;
}
.system-note-commit-list-toggler {

View File

@ -88,7 +88,7 @@ module Types
field :event_count,
GraphQL::Types::Int,
null: true,
description: 'Number of events of this alert.',
description: 'Number of events of the alert.',
method: :events
field :details, # rubocop:disable Graphql/JSONType

View File

@ -33,7 +33,7 @@ module Types
field :unicode_version,
GraphQL::Types::String,
null: false,
description: 'Unicode version for this emoji.'
description: 'Unicode version for the emoji.'
field :user,
Types::UserType,

View File

@ -15,7 +15,7 @@ module Types
description: 'ID (global ID) of the list.'
field :collapsed, GraphQL::Types::Boolean, null: true,
description: 'Indicates if the list is collapsed for this user.'
description: 'Indicates if the list is collapsed for the user.'
field :issues_count, GraphQL::Types::Int, null: true,
description: 'Count of issues in the list.'
field :label, Types::LabelType, null: true,

View File

@ -13,7 +13,7 @@ module Types
field :access_level_description,
type: GraphQL::Types::String,
null: false,
description: 'Human readable representation for this access level.',
description: 'Human readable representation for the access level.',
method: 'humanize'
end
end

View File

@ -11,12 +11,12 @@ module Types
field :merge_access_levels,
type: Types::BranchProtections::MergeAccessLevelType.connection_type,
null: true,
description: 'Details about who can merge when this branch is the source branch.'
description: 'Details about who can merge when the branch is the source branch.'
field :push_access_levels,
type: Types::BranchProtections::PushAccessLevelType.connection_type,
null: true,
description: 'Details about who can push when this branch is the source branch.'
description: 'Details about who can push when the branch is the source branch.'
field :allow_force_push,
type: GraphQL::Types::Boolean,

View File

@ -10,7 +10,7 @@ module Types
field :projects,
Types::ProjectType.connection_type,
null: false,
description: 'Allow list of projects that can be accessed by CI Job tokens created by this project.',
description: 'Allow list of projects that can be accessed by CI Job tokens created by the project.',
method: :outbound_projects,
deprecated: {
reason: 'The `projects` attribute is being deprecated. Use `outbound_allowlist`',

View File

@ -106,7 +106,7 @@ module Types
type: ::Types::Ci::JobType,
null: true,
authorize: :read_build,
description: 'Specific job in this pipeline, either by name or ID.' do
description: 'Specific job in the pipeline, either by name or ID.' do
argument :id,
type: ::Types::GlobalIDType[::CommitStatus],
required: false,
@ -129,7 +129,7 @@ module Types
description: 'Job where pipeline was triggered from.'
field :downstream, Types::Ci::PipelineType.connection_type, null: true,
description: 'Pipelines this pipeline will trigger.',
description: 'Pipelines the pipeline will trigger.',
method: :triggered_pipelines_with_preloads
field :upstream, Types::Ci::PipelineType, null: true,
@ -181,27 +181,27 @@ module Types
field :merge_request_event_type, Types::Ci::PipelineMergeRequestEventTypeEnum, null: true,
description: "Event type of the pipeline associated with a merge request."
field :total_jobs, GraphQL::Types::Int, null: false, method: :total_size, description: "The total number of jobs in the pipeline"
field :total_jobs, GraphQL::Types::Int, null: false, method: :total_size, description: "Total number of jobs in the pipeline."
field :failure_reason, GraphQL::Types::String, null: true, description: "The reason why the pipeline failed"
field :failure_reason, GraphQL::Types::String, null: true, description: "Reason why the pipeline failed."
field :triggered_by_path, GraphQL::Types::String, null: true, description: "The path that triggered this pipeline"
field :triggered_by_path, GraphQL::Types::String, null: true, description: "Path that triggered the pipeline."
field :source, GraphQL::Types::String, null: true, description: "The source of the pipeline"
field :source, GraphQL::Types::String, null: true, description: "Source of the pipeline."
field :child, GraphQL::Types::Boolean, null: false, method: :child?, description: "If the pipeline is a child or not"
field :child, GraphQL::Types::Boolean, null: false, method: :child?, description: "If the pipeline is a child or not."
field :latest, GraphQL::Types::Boolean, null: false, method: :latest?, calls_gitaly: true, description: "If the pipeline is the latest one or not"
field :latest, GraphQL::Types::Boolean, null: false, method: :latest?, calls_gitaly: true, description: "If the pipeline is the latest one or not."
field :ref_text, GraphQL::Types::String, null: false, description: "The reference text from the presenter", calls_gitaly: true
field :ref_text, GraphQL::Types::String, null: false, description: "Reference text from the presenter.", calls_gitaly: true
field :merge_request, Types::MergeRequestType, null: true, description: "The MR which the Pipeline is attached to"
field :merge_request, Types::MergeRequestType, null: true, description: "MR which the Pipeline is attached to."
field :stuck, GraphQL::Types::Boolean, method: :stuck?, null: false, description: "If the pipeline is stuck."
field :yaml_errors, GraphQL::Types::Boolean, method: :yaml_errors?, null: false, description: "If the pipeline has YAML errors."
field :yaml_error_messages, GraphQL::Types::String, method: :yaml_errors, null: true, description: "The pipeline YAML errors."
field :yaml_error_messages, GraphQL::Types::String, method: :yaml_errors, null: true, description: "Pipeline YAML errors."
field :trigger, GraphQL::Types::Boolean, method: :trigger?, null: false, description: "If the pipeline was created by a Trigger request."

View File

@ -38,7 +38,7 @@ module Types
value: :stale
value 'NEVER_CONTACTED',
description: 'Runner that has never contacted this instance.',
description: 'Runner that has never contacted the instance.',
value: :never_contacted
end
end

View File

@ -24,11 +24,11 @@ module Types
field :admin_url, GraphQL::Types::String, null: true,
description: 'Admin URL of the runner. Only available for administrators.'
field :contacted_at, Types::TimeType, null: true,
description: 'Timestamp of last contact from this runner.'
description: 'Timestamp of last contact from the runner.'
field :created_at, Types::TimeType, null: true,
description: 'Timestamp of creation of this runner.'
description: 'Timestamp of creation of the runner.'
field :created_by, Types::UserType, null: true,
description: 'User that created this runner.',
description: 'User that created the runner.',
method: :creator
field :creation_method, Types::Ci::RunnerCreationMethodEnum, null: true,
method: :registration_type,

View File

@ -5,10 +5,10 @@ module Types
# rubocop: disable Graphql/AuthorizeTypes
class RunnerWebUrlEdge < ::Types::BaseEdge
field :edit_url, GraphQL::Types::String, null: true,
description: 'Web URL of the runner edit page. The value depends on where you put this field in the query. You can use it for projects or groups.',
description: 'Web URL of the runner edit page. The value depends on where you put the field in the query. You can use it for projects or groups.',
extras: [:parent]
field :web_url, GraphQL::Types::String, null: true,
description: 'Web URL of the runner. The value depends on where you put this field in the query. You can use it for projects or groups.',
description: 'Web URL of the runner. The value depends on where you put the field in the query. You can use it for projects or groups.',
extras: [:parent]
def initialize(node, connection)

View File

@ -6,7 +6,7 @@ module Types
graphql_name 'StatusAction'
field :button_title, GraphQL::Types::String, null: true,
description: 'Title for the button, for example: Retry this job.'
description: 'Title for the button, for example: Retry the job.'
field :confirmation_message, GraphQL::Types::String, null: true,
description: 'Custom confirmation message for a manual job.',
alpha: { milestone: '17.0' }

View File

@ -11,7 +11,7 @@ module Types
field :cluster_agent,
Types::Clusters::AgentType,
description: 'Cluster agent this token is associated with.',
description: 'Cluster agent the token is associated with.',
null: true
field :created_at,

View File

@ -29,7 +29,7 @@ module Types
description: 'Name of the cluster agent.'
field :project, Types::ProjectType,
description: 'Project this cluster agent is associated with.',
description: 'Project the cluster agent is associated with.',
null: true,
authorize: :read_project

View File

@ -10,12 +10,12 @@ module Types
field :cadence, Types::ContainerExpirationPolicyCadenceEnum, null: false, description: 'This container expiration policy schedule.'
field :created_at, Types::TimeType, null: false, description: 'Timestamp of when the container expiration policy was created.'
field :enabled, GraphQL::Types::Boolean, null: false, description: 'Indicates whether this container expiration policy is enabled.'
field :enabled, GraphQL::Types::Boolean, null: false, description: 'Indicates whether the container expiration policy is enabled.'
field :keep_n, Types::ContainerExpirationPolicyKeepEnum, null: true, description: 'Number of tags to retain.'
field :name_regex, Types::UntrustedRegexp, null: true, description: 'Tags with names matching this regex pattern will expire.'
field :name_regex_keep, Types::UntrustedRegexp, null: true, description: 'Tags with names matching this regex pattern will be preserved.'
field :next_run_at, Types::TimeType, null: true, description: 'Next time that this container expiration policy will get executed.'
field :older_than, Types::ContainerExpirationPolicyOlderThanEnum, null: true, description: 'Tags older that this will expire.'
field :name_regex, Types::UntrustedRegexp, null: true, description: 'Tags with names matching the regex pattern will expire.'
field :name_regex_keep, Types::UntrustedRegexp, null: true, description: 'Tags with names matching the regex pattern will be preserved.'
field :next_run_at, Types::TimeType, null: true, description: 'Next time that the container expiration policy will get executed.'
field :older_than, Types::ContainerExpirationPolicyOlderThanEnum, null: true, description: 'Tags older than the given age will expire.'
field :updated_at, Types::TimeType, null: false, description: 'Timestamp of when the container expiration policy was updated.'
end
end

View File

@ -17,7 +17,7 @@ module Types
field :name, GraphQL::Types::String, null: false, description: 'Name of the tag.'
field :path, GraphQL::Types::String, null: false, description: 'Path of the tag.'
field :published_at, Types::TimeType, null: true, description: 'Timestamp when the tag was published.'
field :referrers, [Types::ContainerRepositoryReferrerType], null: true, description: 'Referrers for this tag.'
field :referrers, [Types::ContainerRepositoryReferrerType], null: true, description: 'Referrers for the tag.'
field :revision, GraphQL::Types::String, null: true, description: 'Revision of the tag.'
field :short_revision, GraphQL::Types::String, null: true, description: 'Short revision of the tag.'
field :total_size, GraphQL::Types::BigInt, null: true, description: 'Size of the tag.'

View File

@ -2435,7 +2435,7 @@
:tags: []
- :name: authorized_projects
:worker_name: AuthorizedProjectsWorker
:feature_category: :system_access
:feature_category: :permissions
:has_external_dependencies: false
:urgency: :high
:resource_boundary: :unknown

View File

@ -7,7 +7,7 @@ class AuthorizedProjectsWorker
sidekiq_options retry: 3
feature_category :system_access
feature_category :permissions
urgency :high
weight 2
idempotent!

View File

@ -7,7 +7,7 @@ feature_categories:
description: Stores a subset of the Finding data which is used to optimize the pipeline security tab
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40368
milestone: '13.4'
gitlab_schema: gitlab_main_cell
gitlab_schema: gitlab_sec
allow_cross_foreign_keys:
- gitlab_main_clusterwide
sharding_key_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/454949

View File

@ -0,0 +1,27 @@
# frozen_string_literal: true
class RemoteDeplicatedAgentConfig < Gitlab::Database::Migration[2.2]
milestone '17.4'
restrict_gitlab_migration gitlab_schema: :gitlab_main
class RemoteDevelopmentAgentConfig < MigrationRecord
self.table_name = 'remote_development_agent_configs'
end
def up
latest_ids = RemoteDevelopmentAgentConfig.select("DISTINCT ON (cluster_agent_id) id")
.order("cluster_agent_id, updated_at DESC")
.map(&:id)
::Gitlab::AppLogger.warn(
message: 'removing duplicated agent configs from migration',
agent_config_latest_ids: latest_ids
)
RemoteDevelopmentAgentConfig.where.not(id: latest_ids).delete_all
end
def down
# removing duplicated agent config is irreversible
end
end

View File

@ -0,0 +1,19 @@
# frozen_string_literal: true
class AddUniqueConstraintToRemoteDevelopmentAgentConfigs < Gitlab::Database::Migration[2.2]
disable_ddl_transaction!
milestone '17.4'
INDEX_NAME = 'index_remote_development_agent_configs_on_unique_agent_id'
EXISTING_INDEX_NAME = 'index_remote_development_agent_configs_on_cluster_agent_id'
def up
add_concurrent_index :remote_development_agent_configs, :cluster_agent_id, name: INDEX_NAME, unique: true
remove_concurrent_index_by_name :remote_development_agent_configs, EXISTING_INDEX_NAME
end
def down
add_concurrent_index :remote_development_agent_configs, :cluster_agent_id, name: EXISTING_INDEX_NAME
remove_concurrent_index_by_name :remote_development_agent_configs, INDEX_NAME
end
end

View File

@ -0,0 +1 @@
339b71e75f375c29d3b9b09c306018f185463fb84aebc68a07df12d029589973

View File

@ -0,0 +1 @@
252acaec01a8da80da3b769b6b83ed251bca1bae7a8fb4ccdf70a9a2d53d421a

View File

@ -29592,10 +29592,10 @@ CREATE UNIQUE INDEX index_releases_on_project_tag_unique ON releases USING btree
CREATE INDEX index_releases_on_released_at ON releases USING btree (released_at);
CREATE INDEX index_remote_development_agent_configs_on_cluster_agent_id ON remote_development_agent_configs USING btree (cluster_agent_id);
CREATE INDEX index_remote_development_agent_configs_on_project_id ON remote_development_agent_configs USING btree (project_id);
CREATE UNIQUE INDEX index_remote_development_agent_configs_on_unique_agent_id ON remote_development_agent_configs USING btree (cluster_agent_id);
CREATE INDEX index_remote_mirrors_on_last_successful_update_at ON remote_mirrors USING btree (last_successful_update_at);
CREATE INDEX index_remote_mirrors_on_project_id ON remote_mirrors USING btree (project_id);

View File

@ -9308,11 +9308,11 @@ Input type: `UpdateContainerExpirationPolicyInput`
| ---- | ---- | ----------- |
| <a id="mutationupdatecontainerexpirationpolicycadence"></a>`cadence` | [`ContainerExpirationPolicyCadenceEnum`](#containerexpirationpolicycadenceenum) | This container expiration policy schedule. |
| <a id="mutationupdatecontainerexpirationpolicyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationupdatecontainerexpirationpolicyenabled"></a>`enabled` | [`Boolean`](#boolean) | Indicates whether this container expiration policy is enabled. |
| <a id="mutationupdatecontainerexpirationpolicyenabled"></a>`enabled` | [`Boolean`](#boolean) | Indicates whether the container expiration policy is enabled. |
| <a id="mutationupdatecontainerexpirationpolicykeepn"></a>`keepN` | [`ContainerExpirationPolicyKeepEnum`](#containerexpirationpolicykeepenum) | Number of tags to retain. |
| <a id="mutationupdatecontainerexpirationpolicynameregex"></a>`nameRegex` | [`UntrustedRegexp`](#untrustedregexp) | Tags with names matching this regex pattern will expire. |
| <a id="mutationupdatecontainerexpirationpolicynameregexkeep"></a>`nameRegexKeep` | [`UntrustedRegexp`](#untrustedregexp) | Tags with names matching this regex pattern will be preserved. |
| <a id="mutationupdatecontainerexpirationpolicyolderthan"></a>`olderThan` | [`ContainerExpirationPolicyOlderThanEnum`](#containerexpirationpolicyolderthanenum) | Tags older that this will expire. |
| <a id="mutationupdatecontainerexpirationpolicynameregex"></a>`nameRegex` | [`UntrustedRegexp`](#untrustedregexp) | Tags with names matching the regex pattern will expire. |
| <a id="mutationupdatecontainerexpirationpolicynameregexkeep"></a>`nameRegexKeep` | [`UntrustedRegexp`](#untrustedregexp) | Tags with names matching the regex pattern will be preserved. |
| <a id="mutationupdatecontainerexpirationpolicyolderthan"></a>`olderThan` | [`ContainerExpirationPolicyOlderThanEnum`](#containerexpirationpolicyolderthanenum) | Tags older than the given age will expire. |
| <a id="mutationupdatecontainerexpirationpolicyprojectpath"></a>`projectPath` | [`ID!`](#id) | Project path where the container expiration policy is located. |
#### Fields
@ -11664,9 +11664,9 @@ The edge type for [`CiRunner`](#cirunner).
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="cirunneredgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="cirunneredgeediturl"></a>`editUrl` | [`String`](#string) | Web URL of the runner edit page. The value depends on where you put this field in the query. You can use it for projects or groups. |
| <a id="cirunneredgeediturl"></a>`editUrl` | [`String`](#string) | Web URL of the runner edit page. The value depends on where you put the field in the query. You can use it for projects or groups. |
| <a id="cirunneredgenode"></a>`node` | [`CiRunner`](#cirunner) | The item at the end of the edge. |
| <a id="cirunneredgeweburl"></a>`webUrl` | [`String`](#string) | Web URL of the runner. The value depends on where you put this field in the query. You can use it for projects or groups. |
| <a id="cirunneredgeweburl"></a>`webUrl` | [`String`](#string) | Web URL of the runner. The value depends on where you put the field in the query. You can use it for projects or groups. |
#### `CiRunnerManagerConnection`
@ -17181,7 +17181,7 @@ Describes an alert from the project's Alert Management.
| <a id="alertmanagementalertdiscussions"></a>`discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. (see [Connections](#connections)) |
| <a id="alertmanagementalertendedat"></a>`endedAt` | [`Time`](#time) | Timestamp the alert ended. |
| <a id="alertmanagementalertenvironment"></a>`environment` | [`Environment`](#environment) | Environment for the alert. |
| <a id="alertmanagementalerteventcount"></a>`eventCount` | [`Int`](#int) | Number of events of this alert. |
| <a id="alertmanagementalerteventcount"></a>`eventCount` | [`Int`](#int) | Number of events of the alert. |
| <a id="alertmanagementalerthosts"></a>`hosts` | [`[String!]`](#string) | List of hosts the alert came from. |
| <a id="alertmanagementalertid"></a>`id` | [`ID!`](#id) | ID of the alert. |
| <a id="alertmanagementalertiid"></a>`iid` | [`String!`](#string) | Internal ID of the alert. |
@ -17918,7 +17918,7 @@ An emoji awarded by a user.
| <a id="awardemojiemoji"></a>`emoji` | [`String!`](#string) | Emoji as an icon. |
| <a id="awardemojiname"></a>`name` | [`String!`](#string) | Emoji name. |
| <a id="awardemojiunicode"></a>`unicode` | [`String!`](#string) | Emoji in Unicode. |
| <a id="awardemojiunicodeversion"></a>`unicodeVersion` | [`String!`](#string) | Unicode version for this emoji. |
| <a id="awardemojiunicodeversion"></a>`unicodeVersion` | [`String!`](#string) | Unicode version for the emoji. |
| <a id="awardemojiuser"></a>`user` | [`UserCore!`](#usercore) | User who awarded the emoji. |
### `BaseService`
@ -18263,7 +18263,7 @@ Represents a list for an issue board.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="boardlistassignee"></a>`assignee` | [`UserCore`](#usercore) | Assignee in the list. |
| <a id="boardlistcollapsed"></a>`collapsed` | [`Boolean`](#boolean) | Indicates if the list is collapsed for this user. |
| <a id="boardlistcollapsed"></a>`collapsed` | [`Boolean`](#boolean) | Indicates if the list is collapsed for the user. |
| <a id="boardlistid"></a>`id` | [`ID!`](#id) | ID (global ID) of the list. |
| <a id="boardlistissuescount"></a>`issuesCount` | [`Int`](#int) | Count of issues in the list. |
| <a id="boardlistiteration"></a>`iteration` | [`Iteration`](#iteration) | Iteration of the list. |
@ -18314,8 +18314,8 @@ Branch protection details for a branch rule.
| ---- | ---- | ----------- |
| <a id="branchprotectionallowforcepush"></a>`allowForcePush` | [`Boolean!`](#boolean) | Toggle force push to the branch for users with write access. |
| <a id="branchprotectioncodeownerapprovalrequired"></a>`codeOwnerApprovalRequired` | [`Boolean!`](#boolean) | Enforce code owner approvals before allowing a merge. |
| <a id="branchprotectionmergeaccesslevels"></a>`mergeAccessLevels` | [`MergeAccessLevelConnection`](#mergeaccesslevelconnection) | Details about who can merge when this branch is the source branch. (see [Connections](#connections)) |
| <a id="branchprotectionpushaccesslevels"></a>`pushAccessLevels` | [`PushAccessLevelConnection`](#pushaccesslevelconnection) | Details about who can push when this branch is the source branch. (see [Connections](#connections)) |
| <a id="branchprotectionmergeaccesslevels"></a>`mergeAccessLevels` | [`MergeAccessLevelConnection`](#mergeaccesslevelconnection) | Details about who can merge when the branch is the source branch. (see [Connections](#connections)) |
| <a id="branchprotectionpushaccesslevels"></a>`pushAccessLevels` | [`PushAccessLevelConnection`](#pushaccesslevelconnection) | Details about who can push when the branch is the source branch. (see [Connections](#connections)) |
| <a id="branchprotectionunprotectaccesslevels"></a>`unprotectAccessLevels` | [`UnprotectAccessLevelConnection`](#unprotectaccesslevelconnection) | Details about who can unprotect this branch. (see [Connections](#connections)) |
### `BranchRule`
@ -18817,9 +18817,9 @@ CI/CD variables for a project.
| <a id="cirunneraccesslevel"></a>`accessLevel` | [`CiRunnerAccessLevel!`](#cirunneraccesslevel) | Access level of the runner. |
| <a id="cirunneractive"></a>`active` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 14.8. Use paused. |
| <a id="cirunneradminurl"></a>`adminUrl` | [`String`](#string) | Admin URL of the runner. Only available for administrators. |
| <a id="cirunnercontactedat"></a>`contactedAt` | [`Time`](#time) | Timestamp of last contact from this runner. |
| <a id="cirunnercreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp of creation of this runner. |
| <a id="cirunnercreatedby"></a>`createdBy` | [`UserCore`](#usercore) | User that created this runner. |
| <a id="cirunnercontactedat"></a>`contactedAt` | [`Time`](#time) | Timestamp of last contact from the runner. |
| <a id="cirunnercreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp of creation of the runner. |
| <a id="cirunnercreatedby"></a>`createdBy` | [`UserCore`](#usercore) | User that created the runner. |
| <a id="cirunnercreationmethod"></a>`creationMethod` **{warning-solid}** | [`CiRunnerCreationMethod`](#cirunnercreationmethod) | **Introduced** in GitLab 17.0. **Status**: Experiment. Type of runner registration. |
| <a id="cirunnerdescription"></a>`description` | [`String`](#string) | Description of the runner. |
| <a id="cirunnereditadminurl"></a>`editAdminUrl` | [`String`](#string) | Admin form URL of the runner. Only available for administrators. |
@ -19090,7 +19090,7 @@ GitLab CI/CD configuration template.
| <a id="clusteragentcreatedbyuser"></a>`createdByUser` | [`UserCore`](#usercore) | User object, containing information about the person who created the agent. |
| <a id="clusteragentid"></a>`id` | [`ID!`](#id) | ID of the cluster agent. |
| <a id="clusteragentname"></a>`name` | [`String`](#string) | Name of the cluster agent. |
| <a id="clusteragentproject"></a>`project` | [`Project`](#project) | Project this cluster agent is associated with. |
| <a id="clusteragentproject"></a>`project` | [`Project`](#project) | Project the cluster agent is associated with. |
| <a id="clusteragentremotedevelopmentagentconfig"></a>`remoteDevelopmentAgentConfig` | [`RemoteDevelopmentAgentConfig`](#remotedevelopmentagentconfig) | Remote development agent config for the cluster agent. |
| <a id="clusteragenttokens"></a>`tokens` | [`ClusterAgentTokenConnection`](#clusteragenttokenconnection) | Tokens associated with the cluster agent. (see [Connections](#connections)) |
| <a id="clusteragentupdatedat"></a>`updatedAt` | [`Time`](#time) | Timestamp the cluster agent was updated. |
@ -19154,7 +19154,7 @@ four standard [pagination arguments](#pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="clusteragenttokenclusteragent"></a>`clusterAgent` | [`ClusterAgent`](#clusteragent) | Cluster agent this token is associated with. |
| <a id="clusteragenttokenclusteragent"></a>`clusterAgent` | [`ClusterAgent`](#clusteragent) | Cluster agent the token is associated with. |
| <a id="clusteragenttokencreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp the token was created. |
| <a id="clusteragenttokencreatedbyuser"></a>`createdByUser` | [`UserCore`](#usercore) | User who created the token. |
| <a id="clusteragenttokendescription"></a>`description` | [`String`](#string) | Description of the token. |
@ -19572,12 +19572,12 @@ A tag expiration policy designed to keep only the images that matter most.
| ---- | ---- | ----------- |
| <a id="containerexpirationpolicycadence"></a>`cadence` | [`ContainerExpirationPolicyCadenceEnum!`](#containerexpirationpolicycadenceenum) | This container expiration policy schedule. |
| <a id="containerexpirationpolicycreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of when the container expiration policy was created. |
| <a id="containerexpirationpolicyenabled"></a>`enabled` | [`Boolean!`](#boolean) | Indicates whether this container expiration policy is enabled. |
| <a id="containerexpirationpolicyenabled"></a>`enabled` | [`Boolean!`](#boolean) | Indicates whether the container expiration policy is enabled. |
| <a id="containerexpirationpolicykeepn"></a>`keepN` | [`ContainerExpirationPolicyKeepEnum`](#containerexpirationpolicykeepenum) | Number of tags to retain. |
| <a id="containerexpirationpolicynameregex"></a>`nameRegex` | [`UntrustedRegexp`](#untrustedregexp) | Tags with names matching this regex pattern will expire. |
| <a id="containerexpirationpolicynameregexkeep"></a>`nameRegexKeep` | [`UntrustedRegexp`](#untrustedregexp) | Tags with names matching this regex pattern will be preserved. |
| <a id="containerexpirationpolicynextrunat"></a>`nextRunAt` | [`Time`](#time) | Next time that this container expiration policy will get executed. |
| <a id="containerexpirationpolicyolderthan"></a>`olderThan` | [`ContainerExpirationPolicyOlderThanEnum`](#containerexpirationpolicyolderthanenum) | Tags older that this will expire. |
| <a id="containerexpirationpolicynameregex"></a>`nameRegex` | [`UntrustedRegexp`](#untrustedregexp) | Tags with names matching the regex pattern will expire. |
| <a id="containerexpirationpolicynameregexkeep"></a>`nameRegexKeep` | [`UntrustedRegexp`](#untrustedregexp) | Tags with names matching the regex pattern will be preserved. |
| <a id="containerexpirationpolicynextrunat"></a>`nextRunAt` | [`Time`](#time) | Next time that the container expiration policy will get executed. |
| <a id="containerexpirationpolicyolderthan"></a>`olderThan` | [`ContainerExpirationPolicyOlderThanEnum`](#containerexpirationpolicyolderthanenum) | Tags older than the given age will expire. |
| <a id="containerexpirationpolicyupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp of when the container expiration policy was updated. |
### `ContainerRegistryProtectionRule`
@ -19735,7 +19735,7 @@ A tag from a container repository.
| <a id="containerrepositorytagname"></a>`name` | [`String!`](#string) | Name of the tag. |
| <a id="containerrepositorytagpath"></a>`path` | [`String!`](#string) | Path of the tag. |
| <a id="containerrepositorytagpublishedat"></a>`publishedAt` | [`Time`](#time) | Timestamp when the tag was published. |
| <a id="containerrepositorytagreferrers"></a>`referrers` | [`[ContainerRepositoryReferrer!]`](#containerrepositoryreferrer) | Referrers for this tag. |
| <a id="containerrepositorytagreferrers"></a>`referrers` | [`[ContainerRepositoryReferrer!]`](#containerrepositoryreferrer) | Referrers for the tag. |
| <a id="containerrepositorytagrevision"></a>`revision` | [`String`](#string) | Revision of the tag. |
| <a id="containerrepositorytagshortrevision"></a>`shortRevision` | [`String`](#string) | Short revision of the tag. |
| <a id="containerrepositorytagtotalsize"></a>`totalSize` | [`BigInt`](#bigint) | Size of the tag. |
@ -25095,7 +25095,7 @@ Defines which user roles, users, or groups can merge into a protected branch.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mergeaccesslevelaccesslevel"></a>`accessLevel` | [`Int!`](#int) | GitLab::Access level. |
| <a id="mergeaccesslevelaccessleveldescription"></a>`accessLevelDescription` | [`String!`](#string) | Human readable representation for this access level. |
| <a id="mergeaccesslevelaccessleveldescription"></a>`accessLevelDescription` | [`String!`](#string) | Human readable representation for the access level. |
| <a id="mergeaccesslevelgroup"></a>`group` | [`AccessLevelGroup`](#accesslevelgroup) | Group associated with this access level. |
| <a id="mergeaccessleveluser"></a>`user` | [`AccessLevelUser`](#accessleveluser) | User associated with this access level. |
@ -28195,16 +28195,16 @@ Returns [`UserMergeRequestInteraction`](#usermergerequestinteraction).
| <a id="pipelinecreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of the pipeline's creation. |
| <a id="pipelinedastprofile"></a>`dastProfile` | [`DastProfile`](#dastprofile) | DAST profile associated with the pipeline. |
| <a id="pipelinedetailedstatus"></a>`detailedStatus` | [`DetailedStatus!`](#detailedstatus) | Detailed status of the pipeline. |
| <a id="pipelinedownstream"></a>`downstream` | [`PipelineConnection`](#pipelineconnection) | Pipelines this pipeline will trigger. (see [Connections](#connections)) |
| <a id="pipelinedownstream"></a>`downstream` | [`PipelineConnection`](#pipelineconnection) | Pipelines the pipeline will trigger. (see [Connections](#connections)) |
| <a id="pipelineduration"></a>`duration` | [`Int`](#int) | Duration of the pipeline in seconds. |
| <a id="pipelinefailurereason"></a>`failureReason` | [`String`](#string) | The reason why the pipeline failed. |
| <a id="pipelinefailurereason"></a>`failureReason` | [`String`](#string) | Reason why the pipeline failed. |
| <a id="pipelinefinishedat"></a>`finishedAt` | [`Time`](#time) | Timestamp of the pipeline's completion. |
| <a id="pipelineid"></a>`id` | [`ID!`](#id) | ID of the pipeline. |
| <a id="pipelineiid"></a>`iid` | [`String!`](#string) | Internal ID of the pipeline. |
| <a id="pipelinejobartifacts"></a>`jobArtifacts` | [`[CiJobArtifact!]`](#cijobartifact) | Job artifacts of the pipeline. |
| <a id="pipelinelatest"></a>`latest` | [`Boolean!`](#boolean) | If the pipeline is the latest one or not. |
| <a id="pipelinemanualvariables"></a>`manualVariables` | [`PipelineManualVariableConnection`](#pipelinemanualvariableconnection) | CI/CD variables added to a manual pipeline. (see [Connections](#connections)) |
| <a id="pipelinemergerequest"></a>`mergeRequest` | [`MergeRequest`](#mergerequest) | The MR which the Pipeline is attached to. |
| <a id="pipelinemergerequest"></a>`mergeRequest` | [`MergeRequest`](#mergerequest) | MR which the Pipeline is attached to. |
| <a id="pipelinemergerequesteventtype"></a>`mergeRequestEventType` | [`PipelineMergeRequestEventType`](#pipelinemergerequesteventtype) | Event type of the pipeline associated with a merge request. |
| <a id="pipelinename"></a>`name` | [`String`](#string) | Name of the pipeline. |
| <a id="pipelinepath"></a>`path` | [`String`](#string) | Relative path to the pipeline's page. |
@ -28212,19 +28212,19 @@ Returns [`UserMergeRequestInteraction`](#usermergerequestinteraction).
| <a id="pipelinequeuedduration"></a>`queuedDuration` | [`Duration`](#duration) | How long the pipeline was queued before starting. |
| <a id="pipelineref"></a>`ref` | [`String`](#string) | Reference to the branch from which the pipeline was triggered. |
| <a id="pipelinerefpath"></a>`refPath` | [`String`](#string) | Reference path to the branch from which the pipeline was triggered. |
| <a id="pipelinereftext"></a>`refText` | [`String!`](#string) | The reference text from the presenter. |
| <a id="pipelinereftext"></a>`refText` | [`String!`](#string) | Reference text from the presenter. |
| <a id="pipelineretryable"></a>`retryable` | [`Boolean!`](#boolean) | Specifies if a pipeline's jobs can be retried. |
| <a id="pipelinesecurityreportsummary"></a>`securityReportSummary` | [`SecurityReportSummary`](#securityreportsummary) | Vulnerability and scanned resource counts for each security scanner of the pipeline. |
| <a id="pipelinesource"></a>`source` | [`String`](#string) | The source of the pipeline. |
| <a id="pipelinesource"></a>`source` | [`String`](#string) | Source of the pipeline. |
| <a id="pipelinesourcejob"></a>`sourceJob` | [`CiJob`](#cijob) | Job where pipeline was triggered from. |
| <a id="pipelinestages"></a>`stages` | [`CiStageConnection`](#cistageconnection) | Stages of the pipeline. (see [Connections](#connections)) |
| <a id="pipelinestartedat"></a>`startedAt` | [`Time`](#time) | Timestamp when the pipeline was started. |
| <a id="pipelinestatus"></a>`status` | [`PipelineStatusEnum!`](#pipelinestatusenum) | Status of the pipeline (CREATED, WAITING_FOR_RESOURCE, PREPARING, WAITING_FOR_CALLBACK, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, CANCELING, SKIPPED, MANUAL, SCHEDULED). |
| <a id="pipelinestuck"></a>`stuck` | [`Boolean!`](#boolean) | If the pipeline is stuck. |
| <a id="pipelinetestreportsummary"></a>`testReportSummary` | [`TestReportSummary!`](#testreportsummary) | Summary of the test report generated by the pipeline. |
| <a id="pipelinetotaljobs"></a>`totalJobs` | [`Int!`](#int) | The total number of jobs in the pipeline. |
| <a id="pipelinetotaljobs"></a>`totalJobs` | [`Int!`](#int) | Total number of jobs in the pipeline. |
| <a id="pipelinetrigger"></a>`trigger` | [`Boolean!`](#boolean) | If the pipeline was created by a Trigger request. |
| <a id="pipelinetriggeredbypath"></a>`triggeredByPath` | [`String`](#string) | The path that triggered this pipeline. |
| <a id="pipelinetriggeredbypath"></a>`triggeredByPath` | [`String`](#string) | Path that triggered the pipeline. |
| <a id="pipelineupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp of the pipeline's last activity. |
| <a id="pipelineupstream"></a>`upstream` | [`Pipeline`](#pipeline) | Pipeline that triggered the pipeline. |
| <a id="pipelineuser"></a>`user` | [`UserCore`](#usercore) | Pipeline user. |
@ -28232,14 +28232,14 @@ Returns [`UserMergeRequestInteraction`](#usermergerequestinteraction).
| <a id="pipelineusesneeds"></a>`usesNeeds` | [`Boolean`](#boolean) | Indicates if the pipeline has jobs with `needs` dependencies. |
| <a id="pipelinewarningmessages"></a>`warningMessages` | [`[PipelineMessage!]`](#pipelinemessage) | Pipeline warning messages. |
| <a id="pipelinewarnings"></a>`warnings` | [`Boolean!`](#boolean) | Indicates if a pipeline has warnings. |
| <a id="pipelineyamlerrormessages"></a>`yamlErrorMessages` | [`String`](#string) | The pipeline YAML errors. |
| <a id="pipelineyamlerrormessages"></a>`yamlErrorMessages` | [`String`](#string) | Pipeline YAML errors. |
| <a id="pipelineyamlerrors"></a>`yamlErrors` | [`Boolean!`](#boolean) | If the pipeline has YAML errors. |
#### Fields with arguments
##### `Pipeline.job`
Specific job in this pipeline, either by name or ID.
Specific job in the pipeline, either by name or ID.
Returns [`CiJob`](#cijob).
@ -31094,7 +31094,7 @@ Defines which user roles, users, or groups can push to a protected branch.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="pushaccesslevelaccesslevel"></a>`accessLevel` | [`Int!`](#int) | GitLab::Access level. |
| <a id="pushaccesslevelaccessleveldescription"></a>`accessLevelDescription` | [`String!`](#string) | Human readable representation for this access level. |
| <a id="pushaccesslevelaccessleveldescription"></a>`accessLevelDescription` | [`String!`](#string) | Human readable representation for the access level. |
| <a id="pushaccessleveldeploykey"></a>`deployKey` | [`AccessLevelDeployKey`](#accessleveldeploykey) | Deploy key assigned to the access level. |
| <a id="pushaccesslevelgroup"></a>`group` | [`AccessLevelGroup`](#accesslevelgroup) | Group associated with this access level. |
| <a id="pushaccessleveluser"></a>`user` | [`AccessLevelUser`](#accessleveluser) | User associated with this access level. |
@ -32204,7 +32204,7 @@ Progress of standards adherence checks.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="statusactionbuttontitle"></a>`buttonTitle` | [`String`](#string) | Title for the button, for example: Retry this job. |
| <a id="statusactionbuttontitle"></a>`buttonTitle` | [`String`](#string) | Title for the button, for example: Retry the job. |
| <a id="statusactionconfirmationmessage"></a>`confirmationMessage` **{warning-solid}** | [`String`](#string) | **Introduced** in GitLab 17.0. **Status**: Experiment. Custom confirmation message for a manual job. |
| <a id="statusactionicon"></a>`icon` | [`String`](#string) | Icon used in the action button. |
| <a id="statusactionid"></a>`id` | [`String!`](#string) | ID for a status action. |
@ -32734,7 +32734,7 @@ Defines which user roles, users, or groups can unprotect a protected branch.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="unprotectaccesslevelaccesslevel"></a>`accessLevel` | [`Int!`](#int) | GitLab::Access level. |
| <a id="unprotectaccesslevelaccessleveldescription"></a>`accessLevelDescription` | [`String!`](#string) | Human readable representation for this access level. |
| <a id="unprotectaccesslevelaccessleveldescription"></a>`accessLevelDescription` | [`String!`](#string) | Human readable representation for the access level. |
| <a id="unprotectaccesslevelgroup"></a>`group` | [`AccessLevelGroup`](#accesslevelgroup) | Group associated with this access level. |
| <a id="unprotectaccessleveluser"></a>`user` | [`AccessLevelUser`](#accessleveluser) | User associated with this access level. |
@ -35177,7 +35177,7 @@ Values for sorting runners.
| Value | Description |
| ----- | ----------- |
| <a id="cirunnerstatusactive"></a>`ACTIVE` **{warning-solid}** | **Deprecated** in GitLab 14.6. This was renamed. Use: [`CiRunner.paused`](#cirunnerpaused). |
| <a id="cirunnerstatusnever_contacted"></a>`NEVER_CONTACTED` | Runner that has never contacted this instance. |
| <a id="cirunnerstatusnever_contacted"></a>`NEVER_CONTACTED` | Runner that has never contacted the instance. |
| <a id="cirunnerstatusoffline"></a>`OFFLINE` | Runner that has not contacted this instance within the last 2 hours. Will be considered `STALE` if offline for more than 7 days. |
| <a id="cirunnerstatusonline"></a>`ONLINE` | Runner that contacted this instance within the last 2 hours. |
| <a id="cirunnerstatuspaused"></a>`PAUSED` **{warning-solid}** | **Deprecated** in GitLab 14.6. This was renamed. Use: [`CiRunner.paused`](#cirunnerpaused). |

View File

@ -2659,6 +2659,7 @@ PUT /groups/:id/push_rule
| `commit_committer_name_check` | boolean | no | Users can only push commits to this repository if the commit author name is consistent with their GitLab account name |
| `reject_unsigned_commits` | boolean | no | Reject commit when its not signed |
| `reject_non_dco_commits` | boolean | no | Reject commit when its not DCO certified |
<!-- markdownlint-enable MD056 -->
```shell

View File

@ -33,6 +33,7 @@ For example:
- [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner)
- [Gitaly](https://gitlab.com/gitlab-org/gitaly)
- [GLab](https://gitlab.com/gitlab-org/cli)
- [GitLab Terraform Provider](https://gitlab.com/gitlab-org/terraform-provider-gitlab)
We have [development style guides for each technology](style_guides.md) to help you align with our coding standards.
@ -47,7 +48,10 @@ Select the appropriate template and add all the necessary information about the
That way you can get more guidance and support.
If you're not sure what to work on, you can
[view issues with the `~quick win` label](https://gitlab.com/groups/gitlab-org/-/issues/?label_name%5B%5D=quick%20win).
[view issues with the `~quick win` label](https://gitlab.com/groups/gitlab-org/-/issues/?sort=created_asc&state=opened&label_name%5B%5D=quick%20win&first_page_size=100),
and filter specifically for [documentation `~quick win`](https://gitlab.com/groups/gitlab-org/-/issues/?sort=created_asc&state=opened&label_name%5B%5D=quick%20win&label_name%5B%5D=documentation&first_page_size=100),
[backend `~quick win`](https://gitlab.com/groups/gitlab-org/-/issues/?sort=created_asc&state=opened&label_name%5B%5D=quick%20win&label_name%5B%5D=backend&first_page_size=100),
or [frontend `~quick win`](https://gitlab.com/groups/gitlab-org/-/issues/?sort=created_asc&state=opened&label_name%5B%5D=quick%20win&label_name%5B%5D=frontend&first_page_size=100).
When you find an issue you want to work on, leave a comment on it.
This helps the GitLab team and members of the wider GitLab community know that you will be working on that issue.
@ -55,6 +59,7 @@ This helps the GitLab team and members of the wider GitLab community know that y
This is a good opportunity to [validate the issue](issue_workflow.md#clarifyingvalidating-an-issue).
Confirm that the issue is still valid, clarify your intended approach, and ask if a feature or change is likely to be accepted.
You do not need to be assigned to the issue to get started.
If the issue already has an assignee, ask if they are still working on the issue or if they would like to collaborate.
For details, see [the issues workflow](issue_workflow.md).

View File

@ -1,7 +1,7 @@
---
stage: Monitor
group: Observability
description: Track errors, application performance issues and manage incident response
description: Track errors, application performance issues, and manage incident response.
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
@ -9,7 +9,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Visualize and analyze errors, traces, metrics and logs collected from your application and its infrastructure. Monitor, identify and resolve performance issues and incidents collaboratively.
| | | |
|--|--|--|
| [**Getting started**](../user/get_started/get_started_monitoring.md) **{chevron-right}** | [**Error tracking**](error_tracking.md) **{chevron-right}** | [**Distributed tracing**](tracing.md) **{chevron-right}** |
| [**Metrics**](metrics.md) **{chevron-right}** | [**Logs**](logs.md) **{chevron-right}** | [**Incident management**](incident_management/index.md) **{chevron-right}** |
| [**Getting started**](../user/get_started/get_started_monitoring.md) **{chevron-right}**<br><br>Overview of how features fit together. | [**Error tracking**](error_tracking.md) **{chevron-right}**<br><br>Error tracking, logging, debugging, data retention. | [**Distributed tracing**](tracing.md) **{chevron-right}**<br><br>Monitoring, troubleshooting, performance analysis, request tracking. |
| [**Metrics**](metrics.md) **{chevron-right}**<br><br>Monitoring, visualization, aggregation, analysis, retention. | [**Logs**](logs.md) **{chevron-right}**<br><br>Centralized logging, analysis, configuration, viewing, filtering. | [**Incident management**](incident_management/index.md) **{chevron-right}**<br><br>Alert handling, response coordination, escalation procedures. |

View File

@ -11,9 +11,9 @@ Use CI/CD to generate your application.
| | | |
|--|--|--|
| [**Getting started**](../ci/index.md) **{chevron-right}** | [**CI/CD YAML syntax reference**](../ci/yaml/index.md) **{chevron-right}** | [**Runners**](https://docs.gitlab.com/runner/) **{chevron-right}** |
| [**Pipelines**](../ci/pipelines/index.md) **{chevron-right}** | [**Jobs**](../ci/jobs/index.md) **{chevron-right}** | [**CI/CD components**](../ci/components/index.md) **{chevron-right}** |
| [**Variables**](../ci/variables/index.md) **{chevron-right}** | [**Pipeline security**](../ci/pipelines/pipeline_security.md) **{chevron-right}** | [**Services**](../ci/services/index.md) **{chevron-right}** |
| [**Auto DevOps**](autodevops/index.md) **{chevron-right}** | [**Testing**](../ci/testing/index.md) **{chevron-right}** | [**SSH keys**](../ci/ssh_keys/index.md) **{chevron-right}** |
| [**ChatOps**](../ci/chatops/index.md) **{chevron-right}** | [**Mobile DevOps**](../ci/mobile_devops.md) **{chevron-right}** | [**Google cloud integration**](../ci/gitlab_google_cloud_integration/index.md) **{chevron-right}** |
|[**External repository integrations**](../ci/ci_cd_for_external_repos/index.md) **{chevron-right}** | | |
| [**Getting started**](../ci/index.md) **{chevron-right}**<br><br>Overview of how features fit together. | [**CI/CD YAML syntax reference**](../ci/yaml/index.md) **{chevron-right}**<br><br>Pipeline definition, artifacts, debugging, examples, steps. | [**Runners**](https://docs.gitlab.com/runner/) **{chevron-right}**<br><br>Execution, agents, job processing, installation, configuration. |
| [**Pipelines**](../ci/pipelines/index.md) **{chevron-right}**<br><br>Configuration, automation, stages, jobs, schedules, efficiency. | [**Jobs**](../ci/jobs/index.md) **{chevron-right}**<br><br>Configuration, logs, artifacts. | [**CI/CD components**](../ci/components/index.md) **{chevron-right}**<br><br>Reusable, versioned CI/CD components for pipelines. |
| [**Variables**](../ci/variables/index.md) **{chevron-right}**<br><br> Configuration, usage, security, troubleshooting. | [**Pipeline security**](../ci/pipelines/pipeline_security.md) **{chevron-right}**<br><br>Secrets management, job tokens, secure files, cloud security. | [**Services**](../ci/services/index.md) **{chevron-right}**<br><br>Reusable database or caching images. |
| [**Auto DevOps**](autodevops/index.md) **{chevron-right}**<br><br>Automated DevOps, CI/CD, language detection, deployment, customization. | [**Testing**](../ci/testing/index.md) **{chevron-right}**<br><br>Unit tests, integration tests, test reports, coverage, quality assurance. | [**SSH keys**](../ci/ssh_keys/index.md) **{chevron-right}**<br><br>Authentication, secure access, deployment, remote execution, key management. |
| [**ChatOps**](../ci/chatops/index.md) **{chevron-right}**<br><br>Collaboration, chat integration, commands, automation, communication. | [**Mobile DevOps**](../ci/mobile_devops.md) **{chevron-right}**<br><br>Mobile apps, Android, build automation, app distribution. | [**Google cloud integration**](../ci/gitlab_google_cloud_integration/index.md) **{chevron-right}**<br><br>Cloud services, Kubernetes deployments. |
|[**External repository integrations**](../ci/ci_cd_for_external_repos/index.md) **{chevron-right}**<br><br>GitHub, Bitbucket, external sources, mirroring, cross-platform. | | |

View File

@ -363,11 +363,6 @@ git rebase -i commit-id
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/462999) in GitLab 17.2.
> - [Enabled on self-managed and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/issues/462999) in GitLab 17.3.
FLAG:
The availability of this feature is controlled by a feature flag.
For more information, see the history.
This feature is available for testing, but not ready for production use.
Permanently delete sensitive or confidential information that was accidentally committed, ensuring
it's no longer accessible in your repository's history.
Replaces a list of strings with `***REMOVED***`.

View File

@ -16,9 +16,9 @@ release features incrementally.
| | | |
|--|--|--|
| [**Getting started**](../user/get_started/get_started_deploy_release.md) **{chevron-right}** | [**Packages and registries**](../user/packages/index.md) **{chevron-right}** | [**Environments and deployments**](../ci/environments/index.md) **{chevron-right}** |
| [**Releases**](../user/project/releases/index.md) **{chevron-right}** | [**Roll out an application incrementally**](../ci/environments/incremental_rollouts.md) **{chevron-right}** | [**Feature flags**](../operations/feature_flags.md) **{chevron-right}** |
| [**GitLab Pages**](../user/project/pages/index.md) **{chevron-right}** | | |
| [**Getting started**](../user/get_started/get_started_deploy_release.md) **{chevron-right}**<br><br>Overview of how features fit together. | [**Packages and registries**](../user/packages/index.md) **{chevron-right}**<br><br>Package management, container registry, artifact storage, dependency management. | [**Environments and deployments**](../ci/environments/index.md) **{chevron-right}**<br><br>Environments, deployments, rollbacks, safety, approvals. |
| [**Releases**](../user/project/releases/index.md) **{chevron-right}**<br><br>Releases, versioning, assets, tags, milestones, evidence. | [**Roll out an application incrementally**](../ci/environments/incremental_rollouts.md) **{chevron-right}**<br><br>Kubernetes, CI/CD, risk mitigation, deployment. | [**Feature flags**](../operations/feature_flags.md) **{chevron-right}**<br><br>Progressive delivery, controlled deployment, risk reduction. |
| [**GitLab Pages**](../user/project/pages/index.md) **{chevron-right}**<br><br>Static site hosting, documentation publishing, project websites, custom domains. | | |
## Related topics

View File

@ -87,6 +87,55 @@ For more information about upgrading GitLab Helm Chart, see [the release notes f
the upgrade. This bug has been fixed with GitLab 17.1.2 and upgrading from GitLab 16.x directly to 17.1.2 will not
cause these issues.
## Issues to be aware of when upgrading from 17.3
- Migration failures when upgrading from GitLab 17.3.
When upgrading from 17.3 to 17.4, there is a slight chance of encountering an error. During the migration process, you might see an error message like the one below:
```shell
main: == [advisory_lock_connection] object_id: 127900, pg_backend_pid: 76263
main: == 20240812040748 AddUniqueConstraintToRemoteDevelopmentAgentConfigs: migrating
main: -- transaction_open?(nil)
main: -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main: -> 0.0181s
main: -- index_exists?(:remote_development_agent_configs, :cluster_agent_id, {:name=>"index_remote_development_agent_configs_on_unique_agent_id", :unique=>true, :algorithm=>:concurrently})
main: -> 0.0026s
main: -- execute("SET statement_timeout TO 0")
main: -> 0.0004s
main: -- add_index(:remote_development_agent_configs, :cluster_agent_id, {:name=>"index_remote_development_agent_configs_on_unique_agent_id", :unique=>true, :algorithm=>:concurrently})
main: -- execute("RESET statement_timeout")
main: -> 0.0002s
main: == [advisory_lock_connection] object_id: 127900, pg_backend_pid: 76263
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
PG::UniqueViolation: ERROR: could not create unique index "index_remote_development_agent_configs_on_unique_agent_id"
DETAIL: Key (cluster_agent_id)=(1000141) is duplicated.
```
This error occurs because the migration adds a unique constraint on the `cluster_agent_id` column in the `remote_development_agent_configs` table, but there are still duplicate entries. The previous migration is supposed to remove these duplicates, but in rare cases, new duplicates may be inserted between the two migrations.
To safely resolve this issue, follow these steps:
1. Open the Rails console where the migrations are being run.
1. Copy and paste the script below into the console and execute it.
1. Re-run the migrations, and they should complete successfully.
```Ruby
# Get the IDs to keep for each cluster_agent_id; if there are duplicates, only the row with the latest updated_at will be kept.
latest_ids = ::RemoteDevelopment::RemoteDevelopmentAgentConfig.select("DISTINCT ON (cluster_agent_id) id")
.order("cluster_agent_id, updated_at DESC")
.map(&:id)
# Get the list of remote_development_agent_configs to be removed.
agent_configs_to_remove = ::RemoteDevelopment::RemoteDevelopmentAgentConfig.where.not(id: latest_ids)
# Delete all duplicated agent_configs.
agent_configs_to_remove.delete_all
```
### Linux package installations
Specific information applies to Linux package installations:

View File

@ -11,12 +11,11 @@ GitLab can check your applications for security vulnerabilities.
| | | |
|--|--|--|
| [**Getting started**](get-started-security.md) **{chevron-right}** | [**Application security**](index.md) **{chevron-right}** | [**Security configuration**](configuration/index.md) **{chevron-right}** |
| [**Container Scanning**](container_scanning/index.md) **{chevron-right}** | [**Dependency Scanning**](dependency_scanning/index.md) **{chevron-right}** | [**Comparison**](comparison_dependency_and_container_scanning.md) **{chevron-right}** |
| [**Dependency List**](dependency_list/index.md) **{chevron-right}** | [**Continuous Vulnerability Scanning**](continuous_vulnerability_scanning/index.md) **{chevron-right}** | [**Static Application Security Testing**](sast/index.md) **{chevron-right}** |
| [**Infrastructure as Code (IaC) Scanning**](iac_scanning/index.md) **{chevron-right}** | [**Secret detection**](secret_detection/index.md) **{chevron-right}** | [**Dynamic Application Security Testing (DAST)**](dast/index.md) **{chevron-right}** |
| [**API Security**](api_security/index.md) **{chevron-right}** | [**Web API Fuzz Testing**](api_fuzzing/index.md) **{chevron-right}** | [**Coverage-guided fuzz testing**](coverage_fuzzing/index.md) **{chevron-right}** |
| [**Security Dashboard**](security_dashboard/index.md) **{chevron-right}** | [**Offline environments**](offline_deployments/index.md) **{chevron-right}** | [**Vulnerability Report**](vulnerability_report/index.md) **{chevron-right}** |
| [**Vulnerability Page**](vulnerabilities/index.md) **{chevron-right}** | [**Vulnerability severity levels**](vulnerabilities/severities.md) **{chevron-right}** | [**GitLab Advisory Database**](gitlab_advisory_database/index.md) **{chevron-right}** |
| [**CVE ID requests**](cve_id_request.md) **{chevron-right}** | [**Policies**](policies/index.md) **{chevron-right}** | [**Security scanner integration**](../../development/integrations/secure.md) **{chevron-right}** |
| [**Secure and Govern glossary**](terminology/index.md) **{chevron-right}** | | |
| [**Getting started**](get-started-security.md) **{chevron-right}**<br><br>Overview of how features fit together. | [**Application security**](index.md) **{chevron-right}**<br><br>Scanning, vulnerabilities, compliance, customization, reporting. | [**Security configuration**](configuration/index.md) **{chevron-right}**<br><br>Configuration, testing, compliance, scanning, enablement. |
| [**Container Scanning**](container_scanning/index.md) **{chevron-right}**<br><br>Image vulnerability scanning, configuration, customization, reporting. | [**Dependency Scanning**](dependency_scanning/index.md) **{chevron-right}**<br><br>Vulnerabilities, remediation, configuration, analyzers, reports. | [**Comparison**](comparison_dependency_and_container_scanning.md) **{chevron-right}**<br><br>Dependency Scanning compared to Container Scanning. |
| [**Dependency List**](dependency_list/index.md) **{chevron-right}**<br><br>vulnerabilities, licenses, filtering, exporting. | [**Continuous Vulnerability Scanning**](continuous_vulnerability_scanning/index.md) **{chevron-right}**<br><br>Scanning, dependencies, advisories, background jobs. | [**Static Application Security Testing**](sast/index.md) **{chevron-right}**<br><br>Scanning, configuration, analyzers, vulnerabilities, reporting, customization, integration. |
| [**Infrastructure as Code (IaC) Scanning**](iac_scanning/index.md) **{chevron-right}**<br><br>Vulnerability detection, configuration analysis, pipeline integration. | [**Secret detection**](secret_detection/index.md) **{chevron-right}**<br><br>Detection, prevention, monitoring, storage, revocation, reporting. | [**Dynamic Application Security Testing (DAST)**](dast/index.md) **{chevron-right}**<br><br>Automated penetration testing, vulnerability detection, web application scanning, security assessment, CI/CD integration. |
| [**API Security**](api_security/index.md) **{chevron-right}**<br><br>Protection, analysis, testing, scanning, discovery. | [**Web API Fuzz Testing**](api_fuzzing/index.md) **{chevron-right}**<br><br>Testing, security, vulnerabilities, automation, errors. | [**Coverage-guided fuzz testing**](coverage_fuzzing/index.md) **{chevron-right}**<br><br>Coverage-guided fuzzing, random inputs, unexpected behavior. |
| [**Security Dashboard**](security_dashboard/index.md) **{chevron-right}**<br><br>Security dashboards, vulnerability trends, project ratings, metrics. | [**Offline environments**](offline_deployments/index.md) **{chevron-right}**<br><br>Offline security scanning, resolving vulnerabilities. | [**Vulnerability Report**](vulnerability_report/index.md) **{chevron-right}**<br><br>Filtering, grouping, exporting, manual addition. |
| [**Vulnerability Page**](vulnerabilities/index.md) **{chevron-right}**<br><br>Vulnerability details, status, resolution, linking issues. | [**Vulnerability severity levels**](vulnerabilities/severities.md) **{chevron-right}**<br><br>Classification, impact, prioritization, risk assessment. | [**GitLab Advisory Database**](gitlab_advisory_database/index.md) **{chevron-right}**<br><br>Security advisories, vulnerabilities, dependencies, database, updates. |
| [**CVE ID requests**](cve_id_request.md) **{chevron-right}**<br><br>Vulnerability tracking, security disclosure. | [**Policies**](policies/index.md) **{chevron-right}**<br><br>Security policies, enforcement, compliance, approvals, scans. | [**Security scanner integration**](../../development/integrations/secure.md) **{chevron-right}**<br><br>Reporting, vulnerabilities, remediations, tracking. |

View File

@ -11,5 +11,5 @@ Use GitLab to speed up and simplify your infrastructure management practices.
| | | |
|--|--|--|
| [**Getting started**](../get_started/get_started_managing_infrastructure.md) **{chevron-right}** | [**Infrastructure as Code**](iac/index.md) **{chevron-right}** | [**Create Kubernetes clusters**](../clusters/create/index.md) **{chevron-right}** |
| [**Connect Kubernetes clusters**](../clusters/agent/index.md) **{chevron-right}** | [**Runbooks**](../project/clusters/runbooks/index.md) **{chevron-right}** | |
| [**Getting started**](../get_started/get_started_managing_infrastructure.md) **{chevron-right}**<br><br>Overview of how features fit together. | [**Infrastructure as Code**](iac/index.md) **{chevron-right}**<br><br>Infrastructure management, versioning, automation, state storage, modules. | [**Create Kubernetes clusters**](../clusters/create/index.md) **{chevron-right}**<br><br>Amazon EKS, Azure AKS, Google GKE, Civo. |
| [**Connect Kubernetes clusters**](../clusters/agent/index.md) **{chevron-right}**<br><br>Kubernetes integration, GitOps, CI/CD, agent deployment, cluster management. | [**Runbooks**](../project/clusters/runbooks/index.md) **{chevron-right}**<br><br>Executable runbooks, automation, troubleshooting, operations. | |

View File

@ -248,11 +248,6 @@ When using repository cleanup, note:
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/462999) in GitLab 17.2.
> - [Enabled on self-managed and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/issues/462999) in GitLab 17.3.
FLAG:
The availability of this feature is controlled by a feature flag.
For more information, see the history.
This feature is available for testing, but not ready for production use.
Permanently delete sensitive or confidential information that was accidentally committed, ensuring
it's no longer accessible in your repository's history.

View File

@ -89,41 +89,41 @@
"@snowplow/browser-plugin-timezone": "^3.24.2",
"@snowplow/browser-tracker": "^3.24.2",
"@sourcegraph/code-host-integration": "0.0.95",
"@tiptap/core": "^2.6.4",
"@tiptap/extension-blockquote": "^2.6.4",
"@tiptap/extension-bold": "^2.6.4",
"@tiptap/extension-bubble-menu": "^2.6.4",
"@tiptap/extension-bullet-list": "^2.6.4",
"@tiptap/extension-code": "^2.6.4",
"@tiptap/extension-code-block": "^2.6.4",
"@tiptap/extension-code-block-lowlight": "^2.6.4",
"@tiptap/extension-document": "^2.6.4",
"@tiptap/extension-dropcursor": "^2.6.4",
"@tiptap/extension-gapcursor": "^2.6.4",
"@tiptap/extension-hard-break": "^2.6.4",
"@tiptap/extension-heading": "^2.6.4",
"@tiptap/extension-highlight": "^2.6.4",
"@tiptap/extension-history": "^2.6.4",
"@tiptap/extension-horizontal-rule": "^2.6.4",
"@tiptap/extension-image": "^2.6.4",
"@tiptap/extension-italic": "^2.6.4",
"@tiptap/extension-link": "^2.6.4",
"@tiptap/extension-list-item": "^2.6.4",
"@tiptap/extension-ordered-list": "^2.6.4",
"@tiptap/extension-paragraph": "^2.6.4",
"@tiptap/extension-strike": "^2.6.4",
"@tiptap/extension-subscript": "^2.6.4",
"@tiptap/extension-superscript": "^2.6.4",
"@tiptap/extension-table": "^2.6.4",
"@tiptap/extension-table-cell": "^2.6.4",
"@tiptap/extension-table-header": "^2.6.4",
"@tiptap/extension-table-row": "^2.6.4",
"@tiptap/extension-task-item": "^2.6.4",
"@tiptap/extension-task-list": "^2.6.4",
"@tiptap/extension-text": "^2.6.4",
"@tiptap/pm": "^2.6.4",
"@tiptap/suggestion": "^2.6.4",
"@tiptap/vue-2": "^2.6.4",
"@tiptap/core": "^2.6.5",
"@tiptap/extension-blockquote": "^2.6.5",
"@tiptap/extension-bold": "^2.6.5",
"@tiptap/extension-bubble-menu": "^2.6.5",
"@tiptap/extension-bullet-list": "^2.6.5",
"@tiptap/extension-code": "^2.6.5",
"@tiptap/extension-code-block": "^2.6.5",
"@tiptap/extension-code-block-lowlight": "^2.6.5",
"@tiptap/extension-document": "^2.6.5",
"@tiptap/extension-dropcursor": "^2.6.5",
"@tiptap/extension-gapcursor": "^2.6.5",
"@tiptap/extension-hard-break": "^2.6.5",
"@tiptap/extension-heading": "^2.6.5",
"@tiptap/extension-highlight": "^2.6.5",
"@tiptap/extension-history": "^2.6.5",
"@tiptap/extension-horizontal-rule": "^2.6.5",
"@tiptap/extension-image": "^2.6.5",
"@tiptap/extension-italic": "^2.6.5",
"@tiptap/extension-link": "^2.6.5",
"@tiptap/extension-list-item": "^2.6.5",
"@tiptap/extension-ordered-list": "^2.6.5",
"@tiptap/extension-paragraph": "^2.6.5",
"@tiptap/extension-strike": "^2.6.5",
"@tiptap/extension-subscript": "^2.6.5",
"@tiptap/extension-superscript": "^2.6.5",
"@tiptap/extension-table": "^2.6.5",
"@tiptap/extension-table-cell": "^2.6.5",
"@tiptap/extension-table-header": "^2.6.5",
"@tiptap/extension-table-row": "^2.6.5",
"@tiptap/extension-task-item": "^2.6.5",
"@tiptap/extension-task-list": "^2.6.5",
"@tiptap/extension-text": "^2.6.5",
"@tiptap/pm": "^2.6.5",
"@tiptap/suggestion": "^2.6.5",
"@tiptap/vue-2": "^2.6.5",
"@vue/apollo-components": "^4.0.0-beta.4",
"@vue/apollo-option": "^4.0.0-beta.4",
"apollo-upload-client": "15.0.0",
@ -303,7 +303,7 @@
"swagger-cli": "^4.0.4",
"tailwindcss": "^3.4.1",
"timezone-mock": "^1.0.8",
"vite": "^5.4.1",
"vite": "^5.4.2",
"vite-plugin-ruby": "^5.0.0",
"vue-loader-vue3": "npm:vue-loader@17.4.2",
"vue-test-utils-compat": "0.0.14",

View File

@ -94,12 +94,38 @@ describe('InstallAgentModal', () => {
expect(findAlert().text()).toBe(I18N_AGENT_TOKEN.tokenSingleUseWarningTitle);
});
it('shows code block with agent installation command', () => {
expect(findCodeBlock().props('code')).toContain(`helm upgrade --install ${agentName}`);
expect(findCodeBlock().props('code')).toContain(`--namespace gitlab-agent-${agentName}`);
expect(findCodeBlock().props('code')).toContain(`--set config.token=${agentToken}`);
expect(findCodeBlock().props('code')).toContain(`--set config.kasAddress=${kasAddress}`);
expect(findCodeBlock().props('code')).toContain(`--set image.tag=v${kasInstallVersion}`);
describe('when on dot_com', () => {
beforeEach(() => {
gon.dot_com = true;
createWrapper();
});
it('shows code block with agent installation command without image version', () => {
expect(findCodeBlock().props('code')).toContain(`helm upgrade --install ${agentName}`);
expect(findCodeBlock().props('code')).toContain(`--namespace gitlab-agent-${agentName}`);
expect(findCodeBlock().props('code')).toContain(`--set config.token=${agentToken}`);
expect(findCodeBlock().props('code')).toContain(`--set config.kasAddress=${kasAddress}`);
expect(findCodeBlock().props('code')).not.toContain(
`--set image.tag=v${kasInstallVersion}`,
);
});
});
describe('when not on dot_com', () => {
beforeEach(() => {
gon.dot_com = false;
createWrapper();
});
it('shows code block with agent installation command with image version', () => {
expect(findCodeBlock().props('code')).toContain(`helm upgrade --install ${agentName}`);
expect(findCodeBlock().props('code')).toContain(`--namespace gitlab-agent-${agentName}`);
expect(findCodeBlock().props('code')).toContain(`--set config.token=${agentToken}`);
expect(findCodeBlock().props('code')).toContain(`--set config.kasAddress=${kasAddress}`);
expect(findCodeBlock().props('code')).toContain(`--set image.tag=v${kasInstallVersion}`);
});
});
it('truncates the namespace name if it exceeds the maximum length', () => {

View File

@ -333,7 +333,7 @@ describe('tags list row', () => {
expect(findDeleteButton().exists()).toBe(true);
expect(findDeleteButton().props('item').extraAttrs).toMatchObject({
class: 'gl-text-red-500!',
class: '!gl-text-red-500',
'data-testid': 'single-delete-button',
});

View File

@ -3,7 +3,7 @@
exports[`TerraformInstallation renders all the messages 1`] = `
<div>
<h3
class="gl-font-lg"
class="gl-text-lg"
>
Provision instructions
</h3>
@ -19,7 +19,7 @@ exports[`TerraformInstallation renders all the messages 1`] = `
trackinglabel=""
/>
<h3
class="gl-font-lg"
class="gl-text-lg"
>
Registry setup
</h3>

View File

@ -18,10 +18,10 @@ exports[`packages_list_row renders 1`] = `
class="gl-flex gl-font-semibold gl-items-center gl-min-h-6 gl-min-w-0 gl-text-primary"
>
<div
class="gl-align-items-center gl-display-flex gl-min-w-0 gl-mr-3"
class="gl-flex gl-items-center gl-min-w-0 gl-mr-3"
>
<gl-link-stub
class="gl-min-w-0 gl-text-body"
class="gl-min-w-0 gl-text-primary"
data-testid="details-link"
href="foo"
>
@ -36,7 +36,7 @@ exports[`packages_list_row renders 1`] = `
class="gl-flex gl-gap-3 gl-grow gl-items-center gl-min-h-6 gl-min-w-0 gl-text-sm gl-text-subtle"
>
<div
class="gl-display-flex"
class="gl-flex"
>
<span>
1.0.0

View File

@ -14,7 +14,7 @@ exports[`ConanInstallation renders all the messages 1`] = `
trackinglabel="code_instruction"
/>
<h3
class="gl-font-lg"
class="gl-text-lg"
>
Registry setup
</h3>

View File

@ -8,7 +8,7 @@ exports[`DependencyRow renders full dependency 1`] = `
class="section-50 table-section"
>
<strong
class="gl-text-body"
class="gl-text-primary"
>
Ninject.Extensions.Factory
</strong>
@ -19,11 +19,11 @@ exports[`DependencyRow renders full dependency 1`] = `
</span>
</div>
<div
class="gl-display-flex gl-md-justify-content-end section-50 table-section"
class="gl-flex md:gl-justify-end section-50 table-section"
data-testid="version-pattern"
>
<span
class="gl-text-body"
class="gl-text-primary"
>
3.3.2
</span>

View File

@ -95,7 +95,7 @@ exports[`MavenInstallation maven renders all the messages 1`] = `
trackinglabel="code_instruction"
/>
<h3
class="gl-font-lg"
class="gl-text-lg"
>
Registry setup
</h3>

View File

@ -14,7 +14,7 @@ exports[`NpmInstallation renders all the messages 1`] = `
trackinglabel="code_instruction"
/>
<h3
class="gl-font-lg"
class="gl-text-lg"
>
Registry setup
</h3>

Some files were not shown because too many files have changed in this diff Show More