Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2025-02-19 18:12:41 +00:00
parent 09a469086b
commit 09f6ce9fcd
126 changed files with 1417 additions and 496 deletions

View File

@ -48,6 +48,7 @@ default:
ADD_SLOW_TEST_NOTE_TO_MERGE_REQUEST: "true"
FF_NETWORK_PER_BUILD: "true"
FF_TIMESTAMPS: "true"
FF_USE_FASTZIP: "true"
.if-merge-request-security-canonical-sync: &if-merge-request-security-canonical-sync
if: '$CI_MERGE_REQUEST_SOURCE_PROJECT_PATH == "gitlab-org/security/gitlab" && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == $CI_DEFAULT_BRANCH && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'

View File

@ -4,10 +4,10 @@
Note: Doc work as part of feature development is covered in the Feature Request template.
* For issues related to features of the docs.gitlab.com site, see
https://gitlab.com/gitlab-org/gitlab-docs/issues/
https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/issues
* For information about documentation content and process, see
https://docs.gitlab.com/ee/development/documentation/
https://docs.gitlab.com/development/documentation/
-->
- [ ] Start this issue's title with `Docs:` or `Docs feedback:`.

View File

@ -34,8 +34,12 @@ After your merge request has been approved according to our [approval guidelines
- You can use the script `bin/secpick` instead of the following steps, to help you cherry-picking. See the [secpick documentation]
- [ ] Create each MR targeting the stable branch `X-Y-stable`, using the [Security merge request template].
- Every merge request will have its own set of to-dos, so make sure to complete those.
- [ ] On the `Related merge requests` section, ensure that **ONLY** `4` merge requests are associated: **ONLY** one targeting `master` and the `3` backports.
- [ ] If there are more associated MRs, re-create another security issue and ensure there are only 4 merge requests associated with that one.
- [ ] On the `Related merge requests` section, ensure that **ONLY** `4` merge requests matching these conditions:
- From the security namespace (`gitlab-org/security`)
- Status is not `Closed`
- (Other MRs not matching these above conditions are acceptable)
- [ ] Among these `4` MRs, one targeting `master` and the `3` backports targeting stable branches.
- [ ] If there are more associated MRs, re-create another security issue and ensure there are only 4 merge requests associated with that one.
- [ ] If this issue requires less than `4` merge requests, add the ~"reduced backports" label.
## Assigning to a release

View File

@ -53,6 +53,7 @@ RSpec/SpecFilePathFormat:
- 'spec/services/ci/create_pipeline_service/rules_spec.rb'
- 'spec/services/ci/create_pipeline_service/run_spec.rb'
- 'spec/services/ci/create_pipeline_service/scripts_spec.rb'
- 'spec/services/ci/create_pipeline_service/stop_linting_spec.rb'
- 'spec/services/ci/create_pipeline_service/tags_spec.rb'
- 'spec/services/ci/create_pipeline_service/variables_spec.rb'
- 'spec/services/ci/create_pipeline_service/workflow_auto_cancel_spec.rb'

View File

@ -1,11 +1,12 @@
<script>
import { GlAlert, GlLoadingIcon } from '@gitlab/ui';
import { GlAlert, GlButton, GlIntersectionObserver } from '@gitlab/ui';
import { __, sprintf } from '~/locale';
import { renderMarkdown } from '~/notes/utils';
import SafeHtml from '~/vue_shared/directives/safe_html';
import { sha256 } from '~/lib/utils/text_utility';
import { InternalEvents } from '~/tracking';
import { executeAndPresentQuery } from '../../core';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { executeAndPresentQuery, presentPreview } from '../../core';
import Counter from '../../utils/counter';
const MAX_GLQL_BLOCKS = 20;
@ -14,12 +15,13 @@ export default {
name: 'GlqlFacade',
components: {
GlAlert,
GlLoadingIcon,
GlButton,
GlIntersectionObserver,
},
directives: {
SafeHtml,
},
mixins: [InternalEvents.mixin()],
mixins: [InternalEvents.mixin(), glFeatureFlagsMixin()],
props: {
query: {
required: true,
@ -28,8 +30,10 @@ export default {
},
data() {
return {
loadOnClick: true,
presenterPreview: null,
presenterComponent: null,
loading: false,
error: {
title: null,
message: null,
@ -41,16 +45,47 @@ export default {
};
},
async mounted() {
if (this.checkGlqlBlocks()) {
this.presentQuery();
}
this.loadOnClick = this.glFeatures.glqlLoadOnClick;
},
methods: {
setLoading(loading) {
this.$emit(loading ? 'loading' : 'loaded');
this.loading = loading;
loadGlqlBlock() {
if (this.presenterComponent || this.presenterPreview) return;
if (this.glFeatures.glqlLoadOnClick || this.checkGlqlBlocksCount()) {
this.presentPreview();
this.loadPresenterComponent();
}
},
checkGlqlBlocks() {
reloadGlqlBlock() {
this.presenterComponent = null;
this.presenterPreview = null;
this.dismissAlert();
this.presentPreview();
this.loadPresenterComponent();
},
async loadPresenterComponent() {
try {
this.presenterComponent = await executeAndPresentQuery(this.query);
this.trackRender();
} catch (error) {
this.handleQueryError(error.message);
}
},
async presentPreview() {
this.dismissAlert();
try {
this.presenterPreview = await presentPreview(this.query);
} catch (error) {
this.handleQueryError(error.message);
}
},
checkGlqlBlocksCount() {
try {
this.$options.numGlqlBlocks.increment();
return true;
@ -59,19 +94,7 @@ export default {
return false;
}
},
async presentQuery() {
this.dismissAlert();
this.setLoading(true);
try {
this.presenterComponent = await executeAndPresentQuery(this.query);
this.trackRender();
} catch (error) {
this.handleQueryError(error.message);
} finally {
this.setLoading(false);
}
},
handleQueryError(message) {
this.error = { ...this.$options.i18n.glqlDisplayError, message };
},
@ -93,47 +116,53 @@ export default {
safeHtmlConfig: { ALLOWED_TAGS: ['code'] },
i18n: {
glqlDisplayError: {
title: __('An error occurred when trying to display this GLQL block:'),
title: __('An error occurred when trying to display this GLQL view:'),
},
glqlLimitError: {
title: sprintf(
__(
'Only %{n} GLQL blocks can be automatically displayed on a page. Click the button below to manually display this block.',
'Only %{n} GLQL views can be automatically displayed on a page. Click the button below to manually display this block.',
),
{ n: MAX_GLQL_BLOCKS },
),
action: __('Display block'),
},
loadGlqlView: __('Load GLQL view'),
},
numGlqlBlocks: new Counter(MAX_GLQL_BLOCKS),
};
</script>
<template>
<div data-testid="glql-facade">
<gl-alert
v-if="error.title || error.message"
variant="warning"
class="gl-mb-3"
:primary-button-text="error.action"
@dismiss="dismissAlert"
@primaryAction="presentQuery"
>
{{ error.title }}
<ul v-if="error.message" class="!gl-mb-0">
<li v-safe-html:[$options.safeHtmlConfig]="renderMarkdown(error.message)"></li>
</ul>
</gl-alert>
<template v-if="error.title || error.message">
<gl-alert
variant="warning"
class="gl-mb-3"
:primary-button-text="error.action"
@dismiss="dismissAlert"
@primaryAction="reloadGlqlBlock"
>
{{ error.title }}
<ul v-if="error.message" class="!gl-mb-0">
<li v-safe-html:[$options.safeHtmlConfig]="renderMarkdown(error.message)"></li>
</ul>
</gl-alert>
</template>
<component :is="presenterComponent" v-if="presenterComponent" />
<div v-else class="markdown-code-block gl-relative">
<gl-loading-icon
v-if="loading"
size="lg"
class="gl-absolute gl-left-1/2 gl-top-1/2 gl-z-2 -gl-translate-x-1/2 -gl-translate-y-1/2"
/>
<pre
:class="preClasses"
><code :class="{ 'gl-opacity-5': loading }">{{ query.trim() }}</code></pre>
<div v-if="loadOnClick" class="markdown-code-block gl-relative">
<pre :class="preClasses"><gl-button
class="gl-font-regular gl-absolute gl-z-1 gl-top-2/4 gl-left-2/4"
style="transform: translate(-50%, -50%)"
:aria-label="$options.i18n.loadGlqlView"
@click="loadOnClick = false"
>{{ $options.i18n.loadGlqlView }}</gl-button><code class="gl-opacity-2">{{ query.trim() }}</code></pre>
</div>
<gl-intersection-observer v-else @appear="loadGlqlBlock">
<component :is="presenterComponent" v-if="presenterComponent" />
<component :is="presenterPreview" v-else-if="presenterPreview" />
<div v-else class="markdown-code-block gl-relative">
<pre :class="preClasses"><code>{{ query.trim() }}</code></pre>
</div>
</gl-intersection-observer>
</div>
</template>

View File

@ -1,5 +1,5 @@
<script>
import { GlIcon, GlIntersperse, GlLink, GlSprintf } from '@gitlab/ui';
import { GlIcon, GlIntersperse, GlLink, GlSprintf, GlSkeletonLoader } from '@gitlab/ui';
import { helpPagePath } from '~/helpers/help_page_helper';
import { __ } from '~/locale';
@ -10,6 +10,7 @@ export default {
GlIntersperse,
GlLink,
GlSprintf,
GlSkeletonLoader,
},
inject: ['presenter'],
props: {
@ -29,6 +30,11 @@ export default {
default: 'ul',
validator: (value) => ['ul', 'ol'].includes(value),
},
isPreview: {
required: false,
type: Boolean,
default: false,
},
},
computed: {
items() {
@ -49,18 +55,25 @@ export default {
<template>
<div class="gl-mb-4">
<component :is="listType" class="!gl-mb-1" data-testid="list">
<li
v-for="(item, itemIndex) in items"
:key="itemIndex"
:data-testid="`list-item-${itemIndex}`"
>
<gl-intersperse separator=" · ">
<span v-for="field in fields" :key="field.key">
<component :is="presenter.forField(item, field.key)" />
</span>
</gl-intersperse>
</li>
<div v-if="!items.length" :dismissible="false" variant="tip" class="!gl-my-2">
<template v-if="isPreview">
<li v-for="i in 5" :key="i">
<gl-skeleton-loader :width="400" :lines="1" />
</li>
</template>
<template v-else-if="items.length">
<li
v-for="(item, itemIndex) in items"
:key="itemIndex"
:data-testid="`list-item-${itemIndex}`"
>
<gl-intersperse separator=" · ">
<span v-for="field in fields" :key="field.key">
<component :is="presenter.forField(item, field.key)" />
</span>
</gl-intersperse>
</li>
</template>
<div v-else-if="!items.length" :dismissible="false" variant="tip" class="!gl-my-2">
{{ __('No data found for this query') }}
</div>
</component>

View File

@ -1,5 +1,5 @@
<script>
import { GlIcon, GlLink, GlSprintf } from '@gitlab/ui';
import { GlIcon, GlLink, GlSprintf, GlSkeletonLoader } from '@gitlab/ui';
import { helpPagePath } from '~/helpers/help_page_helper';
import { __ } from '~/locale';
import Sorter from '../../core/sorter';
@ -11,6 +11,7 @@ export default {
GlIcon,
GlLink,
GlSprintf,
GlSkeletonLoader,
ThResizable,
},
inject: ['presenter'],
@ -25,6 +26,11 @@ export default {
type: Object,
validator: ({ fields }) => Array.isArray(fields) && fields.length > 0,
},
isPreview: {
required: false,
type: Boolean,
default: false,
},
},
data() {
const items = this.data.nodes.slice();
@ -73,16 +79,25 @@ export default {
</tr>
</thead>
<tbody>
<tr
v-for="(item, itemIndex) in items"
:key="item.id"
:data-testid="`table-row-${itemIndex}`"
>
<td v-for="field in fields" :key="field.key">
<component :is="presenter.forField(item, field.key)" />
</td>
</tr>
<tr v-if="!items.length">
<template v-if="isPreview">
<tr v-for="i in 5" :key="i">
<td v-for="field in fields" :key="field.key">
<gl-skeleton-loader :width="120" :lines="1" />
</td>
</tr>
</template>
<template v-else-if="items.length">
<tr
v-for="(item, itemIndex) in items"
:key="item.id"
:data-testid="`table-row-${itemIndex}`"
>
<td v-for="field in fields" :key="field.key">
<component :is="presenter.forField(item, field.key)" />
</td>
</tr>
</template>
<tr v-else-if="!items.length">
<td :colspan="fields.length" class="gl-text-center">
{{ __('No data found for this query') }}
</td>

View File

@ -1,26 +1,32 @@
import { gql } from '@apollo/client/core';
import createDefaultClient from '~/lib/graphql';
import TaskQueue from '../utils/task_queue';
const CONCURRENCY_LIMIT = 1;
export default class Executor {
#client;
static taskQueue;
init(client = createDefaultClient()) {
Executor.taskQueue = Executor.taskQueue || new TaskQueue(CONCURRENCY_LIMIT);
this.#client = client;
return this;
}
async execute(query) {
const { data } = await this.#client.query({
query: gql`
${query}
`,
});
const { data } = await Executor.taskQueue.enqueue(() =>
this.#client.query({
query: gql`
${query}
`,
}),
);
return data;
}
}
export const execute = async (query) => {
const executor = new Executor().init();
return executor.execute(query);
return new Executor().init().execute(query);
};

View File

@ -9,3 +9,10 @@ export const executeAndPresentQuery = async (glqlQuery) => {
const transformed = transform(data, config);
return present(transformed, config);
};
export const presentPreview = async (glqlQuery) => {
const { config } = await parse(glqlQuery);
const data = { project: { issues: { nodes: [] } } };
const transformed = transform(data, config);
return present(transformed, config, { isPreview: true });
};

View File

@ -114,7 +114,7 @@ export default class Presenter {
}
}
export const present = (data, config, ...props) => {
export const present = (data, config, props) => {
const presenter = new Presenter().init({ data, config, ...props });
return presenter.component;
};

View File

@ -0,0 +1,53 @@
export default class TaskQueue {
#queue = [];
#runningTasks = 0;
#concurrencyLimit;
constructor(concurrencyLimit = 1) {
this.#concurrencyLimit = concurrencyLimit;
}
enqueue(task) {
return new Promise((resolve, reject) => {
this.#queue.push(async () => {
try {
resolve(await task());
} catch (e) {
reject(e);
} finally {
this.#runningTasks -= 1;
this.processQueue();
}
});
this.processQueue();
});
}
async processQueue() {
while (this.#runningTasks < this.#concurrencyLimit && this.#queue.length > 0) {
this.#runningTasks += 1;
const task = this.#queue.shift();
// We don't await here to allow concurrent execution
task();
}
}
clear() {
this.#queue = [];
this.#runningTasks = 0;
}
get size() {
return this.#queue.length;
}
get isEmpty() {
return this.#queue.length === 0;
}
get concurrencyLimit() {
return this.#concurrencyLimit;
}
}

View File

@ -2,7 +2,7 @@
export default {
functional: true,
render(h, context) {
const { slotKeys } = context.props;
const slotKeys = context.props.slotKeys ?? context.props['slot-keys'];
const slots = context.slots();
const children = slotKeys.map((key) => slots[key]).filter((x) => x);

View File

@ -33,7 +33,6 @@ const initSentry = () => {
],
// Browser tracing configuration
enableTracing: true,
tracePropagationTargets: [/^\//], // only trace internal requests
tracesSampleRate: gon.sentry_clientside_traces_sample_rate || 0,
integrations: [

View File

@ -216,9 +216,6 @@ export default {
showEditedAt() {
return (this.taskCompletionStatus || this.lastEditedAt) && !this.editMode;
},
canShowDescriptionTemplateSelector() {
return this.glFeatures.workItemDescriptionTemplates;
},
descriptionTemplateContent() {
return this.descriptionTemplate || '';
},
@ -452,10 +449,8 @@ export default {
:class="formGroupClass"
:label="__('Description')"
label-for="work-item-description"
:label-sr-only="!canShowDescriptionTemplateSelector"
>
<work-item-description-template-listbox
v-if="canShowDescriptionTemplateSelector"
:full-path="fullPath"
:template="selectedTemplate"
@selectTemplate="handleSelectTemplate"
@ -500,7 +495,7 @@ export default {
enable-autocomplete
supports-quick-actions
:autofocus="autofocus"
:class="{ 'gl-mt-3': canShowDescriptionTemplateSelector }"
class="gl-mt-3"
@input="setDescriptionText"
@keydown.meta.enter="updateWorkItem"
@keydown.ctrl.enter="updateWorkItem"

View File

@ -245,6 +245,7 @@ export default {
data-testid="apply-button"
category="tertiary"
size="small"
class="gl-flex-shrink-0"
:disabled="isUpdating"
@click="collapseWidget"
>{{ __('Apply') }}</gl-button

View File

@ -35,6 +35,7 @@ module WikiActions
before_action do
push_frontend_feature_flag(:preserve_markdown, container)
push_force_frontend_feature_flag(:glql_integration, container&.glql_integration_feature_flag_enabled?)
push_force_frontend_feature_flag(:glql_load_on_click, container&.glql_load_on_click_feature_flag_enabled?)
push_force_frontend_feature_flag(:continue_indented_text, container&.continue_indented_text_feature_flag_enabled?)
end

View File

@ -9,7 +9,6 @@ class Groups::BoardsController < Groups::ApplicationController
push_frontend_feature_flag(:board_multi_select, group)
push_frontend_feature_flag(:issues_list_drawer, group)
push_force_frontend_feature_flag(:work_items_beta, group&.work_items_beta_feature_flag_enabled?)
push_frontend_feature_flag(:work_item_description_templates, group)
end
feature_category :team_planning

View File

@ -13,9 +13,9 @@ module Groups
push_force_frontend_feature_flag(:create_group_level_work_items,
group&.create_group_level_work_items_feature_flag_enabled?)
push_force_frontend_feature_flag(:glql_integration, group&.glql_integration_feature_flag_enabled?)
push_force_frontend_feature_flag(:glql_load_on_click, group&.glql_load_on_click_feature_flag_enabled?)
push_force_frontend_feature_flag(:continue_indented_text, group&.continue_indented_text_feature_flag_enabled?)
push_frontend_feature_flag(:issues_list_drawer, group)
push_frontend_feature_flag(:work_item_description_templates, group)
end
before_action :handle_new_work_item_path, only: [:show]

View File

@ -43,7 +43,6 @@ class GroupsController < Groups::ApplicationController
push_frontend_feature_flag(:issues_grid_view)
push_frontend_feature_flag(:issues_list_drawer, group)
push_force_frontend_feature_flag(:namespace_level_work_items, group.namespace_work_items_enabled?)
push_frontend_feature_flag(:work_item_description_templates, group)
end
before_action only: :merge_requests do

View File

@ -9,7 +9,6 @@ class Projects::BoardsController < Projects::ApplicationController
push_frontend_feature_flag(:board_multi_select, project)
push_frontend_feature_flag(:issues_list_drawer, project)
push_force_frontend_feature_flag(:work_items_beta, project&.work_items_beta_feature_flag_enabled?)
push_frontend_feature_flag(:work_item_description_templates, project&.group)
end
feature_category :team_planning

View File

@ -11,7 +11,6 @@ class Projects::IncidentsController < Projects::ApplicationController
push_force_frontend_feature_flag(:work_items_beta, @project&.work_items_beta_feature_flag_enabled?)
push_force_frontend_feature_flag(:work_items_alpha, @project&.work_items_alpha_feature_flag_enabled?)
push_frontend_feature_flag(:notifications_todos_buttons, current_user)
push_frontend_feature_flag(:work_item_description_templates, @project&.group)
end
feature_category :incident_management

View File

@ -50,10 +50,10 @@ class Projects::IssuesController < Projects::ApplicationController
push_frontend_feature_flag(:issues_list_drawer, project)
push_frontend_feature_flag(:notifications_todos_buttons, current_user)
push_force_frontend_feature_flag(:glql_integration, project&.glql_integration_feature_flag_enabled?)
push_force_frontend_feature_flag(:glql_load_on_click, project&.glql_load_on_click_feature_flag_enabled?)
push_force_frontend_feature_flag(:continue_indented_text, project&.continue_indented_text_feature_flag_enabled?)
push_force_frontend_feature_flag(:work_items_beta, project&.work_items_beta_feature_flag_enabled?)
push_force_frontend_feature_flag(:work_items_alpha, project&.work_items_alpha_feature_flag_enabled?)
push_frontend_feature_flag(:work_item_description_templates, project&.group)
end
before_action only: [:index, :show] do

View File

@ -9,6 +9,7 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont
before_action do
push_force_frontend_feature_flag(:glql_integration, project&.glql_integration_feature_flag_enabled?)
push_force_frontend_feature_flag(:glql_load_on_click, project&.glql_load_on_click_feature_flag_enabled?)
push_force_frontend_feature_flag(:continue_indented_text, project&.continue_indented_text_feature_flag_enabled?)
end

View File

@ -13,9 +13,9 @@ class Projects::WorkItemsController < Projects::ApplicationController
push_force_frontend_feature_flag(:work_items_beta, project&.work_items_beta_feature_flag_enabled?)
push_force_frontend_feature_flag(:work_items_alpha, project&.work_items_alpha_feature_flag_enabled?)
push_force_frontend_feature_flag(:glql_integration, project&.glql_integration_feature_flag_enabled?)
push_force_frontend_feature_flag(:glql_load_on_click, project&.glql_load_on_click_feature_flag_enabled?)
push_force_frontend_feature_flag(:continue_indented_text, project&.continue_indented_text_feature_flag_enabled?)
push_frontend_feature_flag(:namespace_level_work_items, project&.group)
push_frontend_feature_flag(:work_item_description_templates, project&.group)
end
feature_category :team_planning

View File

@ -56,7 +56,6 @@ class ProjectsController < Projects::ApplicationController
push_force_frontend_feature_flag(:work_items_alpha, @project&.work_items_alpha_feature_flag_enabled?)
# FF to enable setting to allow webhook execution on 30D and 60D notification delivery too
push_frontend_feature_flag(:extended_expiry_webhook_execution_setting, @project&.namespace)
push_frontend_feature_flag(:work_item_description_templates, @project&.group)
end
layout :determine_layout

View File

@ -788,9 +788,14 @@ module Ci
return unless project
return if user&.blocked?
return unless project.has_active_hooks?(:job_hooks) || project.has_active_integrations?(:job_hooks)
if Feature.enabled?(:ci_async_build_hooks_execution, project)
return unless project.has_active_hooks?(:job_hooks) || project.has_active_integrations?(:job_hooks)
Ci::ExecuteBuildHooksWorker.perform_async(project.id, build_data)
Ci::ExecuteBuildHooksWorker.perform_async(project.id, build_data)
else
project.execute_hooks(build_data.dup, :job_hooks) if project.has_active_hooks?(:job_hooks)
project.execute_integrations(build_data.dup, :job_hooks) if project.has_active_integrations?(:job_hooks)
end
end
def browsable_artifacts?

View File

@ -1012,6 +1012,10 @@ class Group < Namespace
feature_flag_enabled_for_self_or_ancestor?(:glql_integration)
end
def glql_load_on_click_feature_flag_enabled?
feature_flag_enabled_for_self_or_ancestor?(:glql_load_on_click)
end
# Note: this method is overridden in EE to check the work_item_epics feature flag which also enables this feature
def namespace_work_items_enabled?
::Feature.enabled?(:namespace_level_work_items, self, type: :development)

View File

@ -4,6 +4,9 @@ module Packages
module Protection
class Rule < ApplicationRecord
enum package_type: Packages::Package.package_types.slice(:conan, :maven, :npm, :pypi)
enum minimum_access_level_for_delete:
Gitlab::Access.sym_options_with_admin.slice(:owner, :admin),
_prefix: :minimum_access_level_for_delete
enum minimum_access_level_for_push:
Gitlab::Access.sym_options_with_admin.slice(:maintainer, :owner, :admin),
_prefix: :minimum_access_level_for_push
@ -25,7 +28,8 @@ module Packages
},
if: :pypi?
validates :package_type, presence: true
validates :minimum_access_level_for_push, presence: true
validate :at_least_one_minimum_access_level_must_be_present
scope :for_package_name, ->(package_name) do
return none if package_name.blank?
@ -38,11 +42,13 @@ module Packages
scope :for_package_type, ->(package_type) { where(package_type: package_type) }
def self.for_push_exists?(access_level:, package_name:, package_type:)
def self.for_action_exists?(action:, access_level:, package_name:, package_type:)
return false if [access_level, package_name, package_type].any?(&:blank?)
minimum_access_level_column = "minimum_access_level_for_#{action}"
for_package_type(package_type)
.where(':access_level < minimum_access_level_for_push', access_level: access_level)
.where(":access_level < #{minimum_access_level_column}", access_level: access_level)
.for_package_name(package_name)
.exists?
end
@ -113,6 +119,12 @@ module Packages
connection.exec_query(query.with(cte.to_arel).to_sql)
end
def at_least_one_minimum_access_level_must_be_present
return unless minimum_access_level_for_delete.blank? && minimum_access_level_for_push.blank?
errors.add(:base, _('A rule must have at least a minimum access role for push or delete.'))
end
end
end
end

View File

@ -3311,6 +3311,10 @@ class Project < ApplicationRecord
group&.glql_integration_feature_flag_enabled? || Feature.enabled?(:glql_integration, self)
end
def glql_load_on_click_feature_flag_enabled?
group&.glql_load_on_click_feature_flag_enabled? || Feature.enabled?(:glql_load_on_click, self)
end
def continue_indented_text_feature_flag_enabled?
group&.continue_indented_text_feature_flag_enabled? || Feature.enabled?(:continue_indented_text, self, type: :wip)
end

View File

@ -18,6 +18,7 @@ module Ci
Gitlab::Ci::Pipeline::Chain::Skip,
Gitlab::Ci::Pipeline::Chain::Config::Content,
Gitlab::Ci::Pipeline::Chain::Config::Process,
Gitlab::Ci::Pipeline::Chain::StopLinting,
Gitlab::Ci::Pipeline::Chain::Validate::AfterConfig,
Gitlab::Ci::Pipeline::Chain::RemoveUnwantedChatJobs,
Gitlab::Ci::Pipeline::Chain::SeedBlock,
@ -94,8 +95,7 @@ module Ci
partition_id: params[:partition_id],
**extra_options(**options))
# Ensure we never persist the pipeline when dry_run: true
@pipeline.readonly! if command.dry_run?
@pipeline.readonly! if command.readonly?
Gitlab::Ci::Pipeline::Chain::Sequence
.new(pipeline, command, SEQUENCE)
@ -154,8 +154,8 @@ module Ci
# :nocov:
# rubocop:enable Gitlab/NoCodeCoverageComment
def extra_options(content: nil, dry_run: false)
{ content: content, dry_run: dry_run }
def extra_options(content: nil, dry_run: false, linting: false)
{ content: content, dry_run: dry_run, linting: linting }
end
def build_logger

View File

@ -35,7 +35,8 @@ module Packages
user_project_authorization_access_level = current_user.max_member_access_for_project(project.id)
project.package_protection_rules
.for_push_exists?(
.for_action_exists?(
action: :push,
access_level: user_project_authorization_access_level,
package_name: params[:package_name],
package_type: params[:package_type]

View File

@ -31,3 +31,21 @@ global-components:
attributes:
- aria-*
- toggle-text: aria-label
gl-form-group:
element: label
attributes:
- aria-*
- label-for: for
- label: <text>
gl-form-input:
element: input
attributes:
- aria-*
gl-form-textarea:
element: textarea
attributes:
- aria-*
gl-form-select:
element: select
attributes:
- aria-*

View File

@ -5,8 +5,8 @@ clusterwide: true
column: anti_abuse_settings
db_type: jsonb
default: "'{}'::jsonb"
description: Configuration settings related to anti-abuse features
description:
encrypted: false
gitlab_com_different_than_default: true
gitlab_com_different_than_default: false
jihu: false
not_null: true

View File

@ -9,7 +9,7 @@ description: When enabled, users will get automatically banned from the applicat
when they download more than the maximum number of unique projects in the time period
specified by `max_number_of_repository_downloads` and `max_number_of_repository_downloads_within_time_period`
respectively. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/94153)
in GitLab 15.4. Self-managed, Ultimate only.
in GitLab 15.4. GitLab Self-Managed, Ultimate only.
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -5,7 +5,8 @@ clusterwide: false
column: default_branch_name
db_type: text
default:
description: "[Instance-level custom initial branch name](../user/project/repository/branches/default.md#instance-level-custom-initial-branch-name)."
description: "[Set the initial branch name](../user/project/repository/branches/default.md#change-the-default-branch-name-for-new-projects-in-an-instance)
for all projects in an instance."
encrypted: false
gitlab_com_different_than_default: true
jihu: false

View File

@ -6,7 +6,7 @@ column: default_project_deletion_protection
db_type: boolean
default: 'false'
description: Enable default project deletion protection so only administrators can
delete projects. Default is `false`. Self-managed, Premium and Ultimate only.
delete projects. Default is `false`. GitLab Self-Managed, Premium and Ultimate only.
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -8,7 +8,7 @@ default: 'false'
description: Specifies whether users who have not confirmed their email should be
deleted. Default is `false`. When set to `true`, unconfirmed users are deleted after
`unconfirmed_users_delete_after_days` days. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352514)
in GitLab 16.1. Self-managed, Premium and Ultimate only.
in GitLab 16.1. GitLab Self-Managed, Premium and Ultimate only.
encrypted: false
gitlab_com_different_than_default: true
jihu: false

View File

@ -6,7 +6,7 @@ column: deletion_adjourned_period
db_type: integer
default: '7'
description: Number of days to wait before deleting a project or group that is marked
for deletion. Value must be between `1` and `90`. Defaults to `7`. Self-managed,
for deletion. Value must be between `1` and `90`. Defaults to `7`. GitLab Self-Managed,
Premium and Ultimate only.
encrypted: false
gitlab_com_different_than_default: false

View File

@ -6,10 +6,10 @@ column: disable_personal_access_tokens
db_type: boolean
default: 'false'
description: Disable personal access tokens. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/384201)
in GitLab 15.7. Self-managed, Premium and Ultimate only. There is no method available
to enable a personal access token that's been disabled through the API. This is
a [known issue](https://gitlab.com/gitlab-org/gitlab/-/issues/399233). For more
information about available workarounds, see [Workaround](https://gitlab.com/gitlab-org/gitlab/-/issues/399233#workaround).
in GitLab 15.7. GitLab Self-Managed, Premium and Ultimate only. There is no method
available to enable a personal access token that's been disabled through the API.
This is a [known issue](https://gitlab.com/gitlab-org/gitlab/-/issues/399233). For
more information about available workarounds, see [Workaround](https://gitlab.com/gitlab-org/gitlab/-/issues/399233#workaround).
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -7,7 +7,7 @@ db_type: boolean
default: 'true'
description: Indicates whether GitLab Duo features are enabled for this instance.
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/144931) in GitLab
16.10. Self-managed, Premium and Ultimate only.
16.10. GitLab Self-Managed, Premium and Ultimate only.
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -6,7 +6,7 @@ column: geo_node_allowed_ips
db_type: character
default: "'0.0.0.0/0"
description: Comma-separated list of IPs and CIDRs of allowed secondary nodes. For
example, `1.1.1.1, 2.2.2.0/24`. Self-managed, Premium and Ultimate only.
example, `1.1.1.1, 2.2.2.0/24`. GitLab Self-Managed, Premium and Ultimate only.
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -6,7 +6,7 @@ column: geo_status_timeout
db_type: integer
default: '10'
description: The amount of seconds after which a request to get a secondary node status
times out. Self-managed, Premium and Ultimate only.
times out. GitLab Self-Managed, Premium and Ultimate only.
encrypted: false
gitlab_com_different_than_default: true
jihu: false

View File

@ -7,7 +7,7 @@ db_type: integer[]
default: "'{}'::integer[]"
description: 'List of user IDs that are emailed when the Git abuse rate limit is exceeded.
Default: `[]`, Maximum: 100 user IDs. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/110201)
in GitLab 15.9. Self-managed, Ultimate only.'
in GitLab 15.9. GitLab Self-Managed, Ultimate only.'
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -7,7 +7,7 @@ db_type: text[]
default: "'{}'::text[]"
description: 'List of usernames excluded from Git anti-abuse rate limits. Default:
`[]`, Maximum: 100 usernames. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90815)
in GitLab 15.2. Self-managed, Ultimate only.'
in GitLab 15.2. GitLab Self-Managed, Ultimate only.'
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -5,8 +5,8 @@ clusterwide: false
column: group_owners_can_manage_default_branch_protection
db_type: boolean
default: 'true'
description: Prevent overrides of default branch protection. Self-managed, Premium
and Ultimate only.
description: Prevent overrides of default branch protection. GitLab Self-Managed,
Premium and Ultimate only.
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -7,7 +7,7 @@ db_type: boolean
default: 'false'
description: Indicates whether the GitLab Duo features enabled setting is enforced
for all subgroups. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/144931)
in GitLab 16.10. Self-managed, Premium and Ultimate only.
in GitLab 16.10. GitLab Self-Managed, Premium and Ultimate only.
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -7,7 +7,7 @@ db_type: smallint
default: '0'
description: 'Maximum number of unique repositories a user can download in the specified
time period before they are banned. Default: 0, Maximum: 10,000 repositories. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87980)
in GitLab 15.1. Self-managed, Ultimate only.'
in GitLab 15.1. GitLab Self-Managed, Ultimate only.'
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -7,7 +7,7 @@ db_type: integer
default: '0'
description: 'Reporting time period (in seconds). Default: 0, Maximum: 864000 seconds
(10 days). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87980)
in GitLab 15.1. Self-managed, Ultimate only.'
in GitLab 15.1. GitLab Self-Managed, Ultimate only.'
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -8,8 +8,8 @@ default:
description: Maximum allowable lifetime for access tokens in days. When left blank,
default value of 365 is applied. When set, value must be 365 or less. When changed,
existing access tokens with an expiration date beyond the maximum allowable lifetime
are revoked. Self-managed, Ultimate only. In GitLab 17.6 or later, the maximum lifetime
limit can be [extended to 400 days](https://gitlab.com/gitlab-org/gitlab/-/issues/461901)
are revoked. GitLab Self-Managed, Ultimate only. In GitLab 17.6 or later, the maximum
lifetime limit can be [extended to 400 days](https://gitlab.com/gitlab-org/gitlab/-/issues/461901)
by enabling a [feature flag](../administration/feature_flags.md) named `buffered_token_expiration_limit`.
encrypted: false
gitlab_com_different_than_default: false

View File

@ -5,10 +5,10 @@ clusterwide: false
column: max_ssh_key_lifetime
db_type: integer
default:
description: Maximum allowable lifetime for SSH keys in days. Self-managed, Ultimate
only. In GitLab 17.6 or later, the maximum lifetime limit can be [extended to 400
days](https://gitlab.com/gitlab-org/gitlab/-/issues/461901) by enabling a [feature
flag](../administration/feature_flags.md) named `buffered_token_expiration_limit`.
description: Maximum allowable lifetime for SSH keys in days. GitLab Self-Managed,
Ultimate only. In GitLab 17.6 or later, the maximum lifetime limit can be [extended
to 400 days](https://gitlab.com/gitlab-org/gitlab/-/issues/461901) by enabling a
[feature flag](../administration/feature_flags.md) named `buffered_token_expiration_limit`.
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -6,7 +6,7 @@ column: max_yaml_depth
db_type: integer
default: '100'
description: 'The maximum depth of nested CI/CD configuration added with the [`include`
keyword](../ci/yaml/index.md#include). Default: `100`.'
keyword](../ci/yaml/_index.md#include). Default: `100`.'
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -7,7 +7,7 @@ db_type: smallint[]
default: "'{1"
description: List of [package registry metadata to sync](../administration/settings/security_and_compliance.md#choose-package-registry-metadata-to-sync).
See [the list](https://gitlab.com/gitlab-org/gitlab/-/blob/ace16c20d5da7c4928dd03fb139692638b557fe3/app/models/concerns/enums/package_metadata.rb#L5)
of the available values. Self-managed, Ultimate only.
of the available values. GitLab Self-Managed, Ultimate only.
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -5,7 +5,7 @@ clusterwide: false
column: package_registry_allow_anyone_to_pull_option
db_type: boolean
default: 'true'
description: Enable to [allow anyone to pull from Package Registry](../user/packages/package_registry/index.md#allow-anyone-to-pull-from-package-registry)
description: Enable to [allow anyone to pull from Package Registry](../user/packages/package_registry/_index.md#allow-anyone-to-pull-from-package-registry)
visible and changeable.
encrypted: false
gitlab_com_different_than_default: false

View File

@ -1,15 +1,12 @@
---
api_type: boolean
api_type:
attr: pre_receive_secret_detection_enabled
clusterwide: true
column: pre_receive_secret_detection_enabled
db_type: boolean
default: 'false'
description: Allow projects to enable secret push protection. This does not enable
secret push protection. When you enable this feature, you accept the [GitLab Testing
Agreement](https://handbook.gitlab.com/handbook/legal/testing-agreement/). Ultimate
only.
description:
encrypted: false
gitlab_com_different_than_default: true
gitlab_com_different_than_default: false
jihu: false
not_null: true

View File

@ -10,4 +10,4 @@ description: Allow projects to enable secret push protection. This does not enab
encrypted: false
gitlab_com_different_than_default: true
jihu: false
not_null: true
not_null: false

View File

@ -1,11 +1,11 @@
---
api_type:
api_type: hash
attr: sign_in_restrictions
clusterwide: false
column: sign_in_restrictions
db_type: jsonb
default: "'{}'::jsonb"
description:
description: Application sign in restrictions.
encrypted: false
gitlab_com_different_than_default: false
jihu: false

View File

@ -5,7 +5,7 @@ clusterwide: false
column: silent_mode_enabled
db_type: boolean
default: 'false'
description: Enable [Silent mode](../administration/silent_mode/index.md). Default
description: Enable [Silent mode](../administration/silent_mode/_index.md). Default
is `false`.
encrypted: false
gitlab_com_different_than_default: false

View File

@ -8,7 +8,7 @@ default: '7'
description: Specifies how many days after sign-up to delete users who have not confirmed
their email. Only applicable if `delete_unconfirmed_users` is set to `true`. Must
be `1` or greater. Default is `7`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352514)
in GitLab 16.1. Self-managed, Premium and Ultimate only.
in GitLab 16.1. GitLab Self-Managed, Premium and Ultimate only.
encrypted: false
gitlab_com_different_than_default: true
jihu: false

View File

@ -1,9 +1,9 @@
---
name: work_item_description_templates
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/512208
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/177856
rollout_issue_url:
name: glql_load_on_click
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/180921
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/517914
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/517546
milestone: '17.9'
group: group::product planning
type: wip
type: development
group: group::knowledge
default_enabled: false

View File

@ -0,0 +1,9 @@
---
name: ci_async_build_hooks_execution
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/499290
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/177706
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/512832
milestone: '17.9'
group: group::pipeline authoring
type: gitlab_com_derisk
default_enabled: false

View File

@ -818,6 +818,9 @@ Gitlab.ee do
Settings.cron_jobs['ldap_sync_worker'] ||= {}
Settings.cron_jobs['ldap_sync_worker']['cron'] ||= '30 1 * * *'
Settings.cron_jobs['ldap_sync_worker']['job_class'] = 'LdapSyncWorker'
Settings.cron_jobs['queue_refresh_of_broken_adherence_groups_worker'] ||= {}
Settings.cron_jobs['queue_refresh_of_broken_adherence_groups_worker']['cron'] ||= '*/20 * * * *'
Settings.cron_jobs['queue_refresh_of_broken_adherence_groups_worker']['job_class'] = 'ComplianceManagement::QueueRefreshOfBrokenAdherenceGroupsWorker'
Settings.cron_jobs['elastic_index_bulk_cron_worker'] ||= {}
Settings.cron_jobs['elastic_index_bulk_cron_worker']['cron'] ||= '*/1 * * * *'
Settings.cron_jobs['elastic_index_bulk_cron_worker']['job_class'] ||= 'ElasticIndexBulkCronWorker'

View File

@ -390,6 +390,14 @@ module.exports = {
include: /node_modules/,
loader: 'babel-loader',
},
{
test: /(@sentry|@sentry-internal)\/.*\.m?js$/,
include: /node_modules/,
loader: 'babel-loader',
options: {
plugins: ['@babel/plugin-transform-optional-chaining'],
},
},
{
test: /swagger-ui-dist\/.*\.js?$/,
include: /node_modules/,

View File

@ -4,7 +4,7 @@
breaking_change: true
reporter: sam.white
body: | # Do not modify this line, instead modify the lines below.
The [required pipeline configuration](https://docs.gitlab.com/administration/settings/continuous_integration/#required-pipeline-configuration) feature is deprecated in GitLab 14.8 for Premium customers and is scheduled for removal in GitLab 15.0. This feature is not deprecated for GitLab Ultimate customers.
The [required pipeline configuration](https://docs.gitlab.com/administration/settings/continuous_integration/#required-pipeline-configuration-deprecated) feature is deprecated in GitLab 14.8 for Premium customers and is scheduled for removal in GitLab 15.0. This feature is not deprecated for GitLab Ultimate customers.
This change to move the feature to GitLab Ultimate tier is intended to help our features better align with our [pricing philosophy](https://handbook.gitlab.com/handbook/company/pricing/#three-tiers) as we see demand for this feature originating primarily from executives.

View File

@ -32,6 +32,6 @@
# OTHER OPTIONAL FIELDS
#
tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
documentation_url: https://docs.gitlab.com/ee/administration/settings/continuous_integration.html#required-pipeline-configuration # (optional) This is a link to the current documentation page
documentation_url: https://docs.gitlab.com/ee/administration/settings/continuous_integration.html#required-pipeline-configuration-deprecated # (optional) This is a link to the current documentation page
image_url: # (optional) This is a link to a thumbnail image depicting the feature
video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg

View File

@ -0,0 +1,15 @@
# frozen_string_literal: true
class RemoveNotNullConstraintFromMininumAccessLevelForPush < Gitlab::Database::Migration[2.2]
milestone '17.9'
disable_ddl_transaction!
def up
remove_not_null_constraint :packages_protection_rules, :minimum_access_level_for_push
end
def down
add_not_null_constraint :packages_protection_rules, :minimum_access_level_for_push
end
end

View File

@ -0,0 +1,28 @@
# frozen_string_literal: true
# This migration is only relevant for the down migration case.
# It ensures that package protection rules with nil minimum_access_level_for_push are removed
# before the NOT NULL constraint is added in the previous down migration,
# i.e. 20250130161000_remove_not_null_constraint_from_mininum_access_level_for_push.rb .
# See the related discussion thread https://gitlab.com/gitlab-org/gitlab/-/merge_requests/179739#note_2334019898
class RemovePackageProtectionRulesOnDownMigration < Gitlab::Database::Migration[2.2]
milestone '17.9'
disable_ddl_transaction!
restrict_gitlab_migration gitlab_schema: :gitlab_main
class PackagesProtectionRule < MigrationRecord
self.table_name = "packages_protection_rules"
end
def up
# no-op
end
def down
PackagesProtectionRule.where(minimum_access_level_for_push: nil).find_in_batches(batch_size: 100) do |ids|
PackagesProtectionRule.where(id: ids).delete_all
end
end
end

View File

@ -0,0 +1,9 @@
# frozen_string_literal: true
class AddMinimumAccessLevelForDeleteToPackagesProtectionRules < Gitlab::Database::Migration[2.2]
milestone '17.9'
def change
add_column :packages_protection_rules, :minimum_access_level_for_delete, :smallint, null: true, if_not_exists: true
end
end

View File

@ -0,0 +1,25 @@
# frozen_string_literal: true
class AddMultiNotNullConstraintOnPackagesProtectionRulesMinimumAccessLevels < Gitlab::Database::Migration[2.2]
milestone '17.9'
disable_ddl_transaction!
TABLE_NAME = :packages_protection_rules
def up
add_multi_column_not_null_constraint(TABLE_NAME,
:minimum_access_level_for_push,
:minimum_access_level_for_delete,
operator: '>',
limit: 0
)
end
def down
remove_multi_column_not_null_constraint(TABLE_NAME,
:minimum_access_level_for_push,
:minimum_access_level_for_delete
)
end
end

View File

@ -0,0 +1 @@
d7540cd5185033e059ef5cd1fec7534cd72d6817d38515cf5ad09494ca53adca

View File

@ -0,0 +1 @@
bec94a6bc401509b2c95bcc81c30410bd278618be2de21ae5b437f9ad2324283

View File

@ -0,0 +1 @@
2228d1a19ee7f088c24212cba45511a8e8f5ae67cdfd5b70506b20494e8d10e8

View File

@ -0,0 +1 @@
c35f7df366f60a6593cde2450ee35072f579cdc19eb2368d8f1a74504a329c9a

View File

@ -18305,7 +18305,8 @@ CREATE TABLE packages_protection_rules (
package_type smallint NOT NULL,
package_name_pattern text NOT NULL,
minimum_access_level_for_push smallint,
CONSTRAINT check_12e13c202a CHECK ((minimum_access_level_for_push IS NOT NULL)),
minimum_access_level_for_delete smallint,
CONSTRAINT check_520a0596a3 CHECK ((num_nonnulls(minimum_access_level_for_delete, minimum_access_level_for_push) > 0)),
CONSTRAINT check_d2d75d206d CHECK ((char_length(package_name_pattern) <= 255))
);

View File

@ -12,8 +12,19 @@ title: GitLab Pages administration
{{< /details >}}
GitLab Pages allows for hosting of static sites. It must be configured by an
administrator. Separate [user documentation](../../user/project/pages/_index.md) is available.
GitLab Pages provides static site hosting for GitLab projects and groups.
Server administrators must configure Pages before users can access this feature.
With GitLab Pages, administrators:
- Host static websites securely with custom domains and SSL/TLS certificates.
- Enable authentication to control access to Pages sites through GitLab permissions.
- Scale deployments using object storage or network storage in multi-node environments.
- Monitor and manage traffic with rate limiting and custom headers.
- Support IPv4 and IPv6 addresses for all Pages sites.
The GitLab Pages daemon runs as a separate process and can be configured either on the same server
as GitLab or on its own dedicated infrastructure.
For user documentation, see [GitLab Pages](../../user/project/pages/_index.md).
{{< alert type="note" >}}

View File

@ -427,62 +427,6 @@ To disable the banner:
1. Clear the **Show the migrate from Jenkins banner** checkbox.
1. Select **Save changes**.
## Required pipeline configuration
{{< details >}}
- Tier: Ultimate
- Offering: GitLab Self-Managed
{{< /details >}}
{{< history >}}
- [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/352316) from GitLab Premium to GitLab Ultimate in 15.0.
- [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/389467) in GitLab 15.9.
- [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/389467) in GitLab 17.0.
- [Re-added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/165111) behind the `required_pipelines` feature flag in GitLab 17.4. Disabled by default.
{{< /history >}}
{{< alert type="warning" >}}
This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/389467) in GitLab 15.9
and was removed in 17.0. From 17.4, it is available only behind the feature flag `required_pipelines`, disabled by default.
Use [compliance pipelines](../../user/group/compliance_pipelines.md) instead. This change is a breaking change.
{{< /alert >}}
You can set a [CI/CD template](../../ci/examples/_index.md#cicd-templates)
as a required pipeline configuration for all projects on a GitLab instance. You can
use a template from:
- The default CI/CD templates.
- A custom template stored in an [instance template repository](instance_template_repository.md).
{{< alert type="note" >}}
When you use a configuration defined in an instance template repository,
nested [`include:`](../../ci/yaml/_index.md#include) keywords
(including `include:file`, `include:local`, `include:remote`, and `include:template`)
[do not work](https://gitlab.com/gitlab-org/gitlab/-/issues/35345).
{{< /alert >}}
The project CI/CD configuration merges into the required pipeline configuration when
a pipeline runs. The merged configuration is the same as if the required pipeline configuration
added the project configuration with the [`include` keyword](../../ci/yaml/_index.md#include).
To view a project's full merged configuration, [View full configuration](../../ci/pipeline_editor/_index.md#view-full-configuration)
in the pipeline editor.
To select a CI/CD template for the required pipeline configuration:
1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand the **Required pipeline configuration** section.
1. Select a CI/CD template from the dropdown list.
1. Select **Save changes**.
## Package registry configuration
### Maven Forwarding
@ -554,3 +498,59 @@ To set the maximum file size:
1. Find the package type you would like to adjust.
1. Enter the maximum file size, in bytes.
1. Select **Save size limits**.
## Required pipeline configuration (deprecated)
{{< details >}}
- Tier: Ultimate
- Offering: GitLab Self-Managed
{{< /details >}}
{{< history >}}
- [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/352316) from GitLab Premium to GitLab Ultimate in 15.0.
- [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/389467) in GitLab 15.9.
- [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/389467) in GitLab 17.0.
- [Re-added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/165111) behind the `required_pipelines` feature flag in GitLab 17.4. Disabled by default.
{{< /history >}}
{{< alert type="warning" >}}
This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/389467) in GitLab 15.9
and was removed in 17.0. From 17.4, it is available only behind the feature flag `required_pipelines`, disabled by default.
Use [compliance pipelines](../../user/group/compliance_pipelines.md) instead. This change is a breaking change.
{{< /alert >}}
You can set a [CI/CD template](../../ci/examples/_index.md#cicd-templates)
as a required pipeline configuration for all projects on a GitLab instance. You can
use a template from:
- The default CI/CD templates.
- A custom template stored in an [instance template repository](instance_template_repository.md).
{{< alert type="note" >}}
When you use a configuration defined in an instance template repository,
nested [`include:`](../../ci/yaml/_index.md#include) keywords
(including `include:file`, `include:local`, `include:remote`, and `include:template`)
[do not work](https://gitlab.com/gitlab-org/gitlab/-/issues/35345).
{{< /alert >}}
The project CI/CD configuration merges into the required pipeline configuration when
a pipeline runs. The merged configuration is the same as if the required pipeline configuration
added the project configuration with the [`include` keyword](../../ci/yaml/_index.md#include).
To view a project's full merged configuration, [View full configuration](../../ci/pipeline_editor/_index.md#view-full-configuration)
in the pipeline editor.
To select a CI/CD template for the required pipeline configuration:
1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > CI/CD**.
1. Expand the **Required pipeline configuration** section.
1. Select a CI/CD template from the dropdown list.
1. Select **Save changes**.

View File

@ -86,13 +86,15 @@ sourced from the [`doc` directory](https://gitlab.com/gitlab-org/gitlab/-/tree/m
When redirecting `/help`, GitLab:
- Redirects requests to the specified URL.
- Appends `ee` and the documentation path, which includes the version number, to the URL.
- Appends `.html` to the URL, and removes `.md` if necessary.
- Uses the specified URL as the base URL for the redirect.
- Constructs the full URL by:
- Adding the version number (`${VERSION}`).
- Adding the documentation path.
- Removing any `.md` file extensions.
For example, if the URL is set to `https://docs.gitlab.com`, requests for
`/help/administration/settings/help_page.md` redirect to:
`https://docs.gitlab.com/${VERSION}/ee/administration/settings/help_page.html`.
`https://docs.gitlab.com/${VERSION}/administration/settings/help_page`.
<!-- ## Troubleshooting

View File

@ -36,7 +36,8 @@ Parameters:
Example request:
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/deploy_tokens"
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/deploy_tokens"
```
Example response:
@ -81,7 +82,8 @@ Parameters:
Example request:
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/deploy_tokens"
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/1/deploy_tokens"
```
Example response:
@ -121,7 +123,8 @@ Parameters:
Example request:
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/deploy_tokens/1"
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/1/deploy_tokens/1"
```
Example response:
@ -162,9 +165,11 @@ Parameters:
Example request:
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --header "Content-Type: application/json" \
--data '{"name": "My deploy token", "expires_at": "2021-01-01", "username": "custom-user", "scopes": ["read_repository"]}' \
"https://gitlab.example.com/api/v4/projects/5/deploy_tokens/"
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{"name": "My deploy token", "expires_at": "2021-01-01", "username": "custom-user", "scopes": ["read_repository"]}' \
--url "https://gitlab.example.com/api/v4/projects/5/deploy_tokens/"
```
Example response:
@ -202,8 +207,9 @@ Parameters:
Example request:
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" \
"https://gitlab.example.com/api/v4/projects/5/deploy_tokens/13"
curl --request DELETE \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/5/deploy_tokens/13"
```
## Group deploy tokens
@ -229,7 +235,8 @@ Parameters:
Example request:
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/1/deploy_tokens"
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url"https://gitlab.example.com/api/v4/groups/1/deploy_tokens"
```
Example response:
@ -269,7 +276,8 @@ Parameters:
Example request:
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/1/deploy_tokens/1"
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/groups/1/deploy_tokens/1"
```
Example response:
@ -310,9 +318,11 @@ Parameters:
Example request:
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --header "Content-Type: application/json" \
--data '{"name": "My deploy token", "expires_at": "2021-01-01", "username": "custom-user", "scopes": ["read_repository"]}' \
"https://gitlab.example.com/api/v4/groups/5/deploy_tokens/"
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{"name": "My deploy token", "expires_at": "2021-01-01", "username": "custom-user", "scopes": ["read_repository"]}' \
--url "https://gitlab.example.com/api/v4/groups/5/deploy_tokens/"
```
Example response:
@ -350,5 +360,7 @@ Parameters:
Example request:
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/deploy_tokens/13"
curl --request DELETE \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/groups/5/deploy_tokens/13"
```

View File

@ -523,9 +523,7 @@ The order of the items in `stages` defines the execution order for jobs:
- Jobs in the next stage run after the jobs from the previous stage complete successfully.
If a pipeline contains only jobs in the `.pre` or `.post` stages, it does not run.
There must be at least one other job in a different stage. `.pre` and `.post` stages
can be used in [required pipeline configuration](../../administration/settings/continuous_integration.md#required-pipeline-configuration)
to define compliance jobs that must run before or after project pipeline jobs.
There must be at least one other job in a different stage.
**Keyword type**: Global keyword.

View File

@ -5,11 +5,18 @@ info: Analysis of Application Settings for Cells 1.0.
title: Application Settings analysis
---
<!--
This documentation is auto generated by a Ruby script.
Please do not edit this file directly. To update this file, run:
scripts/cells/application-settings-analysis.rb
-->
## Statistics
- Number of attributes: 513
- Number of encrypted attributes: 41 (8.0%)
- Number of attributes documented: 312 (61.0%)
- Number of attributes documented: 313 (61.0%)
- Number of attributes on GitLab.com different from the defaults: 233 (45.0%)
- Number of attributes with `clusterwide` set: 513 (100.0%)
- Number of attributes with `clusterwide: true` set: 127 (25.0%)
@ -17,7 +24,7 @@ title: Application Settings analysis
## Individual columns
| Attribute name | Encrypted | DB Type | API Type | Not Null? | Default | GitLab.com != default | Cluster-wide? | Documented? |
| -------------- | ------------- | --------- | --------- | ----------------- | --------------------- | ------------- | ----------- |
| -------------- | ------------- | --------- | --------- | --------- | --------- | ------------- | ----------- | ----------- |
| `abuse_notification_email` | `false` | `character` | `string` | `false` | `null` | `true` | `true`| `true` |
| `admin_mode` | `false` | `boolean` | `boolean` | `true` | `false` | `false` | `false`| `true` |
| `after_sign_out_path` | `false` | `character` | `string` | `false` | `null` | `true` | `true`| `true` |

View File

@ -256,7 +256,7 @@ For February 2025, run the checks for broken external links and `start_remove` c
{{< alert type="note" >}}
This does not impact the release post [structural check](https://handbook.gitlab.com/handbook/marketing/blog/release-posts/#structural-check) or [monthly documentation release](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/releases.md) tasks. The assigned Technical Writer should continue to do these tasks as previously scheduled.
This does not impact the release post [structural check](https://handbook.gitlab.com/handbook/marketing/blog/release-posts/#structural-check) or [monthly documentation release](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/doc/releases.md) tasks. The assigned Technical Writer should continue to do these tasks as previously scheduled.
{{< /alert >}}

View File

@ -5,13 +5,13 @@ info: For assistance with this Style Guide page, see https://handbook.gitlab.com
title: Documentation site architecture
---
The [`gitlab-docs`](https://gitlab.com/gitlab-org/gitlab-docs) project hosts
the repository which is used to generate the GitLab documentation website and
is deployed to <https://docs.gitlab.com>. It uses the [Nanoc](https://nanoc.app/)
The [`docs-gitlab-com`](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com) project hosts
the repository used to generate the GitLab documentation website and
is deployed to <https://docs.gitlab.com>. It uses the [Hugo](https://gohugo.io/)
static site generator.
View the [`gitlab-docs` architecture page](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/architecture.md)
for more information.
For more information, see the [Docs site architecture](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/doc/architecture.md)
page.
## Source files
@ -44,12 +44,12 @@ released, follow the [patch release runbook](https://gitlab.com/gitlab-org/relea
## Documentation in other repositories
If you have code and documentation in a repository other than the [primary repositories](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/architecture.md),
If you have code and documentation in a repository other than the [primary repositories](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/doc/architecture.md),
you should keep the documentation with the code in that repository.
Then you can use one of these approaches:
- Recommended. [Add the repository to the list of products](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/development.md#add-a-new-product)
- Recommended. [Add the repository to the list of products](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/doc/development.md#add-a-new-product)
published at <https://docs.gitlab.com>. The source of the documentation pages remains
in the external repository, but the resulting pages are indexed and searchable on <https://docs.gitlab.com>.
- Recommended. [Add an entry in the global navigation](global_nav.md#add-a-navigation-entry) for
@ -67,7 +67,7 @@ Then you can use one of these approaches:
## Monthly release process (versions)
The docs website supports versions and each month we add the latest one to the list.
For more information, read about the [monthly release process](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/releases.md).
For more information, read about the [monthly release process](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/doc/releases.md).
## Danger Bot
@ -80,15 +80,15 @@ process. This is configured in the `Dangerfile` in the GitLab repository under
## Request a documentation survey banner
To reach to a wider audience, you can request
[a survey banner](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/maintenance.md#survey-banner).
[a survey banner](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/doc/maintenance.md#survey-banner).
Only one banner can exist at any given time. Priority is given based on who
asked for the banner first.
To request a survey banner:
1. [Open an issue](https://gitlab.com/gitlab-org/gitlab-docs/-/issues/new?issue[title]=Survey%20banner%20request&issuable_template=Survey%20banner%20request)
in the `gitlab-docs` project and use the "Survey banner request" template.
1. [Open an issue](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/issues/new?issue[title]=Survey%20banner%20request&issuable_template=Survey%20banner%20request)
in the `docs-gitlab-com` project and use the "Survey banner request" template.
1. Fill in the details in the issue description.
1. Create the issue and someone from the Technical Writing team will handle your request.
1. When you no longer need the banner, ping the person assigned to the issue and ask them to remove it.

View File

@ -57,7 +57,7 @@ that are coded across multiple repositories.
If you want to automate a page on the docs site:
1. Review [issue 823](https://gitlab.com/gitlab-org/gitlab-docs/-/issues/823)
1. Review [issue 246](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/issues/246)
and consider adding feedback there.
1. If that issue does not describe what you need, contact
[the DRI for the docs site backend](https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments-to-other-projects-and-subjects).

View File

@ -13,11 +13,11 @@ The website hosts documentation only for the [currently supported](../../../poli
## Parts of release process
The documentation [release process](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/releases.md)
The documentation [release process](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/doc/releases.md)
involves:
- Merge requests, to make changes to the `main` and relevant stable branches.
- Pipelines, to build and deploy Docker images to the [`gitlab-docs` container registry](https://gitlab.com/gitlab-org/gitlab-docs/container_registry)
- Pipelines, to build and deploy Docker images to the [`docs-gitlab-com` container registry](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/container_registry)
for the relevant stable branches.
- Docker images used to build and deploy all the online documentation, including stable versions and the latest documentation.

View File

@ -76,7 +76,7 @@ place for it.
Do not include the same information in multiple places.
Link to a single source of truth instead.
For example, if you have code in a repository other than the [primary repositories](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/architecture.md),
For example, if you have code in a repository other than the [primary repositories](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/doc/architecture.md),
and documentation in the same repository, you can keep the documentation in that repository.
Then you can either:

View File

@ -39,17 +39,16 @@ as helpful as **Get started with runners**.
## Add a navigation entry
The global nav is stored in the `gitlab-org/gitlab-docs` project, in the file
`content/_data/navigation.yaml`. The `gitlab-docs` project contains code that assembles documentation
content from several projects (including `charts`, `gitlab`, `gitlab-runner`, and `omnibus-gitlab`)
and then builds the `docs.gitlab.com` website from that content.
The global nav is stored in the `gitlab-org/technical-writing/docs-gitlab-com` project, in the
`data/navigation.yaml` file. The documentation website at `docs.gitlab.com` is built using Hugo and assembles documentation
content from several projects (including `charts`, `gitlab`, `gitlab-runner`, and `omnibus-gitlab`).
**Do not** add items to the global nav without
the consent of one of the technical writers.
To add a topic to the global navigation:
1. In the [`navigation.yaml`](https://gitlab.com/gitlab-org/gitlab-docs/blob/main/content/_data/navigation.yaml)
1. In the [`navigation.yaml`](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/data/navigation.yaml)
file, add the item.
1. Assign the MR to a technical writer for review and merge.
@ -117,7 +116,7 @@ The global nav has five levels:
- Doc
- Doc
You can view this structure in [the `navigation.yml` file](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/content/_data/navigation.yaml).
You can view this structure in the [`navigation.yml`](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/data/navigation.yaml?ref_type=heads) file.
### Use GitLab section
@ -149,7 +148,7 @@ the data among the nav in containers properly [styled](#css-classes).
### Data file
The data file describes the structure of the navigation for the applicable project.
It is stored at <https://gitlab.com/gitlab-org/gitlab-docs/blob/main/content/_data/navigation.yaml>
It is stored at <https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/data/navigation.yaml>
and comprises of three main components:
- Sections
@ -167,11 +166,11 @@ sections:
section_url: 'link'
```
The section can stand alone or contain categories within.
The section can stand alone or contain categories.
#### Categories
Each category within a section composes the second level of the nav.
Each category in a section composes the second level of the nav.
It includes the category title and link. It can stand alone in the nav or contain
a third level of sub-items.
@ -296,7 +295,7 @@ The [layout](https://gitlab.com/gitlab-org/gitlab-docs/blob/main/layouts/global_
is fed by the [data file](#data-file), builds the global nav, and is rendered by the
[default](https://gitlab.com/gitlab-org/gitlab-docs/blob/main/layouts/default.html) layout.
The global nav contains links from all [four upstream projects](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/architecture.md).
The global nav contains links from all [four upstream projects](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/doc/architecture.md).
The [global nav URL](#urls) has a different prefix depending on the documentation file you change.
| Repository | Link prefix | Final URL |

View File

@ -1825,7 +1825,8 @@ For example:
[configuration edits guide](#how-to-document-different-installation-methods))
- `15.1 and earlier`, `15.2 and later`
Until we implement automated testing for broken links to tabs ([Issue 1355](https://gitlab.com/gitlab-org/gitlab-docs/-/issues/1355)), do not link directly to a single tab, even though they do have unique URL parameters.
Until we implement automated testing for broken links to tabs, do not link directly to a single tab.
For more information, see [issue 225](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/issues/225).
See [Pajamas](https://design.gitlab.com/components/tabs/#guidelines) for more
details on tabs.

View File

@ -50,9 +50,8 @@ To install `markdownlint-cli2`, run:
yarn global add markdownlint-cli2
```
You should install the version of `markdownlint-cli` or `markdownlint-cli2`
[used (see `variables:` section)](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/.gitlab-ci.yml) when building
the `image:docs-lint-markdown`.
You should install the version of `markdownlint-cli` or `markdownlint-cli2` that matches the version used in the GitLab Docs project.
You can find the correct version in the [`variables:` section](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/.gitlab-ci.yml?ref_type=heads#L16).
## Configure markdownlint in your editor

View File

@ -397,7 +397,7 @@ Add documentation for the integration:
- Add a page in `doc/user/project/integrations`.
- Link it from the [Integrations overview](../../user/project/integrations/_index.md).
- After the documentation has merged, [add an entry](../documentation/site_architecture/global_nav.md#add-a-navigation-entry)
to the documentation navigation under the [Integrations category title](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/24c8ab629383b47a6d6351a9d48325cb43ed5287/content/_data/navigation.yaml?page=3#L2822).
to the documentation navigation under [Integrations](https://gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/-/blob/main/data/navigation.yaml?ref_type=heads#L2936).
You can also refer to our general [documentation guidelines](../documentation/_index.md).

View File

@ -7359,7 +7359,7 @@ For more information, check the [summary section of the deprecation issue](https
</div>
The [required pipeline configuration](https://docs.gitlab.com/administration/settings/continuous_integration/#required-pipeline-configuration) feature is deprecated in GitLab 14.8 for Premium customers and is scheduled for removal in GitLab 15.0. This feature is not deprecated for GitLab Ultimate customers.
The [required pipeline configuration](https://docs.gitlab.com/administration/settings/continuous_integration/#required-pipeline-configuration-deprecated) feature is deprecated in GitLab 14.8 for Premium customers and is scheduled for removal in GitLab 15.0. This feature is not deprecated for GitLab Ultimate customers.
This change to move the feature to GitLab Ultimate tier is intended to help our features better align with our [pricing philosophy](https://handbook.gitlab.com/handbook/company/pricing/#three-tiers) as we see demand for this feature originating primarily from executives.

View File

@ -5,8 +5,15 @@ info: To determine the technical writer assigned to the Stage/Group associated w
title: Ask GitLab Duo Chat
---
GitLab Duo Chat can help with a variety of questions. The following examples
represent some of the areas where GitLab Duo Chat can be the most helpful.
As part of GitLab Duo's AI-powered features, GitLab Duo Chat helps you:
- Get explanations of code, errors, and GitLab features.
- Generate or refactor code, write tests, and fix issues.
- Create CI/CD configurations and troubleshoot job failures.
- Summarize issues, epics, and merge requests.
- Resolve security vulnerabilities.
The following examples provide more information on Duo Chat capabilities.
For additional practical examples, see the [GitLab Duo use cases](../gitlab_duo/use_cases.md).

View File

@ -12,10 +12,18 @@ title: GitLab Flavored Markdown (GLFM)
{{< /details >}}
When you enter text in the GitLab UI, GitLab assumes the text is in the Markdown language.
The text is rendered with a set of styles. These styles are called *GitLab Flavored Markdown*.
GitLab Flavored Markdown (GLFM) is a powerful markup language that formats text in the GitLab user interface.
GLFM:
You can use GitLab Flavored Markdown in the following areas:
- Creates rich content with support for code, diagrams, math equations, and multimedia.
- Links issues, merge requests, and other GitLab content with cross-references.
- Organizes information with task lists, tables, and collapsible sections.
- Supports syntax highlighting for over 100 programming languages.
- Ensures accessibility with semantic heading structures and image descriptions.
When you enter text in the GitLab UI, GitLab assumes the text is in GitLab Flavored Markdown.
You can use GitLab Flavored Markdown in:
- Comments
- Issues

View File

@ -12,7 +12,14 @@ title: Description templates
{{< /details >}}
{{< history >}}
- [Work item support](https://gitlab.com/gitlab-org/gitlab/-/issues/512208) introduced in GitLab 17.10.
{{< /history >}}
Description templates standardize and automate how issues and merge requests are created in GitLab.
Description templates:
- Create consistent layouts for issues and merge requests across projects.
@ -22,7 +29,14 @@ Description templates:
- Ensure proper tracking of bugs, features, and other work items.
- Format [Service Desk email responses](service_desk/configure.md#use-a-custom-template-for-service-desk-tickets).
You can define templates to use as descriptions for your [issues](issues/_index.md) and [merge requests](merge_requests/_index.md).
You can define templates to use as descriptions
for your:
- [issues](issues/_index.md)
- [epics](../group/epics/epic_work_items.md)
- [tasks](../tasks.md)
- [merge requests](merge_requests/_index.md)
Projects inherit templates from their group and instance.
Templates must be:
@ -36,6 +50,12 @@ Templates must be:
Create a new Markdown (`.md`) file inside the `.gitlab/issue_templates/`
directory in your repository.
{{< alert type="note" >}}
Issue templates are supported in all types of Work item including issues, epics, tasks, objectives and key results.
{{< /alert >}}
To create an issue description template:
1. On the left sidebar, select **Search or go to** and find your project.
@ -75,7 +95,7 @@ When you create or edit an issue or a merge request, it shows in the **Choose a
To apply a template:
1. Create or edit an issue or a merge request.
1. Create or edit an issue, work item, or a merge request.
1. Select the **Choose a template** dropdown list.
1. If the **Description** text box hasn't been empty, to confirm, select **Apply template**.
1. Select **Save changes**.
@ -84,7 +104,7 @@ When you select a description template, its content is copied to the description
To discard any changes to the description you've made after selecting the template: expand the **Choose a template** dropdown list and select **Reset template**.
![Choosing a description template in an issue](img/description_templates_v14_7.png)
![Choosing a description template in an issue](img/description_templates_v17-10.png)
{{< alert type="note" >}}

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -13,32 +13,29 @@ title: GitLab Pages
{{< /details >}}
With GitLab Pages, you can publish static websites directly from a repository
in GitLab.
GitLab Pages publishes static websites directly from a repository in GitLab.
<div class="row">
<div class="col-md-9">
<p style="margin-top: 18px;">
<ul>
<li>Use for any personal or business website.</li>
<li>Use any Static Site Generator (SSG) or plain HTML.</li>
<li>Create websites for your projects, groups, or user account.</li>
<li>Host your site on your own GitLab instance or on GitLab.com for free.</li>
<li>Connect your custom domains and TLS certificates.</li>
<li>Attribute any license to your content.</li>
</ul>
These websites:
- Deploy automatically with GitLab CI/CD pipelines.
- Support any static site generator (like Hugo, Jekyll, or Gatsby) or plain HTML, CSS, and JavaScript.
- Run on GitLab-provided infrastructure at no additional cost.
- Connect with custom domains and SSL/TLS certificates.
- Control access through built-in authentication.
- Scale reliably for personal, business, or project documentation sites.
</p>
</div>
<div class="col-md-3"><img src="img/ssgs_pages_v11_3.png" alt="Examples of SSGs supported by Pages" class="middle display-block"></div>
</div>
To publish a website with Pages, you can use any static site generator,
like Gatsby, Jekyll, Hugo, Middleman, Harp, Hexo, or Brunch. You can also
publish any website written directly in plain HTML, CSS, and JavaScript.
Pages does not support dynamic server-side processing, for instance, as `.php` and `.asp` requires.
For more information, see
[Static vs dynamic websites](https://about.gitlab.com/blog/2016/06/03/ssg-overview-gitlab-pages-part-1-dynamic-x-static/).
To publish a website with Pages, use any static site generator like Gatsby, Jekyll, Hugo, Middleman, Harp, Hexo, or Brunch.
Pages also supports websites written directly in plain HTML, CSS, and JavaScript.
Dynamic server-side processing (like `.php` and `.asp`) is not supported.
For more information, see [Static vs dynamic websites](https://about.gitlab.com/blog/2016/06/03/ssg-overview-gitlab-pages-part-1-dynamic-x-static/).
## Getting started

View File

@ -12,12 +12,15 @@ title: Create a GitLab Pages deployment for a static site
{{< /details >}}
If you already have a GitLab project that contains your static site or framework,
you can generate a GitLab Pages website from it.
Create a GitLab Pages deployment to convert your static site or framework into a website hosted on GitLab.
Through a step-by-step form, GitLab:
When you provide basic information in the UI, a `.gitlab-ci.yml` file is created
and a merge request opened. When you commit the merge request,
a pipeline deploys your Pages website.
- Generates a custom CI/CD configuration based on your project setup.
- Creates a `.gitlab-ci.yml` file configured for GitLab Pages deployments.
- Submits the changes through a merge request for your review.
- Deploys your website automatically when the merge request is committed.
This guide explains how to use the Pages UI to deploy a static site or framework-based application.
## Prerequisites

View File

@ -12,8 +12,17 @@ title: GitLab Pages default domain names and URLs
{{< /details >}}
On this document, learn how to name your project for GitLab Pages
according to your intended website's URL.
GitLab Pages provides default domain names based on your namespace and project name.
These domains:
- Generate predictable URLs for project sites, user sites, and group sites.
- Support hierarchical paths that reflect your GitLab organizational structure.
- Create unique domain names with automatic redirects when enabled.
- Work seamlessly with custom domain names and SSL/TLS certificates.
- Scale across user, group, and subgroup projects.
This guide explains how GitLab Pages assigns domain names and URLs to your websites, and how to
configure your static site generator accordingly.
## GitLab Pages default domain names

View File

@ -12,15 +12,18 @@ title: GitLab Pages settings
{{< /details >}}
This document is a user guide to explore the options and settings
GitLab Pages offers.
GitLab Pages offers configuration options to customize your static site's deployment and presentation.
With Pages settings, you can:
To familiarize yourself with GitLab Pages first:
- Serve custom error pages for 403 and 404 responses.
- Configure URL redirects through `_redirects` files.
- Deploy pages from any branch using CI/CD rules.
- Serve pre-compressed assets for faster page loads.
- Customize the folder from which your site is published.
- Generate and manage unique domains for your sites.
- Read an [introduction to GitLab Pages](_index.md).
- Learn [how to get started with Pages](_index.md#getting-started).
- Learn how to enable GitLab Pages
across your GitLab instance on the [administrator documentation](../../../administration/pages/_index.md).
This guide explains the settings and configuration options available for your GitLab Pages sites.
For an introduction to Pages, see [GitLab Pages](_index.md).
## GitLab Pages requirements

View File

@ -207,38 +207,6 @@ You can use [Generic packages](../../packages/generic_packages/_index.md) to hos
For a complete example, see the [Release assets as Generic packages](https://gitlab.com/gitlab-org/release-cli/-/tree/master/docs/examples/release-assets-as-generic-package/)
project.
Here's how to create a release with packaged assets:
1. Build the package files in the pipeline
1. Upload the package files to the [generic package repository](../../packages/generic_packages/_index.md):
```yaml
Upload Package:
stage: deploy
script:
- |
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
--upload-file path/to/your/file \
${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${PACKAGE_NAME}/${VERSION}/filename
```
1. Create release with `release-cli` job:
```yaml
Create Release:
stage: release
iamge: registry.gitlab.com/gitlab-org/release-cli:latest
rules:
- if: $CI_COMMIT_TAG
script:
- |
release-cli create \
--name "Release ${VERSION}" \
--tag-name $CI_COMMIT_TAG \
--description "Your release notes here" \
--assets-link "{\"name\":\"Asset Name\",\"url\":\"${PACKAGE_REGISTRY_URL}/filename\"}"
```
To create a release with packaged assets:
1. From a CI/CD pipeline, build your package files.

View File

@ -12,17 +12,23 @@ title: Wiki
{{< /details >}}
If you don't want to keep your documentation in your repository, but you want
to keep it in the same project as your code, you can use the wiki GitLab provides
in each GitLab project. Every wiki is a separate Git repository, so you can create
wiki pages in the web interface, or [locally using Git](#create-or-edit-wiki-pages-locally).
Wiki provides project and group documentation in a familiar format.
Wiki pages:
GitLab wikis support Markdown, RDoc, AsciiDoc, and Org for content.
Wiki pages written in Markdown support all [Markdown features](../../markdown.md),
and also provide some [wiki-specific behavior](../../markdown.md#wiki-specific-markdown)
for links.
- Generate technical documentation, guides, and knowledge bases in Markdown, RDoc, AsciiDoc, or Org formats.
- Create collaborative documents that integrate directly with GitLab projects and groups.
- Store documentation in Git repositories for version control and collaboration.
- Support custom navigation and organization through sidebar customization.
- Export content as PDF files for offline access and sharing.
- Maintain your content separately from your codebase while keeping them in the same project.
Wiki pages also display a [sidebar](#sidebar), which [you can customize](#customize-sidebar).
Each wiki is a separate Git repository.
You can create and edit wiki pages through the GitLab web interface or
[locally using Git](#create-or-edit-wiki-pages-locally).
Wiki pages written in Markdown support all [Markdown features](../../markdown.md) and provide
[wiki-specific behavior](../../markdown.md#wiki-specific-markdown) for links.
Wiki pages display a [sidebar](#sidebar), which you can customize.
## View a project wiki

View File

@ -10,7 +10,7 @@ module Gitlab
:trigger_request, :schedule, :merge_request, :external_pull_request,
:ignore_skip_ci, :save_incompleted,
:seeds_block, :variables_attributes, :push_options,
:chat_data, :allow_mirror_update, :bridge, :content, :dry_run, :logger, :pipeline_policy_context,
:chat_data, :allow_mirror_update, :bridge, :content, :dry_run, :linting, :logger, :pipeline_policy_context,
# These attributes are set by Chains during processing:
:config_content, :yaml_processor_result, :workflow_rules_result, :pipeline_seed,
:pipeline_config, :partition_id,
@ -18,10 +18,18 @@ module Gitlab
) do
include Gitlab::Utils::StrongMemoize
def readonly?
dry_run? || linting?
end
def dry_run?
dry_run
end
def linting?
linting
end
def branch_exists?
strong_memoize(:is_branch) do
branch_ref? && project.repository.branch_exists?(ref)

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