Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
d88fd39bb7
commit
e797ca243f
|
|
@ -70,11 +70,6 @@ workflow:
|
|||
NAMESPACE: gitlab
|
||||
KUBECONFIG: /root/.kube/config
|
||||
BUNDLE_WITHOUT: development
|
||||
GITLAB_USERNAME: root
|
||||
GITLAB_PASSWORD: 5iveL!fe
|
||||
GITLAB_ADMIN_USERNAME: root
|
||||
GITLAB_ADMIN_PASSWORD: 5iveL!fe
|
||||
GITLAB_QA_ADMIN_ACCESS_TOKEN: $QA_ADMIN_ACCESS_TOKEN
|
||||
RSPEC_LAST_RUN_RESULTS_FILE: "$CI_PROJECT_DIR/qa/tmp/examples.txt"
|
||||
QA_DOCKER_NETWORK: host
|
||||
QA_GENERATE_ALLURE_REPORT: "true"
|
||||
|
|
@ -95,8 +90,6 @@ workflow:
|
|||
bundle exec cng create deployment "${DEPLOYMENT_TYPE}" \
|
||||
--gitlab-domain "${GITLAB_DOMAIN}" \
|
||||
--timeout 5m \
|
||||
--admin-password "${GITLAB_ADMIN_PASSWORD}" \
|
||||
--admin-token "${GITLAB_QA_ADMIN_ACCESS_TOKEN}" \
|
||||
--chart-sha "${GITLAB_HELM_CHART_REF}" \
|
||||
--retry 1 \
|
||||
--ci \
|
||||
|
|
|
|||
|
|
@ -85,7 +85,6 @@ include:
|
|||
QA_DOCKER_NETWORK: host
|
||||
QA_DISABLE_RSPEC_RETRY: "true"
|
||||
QA_GITLAB_URL: http://gdk.test:3000
|
||||
GITLAB_QA_ADMIN_ACCESS_TOKEN: $QA_ADMIN_ACCESS_TOKEN
|
||||
FF_NETWORK_PER_BUILD: "true"
|
||||
RSPEC_LAST_RUN_RESULTS_FILE: "$CI_PROJECT_DIR/qa/tmp/examples.txt"
|
||||
COVERBAND_ENABLED: "$COVERBAND_ENABLED" # explicitly define variable so it is passed in to gdk service container
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ export default {
|
|||
return this.config.fields;
|
||||
},
|
||||
docsPath() {
|
||||
return helpPagePath('user/glql');
|
||||
return helpPagePath('user/glql/index');
|
||||
},
|
||||
},
|
||||
i18n: {
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
docsPath() {
|
||||
return helpPagePath('user/glql');
|
||||
return helpPagePath('user/glql/index');
|
||||
},
|
||||
},
|
||||
async mounted() {
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import IssueToken from './issue_token.vue';
|
|||
const SPACE_FACTOR = 1;
|
||||
|
||||
export default {
|
||||
TYPE_ISSUE,
|
||||
name: 'RelatedIssuableInput',
|
||||
components: {
|
||||
GlFormGroup,
|
||||
|
|
@ -228,7 +229,7 @@ export default {
|
|||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<template #description>
|
||||
<template v-if="issuableType === $options.TYPE_ISSUE" #description>
|
||||
<span :id="`${inputId}-description`">
|
||||
{{
|
||||
__(
|
||||
|
|
|
|||
|
|
@ -300,7 +300,7 @@ export default {
|
|||
</gl-disclosure-dropdown-group>
|
||||
</ul>
|
||||
|
||||
<div v-else-if="hasSearchQuery && !hasResults" class="gl-py-3 gl-pl-5 gl-text-gray-700">
|
||||
<div v-else-if="hasSearchQuery && !hasResults" class="gl-py-3 gl-pl-5 gl-text-default">
|
||||
{{ __('No results found') }}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ export default {
|
|||
<span
|
||||
v-if="!userInput"
|
||||
data-testid="search-scope-placeholder"
|
||||
class="gl-pointer-events-none gl-text-gray-500"
|
||||
class="gl-pointer-events-none gl-text-subtle"
|
||||
>{{ placeholder }}</span
|
||||
>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -46,11 +46,11 @@ export default {
|
|||
/>
|
||||
<gl-icon v-if="item.icon" class="gl-mr-3 gl-shrink-0" :name="item.icon" />
|
||||
<span class="gl-flex gl-flex-col">
|
||||
<span v-safe-html="highlightedName" class="gl-text-gray-900"></span>
|
||||
<span v-safe-html="highlightedName" class="gl-text-strong"></span>
|
||||
<span
|
||||
v-if="item.namespace"
|
||||
v-safe-html="item.namespace"
|
||||
class="gl-text-sm gl-text-gray-500"
|
||||
class="gl-text-sm gl-text-subtle"
|
||||
></span>
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ export default {
|
|||
<div
|
||||
v-if="item.subtitle"
|
||||
data-testid="subtitle"
|
||||
class="gl-truncate gl-text-sm gl-text-gray-500"
|
||||
class="gl-truncate gl-text-sm gl-text-subtle"
|
||||
>
|
||||
{{ item.subtitle }}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ export default {
|
|||
</template>
|
||||
|
||||
<gl-disclosure-dropdown-item v-if="showEmptyState" class="gl-cursor-text">
|
||||
<span class="gl-mx-3 gl-my-3 gl-text-sm gl-text-gray-500">{{ emptyStateText }}</span>
|
||||
<span class="gl-mx-3 gl-my-3 gl-text-sm gl-text-subtle">{{ emptyStateText }}</span>
|
||||
</gl-disclosure-dropdown-item>
|
||||
|
||||
<gl-disclosure-dropdown-item key="all" :item="viewAllItem" class="show-hover-layover">
|
||||
|
|
|
|||
|
|
@ -162,7 +162,7 @@ export default {
|
|||
return '';
|
||||
},
|
||||
commandHighlightClass() {
|
||||
return darkModeEnabled() ? '!gl-bg-gray-10' : '!gl-bg-gray-50';
|
||||
return darkModeEnabled() ? '!gl-bg-subtle' : '!gl-bg-strong';
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
|
|
@ -431,7 +431,7 @@ export default {
|
|||
:aria-label="$options.i18n.SEARCH_OR_COMMAND_MODE_PLACEHOLDER"
|
||||
class="gl-relative gl-w-full gl-rounded-lg gl-pb-0"
|
||||
>
|
||||
<div class="input-box-wrapper gl-border-b -gl-mb-1 gl-bg-white gl-p-2">
|
||||
<div class="input-box-wrapper gl-border-b -gl-mb-1 gl-bg-default gl-p-2">
|
||||
<gl-search-box-by-type
|
||||
id="search"
|
||||
ref="searchInput"
|
||||
|
|
@ -511,7 +511,7 @@ export default {
|
|||
</form>
|
||||
<template #modal-footer>
|
||||
<div class="gl-m-0 gl-flex gl-grow gl-justify-between gl-align-middle">
|
||||
<span class="gl-text-gray-500"
|
||||
<span class="gl-text-subtle"
|
||||
>{{ $options.i18n.COMMAND_PALETTE_TIP }} <command-palette-lottery
|
||||
/></span>
|
||||
<span
|
||||
|
|
|
|||
|
|
@ -192,13 +192,13 @@ export default {
|
|||
<span class="gl-flex gl-min-w-0 gl-grow gl-flex-col">
|
||||
<span
|
||||
v-safe-html="highlightedName(item.text)"
|
||||
class="gl-truncate gl-text-gray-900"
|
||||
class="gl-truncate gl-text-strong"
|
||||
data-testid="autocomplete-item-name"
|
||||
></span>
|
||||
<span
|
||||
v-if="item.value"
|
||||
v-safe-html="item.namespace"
|
||||
class="gl-truncate gl-text-sm gl-text-gray-500"
|
||||
class="gl-truncate gl-text-sm gl-text-subtle"
|
||||
data-testid="autocomplete-item-namespace"
|
||||
></span>
|
||||
</span>
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ export default {
|
|||
<span
|
||||
class="show-hover-layover-hint gl-hidden gl-items-center gl-justify-end gl-opacity-0 sm:gl-flex"
|
||||
>
|
||||
<span class="gl-whitespace-nowrap gl-text-gray-700" data-testid="overlay-message">
|
||||
<span class="gl-whitespace-nowrap gl-text-default" data-testid="overlay-message">
|
||||
<gl-sprintf :message="textMessage">
|
||||
<template #kbd="{ content }">
|
||||
<kbd class="vertical-align-normalization gl-pb-3 gl-align-middle gl-text-base">
|
||||
|
|
|
|||
|
|
@ -94,8 +94,7 @@ export default {
|
|||
<search-result-hover-layover :text-message="$options.i18n.OVERLAY_SEARCH">
|
||||
<gl-icon
|
||||
name="search-results"
|
||||
class="-gl-mt-2 gl-mr-2 gl-shrink-0 gl-pt-2"
|
||||
variant="subtle"
|
||||
class="-gl-mt-2 gl-mr-2 gl-shrink-0 gl-pt-2 gl-text-subtle"
|
||||
/>
|
||||
<span class="gl-grow">
|
||||
{{ item.scopeName }}
|
||||
|
|
|
|||
|
|
@ -585,9 +585,8 @@ $command-palette-spacing: px-to-rem(14px);
|
|||
}
|
||||
|
||||
&.gl-modal .modal-footer {
|
||||
background-color: $gray-50;
|
||||
@apply gl-bg-strong gl-border-t;
|
||||
padding: $command-palette-spacing;
|
||||
border-top: 1px solid $gray-100;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@
|
|||
.discussion-header,
|
||||
.note-header-info {
|
||||
a {
|
||||
color: var(--gl-text-color-default);
|
||||
@apply gl-text-default;
|
||||
|
||||
&:hover,
|
||||
&.hover {
|
||||
|
|
@ -335,11 +335,13 @@
|
|||
}
|
||||
|
||||
.note-headline-light,
|
||||
.discussion-headline-light {
|
||||
.discussion-headline-light,
|
||||
.note-timestamp time {
|
||||
@apply gl-text-subtle;
|
||||
}
|
||||
|
||||
.discussion-headline-light a {
|
||||
.discussion-headline-light a,
|
||||
.note-timestamp:hover time {
|
||||
@apply gl-text-link;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class RemoveMembersLastActivityOnColumn < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.7'
|
||||
|
||||
def up
|
||||
remove_column :members, :last_activity_on
|
||||
end
|
||||
|
||||
def down
|
||||
return if column_exists?(:members, :last_activity_on)
|
||||
|
||||
add_column :members, :last_activity_on, :date, default: -> { 'NOW()' }
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddIndexApprovalProjectRulesOnProjectIdRuleType < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.7'
|
||||
|
||||
disable_ddl_transaction!
|
||||
|
||||
INDEX_NAME = :index_approval_project_rules_on_project_id_and_rule_type
|
||||
TABLE_NAME = :approval_project_rules
|
||||
|
||||
def up
|
||||
add_concurrent_index(TABLE_NAME, %i[project_id rule_type], name: INDEX_NAME)
|
||||
end
|
||||
|
||||
def down
|
||||
remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddIndexApprovalProjectRulesOnProjectIdConfigIdAndId < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.7'
|
||||
|
||||
disable_ddl_transaction!
|
||||
|
||||
INDEX_NAME = :index_approval_project_rules_on_project_id_config_id_and_id
|
||||
TABLE_NAME = :approval_project_rules
|
||||
|
||||
def up
|
||||
add_concurrent_index(TABLE_NAME, %i[security_orchestration_policy_configuration_id project_id id],
|
||||
name: INDEX_NAME)
|
||||
end
|
||||
|
||||
def down
|
||||
remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddIndexApprovalMrRulesOnProjectIdPolicyRuleIdAndId < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.7'
|
||||
|
||||
disable_ddl_transaction!
|
||||
|
||||
INDEX_NAME = :index_approval_mr_rules_on_project_id_policy_rule_id_and_id
|
||||
TABLE_NAME = :approval_merge_request_rules
|
||||
|
||||
def up
|
||||
add_concurrent_index(TABLE_NAME, %i[security_orchestration_policy_configuration_id approval_policy_rule_id id],
|
||||
name: INDEX_NAME)
|
||||
end
|
||||
|
||||
def down
|
||||
remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddIndexScanResultPolicyViolationsOnProjectIdPolicyRuleIdAndId < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.7'
|
||||
|
||||
disable_ddl_transaction!
|
||||
|
||||
INDEX_NAME = :idx_policy_violations_on_project_id_policy_rule_id_and_id
|
||||
TABLE_NAME = :scan_result_policy_violations
|
||||
|
||||
def up
|
||||
add_concurrent_index(TABLE_NAME, %i[project_id approval_policy_rule_id id], name: INDEX_NAME)
|
||||
end
|
||||
|
||||
def down
|
||||
remove_concurrent_index_by_name(TABLE_NAME, INDEX_NAME)
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class DropIndexApprovalMrRulesOnConfigIdAndPolicyRuleId < Gitlab::Database::Migration[2.2]
|
||||
INDEX_NAME = 'idx_approval_mr_rules_on_config_id_and_policy_rule_id'
|
||||
|
||||
disable_ddl_transaction!
|
||||
milestone '17.7'
|
||||
|
||||
def up
|
||||
remove_concurrent_index_by_name :approval_merge_request_rules, INDEX_NAME
|
||||
end
|
||||
|
||||
def down
|
||||
add_concurrent_index :approval_merge_request_rules,
|
||||
%w[security_orchestration_policy_configuration_id approval_policy_rule_id], name: INDEX_NAME
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class DropIndexApprovalProjectRulesOnProjectId < Gitlab::Database::Migration[2.2]
|
||||
INDEX_NAME = 'index_approval_project_rules_on_project_id'
|
||||
|
||||
disable_ddl_transaction!
|
||||
milestone '17.7'
|
||||
|
||||
def up
|
||||
remove_concurrent_index_by_name :approval_project_rules, INDEX_NAME
|
||||
end
|
||||
|
||||
def down
|
||||
add_concurrent_index :approval_project_rules, :project_id, name: INDEX_NAME
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class DropIndexScanResultPolicyViolationsOnProjectId < Gitlab::Database::Migration[2.2]
|
||||
INDEX_NAME = 'index_scan_result_policy_violations_on_project_id'
|
||||
|
||||
disable_ddl_transaction!
|
||||
milestone '17.7'
|
||||
|
||||
def up
|
||||
remove_concurrent_index_by_name :scan_result_policy_violations, INDEX_NAME
|
||||
end
|
||||
|
||||
def down
|
||||
add_concurrent_index :scan_result_policy_violations, :project_id, name: INDEX_NAME
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1 @@
|
|||
bfdbad5b9a04f47da9d9eba38056fe0880ece5eabb9f7050b04b606fa8524c56
|
||||
|
|
@ -0,0 +1 @@
|
|||
56fe5d33d48fbf846666f33cfe56f59a01c9db628db410244a4543c3c0551379
|
||||
|
|
@ -0,0 +1 @@
|
|||
d2cb32a52662f54c5bd3f3e4d5d9588fe9ae846af92c937a01f52aa5651eea10
|
||||
|
|
@ -0,0 +1 @@
|
|||
70420def8903704a3cc34cb1a8147f533288009ce7a10a2360f01504c6da889f
|
||||
|
|
@ -0,0 +1 @@
|
|||
7d6bcdd8a6d1601a56e8d05eea3b301bdd43100a08e700d6c3f2737093a64c0f
|
||||
|
|
@ -0,0 +1 @@
|
|||
cc74b8f073b711c4eb1d5ec6b0144641fbcdb1c269fd8e2197138aba256a0d1a
|
||||
|
|
@ -0,0 +1 @@
|
|||
fca8baeff96256f9e2b94d8c61f95ecef0d24dc9803d0d8a55e23150ffff2c70
|
||||
|
|
@ -0,0 +1 @@
|
|||
cab6aa7943af94ad128ae0cfa7ca3329841e34415c34461dbad0c6bda49df5f7
|
||||
|
|
@ -14160,7 +14160,6 @@ CREATE TABLE members (
|
|||
member_role_id bigint,
|
||||
expiry_notified_at timestamp with time zone,
|
||||
request_accepted_at timestamp with time zone,
|
||||
last_activity_on date DEFAULT now(),
|
||||
CONSTRAINT check_508774aac0 CHECK ((member_namespace_id IS NOT NULL))
|
||||
);
|
||||
|
||||
|
|
@ -28281,8 +28280,6 @@ CREATE INDEX idx_approval_merge_request_rules_on_scan_result_policy_id ON approv
|
|||
|
||||
CREATE INDEX idx_approval_mr_rules_on_config_id_and_id_and_updated_at ON approval_merge_request_rules USING btree (security_orchestration_policy_configuration_id, id, updated_at);
|
||||
|
||||
CREATE INDEX idx_approval_mr_rules_on_config_id_and_policy_rule_id ON approval_merge_request_rules USING btree (security_orchestration_policy_configuration_id, approval_policy_rule_id);
|
||||
|
||||
CREATE INDEX idx_approval_policy_rules_security_policy_id_id ON approval_policy_rules USING btree (security_policy_id, id);
|
||||
|
||||
CREATE INDEX idx_approval_project_rules_on_config_id_and_policy_rule_id ON approval_project_rules USING btree (security_orchestration_policy_configuration_id, approval_policy_rule_id);
|
||||
|
|
@ -28521,6 +28518,8 @@ CREATE INDEX idx_pkgs_on_project_id_name_version_on_installable_terraform ON pac
|
|||
|
||||
CREATE INDEX idx_pkgs_project_id_lower_name_when_nuget_installable_version ON packages_packages USING btree (project_id, lower((name)::text)) WHERE ((package_type = 4) AND (version IS NOT NULL) AND (status = ANY (ARRAY[0, 1])));
|
||||
|
||||
CREATE INDEX idx_policy_violations_on_project_id_policy_rule_id_and_id ON scan_result_policy_violations USING btree (project_id, approval_policy_rule_id, id);
|
||||
|
||||
CREATE INDEX idx_proj_feat_usg_on_jira_dvcs_cloud_last_sync_at_and_proj_id ON project_feature_usages USING btree (jira_dvcs_cloud_last_sync_at, project_id) WHERE (jira_dvcs_cloud_last_sync_at IS NOT NULL);
|
||||
|
||||
CREATE INDEX idx_proj_feat_usg_on_jira_dvcs_server_last_sync_at_and_proj_id ON project_feature_usages USING btree (jira_dvcs_server_last_sync_at, project_id) WHERE (jira_dvcs_server_last_sync_at IS NOT NULL);
|
||||
|
|
@ -28857,6 +28856,8 @@ CREATE UNIQUE INDEX index_approval_merge_request_rules_users_1 ON approval_merge
|
|||
|
||||
CREATE INDEX index_approval_merge_request_rules_users_2 ON approval_merge_request_rules_users USING btree (user_id);
|
||||
|
||||
CREATE INDEX index_approval_mr_rules_on_project_id_policy_rule_id_and_id ON approval_merge_request_rules USING btree (security_orchestration_policy_configuration_id, approval_policy_rule_id, id);
|
||||
|
||||
CREATE UNIQUE INDEX index_approval_policy_rule_on_project_and_rule ON approval_policy_rule_project_links USING btree (approval_policy_rule_id, project_id);
|
||||
|
||||
CREATE INDEX index_approval_policy_rule_project_links_on_project_id ON approval_policy_rule_project_links USING btree (project_id);
|
||||
|
|
@ -28873,7 +28874,9 @@ CREATE INDEX index_approval_project_rules_on_approval_policy_rule_id ON approval
|
|||
|
||||
CREATE INDEX index_approval_project_rules_on_id_with_regular_type ON approval_project_rules USING btree (id) WHERE (rule_type = 0);
|
||||
|
||||
CREATE INDEX index_approval_project_rules_on_project_id ON approval_project_rules USING btree (project_id);
|
||||
CREATE INDEX index_approval_project_rules_on_project_id_and_rule_type ON approval_project_rules USING btree (project_id, rule_type);
|
||||
|
||||
CREATE INDEX index_approval_project_rules_on_project_id_config_id_and_id ON approval_project_rules USING btree (security_orchestration_policy_configuration_id, project_id, id);
|
||||
|
||||
CREATE INDEX index_approval_project_rules_on_rule_type ON approval_project_rules USING btree (rule_type);
|
||||
|
||||
|
|
@ -32007,8 +32010,6 @@ CREATE INDEX index_scan_result_policy_violations_on_merge_request_id ON scan_res
|
|||
|
||||
CREATE UNIQUE INDEX index_scan_result_policy_violations_on_policy_and_merge_request ON scan_result_policy_violations USING btree (scan_result_policy_id, merge_request_id);
|
||||
|
||||
CREATE INDEX index_scan_result_policy_violations_on_project_id ON scan_result_policy_violations USING btree (project_id);
|
||||
|
||||
CREATE INDEX index_scim_identities_on_group_id ON scim_identities USING btree (group_id);
|
||||
|
||||
CREATE UNIQUE INDEX index_scim_identities_on_lower_extern_uid_and_group_id ON scim_identities USING btree (lower((extern_uid)::text), group_id);
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ Maintenance is performed outside standard working hours:
|
|||
| Americas (Option 1) | Tuesday | 07:00 - 11:00 |
|
||||
| Americas (Option 2) | Sunday-Monday | 21:00 - 01:00 |
|
||||
|
||||
You can postpone scheduled maintenance to another window in the same week by contacting your Customer Success Manager at least one week in advance.
|
||||
View your maintenance window in [Switchboard](tenant_overview.md#maintenance-windows), including upcoming and recent maintenance. You can postpone scheduled maintenance to another window in the same week by contacting your Customer Success Manager at least one week in advance.
|
||||
|
||||
NOTE:
|
||||
The scheduled weekly maintenance window is separate from [emergency maintenance](#emergency-maintenance), which cannot be postponed.
|
||||
|
|
|
|||
|
|
@ -11,40 +11,46 @@ DETAILS:
|
|||
**Tier:** Ultimate
|
||||
**Offering:** GitLab Dedicated
|
||||
|
||||
The Overview page in Switchboard provides essential information about your GitLab Dedicated instance, including:
|
||||
Monitor your GitLab Dedicated instance details, maintenance windows, and configuration status in Switchboard.
|
||||
|
||||
- Whether there are pending configuration changes
|
||||
## View your instance details
|
||||
|
||||
To access your instance details:
|
||||
|
||||
1. Sign in to [Switchboard](https://console.gitlab-dedicated.com/).
|
||||
1. Select your tenant.
|
||||
|
||||
The **Overview** page displays:
|
||||
|
||||
- Any pending configuration changes
|
||||
- When the instance was updated
|
||||
- Instance attributes
|
||||
- Instance details
|
||||
- Maintenance windows
|
||||
- Hosted runners
|
||||
|
||||
To view details about your instance:
|
||||
## Tenant overview
|
||||
|
||||
- Sign in to [Switchboard](https://console.gitlab-dedicated.com/).
|
||||
|
||||
## Instance attributes
|
||||
|
||||
This section provides important information about your tenant, including:
|
||||
The top section shows important information about your tenant, including:
|
||||
|
||||
- Tenant name and URL
|
||||
- AWS regions for data storage and backup
|
||||
- Total Git repository capacity
|
||||
- Current GitLab version
|
||||
- Reference architecture
|
||||
- Maintenance window
|
||||
- Current GitLab version
|
||||
- AWS regions for data storage and backup
|
||||
|
||||
## Maintenance windows
|
||||
|
||||
This section displays the:
|
||||
The **Maintenance windows** section displays the:
|
||||
|
||||
- Next scheduled maintenance window.
|
||||
- Last completed maintenance window.
|
||||
- Most recent emergency maintenance window (if applicable).
|
||||
- Upcoming GitLab version upgrade.
|
||||
- Next scheduled maintenance window
|
||||
- Most recent completed maintenance window
|
||||
- Most recent emergency maintenance window (if applicable)
|
||||
- Upcoming GitLab version upgrade
|
||||
|
||||
For more information, see [Maintenance windows](../../administration/dedicated/maintenance.md#maintenance-windows).
|
||||
NOTE:
|
||||
Switchboard shows upcoming GitLab version upgrades one week before their scheduled maintenance window. For more information, see [Maintenance windows](../../administration/dedicated/maintenance.md#maintenance-windows).
|
||||
|
||||
## Hosted runners
|
||||
|
||||
This section shows the [hosted runners](../../administration/dedicated/hosted_runners.md) associated with your instance.
|
||||
The **Hosted runners** section shows the [hosted runners](../../administration/dedicated/hosted_runners.md) associated with your instance.
|
||||
|
|
|
|||
|
|
@ -288,7 +288,7 @@ Plan.default.actual_limits.update!(group_hooks: 100)
|
|||
|
||||
Set the limit to `0` to disable it.
|
||||
|
||||
The default maximum number of webhooks is `100` per project and `50` per group. Webhooks in a child group do not count towards the webhook limit of their parent group.
|
||||
The default maximum number of webhooks is `100` per project and `50` per group. Webhooks in a subgroup do not count towards the webhook limit of their parent group.
|
||||
|
||||
For GitLab.com, see the [webhook limits for GitLab.com](../user/gitlab_com/index.md#webhooks).
|
||||
|
||||
|
|
|
|||
|
|
@ -299,7 +299,7 @@ Parameters:
|
|||
| `with_custom_attributes` | boolean | no | Include [custom attributes](custom_attributes.md) in response (administrators only) |
|
||||
| `owned` | boolean | no | Limit to groups explicitly owned by the current user |
|
||||
| `min_access_level` | integer | no | Limit to groups where current user has at least this [role (`access_level`)](members.md#roles) |
|
||||
| `top_level_only` | boolean | no | Limit to top level groups, excluding all subgroups |
|
||||
| `top_level_only` | boolean | no | Limit to top-level groups, excluding all subgroups |
|
||||
| `repository_storage` | string | no | Filter by repository storage used by the group _(administrators only)_. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/419643) in GitLab 16.3. Premium and Ultimate only. |
|
||||
| `marked_for_deletion_on` | date | no | Filter by date when group was marked for deletion. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/429315) in GitLab 17.1. Premium and Ultimate only. |
|
||||
|
||||
|
|
|
|||
|
|
@ -432,9 +432,9 @@ Prerequisites:
|
|||
- This API endpoint requires permission to administer memberships for the group.
|
||||
|
||||
Lists all projects and groups a user is a member of. Only projects and groups in the group hierarchy
|
||||
are included. For instance, if the requested group is `Root Group`, and the requested user is a direct member
|
||||
of both `Root Group / Sub Group One` and `Other Group / Sub Group Two`, then only `Root Group / Sub Group One`
|
||||
is returned, because `Other Group / Sub Group Two` is not in the `Root Group` hierarchy.
|
||||
are included. For instance, if the requested group is `Top-Level Group`, and the requested user is a direct member
|
||||
of both `Top-Level Group / Subgroup One` and `Other Group / Subgroup Two`, then only `Top-Level Group / Subgroup One`
|
||||
is returned, because `Other Group / Subgroup Two` is not in the `Top-Level Group` hierarchy.
|
||||
|
||||
This API endpoint takes [pagination](rest/index.md#pagination) parameters `page` and `per_page` to restrict
|
||||
the list of memberships.
|
||||
|
|
@ -460,7 +460,7 @@ Example response:
|
|||
{
|
||||
"id": 168,
|
||||
"source_id": 131,
|
||||
"source_full_name": "Root Group / Sub Group One",
|
||||
"source_full_name": "Top-Level Group / Subgroup One",
|
||||
"source_members_url": "https://gitlab.example.com/groups/root-group/sub-group-one/-/group_members",
|
||||
"created_at": "2021-03-31T17:28:44.812Z",
|
||||
"expires_at": "2022-03-21",
|
||||
|
|
@ -472,7 +472,7 @@ Example response:
|
|||
{
|
||||
"id": 169,
|
||||
"source_id": 63,
|
||||
"source_full_name": "Root Group / Sub Group One / My Project",
|
||||
"source_full_name": "Top-Level Group / Subgroup One / My Project",
|
||||
"source_members_url": "https://gitlab.example.com/root-group/sub-group-one/my-project/-/project_members",
|
||||
"created_at": "2021-03-31T17:29:14.934Z",
|
||||
"expires_at": null,
|
||||
|
|
@ -498,8 +498,8 @@ Prerequisites:
|
|||
- This API endpoint works on top-level groups only. It does not work on subgroups.
|
||||
- This API endpoint requires permission to administer memberships for the group.
|
||||
|
||||
Lists all projects and groups that a user is a member of, that have been invited to the requested root group.
|
||||
For instance, if the requested group is `Root Group`, and the requested user is a direct member of `Other Group / Sub Group Two`, which was invited to `Root Group`, then only `Other Group / Sub Group Two` is returned.
|
||||
Lists all projects and groups that a user is a member of, that have been invited to the requested top-level group.
|
||||
For instance, if the requested group is `Top-Level Group`, and the requested user is a direct member of `Other Group / Subgroup Two`, which was invited to `Top-Level Group`, then only `Other Group / Subgroup Two` is returned.
|
||||
|
||||
The response lists only indirect memberships. Direct memberships are not included.
|
||||
|
||||
|
|
@ -526,7 +526,7 @@ Example response:
|
|||
{
|
||||
"id": 168,
|
||||
"source_id": 132,
|
||||
"source_full_name": "Invited Group / Sub Group One",
|
||||
"source_full_name": "Invited Group / Subgroup One",
|
||||
"source_members_url": "https://gitlab.example.com/groups/invited-group/sub-group-one/-/group_members",
|
||||
"created_at": "2021-03-31T17:28:44.812Z",
|
||||
"expires_at": "2022-03-21",
|
||||
|
|
@ -883,7 +883,7 @@ PUT /groups/:id/members/:member_id/approve
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-------------|-------------------|----------|-------------|
|
||||
| `id` | integer or string | yes | The ID or [URL-encoded path of the root group](rest/index.md#namespaced-paths). |
|
||||
| `id` | integer or string | yes | The ID or [URL-encoded path of the top-level group](rest/index.md#namespaced-paths). |
|
||||
| `member_id` | integer | yes | The ID of the member. |
|
||||
|
||||
Example request:
|
||||
|
|
@ -903,7 +903,7 @@ POST /groups/:id/members/approve_all
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------|-------------------|----------|-------------|
|
||||
| `id` | integer or string | yes | The ID or [URL-encoded path of the root group](rest/index.md#namespaced-paths). |
|
||||
| `id` | integer or string | yes | The ID or [URL-encoded path of the top-level group](rest/index.md#namespaced-paths). |
|
||||
|
||||
Example request:
|
||||
|
||||
|
|
@ -922,7 +922,7 @@ Prerequisites:
|
|||
- This API endpoint works on top-level groups only. It does not work on subgroups.
|
||||
- This API endpoint requires permission to administer members for the group.
|
||||
|
||||
This request returns all matching group and project members from all groups and projects in the root group's hierarchy.
|
||||
This request returns all matching group and project members from all groups and projects in the top-level group's hierarchy.
|
||||
|
||||
When the member is an invited user that has not signed up for a GitLab account yet, the invited email address is returned.
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ This should enable everyone to see locally any change in an IDE being sent to th
|
|||
1. In VS Code, go to the Extensions page and find "GitLab Workflow" in the list.
|
||||
1. Open the extension settings by clicking a small cog icon and select "Extension Settings" option.
|
||||
1. Check a "GitLab: Debug" checkbox.
|
||||
1. If you'd like to test that Code Suggestions is working from inside the GitLab Workflow extension for VS Code, then follow the [steps to set up a personal access token](https://gitlab.com/gitlab-org/gitlab-vscode-extension/#setup) with your GDK inside the new window of VS Code that pops up when you run the "Run and Debug" command.
|
||||
1. If you'd like to test that Code Suggestions is working from inside the GitLab Workflow extension for VS Code, then follow the [steps to set up a personal access token](../../editor_extensions/visual_studio_code/index.md#set-up-the-gitlab-workflow-extension) with your GDK inside the new window of VS Code that pops up when you run the "Run and Debug" command.
|
||||
- Once you complete the steps below, to test you are hitting your local `/code_suggestions/completions` endpoint and not production, follow these steps:
|
||||
1. Inside the new window, in the built in terminal select the "Output" tab then "GitLab Language Server" from the drop down menu on the right.
|
||||
1. Open a new file inside of this VS Code window and begin typing to see Code Suggestions in action.
|
||||
|
|
|
|||
|
|
@ -68,19 +68,17 @@ there for any exceptions while testing your feature after enabling the feature f
|
|||
For these pre-production environments, it's strongly encouraged to run the command in
|
||||
`#staging`, `#production`, or `#chatops-ops-test`, for improved visibility.
|
||||
|
||||
#### Enabling the feature flag with percentage of time
|
||||
#### Enabling the feature flag for a given percentage of actors
|
||||
|
||||
To enable a feature for 25% of the time, run the following in Slack:
|
||||
To enable a feature 25% of the time for any given actor, run the following in Slack:
|
||||
|
||||
```shell
|
||||
/chatops run feature set new_navigation_bar 25 --random --dev
|
||||
/chatops run feature set new_navigation_bar 25 --random --staging
|
||||
/chatops run feature set new_navigation_bar 25 --actors --dev
|
||||
/chatops run feature set new_navigation_bar 25 --actors --staging
|
||||
```
|
||||
|
||||
NOTE:
|
||||
Percentage of time feature flags are deprecated in favor of [percentage of actors](#percentage-based-actor-selection).
|
||||
If you understand the consequences of using percentage of time feature flags, you can force it using
|
||||
`--ignore-random-deprecation-check`.
|
||||
See [percentage of actors](#percentage-based-actor-selection) for your choices of actors
|
||||
for which you would like to randomize the rollout.
|
||||
|
||||
### Enabling a feature for GitLab.com
|
||||
|
||||
|
|
@ -202,33 +200,9 @@ Before enabling a feature flag, verify that you are not violating any [Productio
|
|||
The following `/chatops` commands must be performed in the Slack
|
||||
`#production` channel.
|
||||
|
||||
##### Percentage of time roll out
|
||||
|
||||
To enable a feature for 25% of the time, run the following in Slack:
|
||||
|
||||
```shell
|
||||
/chatops run feature set new_navigation_bar 25 --random
|
||||
```
|
||||
|
||||
NOTE:
|
||||
Percentage of time feature flags are deprecated in favor of [percentage of actors](#percentage-based-actor-selection).
|
||||
If you understand the consequences of using percentage of time feature flags, you can force it using
|
||||
`--ignore-random-deprecation-check`.
|
||||
|
||||
This sets a feature flag to `true` based on the following formula:
|
||||
|
||||
```ruby
|
||||
feature_flag_state = rand < (25 / 100.0)
|
||||
```
|
||||
|
||||
This will enable the feature for GitLab.com, with `new_navigation_bar` being the
|
||||
name of the feature.
|
||||
This command does *not* enable the feature for 25% of the total users.
|
||||
Instead, when the feature is checked with `enabled?`, it will return `true` 25% of the time.
|
||||
|
||||
##### Percentage of actors roll out
|
||||
|
||||
To enable a feature for 25% of actors such as users, projects, or groups,
|
||||
To enable a feature for 25% of actors such as users, projects, groups or the current request or job,
|
||||
run the following in Slack:
|
||||
|
||||
```shell
|
||||
|
|
@ -360,14 +334,28 @@ When the `default_enabled` attribute in the YAML definition is switched to
|
|||
/chatops run feature delete some_feature
|
||||
```
|
||||
|
||||
##### Percentage of actors vs percentage of time rollouts
|
||||
##### Percentage of time roll out (deprecated)
|
||||
|
||||
If you want to make sure a feature is always on or off for users, use a **Percentage of actors**
|
||||
rollout. Avoid using percentage of _time_ rollouts in this case.
|
||||
Previously, to enable a feature 25% of the time, we would run the following in Slack:
|
||||
|
||||
A percentage of _time_ rollout can introduce inconsistent behavior when `Feature.enabled?`
|
||||
is used multiple times in the code because the feature flag value is randomized each time
|
||||
`Feature.enabled?` is called on your code path.
|
||||
```shell
|
||||
/chatops run feature set new_navigation_bar 25 --random
|
||||
```
|
||||
|
||||
This command enables the `new_navigation_bar` feature for GitLab.com. However, this command does *not* enable the feature for 25% of the total users.
|
||||
Instead, when the feature is checked with `enabled?`, it returns `true` 25% of the time.
|
||||
|
||||
Percentage of time feature flags are now deprecated in favor of [percentage of actors](#percentage-based-actor-selection)
|
||||
using the `Feature.current_request` actor. The problem with not using an actor is that the randomized
|
||||
choice evaluates for each call into `Feature.enabled?` rather than once per request or job execution,
|
||||
which can lead to flip-flopping between states. For example:
|
||||
|
||||
```ruby
|
||||
feature_flag_state = rand < (25 / 100.0)
|
||||
```
|
||||
|
||||
For the time being, we continue to allow use of percentage of time feature flags.
|
||||
During rollout, you can force it using the `--ignore-random-deprecation-check` switch in ChatOps.
|
||||
|
||||
##### Disabling feature flags
|
||||
|
||||
|
|
|
|||
|
|
@ -15,12 +15,12 @@ collect and display OpenTelemetry data. Therefore, you should point the
|
|||
|
||||
1. Which has an Ultimate license, and where you have
|
||||
1. In which you have at least the Maintainer role
|
||||
1. In which you have access to enable top-level root-group feature flags (or is under the `gitlab-org` or `gitlab-com` root groups which already have the flags enabled)
|
||||
1. In which you have access to enable top-level group feature flags (or is under the `gitlab-org` or `gitlab-com` top-level groups which already have the flags enabled)
|
||||
|
||||
Once you have a project identified to use:
|
||||
|
||||
1. Note the ID of the project (from the three dots at upper right of main project page).
|
||||
1. Note the ID of the top-level root group which contains the project.
|
||||
1. Note the ID of the top-level group which contains the project.
|
||||
1. When setting the environment variables for the following steps, add them to `env.runit` in the root of the `gitlab-development-kit` folder.
|
||||
1. Follow instructions to [configure distributed tracing for a project](../../operations/tracing.md), with the following custom settings:
|
||||
- For the `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` environment variable, use the following value:
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ What we will do to achieve this:
|
|||
1. Ensure we write to both `issues#issue_type` and `issues#work_item_type_id` columns for
|
||||
new or updated issues.
|
||||
1. Backfill the `work_item_type_id` column to point to the `work_item_types#id` corresponding
|
||||
to issue's project root groups. For example:
|
||||
to issue's project top-level groups. For example:
|
||||
|
||||
```ruby
|
||||
issue.project.root_group.work_item_types.where(base_type: issue.issue_type).first.id.
|
||||
|
|
|
|||
|
|
@ -6,8 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
|||
|
||||
# Custom queries in the VS Code extension
|
||||
|
||||
The **GitLab Workflow** extension adds a
|
||||
[sidebar](https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/tree/main?ref_type=heads#sidebar-details)
|
||||
The **GitLab Workflow** extension adds a [sidebar](index.md#view-issues-and-merge-requests)
|
||||
to VS Code. This sidebar displays default search queries for each of your projects:
|
||||
|
||||
- Issues assigned to me
|
||||
|
|
@ -41,7 +40,7 @@ To see search results from your project:
|
|||
## Create a custom query
|
||||
|
||||
Any custom queries you define override the default queries shown in the
|
||||
[VS Code sidebar](https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/tree/main?ref_type=heads#sidebar-details),
|
||||
[VS Code sidebar](index.md#view-issues-and-merge-requests),
|
||||
under **Issues and Merge requests**.
|
||||
|
||||
To override the extension's default queries and replace them with your own:
|
||||
|
|
|
|||
|
|
@ -14,15 +14,14 @@ and extend your view with [custom queries](custom_queries.md).
|
|||
|
||||
This extension brings the GitLab features you use every day directly into your VS Code environment:
|
||||
|
||||
- [View issues](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#browse-issues-review-mrs) and merge requests.
|
||||
- [View issues](#view-issues-and-merge-requests) and merge requests.
|
||||
- Run [common commands](settings.md#command-palette-commands) from the Visual Studio Code Command Palette.
|
||||
- Create and [review](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#merge-request-reviews)
|
||||
merge requests.
|
||||
- Create and [review](#review-a-merge-request) merge requests.
|
||||
- [Test your GitLab CI/CD configuration](cicd.md#test-gitlab-cicd-configuration).
|
||||
- View [pipeline status](cicd.md) and [job outputs](cicd.md#view-cicd-job-output).
|
||||
- [Create](#create-a-snippet) and manage snippets.
|
||||
- [Browse repositories](remote_urls.md#browse-a-repository-in-read-only-mode) without cloning them.
|
||||
- [View security findings](https://marketplace.visualstudio.com/items?itemName=gitlab.gitlab-workflow#security-findings).
|
||||
- [View security findings](#view-security-findings).
|
||||
|
||||
The GitLab Workflow extension also streamlines your VS Code workflow with AI-assisted features:
|
||||
|
||||
|
|
@ -64,7 +63,7 @@ This extension requires you to create a GitLab personal access token, and assign
|
|||
|
||||
The extension matches your Git repository remote URL with the GitLab instance URL you specified
|
||||
for your token. If you have multiple accounts or projects, you can choose the one you want to use.
|
||||
For more details, see [Account management](https://gitlab.com/gitlab-org/gitlab-vscode-extension/#account-management).
|
||||
For more details, see [Switch GitLab accounts in VS Code](#switch-gitlab-accounts-in-vs-code).
|
||||
|
||||
The extension shows information in the VS Code status bar if both:
|
||||
|
||||
|
|
@ -76,8 +75,8 @@ The extension shows information in the VS Code status bar if both:
|
|||
After you install GitLab Workflow, go to **Settings > Extensions > GitLab Workflow** in VS Code to configure its settings:
|
||||
|
||||
- [GitLab Duo Chat](../../user/gitlab_duo_chat/index.md#use-gitlab-duo-chat-in-vs-code).
|
||||
- [Features to display or hide](https://gitlab.com/gitlab-org/gitlab-vscode-extension#extension-settings).
|
||||
- [Self-signed certificate](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#self-signed-certificates) information.
|
||||
- [Features to display or hide](settings.md#extension-settings).
|
||||
- [Self-signed certificate](troubleshooting.md#configure-self-signed-certificates) information.
|
||||
- [Code Suggestions](../../user/project/repository/code_suggestions/index.md).
|
||||
|
||||
### Customize keyboard shortcuts
|
||||
|
|
@ -278,7 +277,7 @@ Prerequisites:
|
|||
|
||||
- You're a member of a GitLab project.
|
||||
- You've installed the [GitLab Workflow extension](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow).
|
||||
- You've signed in to your GitLab instance, as described in [Setup](https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/tree/main/#setup).
|
||||
- You've signed in to your GitLab instance, as described in [Set up the GitLab Workflow extension](#set-up-the-gitlab-workflow-extension).
|
||||
|
||||
To search the titles and description fields in your project:
|
||||
|
||||
|
|
|
|||
|
|
@ -6,9 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
|||
|
||||
# GitLab remote URL format
|
||||
|
||||
In VS Code, you can browse GitLab repositories
|
||||
[in read-only mode](https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/blob/main/README.md#browse-a-repository-without-cloning)
|
||||
with a custom remote URL.
|
||||
In VS Code, you can clone Git repositories, or browse them
|
||||
in read-only mode.
|
||||
|
||||
GitLab remote URLs require these parameters:
|
||||
|
||||
|
|
@ -41,13 +40,38 @@ For example, the `projectID` for the main GitLab project is `278964`, so the rem
|
|||
gitlab-remote://gitlab.com/<label>?project=278964&ref=master
|
||||
```
|
||||
|
||||
## Clone a Git project
|
||||
|
||||
GitLab Workflow extends the `Git: Clone` command. For GitLab projects, it supports cloning with either
|
||||
HTTPS or Git URLs.
|
||||
|
||||
Prerequisites:
|
||||
|
||||
- To return search results from a GitLab instance, you must have
|
||||
[added an access token](index.md#set-up-the-gitlab-workflow-extension) to that GitLab instance.
|
||||
- You must be a member of a project for search to return it as a result.
|
||||
|
||||
To search for, then clone, a GitLab project:
|
||||
|
||||
1. Open the Command Palette by pressing:
|
||||
- MacOS: <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>.
|
||||
- Windows: <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>.
|
||||
1. Run the **Git: Clone** command.
|
||||
1. Select either GitHub or GitLab as a repository source.
|
||||
1. Search for, then select, a **Repository name**.
|
||||
1. Select a local folder to clone the repository into.
|
||||
1. If cloning a GitLab repository, select a cloning method:
|
||||
- To clone with Git, select the URL that begins with `user@hostname.com`.
|
||||
- To clone with HTTPS, select the URL that begins with `https://`. This method uses your access token to clone the repository, fetch commits, and push commits.
|
||||
1. Select whether to open the cloned repository, or add it to your current workspace.
|
||||
|
||||
## Browse a repository in read-only mode
|
||||
|
||||
With this extension, you can browse a GitLab repository in read-only mode without cloning it.
|
||||
|
||||
Prerequisites:
|
||||
|
||||
- You have [registered an access token](https://gitlab.com/gitlab-org/gitlab-vscode-extension/#setup) for that GitLab instance.
|
||||
- You have [registered an access token](index.md#set-up-the-gitlab-workflow-extension) for that GitLab instance.
|
||||
|
||||
To browse a GitLab repository in read-only mode:
|
||||
|
||||
|
|
|
|||
|
|
@ -9,42 +9,69 @@ description: "Settings and commands in the GitLab Workflow extension for VS Code
|
|||
|
||||
## Command Palette commands
|
||||
|
||||
In VS Code, trigger these commands from the
|
||||
[Command Palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette).
|
||||
This extension provides several sets of commands that you can trigger in the
|
||||
[Command Palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette):
|
||||
|
||||
### Manage projects and code
|
||||
|
||||
- `GitLab: Authenticate`
|
||||
- [`GitLab: Compare Current Branch with Default Branch`](index.md#compare-with-default-branch):
|
||||
Compare your branch with the repository's default branch and view changes on GitLab.
|
||||
- `GitLab: Open Current Project on GitLab`
|
||||
- [`GitLab: Open Remote Repository`](remote_urls.md): Browse a remote GitLab repository.
|
||||
- `GitLab: Pipeline Actions - View, Create, Retry, or Cancel`
|
||||
- `GitLab: Remove Account from VS Code`
|
||||
- `GitLab: Validate GitLab Accounts`
|
||||
|
||||
### Manage issues and merge requests
|
||||
|
||||
- [`GitLab: Advanced Search (Issues, Merge Requests, Commits, Comments...)`](index.md#search-issues-and-merge-requests)
|
||||
- [`GitLab: Compare Current Branch with Default Branch`](https://gitlab.com/gitlab-org/gitlab-vscode-extension/#compare-with-default-branch):
|
||||
Compare your branch with the repository's default branch and view changes on GitLab.
|
||||
- `GitLab: Copy Link to Active File on GitLab`
|
||||
- `GitLab: Create New Issue on Current Project`
|
||||
- `GitLab: Create New Merge Request on Current Project`: Open the merge request page to create a merge request.
|
||||
- [`GitLab: Create Snippet`](index.md#create-a-snippet): Create a public, internal, or private snippet
|
||||
from an entire file or selection.
|
||||
- [`GitLab: Create Snippet Patch`](index.md#create-a-patch-file): Create a `.patch` file from the entire file, or a selection.
|
||||
- [`GitLab: Insert Snippet`](index.md#insert-a-snippet): Insert a single-file or multi-file project snippet.
|
||||
- [`GitLab: Open Active File on GitLab`](https://gitlab.com/gitlab-org/gitlab-vscode-extension/#open-active-file) -
|
||||
- [`GitLab: Open Active File on GitLab`](index.md#open-current-file-in-gitlab-ui) -
|
||||
View active file on GitLab with highlighting active line number and selected text block.
|
||||
- `GitLab: Open Current Project on GitLab`
|
||||
- `GitLab: Open Merge Request for Current Branch`
|
||||
- [`GitLab: Open Remote Repository`](remote_urls.md): Browse a remote GitLab repository.
|
||||
- `GitLab: Remove Account from VS Code`
|
||||
- [`GitLab: Search Project Issues (Supports Filters)`](index.md#search-issues-and-merge-requests).
|
||||
- [`GitLab: Search Project Merge Requests (Supports Filters)`](index.md#search-issues-and-merge-requests).
|
||||
- `GitLab: Show Issues Assigned to Me`: Open issues assigned to you on GitLab.
|
||||
- `GitLab: Show Merge Requests Assigned to Me`: Open merge requests assigned to you on GitLab.
|
||||
- [`GitLab: Show Merged GitLab CI/CD Config`](https://gitlab.com/gitlab-org/gitlab-vscode-extension/#show-merged-gitlab-cicd-configuration):
|
||||
|
||||
### Manage CI/CD pipelines
|
||||
|
||||
- [`GitLab: Show Merged GitLab CI/CD Configuration`](cicd.md#show-merged-gitlab-cicd-configuration):
|
||||
Show a preview of the GitLab CI/CD configuration file `.gitlab-ci.yml` with all includes resolved.
|
||||
- `GitLab: Toggle Code Suggestions`
|
||||
- `GitLab: Toggle Code Suggestions for current language`
|
||||
- [`GitLab: Validate GitLab CI/CD Config`](https://gitlab.com/gitlab-org/gitlab-vscode-extension/#validate-gitlab-cicd-configuration):
|
||||
- [`GitLab: Validate GitLab CI/CD Configuration`](cicd.md#test-gitlab-cicd-configuration):
|
||||
Test the GitLab CI/CD configuration file `.gitlab-ci.yml`.
|
||||
|
||||
### Command integrations
|
||||
### AI-assisted features
|
||||
|
||||
This extension also integrates with these commands:
|
||||
- `GitLab: Restart GitLab Language Server`
|
||||
- `GitLab: Show Duo Workflow`
|
||||
- `GitLab: Toggle Code Suggestions`
|
||||
- `GitLab: Toggle Code Suggestions for current language`
|
||||
|
||||
### Other features
|
||||
|
||||
- `GitLab: Apply Snippet Patch`
|
||||
- `GitLab: Clone Wiki`
|
||||
- [`GitLab: Create Snippet`](index.md#create-a-snippet): Create a public, internal, or private snippet
|
||||
from an entire file or selection.
|
||||
- [`GitLab: Create Snippet Patch`](index.md#create-a-patch-file): Create a `.patch` file from the entire file, or a selection.
|
||||
- [`GitLab: Insert Snippet`](index.md#insert-a-snippet): Insert a single-file or multi-file project snippet.
|
||||
- `GitLab: Publish Workspace to GitLab`
|
||||
- `GitLab: Refresh Sidebar`
|
||||
- `GitLab: Show Extension Logs`
|
||||
- `GitLab: View Security Finding Details`
|
||||
- `GitLab Workflow: Focus on For current branch View`
|
||||
- `GitLab Workflow: Focus on Issues and Merge Requests View`
|
||||
|
||||
## Command integrations
|
||||
|
||||
This extension also integrates with some commands provided by VS Code:
|
||||
|
||||
- `Git: Clone`: Search for and clone projects for every GitLab instance you set up. For more information, see:
|
||||
- [Clone GitLab projects](https://gitlab.com/gitlab-org/gitlab-vscode-extension/#clone-gitlab-projects)
|
||||
- [Clone GitLab projects](remote_urls.md#clone-a-git-project)
|
||||
in the extension documentation.
|
||||
- [Cloning a repository](https://code.visualstudio.com/docs/sourcecontrol/overview#_cloning-a-repository)
|
||||
in the VS Code documentation.
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
|||
|
||||
If you encounter any issues with the GitLab Workflow extension for VS Code, or have feature requests for it:
|
||||
|
||||
1. Check the [extension documentation](https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/blob/main/README.md)
|
||||
1. Check the [extension documentation](index.md)
|
||||
for known issues and solutions.
|
||||
1. Report bugs or request features in the
|
||||
[`gitlab-vscode-extension` issue queue](https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/issues).
|
||||
|
|
@ -202,6 +202,6 @@ before starting VS Code. If you set the token in a
|
|||
you don't have to set a personal access token each time you delete your VS Code storage. Set these variables:
|
||||
|
||||
- `GITLAB_WORKFLOW_INSTANCE_URL`: Your GitLab instance URL, like `https://gitlab.com`.
|
||||
- `GITLAB_WORKFLOW_TOKEN`: Your personal access token, which you created [during setup](https://gitlab.com/gitlab-org/gitlab-vscode-extension/#setup).
|
||||
- `GITLAB_WORKFLOW_TOKEN`: Your personal access token, which you created [during setup](index.md#set-up-the-gitlab-workflow-extension).
|
||||
|
||||
The token configured in an environment variable is overridden if you configure a token for the same GitLab instance in the extension.
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ Prerequisites:
|
|||
- `<your_issuer_uri>` with your identity provider issuer URI, which can be
|
||||
can be copied from the IAM integration page when choosing
|
||||
manual setup and must exactly match the value. The parameter must include
|
||||
the path of the root group. For example, if the project is under
|
||||
the path of the top-level group. For example, if the project is under
|
||||
`my-root-group/my-subgroup/project-a`, the `issuer-uri` must be set to
|
||||
`https://auth.gcp.gitlab.com/oidc/my-root-group`.
|
||||
|
||||
|
|
@ -203,8 +203,8 @@ The ID token includes the following custom claims:
|
|||
| `namespace_path` | On project events | Path of the group or user level namespace. |
|
||||
| `project_id` | On project events | ID of the project. |
|
||||
| `project_path` | On project events | Path of the project. |
|
||||
| `root_namespace_id` | On group events | ID of the root group or user level namespace. |
|
||||
| `root_namespace_path` | On group events | Path of the root group or user level namespace. |
|
||||
| `root_namespace_id` | On group events | ID of the top-level group or user level namespace. |
|
||||
| `root_namespace_path` | On group events | Path of the top-level group or user level namespace. |
|
||||
| `user_id` | On user-trigged events | ID of the user. |
|
||||
| `user_login` | On user-trigged events | Username of the user. |
|
||||
| `user_email` | On user-trigged events | Email of the user. |
|
||||
|
|
|
|||
|
|
@ -369,4 +369,4 @@ corpus file extracts into a folder named `corpus`.
|
|||
|
||||
If you see this error message when running the fuzzing job with `COVFUZZ_USE_REGISTRY` set to `true`,
|
||||
ensure that duplicates are allowed. For more details, see
|
||||
[duplicate Generic packages](../../packages/generic_packages/index.md#do-not-allow-duplicate-generic-packages).
|
||||
[duplicate Generic packages](../../packages/generic_packages/index.md#disable-publishing-duplicate-package-names).
|
||||
|
|
|
|||
|
|
@ -4,241 +4,487 @@ group: Package Registry
|
|||
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
|
||||
---
|
||||
|
||||
# GitLab Generic Packages Repository
|
||||
# GitLab generic packages repository
|
||||
|
||||
DETAILS:
|
||||
**Tier:** Free, Premium, Ultimate
|
||||
**Offering:** GitLab.com, Self-managed, GitLab Dedicated
|
||||
|
||||
Publish generic files, like release binaries, in your project's package registry. Then, install the packages whenever you need to use them as a dependency.
|
||||
Use the generic packages repository to publish and manage generic files, such as release binaries, in your project's package registry. This feature is particularly useful for storing and distributing artifacts that don't fit into specific package formats like npm or Maven.
|
||||
|
||||
The generic packages repository provides:
|
||||
|
||||
- A place to store any file type as a package.
|
||||
- Version control for your packages.
|
||||
- Integration with GitLab CI/CD.
|
||||
- API access for automation.
|
||||
|
||||
## Authenticate to the package registry
|
||||
|
||||
To authenticate to the package registry, you need either a [personal access token](../../../api/rest/authentication.md#personalprojectgroup-access-tokens),
|
||||
[CI/CD job token](../../../ci/jobs/ci_job_token.md), or [deploy token](../../project/deploy_tokens/index.md).
|
||||
To interact with the package registry, you must authenticate with one of the following methods:
|
||||
|
||||
In addition to the standard API authentication mechanisms, the generic package
|
||||
API allows authentication with HTTP Basic authentication for use with tools that
|
||||
do not support the other available mechanisms. The `user-id` is not checked and
|
||||
may be any value, and the `password` must be either a [personal access token](../../../api/rest/authentication.md#personalprojectgroup-access-tokens),
|
||||
a [CI/CD job token](../../../ci/jobs/ci_job_token.md), or a [deploy token](../../project/deploy_tokens/index.md).
|
||||
- A [personal access token](../../../user/profile/personal_access_tokens.md) with the scope set to `api`.
|
||||
- A [project access token](../../../user/project/settings/project_access_tokens.md) with the scope set to `api` and at least the Developer role.
|
||||
- A [CI/CD job token](../../../ci/jobs/ci_job_token.md).
|
||||
- A [deploy token](../../project/deploy_tokens/index.md) with the scope set to `read_package_registry`, `write_package_registry`, or both.
|
||||
|
||||
Do not use authentication methods other than the methods documented here. Undocumented authentication methods might be removed in the future.
|
||||
|
||||
## Publish a package file
|
||||
When you authenticate with the package registry, you should follow these best practices:
|
||||
|
||||
When you publish a package file, if the package does not exist, it is created.
|
||||
- To access permissions associated with the Developer role, use a personal access token.
|
||||
- Use CI/CD job tokens for automated pipelines.
|
||||
- Use deploy tokens for external system integration.
|
||||
- Always send authentication information over HTTPS.
|
||||
|
||||
Prerequisites:
|
||||
### HTTP Basic authentication
|
||||
|
||||
- You must [authenticate with the API](../../../api/rest/authentication.md).
|
||||
If authenticating with a deploy token, it must be configured with the `write_package_registry`
|
||||
scope. If authenticating with a personal access token or project access token, it must be
|
||||
configured with the `api` scope. Project access tokens must have at least the Developer role.
|
||||
- You must call this API endpoint serially when attempting to upload multiple files under the
|
||||
same package name and version. Attempts to concurrently upload multiple files into
|
||||
a new package name and version may face partial failures with
|
||||
`HTTP 500: Internal Server Error` responses due to the requests racing to
|
||||
create the package.
|
||||
|
||||
```plaintext
|
||||
PUT /projects/:id/packages/generic/:package_name/:package_version/:file_name?status=:status
|
||||
```
|
||||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-------------------|----------------|----------|-------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../../../api/rest/index.md#namespaced-paths). |
|
||||
| `package_name` | string | yes | The package name. It can contain only lowercase letters (`a-z`), uppercase letter (`A-Z`), numbers (`0-9`), dots (`.`), hyphens (`-`), or underscores (`_`). |
|
||||
| `package_version` | string | yes | The package version. The following regex validates this: `\A(\.?[\w\+-]+\.?)+\z`. You can test your version strings on [Rubular](https://rubular.com/r/aNCV0wG5K14uq8). |
|
||||
| `file_name` | string | yes | The filename. It can contain only lowercase letters (`a-z`), uppercase letter (`A-Z`), numbers (`0-9`), dots (`.`), hyphens (`-`), underscores (`_`), or slashes (`/`). |
|
||||
| `status` | string | no | The package status. It can be `default` or `hidden`. Hidden packages do not appear in the UI or [package API list endpoints](../../../api/packages.md). |
|
||||
| `select` | string | no | The response payload. By default, the response is empty. Valid values are: `package_file`. `package_file` returns details of the package file record created by this request. |
|
||||
|
||||
Provide the file context in the request body.
|
||||
|
||||
Example request using a personal access token:
|
||||
If you use a tool that doesn't support the standard authentication methods, you can use HTTP Basic authentication:
|
||||
|
||||
```shell
|
||||
curl --fail-with-body --header "PRIVATE-TOKEN: <your_access_token>" \
|
||||
--upload-file path/to/file.txt \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt"
|
||||
|
||||
<!-- Or with a full path file -->
|
||||
|
||||
curl --fail-with-body --user "user:<your_access_token>" \
|
||||
--upload-file path/to/file.txt \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/path/to/file.txt"
|
||||
curl --user "<username>:<token>" <other options> <GitLab API endpoint>
|
||||
```
|
||||
|
||||
Example response without attribute `select`:
|
||||
Although it is ignored, you must provide a username. The token is your personal access token, CI/CD job token, or deploy token.
|
||||
|
||||
```json
|
||||
{
|
||||
"message":"201 Created"
|
||||
}
|
||||
```
|
||||
## Publish a package
|
||||
|
||||
Example request with attribute `select = package_file`:
|
||||
You can publish packages with the API.
|
||||
|
||||
### Publish a single file
|
||||
|
||||
To publish a single file, use the following API endpoint:
|
||||
|
||||
```shell
|
||||
curl --fail-with-body --header "PRIVATE-TOKEN: <your_access_token>" \
|
||||
--user "<username>:<Project Access Token>" \
|
||||
PUT /projects/:id/packages/generic/:package_name/:package_version/:file_name
|
||||
```
|
||||
|
||||
Replace the placeholders in the URL with your specific values:
|
||||
|
||||
- `:id`: Your project ID or URL-encoded path
|
||||
- `:package_name`: Name of your package
|
||||
- `:package_version`: Version of your package
|
||||
- `:file_name`: Name of the file you're uploading
|
||||
|
||||
For example:
|
||||
|
||||
::Tabs
|
||||
|
||||
:::TabTitle Personal access token
|
||||
|
||||
With HTTP headers:
|
||||
|
||||
```shell
|
||||
curl --location --header "PRIVATE-TOKEN: <personal_access_token>" \
|
||||
--upload-file path/to/file.txt \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt?select=package_file"
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/1.0.0/file.txt"
|
||||
```
|
||||
|
||||
Example response with attribute `select = package_file`:
|
||||
With HTTP Basic authentication:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 1,
|
||||
"package_id": 1,
|
||||
"created_at": "2021-10-12T12:05:23.387Z",
|
||||
"updated_at": "2021-10-12T12:05:23.387Z",
|
||||
"size": 0,
|
||||
"file_store": 1,
|
||||
"file_md5": null,
|
||||
"file_sha1": null,
|
||||
"file_name": "file.txt",
|
||||
"file": {
|
||||
"url": "/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b/packages/26/files/36/file.txt"
|
||||
},
|
||||
"file_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"verification_retry_at": null,
|
||||
"verified_at": null,
|
||||
"verification_failure": null,
|
||||
"verification_retry_count": null,
|
||||
"verification_checksum": null,
|
||||
"verification_state": 0,
|
||||
"verification_started_at": null,
|
||||
"new_file_path": null
|
||||
}
|
||||
```shell
|
||||
curl --location --user "<username>:<personal_access_token>" \
|
||||
--upload-file path/to/file.txt \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/1.0.0/file.txt"
|
||||
```
|
||||
|
||||
### Publishing a package with the same name or version
|
||||
:::TabTitle Project access token
|
||||
|
||||
When you publish a package with the same name and version as an existing package, the new package
|
||||
files are added to the existing package. When you install a generic package that has a duplicate, GitLab downloads the latest version.
|
||||
With HTTP headers:
|
||||
|
||||
You can use the UI or API to access and view the
|
||||
existing package's older files. To delete these older package revisions, consider using the Packages
|
||||
API or the UI.
|
||||
```shell
|
||||
curl --location --header "PRIVATE-TOKEN: <project_access_token>" \
|
||||
--upload-file path/to/file.txt \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/1.0.0/file.txt"
|
||||
```
|
||||
|
||||
#### Do not allow duplicate Generic packages
|
||||
With HTTP Basic authentication:
|
||||
|
||||
```shell
|
||||
curl --location --user "<project_access_token_username>:project_access_token" \
|
||||
--upload-file path/to/file.txt \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/1.0.0/file.txt"
|
||||
```
|
||||
|
||||
:::TabTitle Deploy token
|
||||
|
||||
With HTTP headers:
|
||||
|
||||
```shell
|
||||
curl --location --header "DEPLOY-TOKEN: <deploy_token>" \
|
||||
--upload-file path/to/file.txt \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/1.0.0/file.txt"
|
||||
```
|
||||
|
||||
With HTTP Basic authentication:
|
||||
|
||||
```shell
|
||||
curl --location --user "<deploy_token_username>:<deploy_token>" \
|
||||
--upload-file path/to/file.txt \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/1.0.0/file.txt"
|
||||
```
|
||||
|
||||
Replace `<deploy_token_username>` with the username of your deploy token and `<deploy_token>` with your actual deploy token.
|
||||
|
||||
:::TabTitle CI/CD job token
|
||||
|
||||
These examples are for a `.gitlab-ci.yml` file. GitLab CI/CD automatically provides the `CI_JOB_TOKEN`.
|
||||
|
||||
With HTTP headers:
|
||||
|
||||
```yaml
|
||||
publish:
|
||||
stage: deploy
|
||||
script:
|
||||
- |
|
||||
curl --location --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
|
||||
--upload-file path/to/file.txt \
|
||||
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/${CI_COMMIT_TAG}/file.txt"
|
||||
```
|
||||
|
||||
With HTTP Basic authentication:
|
||||
|
||||
```yaml
|
||||
publish:
|
||||
stage: deploy
|
||||
script:
|
||||
- |
|
||||
curl --location --user "gitlab-ci-token:${CI_JOB_TOKEN}" \
|
||||
--upload-file path/to/file.txt \
|
||||
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/${CI_COMMIT_TAG}/file.txt"
|
||||
```
|
||||
|
||||
::EndTabs
|
||||
|
||||
Each request returns a response indicating success or failure. If your upload is successful, the response status is `201 Created`.
|
||||
|
||||
### Publish multiple files
|
||||
|
||||
To publish multiple files or an entire directory, you must make one API call for each file.
|
||||
|
||||
You should follow these best practices when you publish multiple files to the repository:
|
||||
|
||||
- **Versioning**: Use a consistent versioning scheme for your package. This could be based on your project's version, build number, or date.
|
||||
- **File organization**: Consider how you want to structure your files within the package. You might want to include a manifest file that lists all the included files and their purposes.
|
||||
- **Automation**: Whenever possible, automate the publishing process through CI/CD pipelines. This ensures consistency and reduces manual errors.
|
||||
- **Error handling**: Implement error checking in your scripts. For example, check the HTTP response code from cURL to ensure each file was uploaded successfully.
|
||||
- **Logging**: Maintain logs of what files were uploaded, when, and by whom. This can be crucial for troubleshooting and auditing.
|
||||
- **Compression**: For large directories, consider compressing the contents into a single file before uploading. This can simplify the upload process and reduce the number of API calls.
|
||||
- **Checksums**: Generate and store checksums (MD5, SHA256) for your files. This allows users to verify the integrity of downloaded files.
|
||||
|
||||
For example:
|
||||
|
||||
::Tabs
|
||||
|
||||
:::TabTitle With a Bash script
|
||||
|
||||
Create a Bash script to iterate through files and upload them:
|
||||
|
||||
```shell
|
||||
#!/bin/bash
|
||||
|
||||
TOKEN="<access_token>"
|
||||
PROJECT_ID="24"
|
||||
PACKAGE_NAME="my_package"
|
||||
PACKAGE_VERSION="1.0.0"
|
||||
DIRECTORY_PATH="./files_to_upload"
|
||||
|
||||
for file in "$DIRECTORY_PATH"/*; do
|
||||
if [ -f "$file" ]; then
|
||||
filename=$(basename "$file")
|
||||
curl --location --header "PRIVATE-TOKEN: $TOKEN" \
|
||||
--upload-file "$file" \
|
||||
"https://gitlab.example.com/api/v4/projects/$PROJECT_ID/packages/generic/$PACKAGE_NAME/$PACKAGE_VERSION/$filename"
|
||||
echo "Uploaded: $filename"
|
||||
fi
|
||||
done
|
||||
```
|
||||
|
||||
:::TabTitle With GitLab CI/CD
|
||||
|
||||
For automated uploads in your CI/CD pipeline, you can iterate through your files and upload them:
|
||||
|
||||
```yaml
|
||||
upload_package:
|
||||
stage: publish
|
||||
script:
|
||||
- |
|
||||
for file in ./build/*; do
|
||||
if [ -f "$file" ]; then
|
||||
filename=$(basename "$file")
|
||||
curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \
|
||||
--upload-file "$file" \
|
||||
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/${CI_COMMIT_TAG}/$filename"
|
||||
echo "Uploaded: $filename"
|
||||
fi
|
||||
done
|
||||
```
|
||||
|
||||
::EndTabs
|
||||
|
||||
### Maintain directory structure
|
||||
|
||||
To preserve the structure of a published directory, include the relative path in the file name:
|
||||
|
||||
```shell
|
||||
#!/bin/bash
|
||||
|
||||
TOKEN="<access_token>"
|
||||
PROJECT_ID="24"
|
||||
PACKAGE_NAME="my_package"
|
||||
PACKAGE_VERSION="1.0.0"
|
||||
DIRECTORY_PATH="./files_to_upload"
|
||||
|
||||
find "$DIRECTORY_PATH" -type f | while read -r file; do
|
||||
relative_path=${file#"$DIRECTORY_PATH/"}
|
||||
curl --location --header "PRIVATE-TOKEN: $TOKEN" \
|
||||
--upload-file "$file" \
|
||||
"https://gitlab.example.com/api/v4/projects/$PROJECT_ID/packages/generic/$PACKAGE_NAME/$PACKAGE_VERSION/$relative_path"
|
||||
echo "Uploaded: $relative_path"
|
||||
done
|
||||
```
|
||||
|
||||
## Download a package
|
||||
|
||||
You can download packages with the API.
|
||||
|
||||
### Download a single file
|
||||
|
||||
To download a single package file, use the following API endpoint:
|
||||
|
||||
```shell
|
||||
GET /projects/:id/packages/generic/:package_name/:package_version/:file_name
|
||||
```
|
||||
|
||||
Replace the placeholders in the URL with your specific values:
|
||||
|
||||
- `:id`: Your project ID or URL-encoded path
|
||||
- `:package_name`: Name of your package
|
||||
- `:package_version`: Version of your package
|
||||
- `:file_name`: Name of the file you're uploading
|
||||
|
||||
For example:
|
||||
|
||||
::Tabs
|
||||
|
||||
:::TabTitle Personal access token
|
||||
|
||||
With HTTP headers:
|
||||
|
||||
```shell
|
||||
curl --header "PRIVATE-TOKEN: <access_token>" \
|
||||
--location \
|
||||
"https://gitlab.example.com/api/v4/projects/1/packages/generic/my_package/0.0.1/file.txt" \
|
||||
--output file.txt
|
||||
```
|
||||
|
||||
With HTTP Basic authentication:
|
||||
|
||||
```shell
|
||||
curl --user "<username>:<access_token>" \
|
||||
--location \
|
||||
"https://gitlab.example.com/api/v4/projects/1/packages/generic/my_package/0.0.1/file.txt" \
|
||||
--output file.txt
|
||||
```
|
||||
|
||||
:::TabTitle Project access token
|
||||
|
||||
With HTTP headers:
|
||||
|
||||
```shell
|
||||
curl --header "PROJECT-TOKEN: <project_access_token>" \
|
||||
--location \
|
||||
"https://gitlab.example.com/api/v4/projects/1/packages/generic/my_package/0.0.1/file.txt" \
|
||||
--output file.txt
|
||||
```
|
||||
|
||||
With HTTP Basic authentication:
|
||||
|
||||
```shell
|
||||
curl --user "<project_access_token_username>:<project_access_token>" \
|
||||
--location \
|
||||
"https://gitlab.example.com/api/v4/projects/1/packages/generic/my_package/0.0.1/file.txt" \
|
||||
--output file.txt
|
||||
```
|
||||
|
||||
:::TabTitle Deploy token
|
||||
|
||||
With HTTP headers:
|
||||
|
||||
```shell
|
||||
curl --header "DEPLOY-TOKEN: <deploy_token>" \
|
||||
--location \
|
||||
"https://gitlab.example.com/api/v4/projects/1/packages/generic/my_package/0.0.1/file.txt" \
|
||||
--output file.txt
|
||||
```
|
||||
|
||||
With HTTP Basic authentication:
|
||||
|
||||
```shell
|
||||
curl --user "<deploy_token_username>:<deploy_token>" \
|
||||
--location \
|
||||
"https://gitlab.example.com/api/v4/projects/1/packages/generic/my_package/0.0.1/file.txt" \
|
||||
--output file.txt
|
||||
```
|
||||
|
||||
:::TabTitle CI/CD job token
|
||||
|
||||
These examples are for a `.gitlab-ci.yml` file. GitLab CI/CD automatically provides the `CI_JOB_TOKEN`.
|
||||
|
||||
With HTTP headers:
|
||||
|
||||
```yaml
|
||||
publish:
|
||||
stage: deploy
|
||||
script:
|
||||
- |
|
||||
curl --location --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
|
||||
--upload-file path/to/file.txt \
|
||||
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/${CI_COMMIT_TAG}/file.txt"
|
||||
```
|
||||
|
||||
With HTTP Basic authentication:
|
||||
|
||||
```yaml
|
||||
publish:
|
||||
stage: deploy
|
||||
script:
|
||||
- |
|
||||
curl --location --user "gitlab-ci-token:${CI_JOB_TOKEN}" \
|
||||
--upload-file path/to/file.txt \
|
||||
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/${CI_COMMIT_TAG}/file.txt"
|
||||
```
|
||||
|
||||
Each request returns a response indicating success or failure. If your upload is successful, the response status is `201 Created`.
|
||||
|
||||
::EndTabs
|
||||
|
||||
### Download multiple files
|
||||
|
||||
To download multiple files or an entire directory, you must make one API call for each file, or use additional tools.
|
||||
|
||||
You should follow these best practices when you download multiple files from the repository:
|
||||
|
||||
- **Versioning**: Always specify the exact version of the package you want to download to ensure consistency.
|
||||
- **Directory structure**: When downloading, maintain the original directory structure of the package to preserve file organization.
|
||||
- **Automation**: Integrate package downloads into your CI/CD pipelines or build scripts for automated workflows.
|
||||
- **Error handling**: Implement checks to ensure all files are downloaded successfully. You can verify the HTTP status code or check file existence after download.
|
||||
- **Caching**: For frequently used packages, consider implementing a caching mechanism to reduce network usage and improve build times.
|
||||
- **Parallel downloads**: For large packages with many files, you might want to implement parallel downloads to speed up the process.
|
||||
- **Checksums**: If available, verify the integrity of downloaded files using checksums provided by the package publisher.
|
||||
- **Incremental downloads**: For large packages that change frequently, consider implementing a mechanism to download only the files that have changed since the last download.
|
||||
|
||||
For example:
|
||||
|
||||
::Tabs
|
||||
|
||||
:::TabTitle With a Bash script
|
||||
|
||||
Create a bash script to download multiple files:
|
||||
|
||||
```shell
|
||||
#!/bin/bash
|
||||
|
||||
TOKEN="<access_token>"
|
||||
PROJECT_ID="24"
|
||||
PACKAGE_NAME="my_package"
|
||||
PACKAGE_VERSION="1.0.0"
|
||||
OUTPUT_DIR="./downloaded_files"
|
||||
|
||||
# Create output directory if it doesn't exist
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
# Array of files to download
|
||||
files=("file1.txt" "file2.txt" "subdirectory/file3.txt")
|
||||
|
||||
for file in "${files[@]}"; do
|
||||
curl --location --header "PRIVATE-TOKEN: $TOKEN" \
|
||||
--output "$OUTPUT_DIR/$file" \
|
||||
--create-dirs \
|
||||
"https://gitlab.example.com/api/v4/projects/$PROJECT_ID/packages/generic/$PACKAGE_NAME/$PACKAGE_VERSION/$file"
|
||||
echo "Downloaded: $file"
|
||||
done
|
||||
```
|
||||
|
||||
:::TabTitle With GitLab CI/CD
|
||||
|
||||
For automated downloads in your CI/CD pipeline:
|
||||
|
||||
```yaml
|
||||
download_package:
|
||||
stage: build
|
||||
script:
|
||||
- |
|
||||
FILES=("file1.txt" "file2.txt" "subdirectory/file3.txt")
|
||||
for file in "${FILES[@]}"; do
|
||||
curl --location --header "JOB-TOKEN: $CI_JOB_TOKEN" \
|
||||
--output "$file" \
|
||||
--create-dirs \
|
||||
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/${CI_COMMIT_TAG}/$file"
|
||||
echo "Downloaded: $file"
|
||||
done
|
||||
```
|
||||
|
||||
::EndTabs
|
||||
|
||||
### Download an entire package
|
||||
|
||||
To download all files in a package, list the package contents using the GitLab API, then download each file:
|
||||
|
||||
```shell
|
||||
TOKEN="<access_token>"
|
||||
PROJECT_ID="24"
|
||||
PACKAGE_NAME="my_package"
|
||||
PACKAGE_VERSION="1.0.0"
|
||||
OUTPUT_DIR="./downloaded_package"
|
||||
|
||||
# Create output directory
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
# Get list of files in the package
|
||||
files=$(curl --location --header "PRIVATE-TOKEN: $TOKEN" \
|
||||
"https://gitlab.example.com/api/v4/projects/$PROJECT_ID/packages/generic/$PACKAGE_NAME/$PACKAGE_VERSION/files" \
|
||||
| jq -r '.[].file_name')
|
||||
|
||||
# Download each file
|
||||
for file in $files; do
|
||||
curl --location --header "PRIVATE-TOKEN: $TOKEN" \
|
||||
--output "$OUTPUT_DIR/$file" \
|
||||
--create-dirs \
|
||||
"https://gitlab.example.com/api/v4/projects/$PROJECT_ID/packages/generic/$PACKAGE_NAME/$PACKAGE_VERSION/$file"
|
||||
echo "Downloaded: $file"
|
||||
done
|
||||
```
|
||||
|
||||
## Disable publishing duplicate package names
|
||||
|
||||
> - Required role [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/350682) from Developer to Maintainer in GitLab 15.0.
|
||||
> - Required role [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/370471) from Maintainer to Owner in GitLab 17.0.
|
||||
|
||||
To prevent users from publishing duplicate generic packages, you can use the [GraphQL API](../../../api/graphql/reference/index.md#packagesettings)
|
||||
or the UI.
|
||||
By default, when you publish a package with the same name and version as an existing package, the new files are added to the existing package. You can disable publishing duplicate file names in the settings.
|
||||
|
||||
In the UI:
|
||||
Prerequisites:
|
||||
|
||||
- You must have the Owner role.
|
||||
|
||||
To disable publishing duplicate file names:
|
||||
|
||||
1. On the left sidebar, select **Search or go to** and find your group.
|
||||
1. Select **Settings > Packages and registries**.
|
||||
1. In the **Generic** row of the **Duplicate packages** table, turn off the **Allow duplicates** toggle.
|
||||
1. Optional. In the **Exceptions** text box, enter a regular expression that matches the names and versions of packages to allow.
|
||||
|
||||
Your changes are automatically saved.
|
||||
## Add a package retention policy
|
||||
|
||||
## Download package file
|
||||
Implement a package retention policy to manage storage and maintain relevant versions.
|
||||
|
||||
Download a package file.
|
||||
To do so:
|
||||
|
||||
If multiple packages have the same name, version, and filename, then the most recent one is retrieved.
|
||||
- Use the built-in GitLab [cleanup policies](../package_registry/reduce_package_registry_storage.md#cleanup-policy).
|
||||
|
||||
Prerequisites:
|
||||
You can also use the API to implement custom cleanup scripts.
|
||||
|
||||
- You need to [authenticate with the API](../../../api/rest/authentication.md).
|
||||
- If authenticating with a deploy token, it must be configured with the `read_package_registry` and/or `write_package_registry` scope.
|
||||
- Project access tokens require the `read_api` scope and at least the `Reporter` role.
|
||||
- If you use cURL to download artifacts from a GitLab instance with object storage enabled,
|
||||
use the `--location` parameter, as the request might be redirected.
|
||||
|
||||
```plaintext
|
||||
GET /projects/:id/packages/generic/:package_name/:package_version/:file_name
|
||||
```
|
||||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-------------------|----------------|----------|-------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../../../api/rest/index.md#namespaced-paths). |
|
||||
| `package_name` | string | yes | The package name. |
|
||||
| `package_version` | string | yes | The package version. |
|
||||
| `file_name` | string | yes | The filename. |
|
||||
|
||||
The file context is served in the response body. The response content type is `application/octet-stream`.
|
||||
|
||||
::Tabs
|
||||
|
||||
:::TabTitle Personal access token
|
||||
|
||||
Example request that uses a personal access token:
|
||||
|
||||
```shell
|
||||
# Header authentication
|
||||
curl --fail-with-body --output file.txt --header "PRIVATE-TOKEN: <your_access_token>" \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt"
|
||||
|
||||
# Basic authentication
|
||||
curl --fail-with-body --output file.txt --user "user:<your_access_token>" \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt"
|
||||
```
|
||||
|
||||
:::TabTitle CI_JOB_TOKEN
|
||||
|
||||
Example request that uses a `CI_JOB_TOKEN`:
|
||||
|
||||
```shell
|
||||
# Header authentication
|
||||
curl --fail-with-body --output file.txt --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt"
|
||||
|
||||
# Basic authentication
|
||||
curl --fail-with-body --output file.txt --user "gitlab-ci-token:${CI_JOB_TOKEN}" \
|
||||
"https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt"
|
||||
```
|
||||
|
||||
::EndTabs
|
||||
|
||||
## Publish a generic package by using CI/CD
|
||||
|
||||
To work with generic packages in [GitLab CI/CD](../../../ci/index.md), you can use
|
||||
`CI_JOB_TOKEN` in place of the personal access token in your commands.
|
||||
|
||||
For example:
|
||||
|
||||
```yaml
|
||||
default:
|
||||
image: curlimages/curl:latest
|
||||
|
||||
stages:
|
||||
- upload
|
||||
- download
|
||||
|
||||
upload:
|
||||
stage: upload
|
||||
script:
|
||||
- 'curl --fail-with-body --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file path/to/file.txt "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/0.0.1/file.txt"'
|
||||
|
||||
download:
|
||||
stage: download
|
||||
script:
|
||||
- 'wget --header="JOB-TOKEN: $CI_JOB_TOKEN" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/0.0.1/file.txt'
|
||||
```
|
||||
|
||||
When using a Windows runner with PowerShell, you must use `Invoke-WebRequest` or `Invoke-RestMethod`
|
||||
instead of `curl` in the `upload` and `download` stages.
|
||||
|
||||
For example:
|
||||
|
||||
```yaml
|
||||
upload:
|
||||
stage: upload
|
||||
script:
|
||||
- Invoke-RestMethod -Headers @{ "JOB-TOKEN"="$CI_JOB_TOKEN" } -InFile path/to/file.txt -uri "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/0.0.1/file.txt" -Method put
|
||||
```
|
||||
|
||||
### Generic package sample project
|
||||
## Generic package sample project
|
||||
|
||||
The [Write CI-CD Variables in Pipeline](https://gitlab.com/guided-explorations/cfg-data/write-ci-cd-variables-in-pipeline) project contains a working example you can use to create, upload, and download generic packages in GitLab CI/CD.
|
||||
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ CI/CD templates, which you can use to get started, are in [this repository](http
|
|||
|
||||
For more information about using the GitLab package registry with CI/CD, see:
|
||||
|
||||
- [Generic](../generic_packages/index.md#publish-a-generic-package-by-using-cicd)
|
||||
- [Generic](../generic_packages/index.md#publish-a-package)
|
||||
- [Maven](../maven_repository/index.md#create-maven-packages-with-gitlab-cicd)
|
||||
- [npm](../npm_registry/index.md#publish-a-package-with-a-cicd-pipeline)
|
||||
- [NuGet](../nuget_repository/index.md#publish-a-nuget-package-by-using-cicd)
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ to store any artifacts from a release or tag pipeline,
|
|||
that can also be used for attaching binary files to an individual release entry.
|
||||
You basically need to:
|
||||
|
||||
1. [Push the artifacts to the Generic package registry](../../packages/generic_packages/index.md#publish-a-package-file).
|
||||
1. [Push the artifacts to the Generic package registry](../../packages/generic_packages/index.md#publish-a-package).
|
||||
1. [Attach the package link to the release](#links).
|
||||
|
||||
The following example generates release assets, publishes them
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ These words are listed in the
|
|||
where:
|
||||
|
||||
- `TOP_LEVEL_ROUTES` are names reserved as usernames or top-level groups.
|
||||
- `PROJECT_WILDCARD_ROUTES` are names reserved for child groups or projects.
|
||||
- `PROJECT_WILDCARD_ROUTES` are names reserved for subgroups or projects.
|
||||
- `GROUP_ROUTES` are names reserved for all groups or projects.
|
||||
|
||||
## Limitations on usernames, project and group names and slugs
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ Running workspaces stop when they are automatically terminated or manually stopp
|
|||
|
||||
## Legacy agent authorization strategy
|
||||
|
||||
In GitLab 17.1 and earlier, an agent doesn't have to be allowed to be available in a group for creating workspaces. You can use an agent present anywhere in the top-level group (or the root group) of a workspace project to create a workspace, as long as the remote development module is enabled and you have at least the Developer role for the top-level group.
|
||||
In GitLab 17.1 and earlier, an agent doesn't have to be allowed to be available in a group for creating workspaces. You can use an agent present anywhere in the top-level group of a workspace project to create a workspace, as long as the remote development module is enabled and you have at least the Developer role for the top-level group.
|
||||
For example, if the path to your workspace project is `top-level-group/subgroup-1/subgroup-2/workspace-project`,
|
||||
you can use any configured agent in `top-level-group` and in any of its subgroups.
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ module QA
|
|||
private
|
||||
|
||||
def api_client
|
||||
@api_client ||= Runtime::API::Client.new(:gitlab)
|
||||
@api_client ||= UserStore.test_user.api_client
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -5,9 +5,10 @@ module QA
|
|||
include Support::API
|
||||
|
||||
describe 'API basics', product_group: :source_code do
|
||||
let(:api_client) { Runtime::API::Client.new(:gitlab) }
|
||||
let(:test_user) { Runtime::UserStore.test_user }
|
||||
let(:api_client) { test_user.api_client }
|
||||
let(:project_name) { "api-basics-#{SecureRandom.hex(8)}" }
|
||||
let(:sanitized_project_path) { CGI.escape("#{Runtime::User.username}/#{project_name}") }
|
||||
let(:sanitized_project_path) { CGI.escape("#{test_user.username}/#{project_name}") }
|
||||
let(:file_name) { 'bã®' }
|
||||
# this file path deliberately includes a subdirectory which matches the file name to verify file/dir matching logic
|
||||
let(:file_path) { CGI.escape("føo/#{file_name}/føo/#{file_name}") }
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@ module QA
|
|||
include Support::API
|
||||
|
||||
describe 'Users API', :smoke, product_group: :tenant_scale do
|
||||
let(:api_client) { Runtime::API::Client.new(:gitlab) }
|
||||
let(:api_client) { Runtime::UserStore.test_user.api_client }
|
||||
let(:username) { Runtime::UserStore.test_user.username }
|
||||
|
||||
it 'GET /users', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347882' do
|
||||
request = Runtime::API::Request.new(api_client, '/users')
|
||||
|
|
@ -16,14 +17,12 @@ module QA
|
|||
|
||||
it 'GET /users/:username with a valid username',
|
||||
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347886' do
|
||||
request = Runtime::API::Request.new(api_client, '/users', username: Runtime::User.username)
|
||||
request = Runtime::API::Request.new(api_client, '/users', username: username)
|
||||
response = Support::API.get(request.url)
|
||||
response_body = parse_body(response)
|
||||
|
||||
expect(response.code).to eq(Support::API::HTTP_STATUS_OK)
|
||||
expect(response_body).to contain_exactly(
|
||||
a_hash_including(username: Runtime::User.username)
|
||||
)
|
||||
expect(response_body).to contain_exactly(a_hash_including(username: username))
|
||||
end
|
||||
|
||||
it 'GET /users/:username with an invalid username',
|
||||
|
|
|
|||
|
|
@ -414,14 +414,15 @@ RSpec.describe 'Pipelines', :js, feature_category: :continuous_integration do
|
|||
click_button 'delayed job 1'
|
||||
end
|
||||
|
||||
# Wait for UI to transition to ensure a request has been made
|
||||
# Click on the manual action dropdown and check if a request has been made
|
||||
find(manual_action_selector).click
|
||||
within(manual_action_dropdown) { find('.gl-spinner') }
|
||||
within(manual_action_dropdown) { find_by_testid('play-icon') }
|
||||
|
||||
wait_for_requests
|
||||
end
|
||||
|
||||
it 'enqueues the delayed job', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/410129' do
|
||||
it 'enqueues the delayed job', :js do
|
||||
expect(delayed_job.reload).to be_pending
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ exports[`SearchItem should render the item 1`] = `
|
|||
class="gl-flex gl-flex-col"
|
||||
>
|
||||
<span
|
||||
class="gl-text-gray-900"
|
||||
class="gl-text-strong"
|
||||
>
|
||||
Cole Dickinson
|
||||
</span>
|
||||
|
|
@ -40,7 +40,7 @@ exports[`SearchItem should render the item 2`] = `
|
|||
class="gl-flex gl-flex-col"
|
||||
>
|
||||
<span
|
||||
class="gl-text-gray-900"
|
||||
class="gl-text-strong"
|
||||
>
|
||||
Manage > Activity
|
||||
</span>
|
||||
|
|
@ -66,12 +66,12 @@ exports[`SearchItem should render the item 3`] = `
|
|||
class="gl-flex gl-flex-col"
|
||||
>
|
||||
<span
|
||||
class="gl-text-gray-900"
|
||||
class="gl-text-strong"
|
||||
>
|
||||
MockProject1
|
||||
</span>
|
||||
<span
|
||||
class="gl-text-gray-500 gl-text-sm"
|
||||
class="gl-text-sm gl-text-subtle"
|
||||
>
|
||||
Gitlab Org / MockProject1
|
||||
</span>
|
||||
|
|
@ -97,7 +97,7 @@ exports[`SearchItem should render the item 4`] = `
|
|||
class="gl-flex gl-flex-col"
|
||||
>
|
||||
<span
|
||||
class="gl-text-gray-900"
|
||||
class="gl-text-strong"
|
||||
>
|
||||
Dismiss Cipher with no integrity
|
||||
</span>
|
||||
|
|
|
|||
Loading…
Reference in New Issue