Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-11-21 00:16:09 +00:00
parent d88fd39bb7
commit e797ca243f
59 changed files with 787 additions and 357 deletions

View File

@ -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 \

View File

@ -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

View File

@ -38,7 +38,7 @@ export default {
return this.config.fields;
},
docsPath() {
return helpPagePath('user/glql');
return helpPagePath('user/glql/index');
},
},
i18n: {

View File

@ -39,7 +39,7 @@ export default {
},
computed: {
docsPath() {
return helpPagePath('user/glql');
return helpPagePath('user/glql/index');
},
},
async mounted() {

View File

@ -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`">
{{
__(

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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">

View File

@ -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

View File

@ -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>

View File

@ -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">

View File

@ -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 }}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1 @@
bfdbad5b9a04f47da9d9eba38056fe0880ece5eabb9f7050b04b606fa8524c56

View File

@ -0,0 +1 @@
56fe5d33d48fbf846666f33cfe56f59a01c9db628db410244a4543c3c0551379

View File

@ -0,0 +1 @@
d2cb32a52662f54c5bd3f3e4d5d9588fe9ae846af92c937a01f52aa5651eea10

View File

@ -0,0 +1 @@
70420def8903704a3cc34cb1a8147f533288009ce7a10a2360f01504c6da889f

View File

@ -0,0 +1 @@
7d6bcdd8a6d1601a56e8d05eea3b301bdd43100a08e700d6c3f2737093a64c0f

View File

@ -0,0 +1 @@
cc74b8f073b711c4eb1d5ec6b0144641fbcdb1c269fd8e2197138aba256a0d1a

View File

@ -0,0 +1 @@
fca8baeff96256f9e2b94d8c61f95ecef0d24dc9803d0d8a55e23150ffff2c70

View File

@ -0,0 +1 @@
cab6aa7943af94ad128ae0cfa7ca3329841e34415c34461dbad0c6bda49df5f7

View File

@ -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);

View File

@ -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.

View File

@ -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.

View File

@ -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).

View File

@ -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. |

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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:

View File

@ -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.

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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.

View File

@ -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.

View File

@ -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. |

View File

@ -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).

View File

@ -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.

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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}") }

View File

@ -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',

View File

@ -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

View File

@ -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 &gt; 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>