From 30b8ad35feb7efb0587f44d8e7b371490634ee1c Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 2 Mar 2021 00:11:26 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- app/models/clusters/agent_token.rb | 1 + app/views/groups/settings/_advanced.html.haml | 2 +- app/views/shared/_group_form.html.haml | 2 +- .../emilyring-clustertoken-name.yml | 5 + ...7_add_name_field_to_cluster_agent_token.rb | 12 +++ ...20210225135533_limit_cluster_token_size.rb | 17 ++++ db/schema_migrations/20210224133337 | 1 + db/schema_migrations/20210225135533 | 1 + db/structure.sql | 2 + doc/administration/compliance.md | 2 +- .../packages/container_registry.md | 2 +- doc/api/graphql/reference/index.md | 11 +++ doc/api/merge_requests.md | 7 +- doc/api/releases/index.md | 6 +- doc/development/contributing/style_guides.md | 2 +- doc/development/fe_guide/style/javascript.md | 2 +- doc/development/fe_guide/tooling.md | 10 +- .../testing_guide/frontend_testing.md | 89 ++++++++++++++++++ doc/security/two_factor_authentication.md | 2 +- doc/subscriptions/bronze_starter.md | 2 +- .../settings/continuous_integration.md | 4 +- doc/user/clusters/agent/index.md | 10 +- doc/user/group/img/group_settings.png | Bin 51335 -> 0 bytes doc/user/group/index.md | 59 +++++------- doc/user/packages/container_registry/index.md | 2 +- doc/user/permissions.md | 5 +- doc/user/project/integrations/webhooks.md | 2 +- .../members/share_project_with_groups.md | 2 +- doc/user/project/repository/index.md | 2 +- lefthook.yml | 2 +- lib/tasks/eslint.rake | 2 +- package.json | 8 +- qa/qa/resource/clusters/agent_token.rb | 2 +- .../non_devops/performance_bar_spec.rb | 2 +- scripts/static-analysis | 2 +- spec/factories/clusters/agent_tokens.rb | 2 + spec/models/clusters/agent_token_spec.rb | 2 + 37 files changed, 215 insertions(+), 71 deletions(-) create mode 100644 changelogs/unreleased/emilyring-clustertoken-name.yml create mode 100644 db/migrate/20210224133337_add_name_field_to_cluster_agent_token.rb create mode 100644 db/migrate/20210225135533_limit_cluster_token_size.rb create mode 100644 db/schema_migrations/20210224133337 create mode 100644 db/schema_migrations/20210225135533 delete mode 100644 doc/user/group/img/group_settings.png diff --git a/app/models/clusters/agent_token.rb b/app/models/clusters/agent_token.rb index 8266f40133d..9d79887b574 100644 --- a/app/models/clusters/agent_token.rb +++ b/app/models/clusters/agent_token.rb @@ -13,5 +13,6 @@ module Clusters before_save :ensure_token validates :description, length: { maximum: 1024 } + validates :name, presence: true, length: { maximum: 255 }, on: :create end end diff --git a/app/views/groups/settings/_advanced.html.haml b/app/views/groups/settings/_advanced.html.haml index 627807841c5..fddb83114f3 100644 --- a/app/views/groups/settings/_advanced.html.haml +++ b/app/views/groups/settings/_advanced.html.haml @@ -8,7 +8,7 @@ %p = s_('GroupSettings|Changing group URL can have unintended side effects.') = succeed '.' do - = link_to _('Learn more'), help_page_path('user/group/index', anchor: 'changing-a-groups-path'), target: '_blank' + = link_to _('Learn more'), help_page_path('user/group/index', anchor: 'change-a-groups-path'), target: '_blank' .input-group.gl-field-error-anchor .group-root-path.input-group-prepend.has-tooltip{ title: group_path(@group), :'data-placement' => 'bottom' } diff --git a/app/views/shared/_group_form.html.haml b/app/views/shared/_group_form.html.haml index c3fac5cd464..eea0c5f37de 100644 --- a/app/views/shared/_group_form.html.haml +++ b/app/views/shared/_group_form.html.haml @@ -39,7 +39,7 @@ .gl-alert-body = _('Changing group URL can have unintended side effects.') = succeed '.' do - = link_to _('Learn more'), help_page_path('user/group/index', anchor: 'changing-a-groups-path'), target: '_blank', class: 'gl-link' + = link_to _('Learn more'), help_page_path('user/group/index', anchor: 'change-a-groups-path'), target: '_blank', class: 'gl-link' - if @group.persisted? .row diff --git a/changelogs/unreleased/emilyring-clustertoken-name.yml b/changelogs/unreleased/emilyring-clustertoken-name.yml new file mode 100644 index 00000000000..887a88b3b29 --- /dev/null +++ b/changelogs/unreleased/emilyring-clustertoken-name.yml @@ -0,0 +1,5 @@ +--- +title: Add name field to cluster agent token +merge_request: 53920 +author: +type: changed diff --git a/db/migrate/20210224133337_add_name_field_to_cluster_agent_token.rb b/db/migrate/20210224133337_add_name_field_to_cluster_agent_token.rb new file mode 100644 index 00000000000..2cec37f8477 --- /dev/null +++ b/db/migrate/20210224133337_add_name_field_to_cluster_agent_token.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class AddNameFieldToClusterAgentToken < ActiveRecord::Migration[6.0] + DOWNTIME = false + + # rubocop:disable Migration/AddLimitToTextColumns + # limit is added in LimitClusterTokenSize + def change + add_column :cluster_agent_tokens, :name, :text + end + # rubocop:enable Migration/AddLimitToTextColumns +end diff --git a/db/migrate/20210225135533_limit_cluster_token_size.rb b/db/migrate/20210225135533_limit_cluster_token_size.rb new file mode 100644 index 00000000000..6a1b6b7b4e8 --- /dev/null +++ b/db/migrate/20210225135533_limit_cluster_token_size.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class LimitClusterTokenSize < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_text_limit :cluster_agent_tokens, :name, 255 + end + + def down + remove_text_limit :cluster_agent_tokens, :name + end +end diff --git a/db/schema_migrations/20210224133337 b/db/schema_migrations/20210224133337 new file mode 100644 index 00000000000..d5dafb9fb56 --- /dev/null +++ b/db/schema_migrations/20210224133337 @@ -0,0 +1 @@ +964e9f88018b2ab72fd370f6a8dccde218cfd4ffa3ccedf4f142ab341f5e858f \ No newline at end of file diff --git a/db/schema_migrations/20210225135533 b/db/schema_migrations/20210225135533 new file mode 100644 index 00000000000..e7c24096aac --- /dev/null +++ b/db/schema_migrations/20210225135533 @@ -0,0 +1 @@ +526174bd42327e0212b15ffbad99541887de1dec35cc4c592d4f02065026b3ca \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 2f2c8cd588d..38f79b4810f 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -11029,6 +11029,8 @@ CREATE TABLE cluster_agent_tokens ( token_encrypted text NOT NULL, created_by_user_id bigint, description text, + name text, + CONSTRAINT check_2b79dbb315 CHECK ((char_length(name) <= 255)), CONSTRAINT check_4e4ec5070a CHECK ((char_length(description) <= 1024)), CONSTRAINT check_c60daed227 CHECK ((char_length(token_encrypted) <= 255)) ); diff --git a/doc/administration/compliance.md b/doc/administration/compliance.md index 721b0dbb957..04369a76fb3 100644 --- a/doc/administration/compliance.md +++ b/doc/administration/compliance.md @@ -20,7 +20,7 @@ relevant compliance standards. |**[Enforce TOS acceptance](../user/admin_area/settings/terms.md)**
Enforce your users accepting new terms of service by blocking GitLab traffic.|Free+||Instance| |**[Email all users of a project, group, or entire server](../tools/email.md)**
An administrator can email groups of users based on project or group membership, or email everyone using the GitLab instance. This is great for scheduled maintenance or upgrades.|Premium+||Instance| |**[Omnibus package supports log forwarding](https://docs.gitlab.com/omnibus/settings/logs.html#udp-log-forwarding)**
Forward your logs to a central system.|Premium+||Instance| -|**[Lock project membership to group](../user/group/index.md#member-lock)**
Group owners can prevent new members from being added to projects within a group.|Premium+|✓|Group| +|**[Lock project membership to group](../user/group/index.md#prevent-members-from-being-added-to-a-group)**
Group owners can prevent new members from being added to projects within a group.|Premium+|✓|Group| |**[LDAP group sync](auth/ldap/index.md#group-sync)**
GitLab Enterprise Edition gives administrators the ability to automatically sync groups and manage SSH keys, permissions, and authentication, so you can focus on building your product, not configuring your tools.|Premium+||Instance| |**[LDAP group sync filters](auth/ldap/index.md#group-sync)**
GitLab Enterprise Edition Premium gives more flexibility to synchronize with LDAP based on filters, meaning you can leverage LDAP attributes to map GitLab permissions.|Premium+||Instance| |**[Audit events](audit_events.md)**
To maintain the integrity of your code, GitLab Enterprise Edition Premium gives administrators the ability to view any modifications made within the GitLab server in an advanced audit events system, so you can control, analyze, and track every change.|Premium+|✓|Instance, Group, Project| diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md index 63bb969afce..c3cefb8ed96 100644 --- a/doc/administration/packages/container_registry.md +++ b/doc/administration/packages/container_registry.md @@ -1144,7 +1144,7 @@ project or branch name. Special characters can include: - Trailing hyphen/dash - Double hyphen/dash -To get around this, you can [change the group path](../../user/group/index.md#changing-a-groups-path), +To get around this, you can [change the group path](../../user/group/index.md#change-a-groups-path), [change the project path](../../user/project/settings/index.md#renaming-a-repository) or change the branch name. Another option is to create a [push rule](../../push_rules/push_rules.md) to prevent this at the instance level. diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 0d9984abadc..059c2985d8b 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -865,6 +865,7 @@ Autogenerated return type of ClusterAgentDelete. | `createdByUser` | User | The user who created the token. | | `description` | String | Description of the token. | | `id` | ClustersAgentTokenID! | Global ID of the token. | +| `name` | String | Name given to the token. | ### ClusterAgentTokenCreatePayload @@ -1244,6 +1245,7 @@ Represents a DAST Profile. | Field | Type | Description | | ----- | ---- | ----------- | +| `branch` | DastProfileBranch | The associated branch. Will always return `null` if `dast_branch_selection` feature flag is disabled. | | `dastScannerProfile` | DastScannerProfile | The associated scanner profile. | | `dastSiteProfile` | DastSiteProfile | The associated site profile. | | `description` | String | The description of the scan. | @@ -1251,6 +1253,15 @@ Represents a DAST Profile. | `id` | DastProfileID! | ID of the profile. | | `name` | String | The name of the profile. | +### DastProfileBranch + +Represents a DAST Profile Branch. + +| Field | Type | Description | +| ----- | ---- | ----------- | +| `exists` | Boolean | Indicates whether or not the branch exists. | +| `name` | String | The name of the branch. | + ### DastProfileCreatePayload Autogenerated return type of DastProfileCreate. diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md index b3647131ec8..60fdd34ebc0 100644 --- a/doc/api/merge_requests.md +++ b/doc/api/merge_requests.md @@ -44,7 +44,10 @@ is fetched from its project, `relative` format would be the same as `short` form diffs associated with the set of changes have the same size limitations applied as other diffs returned by the API or viewed via the UI. When these limits impact the results, the `overflow` field contains a value of `true`. Diff data without these limits applied can be retrieved by -adding the `access_raw_diffs` parameter, but it is slower and more resource-intensive. +adding the `access_raw_diffs` parameter, accessing diffs not from the database but from Gitaly directly. +This approach is generally slower and more resource-intensive, but isn't subject to size limits +placed on database-backed diffs. [Limits inherent to Gitaly](../development/diffs.md#diff-limits) +still apply. ## List merge requests @@ -846,7 +849,7 @@ Parameters: |----------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------| | `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. | | `merge_request_iid` | integer | yes | The internal ID of the merge request. | -| `access_raw_diffs` | boolean | no | Retrieve change diffs without size limitations. | +| `access_raw_diffs` | boolean | no | Retrieve change diffs via Gitaly. | ```json { diff --git a/doc/api/releases/index.md b/doc/api/releases/index.md index be9512ed0e0..67e441ee7e4 100644 --- a/doc/api/releases/index.md +++ b/doc/api/releases/index.md @@ -350,7 +350,7 @@ Example response: ## Create a release -Create a Release. You need push access to the repository to create a Release. +Create a release. Developer level access to the project is required to create a release. ```plaintext POST /projects/:id/releases @@ -524,7 +524,7 @@ Example response: ## Update a release -Update a Release. +Update a release. Developer level access to the project is required to update a release. ```plaintext PUT /projects/:id/releases/:tag_name @@ -631,7 +631,7 @@ Example response: ## Delete a Release -Delete a Release. Deleting a Release doesn't delete the associated tag. +Delete a release. Deleting a release doesn't delete the associated tag. Maintainer level access to the project is required to delete a release. ```plaintext DELETE /projects/:id/releases/:tag_name diff --git a/doc/development/contributing/style_guides.md b/doc/development/contributing/style_guides.md index aad24663118..444a067a780 100644 --- a/doc/development/contributing/style_guides.md +++ b/doc/development/contributing/style_guides.md @@ -56,7 +56,7 @@ The current Lefthook configuration can be found in [`lefthook.yml`](https://gitl Before you push your changes, Lefthook automatically runs the following checks: - Danger: Runs a subset of checks that `danger-review` runs on your merge requests. -- ES lint: Run `yarn run internal:eslint` checks (with the [`.eslintrc.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.eslintrc.yml) configuration) on the modified `*.{js,vue}` files. Tags: `frontend`, `style`. +- ES lint: Run `yarn run lint:eslint` checks (with the [`.eslintrc.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.eslintrc.yml) configuration) on the modified `*.{js,vue}` files. Tags: `frontend`, `style`. - HAML lint: Run `bundle exec haml-lint` checks (with the [`.haml-lint.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.haml-lint.yml) configuration) on the modified `*.html.haml` files. Tags: `view`, `haml`, `style`. - Markdown lint: Run `yarn markdownlint` checks on the modified `*.md` files. Tags: `documentation`, `style`. - SCSS lint: Run `yarn lint:stylelint` checks (with the [`.stylelintrc`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.stylelintrc) configuration) on the modified `*.scss{,.css}` files. Tags: `stylesheet`, `css`, `style`. diff --git a/doc/development/fe_guide/style/javascript.md b/doc/development/fe_guide/style/javascript.md index 87054f7db86..460d8f58312 100644 --- a/doc/development/fe_guide/style/javascript.md +++ b/doc/development/fe_guide/style/javascript.md @@ -14,7 +14,7 @@ In addition to the style guidelines set by Airbnb, we also have a few specific r listed below. NOTE: -You can run ESLint locally by running `yarn run lint:eslint` +You can run ESLint locally by running `yarn run lint:eslint:all` or `yarn run lint:eslint $PATH_TO_FILE`. ## Avoid forEach diff --git a/doc/development/fe_guide/tooling.md b/doc/development/fe_guide/tooling.md index c493ab9a206..1ab97d8a1f5 100644 --- a/doc/development/fe_guide/tooling.md +++ b/doc/development/fe_guide/tooling.md @@ -30,10 +30,16 @@ yarn run lint:eslint:staged:fix If manual changes are required, a list of changes are sent to the console. +To check a specific file in the repository with ESLINT, run the following script (replacing $PATH_TO_FILE): + +```shell +yarn run lint:eslint $PATH_TO_FILE +``` + To check **all** files in the repository with ESLint, run the following script: ```shell -yarn run lint:eslint +yarn run lint:eslint:all ``` A list of problems found are logged to the console. @@ -41,7 +47,7 @@ A list of problems found are logged to the console. To apply automatic ESLint fixes to **all** files in the repository, run the following script: ```shell -yarn run lint:eslint:fix +yarn run lint:eslint:all:fix ``` If manual changes are required, a list of changes are sent to the console. diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md index 5509833dc71..c765e214804 100644 --- a/doc/development/testing_guide/frontend_testing.md +++ b/doc/development/testing_guide/frontend_testing.md @@ -1168,6 +1168,95 @@ You can download any older version of Firefox from the releases FTP server, { + expect(prettifyName('Homer Simpson')).toMatchSnapshot() +}) +``` + +When this test runs the first time a fresh `.snap` file will be created. It will look something like this: + +```txt +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`makes the name look pretty`] = ` +Sir Homer Simpson the Third +` +``` + +Now, every time you call this test, the new snapshot will be evaluated against the previously created version. This should highlight the fact that it's important to understand the content of your snapshot file and treat it with care. Snapshots will lose their value if the output of the snapshot is too big or complex to read, this means keeping snapshots isolated to human-readable items that can be either evaluated in a merge request review or are guaranteed to never change. +The same can be done for `wrappers` or `elements` + +```javascript +it('renders the component correctly', () => { + expect(wrapper).toMatchSnapshot() + expect(wrapper.element).toMatchSnapshot(); +}) +``` + +The above test will create two snapshots, what's important is to decide which of the snapshots provide more value for the codebase safety i.e. if one of these snapshots changes, does that highlight a possible un-wanted break in the codebase? This can help catch unexpected changes if something in an underlying dependency changes without our knowledge. + +### Pros and Cons + +**Pros** + +- Speed up the creation of unit tests +- Easy to maintain +- Provides a good safety net to protect against accidental breakage of important HTML structures + +**Cons** + +- Is not a catch-all solution that replaces the work of integration or unit tests +- No meaningful assertions or expectations within snapshots +- When carelessly used with [GitLab UI](https://gitlab.com/gitlab-org/gitlab-ui) it can create fragility in tests when the underlying library changes the HTML of a component we are testing + +A good guideline to follow: the more complex the component you may want to steer away from just snapshot testing. But that's not to say you can't still snapshot test and test your component as normal. + +### When to use + +**Use snapshots when** + +- to capture a components rendered output +- to fully or partially match templates +- to match readable data structures +- to verify correctly composed native HTML elements +- as a safety net for critical structures so others don't break it by accident +- Template heavy component +- Not a lot of logic in the component +- Composed of native HTML elements + +### When not to use + +**Don't use snapshots when** + +- To capture large data structures just to have something +- To just have some kind of test written +- To capture highly volatile ui elements without stubbing them (Think of GitLab UI version updates) + --- [Return to Testing documentation](index.md) diff --git a/doc/security/two_factor_authentication.md b/doc/security/two_factor_authentication.md index 6762becec2d..ded10e2f498 100644 --- a/doc/security/two_factor_authentication.md +++ b/doc/security/two_factor_authentication.md @@ -61,7 +61,7 @@ The following are important notes about 2FA: 2FA for the project. For example, if project *P* belongs to 2FA-enabled group *A* and is shared with 2FA-disabled group *B*, members of group *B* can access project *P* without 2FA. To ensure this scenario doesn't occur, - [prevent sharing of projects](../user/group/index.md#share-with-group-lock) + [prevent sharing of projects](../user/group/index.md#prevent-a-project-from-being-shared-with-groups) for the 2FA-enabled group. - If you add additional members to a project within a group or subgroup that has 2FA enabled, 2FA is **not** required for those individually added members. diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md index a43bb4498de..7c80c7c336b 100644 --- a/doc/subscriptions/bronze_starter.md +++ b/doc/subscriptions/bronze_starter.md @@ -26,7 +26,7 @@ the tiers are no longer mentioned in GitLab documentation: - [Creating group memberships via CN](../user/group/index.md#creating-group-links-via-cn) - [Group push rules](../user/group/index.md#group-push-rules) - [Managing group memberships via LDAP](../user/group/index.md#manage-group-memberships-via-ldap) - - [Member locking](../user/group/index.md#member-lock) + - [Member locking](../user/group/index.md#prevent-members-from-being-added-to-a-group) - [Overriding user permissions](../user/group/index.md#overriding-user-permissions) - [User contribution analysis](../user/group/index.md#user-contribution-analysis) - [Kerberos integration](../integration/kerberos.md) diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md index 761fc6477d6..f14241bb663 100644 --- a/doc/user/admin_area/settings/continuous_integration.md +++ b/doc/user/admin_area/settings/continuous_integration.md @@ -50,13 +50,13 @@ To change it at the: 1. Change the value of maximum artifacts size (in MB). 1. Click **Save changes** for the changes to take effect. -- [Group level](../../group/index.md#group-settings) (this will override the instance setting): +- Group level (this will override the instance setting): 1. Go to the group's **Settings > CI / CD > General Pipelines**. 1. Change the value of **maximum artifacts size (in MB)**. 1. Click **Save changes** for the changes to take effect. -- [Project level](../../../ci/pipelines/settings.md) (this will override the instance and group settings): +- Project level (this will override the instance and group settings): 1. Go to the project's **Settings > CI / CD > General Pipelines**. 1. Change the value of **maximum artifacts size (in MB)**. diff --git a/doc/user/clusters/agent/index.md b/doc/user/clusters/agent/index.md index 0f30d09829a..619fc4fb090 100644 --- a/doc/user/clusters/agent/index.md +++ b/doc/user/clusters/agent/index.md @@ -205,7 +205,13 @@ the Agent in subsequent steps. You can create an Agent record either: } mutation createToken { - clusterAgentTokenCreate(input: { clusterAgentId: }) { + clusterAgentTokenCreate( + input: { + clusterAgentId: "" + description: "" + name: "" + } + ) { secret # This is the value you need to use on the next step token { createdAt @@ -459,7 +465,7 @@ There are several components that work in concert for the Agent to generate the - One or more network policies through any of these options: - Use the [Container Network Policy editor](../../application_security/threat_monitoring/index.md#container-network-policy-editor) to create and manage policies. - Use an [AutoDevOps](../../application_security/threat_monitoring/index.md#container-network-policy-management) configuration. - - Add the required labels and annotations to existing network policies. + - Add the required labels and annotations to existing network policies. - Use a configuration repository to inform the Agent through a `config.yaml` file, which repositories can synchronize with. This repository might be the same, or a separate GitLab project. diff --git a/doc/user/group/img/group_settings.png b/doc/user/group/img/group_settings.png deleted file mode 100644 index f3a75f1bde848b91ca1875998a0981e55f739c6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51335 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 NmsXall=u+ze*s+cyRZNN diff --git a/doc/user/group/index.md b/doc/user/group/index.md index 6fb98c02902..e0361f6033c 100644 --- a/doc/user/group/index.md +++ b/doc/user/group/index.md @@ -293,7 +293,7 @@ Learn how to [transfer a project into a group](../project/settings/index.md#tran You can [share your projects with a group](../project/members/share_project_with_groups.md) and give all group members access to the project at once. -Alternatively, you can [lock the sharing with group feature](#share-with-group-lock). +Alternatively, you can [lock the sharing with group feature](#prevent-a-project-from-being-shared-with-groups). ## Sharing a group with another group @@ -418,9 +418,9 @@ to explore data such as: [Learn more about Insights](insights/index.md). -## Transferring groups +## Transfer a group -From GitLab 10.5, you can transfer groups in the following ways: +You can transfer groups in the following ways: - Transfer a subgroup to a new parent group. - Convert a top-level group into a subgroup by transferring it to the desired group. @@ -435,20 +435,7 @@ When transferring groups, note: - Only explicit group membership is transferred, not inherited membership. If the group's owners have only inherited membership, this leaves the group without an owner. In this case, the user transferring the group becomes the group's owner. - Transfers will fail if [packages](../packages/index.md) exist in any of the projects within the group, or in any of its subgroups. -## Group settings - -After creating a group, you can manage its settings by navigating to -the group's dashboard, and clicking **Settings**. - -![group settings](img/group_settings.png) - -### General settings - -In addition to editing any settings you previously -set when [creating the group](#create-a-group), you can also -access further configurations for your group. - -#### Changing a group's path +## Change a group's path Changing a group's path (group URL) can have unintended side effects. Read [how redirects will behave](../project/repository/index.md#redirects-when-changing-repository-paths) @@ -475,11 +462,7 @@ If you want to retain ownership over the original namespace and protect the URL redirects, then instead of changing a group's path or renaming a username, you can create a new group and transfer projects to it. -### Group repository settings - -You can change settings that are specific to repositories in your group. - -#### Custom initial branch name +## Use a custom name for the initial branch > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43290) in GitLab 13.6. @@ -492,7 +475,7 @@ else. This way, every new project created under that group from then on will sta 1. Change the default initial branch to a custom name of your choice. 1. **Save Changes**. -### Remove a group +## Remove a group To remove a group and its contents: @@ -509,7 +492,7 @@ This action either: Since [GitLab 13.6](https://gitlab.com/gitlab-org/gitlab/-/issues/39504), if the user who sets up the deletion leaves or is otherwise removed from the group before the actual deletion happens, the job is cancelled, and the group is no longer scheduled for deletion. -### Restore a group **(PREMIUM)** +## Restore a group **(PREMIUM)** > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33257) in GitLab 12.8. @@ -519,13 +502,13 @@ To restore a group that is marked for deletion: 1. Expand the **Path, transfer, remove** section. 1. In the Restore group section, click the **Restore group** button. -#### Enforce 2FA to group members +## Enforce two-factor authentication for group members Add a security layer to your group by [enforcing two-factor authentication (2FA)](../../security/two_factor_authentication.md#enforcing-2fa-for-all-users-in-a-group) for all group members. -#### Share with group lock +## Prevent a project from being shared with groups Prevent projects in a group from [sharing a project with another group](../project/members/share_project_with_groups.md) to enable tighter control over project access. @@ -540,7 +523,7 @@ To enable this feature, navigate to the group settings page. Select ![Checkbox for share with group lock](img/share_with_group_lock.png) -#### Member Lock **(PREMIUM)** +## Prevent members from being added to a group **(PREMIUM)** Member lock lets a group owner prevent any new project membership to all of the projects within a group, allowing tighter control over project membership. @@ -560,7 +543,7 @@ This will disable the option for all users who previously had permissions to operate project memberships, so no new users can be added. Furthermore, any request to add a new user to a project through API will not be possible. -#### IP access restriction **(PREMIUM)** +## Restrict group access by IP address **(PREMIUM)** > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1985) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0. > - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/215410) to [GitLab Premium](https://about.gitlab.com/pricing/) in 13.1. @@ -598,7 +581,7 @@ To enable this feature: ![Domain restriction by IP address](img/restrict-by-ip.gif) -#### Allowed domain restriction **(PREMIUM)** +## Restrict group access by domain **(PREMIUM)** >- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7297) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.2. >- Support for specifying multiple email domains [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33143) in GitLab 13.1 @@ -633,7 +616,7 @@ This will enable the domain-checking for all new users added to the group from t NOTE: Domain restrictions only apply to groups and do not prevent users from being added as members of projects owned by the restricted group. -#### Group file templates **(PREMIUM)** +## Group file templates **(PREMIUM)** Group file templates allow you to share a set of templates for common file types with every project in a group. It is analogous to the @@ -660,12 +643,12 @@ To enable this feature, navigate to the group settings page, expand the To learn how to create templates for issues and merge requests, visit [Description templates](../project/description_templates.md). -#### Group-level project templates **(PREMIUM)** +### Group-level project templates **(PREMIUM)** Define project templates at a group level by setting a group as the template source. [Learn more about group-level project templates](custom_project_templates.md). -#### Disabling email notifications +## Disabling email notifications > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23585) in GitLab 12.2. @@ -677,7 +660,7 @@ To enable this feature: 1. Expand the **Permissions, LFS, 2FA** section, and select **Disable email notifications**. 1. Click **Save changes**. -#### Disabling group mentions +## Disabling group mentions > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21301) in GitLab 12.6. @@ -694,7 +677,7 @@ To enable this feature: 1. Expand the **Permissions, LFS, 2FA** section, and select **Disable group mentions**. 1. Click **Save changes**. -#### Enabling delayed project removal **(PREMIUM)** +## Enabling delayed project removal **(PREMIUM)** > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) in GitLab 13.2. @@ -714,7 +697,7 @@ To enable delayed deletion of projects: NOTE: The group setting for delayed deletion is not inherited by subgroups and has to be individually defined for each group. -#### Prevent project forking outside group **(PREMIUM)** +## Prevent project forking outside group **(PREMIUM)** > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216987) in GitLab 13.3. @@ -731,7 +714,7 @@ To enable prevent project forking: 1. Expand the **Permissions, LFS, 2FA** section, and check **Prevent project forking outside current group**. 1. Click **Save changes**. -### Advanced settings +## Advanced settings - **Projects**: View all projects within that group, add members to each project, access each project's settings, and remove any project, all from the same screen. @@ -742,7 +725,7 @@ To enable prevent project forking: - **Pipelines quota**: Keep track of the [pipeline quota](../admin_area/settings/continuous_integration.md) for the group. - **Integrations**: Configure [integrations](../admin_area/settings/project_integration_management.md) for your group. -#### Group push rules **(PREMIUM)** +## Group push rules **(PREMIUM)** > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34370) in [GitLab Starter](https://about.gitlab.com/pricing/) 12.8. > - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/224129) in GitLab 13.4. @@ -758,7 +741,7 @@ When set, new subgroups have push rules set for them based on either: - The closest parent group with push rules defined. - Push rules set at the instance level, if no parent groups have push rules defined. -### Maximum artifacts size **(FREE SELF)** +## Maximum artifacts size **(FREE SELF)** For information about setting a maximum artifact size for a group, see [Maximum artifacts size](../admin_area/settings/continuous_integration.md#maximum-artifacts-size). diff --git a/doc/user/packages/container_registry/index.md b/doc/user/packages/container_registry/index.md index e3a469c4b6c..ffe2f12e9d8 100644 --- a/doc/user/packages/container_registry/index.md +++ b/doc/user/packages/container_registry/index.md @@ -699,7 +699,7 @@ project or branch name. Special characters can include: - Leading underscore - Trailing hyphen/dash -To get around this, you can [change the group path](../../group/index.md#changing-a-groups-path), +To get around this, you can [change the group path](../../group/index.md#change-a-groups-path), [change the project path](../../project/settings/index.md#renaming-a-repository) or change the branch name. diff --git a/doc/user/permissions.md b/doc/user/permissions.md index 6a05d355fcc..699ba645e87 100644 --- a/doc/user/permissions.md +++ b/doc/user/permissions.md @@ -104,7 +104,8 @@ The following table depicts the various user permission levels in a project. | Publish [packages](packages/index.md) | | | ✓ | ✓ | ✓ | | Create/edit/delete a Cleanup policy | | | ✓ | ✓ | ✓ | | Upload [Design Management](project/issues/design_management.md) files | | | ✓ | ✓ | ✓ | -| Create/edit/delete [Releases](project/releases/index.md)| | | ✓ | ✓ | ✓ | +| Create/edit [releases](project/releases/index.md)| | | ✓ | ✓ | ✓ | +| Delete [releases](project/releases/index.md)| | | | ✓ | ✓ | | Create new branches | | | ✓ | ✓ | ✓ | | Push to non-protected branches | | | ✓ | ✓ | ✓ | | Force push to non-protected branches | | | ✓ | ✓ | ✓ | @@ -195,7 +196,7 @@ The following table depicts the various user permission levels in a project. 1. If the [branch is protected](project/protected_branches.md#using-the-allowed-to-merge-and-allowed-to-push-settings), this depends on the access Developers and Maintainers are given. 1. Guest users can access GitLab [**Releases**](project/releases/index.md) for downloading assets but are not allowed to download the source code nor see repository information like tags and commits. 1. Actions are limited only to records owned (referenced) by user. -1. When [Share Group Lock](group/index.md#share-with-group-lock) is enabled the project can't be shared with other groups. It does not affect group with group sharing. +1. When [Share Group Lock](group/index.md#prevent-a-project-from-being-shared-with-groups) is enabled the project can't be shared with other groups. It does not affect group with group sharing. 1. For information on eligible approvers for merge requests, see [Eligible approvers](project/merge_requests/merge_request_approvals.md#eligible-approvers). 1. Owner permission is only available at the group or personal namespace level (and for instance admins) and is inherited by its projects. diff --git a/doc/user/project/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md index 92e8c67c01c..bf289c9707c 100644 --- a/doc/user/project/integrations/webhooks.md +++ b/doc/user/project/integrations/webhooks.md @@ -1566,7 +1566,7 @@ X-Gitlab-Event: Subgroup Hook ``` NOTE: -Webhooks for when a [subgroup is removed from a group](#subgroup-removed-from-a-group) are not triggered when a [subgroup is transferred to a new parent group](../../group/index.md#transferring-groups) +Webhooks for when a [subgroup is removed from a group](#subgroup-removed-from-a-group) are not triggered when a [subgroup is transferred to a new parent group](../../group/index.md#transfer-a-group) ### Feature Flag events diff --git a/doc/user/project/members/share_project_with_groups.md b/doc/user/project/members/share_project_with_groups.md index 7000988d9bf..8ca403783cb 100644 --- a/doc/user/project/members/share_project_with_groups.md +++ b/doc/user/project/members/share_project_with_groups.md @@ -62,4 +62,4 @@ It is possible to prevent projects in a group from [sharing a project with another group](../members/share_project_with_groups.md). This allows for tighter control over project access. -Learn more about [Share with group lock](../../group/index.md#share-with-group-lock). +Learn more about [Share with group lock](../../group/index.md#prevent-a-project-from-being-shared-with-groups). diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md index 5a915ebef89..d330e4d2d94 100644 --- a/doc/user/project/repository/index.md +++ b/doc/user/project/repository/index.md @@ -298,7 +298,7 @@ and Git push/pull redirects. Depending on the situation, different things apply. When [renaming a user](../../profile/index.md#changing-your-username), -[changing a group path](../../group/index.md#changing-a-groups-path) or [renaming a repository](../settings/index.md#renaming-a-repository): +[changing a group path](../../group/index.md#change-a-groups-path) or [renaming a repository](../settings/index.md#renaming-a-repository): - Existing web URLs for the namespace and anything under it (such as projects) will redirect to the new URLs. diff --git a/lefthook.yml b/lefthook.yml index f6e3fb68b0e..8791cf61231 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -7,7 +7,7 @@ pre-push: tags: frontend style files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD glob: "*.{js,vue}" - run: yarn run internal:eslint {files} + run: yarn run lint:eslint {files} haml-lint: tags: view haml style files: git diff --name-only $(git merge-base origin/master HEAD)..HEAD diff --git a/lib/tasks/eslint.rake b/lib/tasks/eslint.rake index 35c3e834258..529f17d4d27 100644 --- a/lib/tasks/eslint.rake +++ b/lib/tasks/eslint.rake @@ -3,7 +3,7 @@ unless Rails.env.production? desc "GitLab | Run ESLint" task eslint: ['yarn:check'] do - unless system('yarn run lint:eslint') + unless system('yarn run lint:eslint:all') abort('rake eslint failed') end end diff --git a/package.json b/package.json index 7814aa04964..1860e87b070 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "block-dependencies": "node scripts/frontend/block_dependencies.js", "clean": "rm -rf public/assets tmp/cache/*-loader", "dev-server": "NODE_OPTIONS=\"--max-old-space-size=3584\" node scripts/frontend/webpack_dev_server.js", - "eslint-fix": "echo 'Please use `yarn lint:eslint:fix` instead' && exit 1", + "eslint-fix": "echo 'Please use `yarn lint:eslint:all:fix` instead' && exit 1", "eslint-staged": "echo 'Please use `yarn lint:eslint:staged` instead' && exit 1", "eslint-staged-fix": "echo 'Please use `yarn lint:eslint:staged:fix` instead' && exit 1", "eslint-report": "echo 'Please use `yarn lint:eslint:report` instead' && exit 1", @@ -21,8 +21,10 @@ "karma": "BABEL_ENV=${BABEL_ENV:=karma} karma start --single-run true config/karma.config.js", "karma-coverage": "BABEL_ENV=coverage karma start --single-run true config/karma.config.js", "karma-start": "BABEL_ENV=karma karma start config/karma.config.js", - "lint:eslint": "yarn run internal:eslint .", - "lint:eslint:fix": "yarn run lint:eslint --fix", + "lint:eslint": "yarn run internal:eslint", + "lint:eslint:fix": "yarn run internal:eslint --fix", + "lint:eslint:all": "yarn run internal:eslint .", + "lint:eslint:all:fix": "yarn run lint:eslint:all --fix", "lint:eslint:report": "yarn run internal:eslint --format html --output-file ./eslint-report.html --no-inline-config .", "lint:eslint:staged": "scripts/frontend/execute-on-staged-files.sh internal:eslint '(js|vue)'", "lint:eslint:staged:fix": "yarn run lint:eslint:staged --fix", diff --git a/qa/qa/resource/clusters/agent_token.rb b/qa/qa/resource/clusters/agent_token.rb index 6a5e861b650..3286f46cdb2 100644 --- a/qa/qa/resource/clusters/agent_token.rb +++ b/qa/qa/resource/clusters/agent_token.rb @@ -32,7 +32,7 @@ module QA def api_post_body <<~GQL mutation createToken { - clusterAgentTokenCreate(input: { clusterAgentId: "gid://gitlab/Clusters::Agent/#{agent.id}" }) { + clusterAgentTokenCreate(input: { clusterAgentId: "gid://gitlab/Clusters::Agent/#{agent.id}" name: "token-#{agent.id}" }) { secret # This is the value you need to use on the next step token { createdAt diff --git a/qa/qa/specs/features/browser_ui/non_devops/performance_bar_spec.rb b/qa/qa/specs/features/browser_ui/non_devops/performance_bar_spec.rb index a0f613cfda2..302fec55c53 100644 --- a/qa/qa/specs/features/browser_ui/non_devops/performance_bar_spec.rb +++ b/qa/qa/specs/features/browser_ui/non_devops/performance_bar_spec.rb @@ -20,7 +20,7 @@ module QA end end - it 'shows results for the original request and AJAX requests', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/478' do + it 'shows results for the original request and AJAX requests', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/478', quarantine: { only: { pipeline: :master }, issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/323051', type: :bug } do # Issue pages always make AJAX requests Resource::Issue.fabricate_via_browser_ui! do |issue| issue.title = 'Performance bar test' diff --git a/scripts/static-analysis b/scripts/static-analysis index f0134b3df18..2442455e630 100755 --- a/scripts/static-analysis +++ b/scripts/static-analysis @@ -25,7 +25,7 @@ class StaticAnalysis # Most of the time, RuboCop finishes in 30 seconds, but sometimes it can take around 1200 seconds so we set a # duration of 300 to lower the likelihood that it will run in the same job as another long task... %w[bundle exec rubocop --parallel] => 300, - %w[yarn run lint:eslint] => 197, + %w[yarn run lint:eslint:all] => 197, %w[yarn run lint:prettier] => 124, %w[bin/rake gettext:lint] => 96, %w[bundle exec license_finder] => 49, diff --git a/spec/factories/clusters/agent_tokens.rb b/spec/factories/clusters/agent_tokens.rb index 6f92f2217b3..c49d197c3cd 100644 --- a/spec/factories/clusters/agent_tokens.rb +++ b/spec/factories/clusters/agent_tokens.rb @@ -5,5 +5,7 @@ FactoryBot.define do association :agent, factory: :cluster_agent token_encrypted { Gitlab::CryptoHelper.aes256_gcm_encrypt(SecureRandom.hex(50)) } + + sequence(:name) { |n| "agent-token-#{n}" } end end diff --git a/spec/models/clusters/agent_token_spec.rb b/spec/models/clusters/agent_token_spec.rb index 8107b5b1388..a1b45df1970 100644 --- a/spec/models/clusters/agent_token_spec.rb +++ b/spec/models/clusters/agent_token_spec.rb @@ -6,6 +6,8 @@ RSpec.describe Clusters::AgentToken do it { is_expected.to belong_to(:agent).class_name('Clusters::Agent').required } it { is_expected.to belong_to(:created_by_user).class_name('User').optional } it { is_expected.to validate_length_of(:description).is_at_most(1024) } + it { is_expected.to validate_length_of(:name).is_at_most(255) } + it { is_expected.to validate_presence_of(:name) } describe '#token' do it 'is generated on save' do