Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2022-12-13 06:07:20 +00:00
parent b4558e74da
commit 99bb3eedd0
34 changed files with 349 additions and 184 deletions

View File

@ -7,13 +7,13 @@ export const BRANCH_FILTER_REGEX = 'regex';
export const WILDCARD_CODE_STABLE = '*-stable';
export const WILDCARD_CODE_PRODUCTION = 'production/*';
export const REGEX_CODE = '(feature|hotfix)/*';
export const REGEX_CODE = '^(feature|hotfix)/';
export const descriptionText = {
[BRANCH_FILTER_WILDCARD]: s__(
'Webhooks|Wildcards such as %{WILDCARD_CODE_STABLE} or %{WILDCARD_CODE_PRODUCTION} are supported.',
),
[BRANCH_FILTER_REGEX]: s__('Webhooks|Regex such as %{REGEX_CODE} is supported.'),
[BRANCH_FILTER_REGEX]: s__('Webhooks|Regular expressions such as %{REGEX_CODE} are supported.'),
};
export const MASK_ITEM_VALUE_HIDDEN = '************';

View File

@ -48,9 +48,9 @@ class Environment < ApplicationRecord
has_one :latest_opened_most_severe_alert, -> { order_severity_with_open_prometheus_alert }, class_name: 'AlertManagement::Alert', inverse_of: :environment
before_validation :generate_slug, if: ->(env) { env.slug.blank? }
before_validation :ensure_environment_tier
before_save :set_environment_type
before_save :ensure_environment_tier
after_save :clear_reactive_cache!
validates :name,
@ -71,6 +71,10 @@ class Environment < ApplicationRecord
length: { maximum: 255 },
allow_nil: true
# Currently, the tier presence is validaed for newly created environments.
# After the `BackfillEnvironmentTiers` background migration has been completed, we should remove `on: :create`.
# See https://gitlab.com/gitlab-org/gitlab/-/issues/385253.
validates :tier, presence: true, on: :create
validate :safe_external_url
validate :merge_request_not_changed

View File

@ -1,8 +0,0 @@
---
name: list_refs_for_find_all_tags_branches
introduced_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/102002"
rollout_issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/383617"
milestone: '15.7'
type: development
group: group::gitaly
default_enabled: false

View File

@ -2,7 +2,7 @@
announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
announcement_date: "2021-11-22"
removal_milestone: "16.0" # the milestone when this feature is planned to be removed
removal_date: "2023-04-22" # the date of the milestone release when this feature is planned to be removed
removal_date: "2023-05-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
The GitLab Runner GraphQL API endpoints will not return `paused` or `active` as a status in GitLab 16.0.

View File

@ -2,7 +2,7 @@
announcement_milestone: "14.8"
announcement_date: "2022-02-22"
removal_milestone: "16.0"
removal_date: "2023-04-22"
removal_date: "2023-05-22"
breaking_change: true
reporter: dhershkovitch
body: |

View File

@ -2,7 +2,7 @@
announcement_milestone: "14.8"
announcement_date: "2022-02-22"
removal_milestone: "16.0"
removal_date: "2023-04-22"
removal_date: "2023-05-22"
breaking_change: true
reporter: pedropombeiro
body: |

View File

@ -2,7 +2,7 @@
announcement_milestone: "14.8" # The milestone when this feature was first announced as deprecated.
announcement_date: "2022-02-22"
removal_milestone: "16.0"
removal_date: "2023-04-22"
removal_date: "2023-05-22"
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
The GitLab Runner GraphQL endpoints will stop accepting `paused` or `active` as a status value in GitLab 16.0.

View File

@ -2,7 +2,7 @@
announcement_milestone: "15.7" # (required) The milestone when this feature was first announced as deprecated.
announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
removal_date: "2022-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
reporter: derekferguson # (required) GitLab username of the person reporting the deprecation
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth

View File

@ -0,0 +1,21 @@
# frozen_string_literal: true
class ScheduleBackfillEnvironmentTier < Gitlab::Database::Migration[2.0]
MIGRATION = 'BackfillEnvironmentTiers'
DELAY_INTERVAL = 2.minutes
restrict_gitlab_migration gitlab_schema: :gitlab_main
def up
queue_batched_background_migration(
MIGRATION,
:environments,
:id,
job_interval: DELAY_INTERVAL
)
end
def down
delete_batched_background_migration(MIGRATION, :environments, :id, [])
end
end

View File

@ -0,0 +1 @@
64c4d48759a28b2dbac035d290724ee82b8af4af2bef75e1d7e07eefe10e6d17

View File

@ -54,7 +54,7 @@ sole discretion of GitLab Inc.
### DAST API variables
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2022-05-22)
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@ -1122,7 +1122,7 @@ To align with this change, API calls to list external status checks will also re
### GraphQL API Runner will not accept `status` filter values of `active` or `paused`
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-04-22)
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@ -1302,7 +1302,7 @@ The `instanceStatisticsMeasurements` GraphQL node has been renamed to `usageTren
### REST and GraphQL API Runner usage of `active` replaced by `paused`
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-04-22)
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@ -1627,7 +1627,7 @@ The new security approvals feature is similar to vulnerability check. For exampl
### `CI_BUILD_*` predefined variables
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-04-22)
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
@ -2091,7 +2091,7 @@ Administrators who need to add runners for multiple projects can register a runn
### GraphQL API Runner status will not return `paused`
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-04-22)
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
WARNING:
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).

View File

@ -51,22 +51,22 @@ To run a DAST authenticated scan:
### Available CI/CD variables
| CI/CD variable | Type | Description |
|:-----------------------------------------------|:--------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `DAST_AUTH_COOKIES` | string | Set to a comma-separated list of cookie names to specify which cookies are used for authentication. |
| `DAST_AUTH_REPORT` | boolean | Used in combination with exporting the `gl-dast-debug-auth-report.html` artifact to aid in debugging authentication issues. |
| `DAST_AUTH_URL` <sup>1</sup> | URL | The URL of the page containing the sign-in HTML form on the target website. `DAST_USERNAME` and `DAST_PASSWORD` are submitted with the login form to create an authenticated scan. Example: `https://login.example.com`. |
| `DAST_AUTH_VERIFICATION_LOGIN_FORM` | boolean | Verifies successful authentication by checking for the absence of a login form once the login form has been submitted. |
| `DAST_AUTH_VERIFICATION_SELECTOR` | selector | Verifies successful authentication by checking for presence of a selector once the login form has been submitted. Example: `css:.user-photo`. |
| `DAST_AUTH_VERIFICATION_URL` <sup>1</sup> | URL | Verifies successful authentication by checking the URL in the browser once the login form has been submitted. Example: `"https://example.com/loggedin_page"`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207335) in GitLab 13.8. |
| `DAST_BROWSER_PATH_TO_LOGIN_FORM` <sup>1</sup> | selector | Comma-separated list of selectors that are selected prior to attempting to enter `DAST_USERNAME` and `DAST_PASSWORD` into the login form. Example: `"css:.navigation-menu,css:.login-menu-item"`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326633) in GitLab 14.1. |
| `DAST_EXCLUDE_URLS` <sup>1</sup> | URLs | The URLs to skip during the authenticated scan; comma-separated. Regular expression syntax can be used to match multiple URLs. For example, `.*` matches an arbitrary character sequence. |
| `DAST_FIRST_SUBMIT_FIELD` | string | The `id` or `name` of the element that when selected submits the username form of a multi-page login process. For example, `css:button[type='user-submit']`. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
| `DAST_PASSWORD` <sup>1</sup> | string | The password to authenticate to in the website. Example: `P@55w0rd!` |
| `DAST_PASSWORD_FIELD` | string | The selector of password field at the sign-in HTML form. Example: `id:password` |
| `DAST_SUBMIT_FIELD` | string | The `id` or `name` of the element that when selected submits the login form or the password form of a multi-page login process. For example, `css:button[type='submit']`. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
| `DAST_USERNAME` <sup>1</sup> | string | The username to authenticate to in the website. Example: `admin` |
| `DAST_USERNAME_FIELD` <sup>1</sup> | string | The selector of username field at the sign-in HTML form. Example: `name:username` |
| CI/CD variable | Type | Description |
|:-----------------------------------------------|:------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `DAST_AUTH_COOKIES` | string | Set to a comma-separated list of cookie names to specify which cookies are used for authentication. |
| `DAST_AUTH_REPORT` | boolean | Used in combination with exporting the `gl-dast-debug-auth-report.html` artifact to aid in debugging authentication issues. |
| `DAST_AUTH_URL` <sup>1</sup> | URL | The URL of the page containing the sign-in HTML form on the target website. `DAST_USERNAME` and `DAST_PASSWORD` are submitted with the login form to create an authenticated scan. Example: `https://login.example.com`. |
| `DAST_AUTH_VERIFICATION_LOGIN_FORM` | boolean | Verifies successful authentication by checking for the absence of a login form once the login form has been submitted. |
| `DAST_AUTH_VERIFICATION_SELECTOR` | [selector](#finding-an-elements-selector) | Verifies successful authentication by checking for presence of a selector once the login form has been submitted. Example: `css:.user-photo`. |
| `DAST_AUTH_VERIFICATION_URL` <sup>1</sup> | URL | Verifies successful authentication by checking the URL in the browser once the login form has been submitted. Example: `"https://example.com/loggedin_page"`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207335) in GitLab 13.8. |
| `DAST_BROWSER_PATH_TO_LOGIN_FORM` <sup>1</sup> | [selector](#finding-an-elements-selector) | Comma-separated list of selectors that are selected prior to attempting to enter `DAST_USERNAME` and `DAST_PASSWORD` into the login form. Example: `"css:.navigation-menu,css:.login-menu-item"`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326633) in GitLab 14.1. |
| `DAST_EXCLUDE_URLS` <sup>1</sup> | URLs | The URLs to skip during the authenticated scan; comma-separated. Regular expression syntax can be used to match multiple URLs. For example, `.*` matches an arbitrary character sequence. |
| `DAST_FIRST_SUBMIT_FIELD` | string | The `id` or `name` of the element that when selected submits the username form of a multi-page login process. For example, `css:button[type='user-submit']`. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
| `DAST_PASSWORD` <sup>1</sup> | string | The password to authenticate to in the website. Example: `P@55w0rd!` |
| `DAST_PASSWORD_FIELD` | string | The selector of password field at the sign-in HTML form. Example: `id:password` |
| `DAST_SUBMIT_FIELD` | string | The `id` or `name` of the element that when selected submits the login form or the password form of a multi-page login process. For example, `css:button[type='submit']`. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
| `DAST_USERNAME` <sup>1</sup> | string | The username to authenticate to in the website. Example: `admin` |
| `DAST_USERNAME_FIELD` <sup>1</sup> | string | The selector of username field at the sign-in HTML form. Example: `name:username` |
1. Available to an on-demand proxy-based DAST scan.
@ -188,13 +188,13 @@ dast:
Selectors are used by CI/CD variables to specify the location of an element displayed on a page in a browser.
Selectors have the format `type`:`search string`. DAST searches for the selector using the search string based on the type.
| Selector type | Example | Description |
| ------------- | ---------------------------------- | ----------- |
| `css` | `css:.password-field` | Searches for a HTML element having the supplied CSS selector. Selectors should be as specific as possible for performance reasons. |
| `id` | `id:element` | Searches for an HTML element with the provided element ID. |
| `name` | `name:element` | Searches for an HTML element with the provided element name. |
| `xpath` | `xpath://input[@id="my-button"]/a` | Searches for a HTML element with the provided XPath. Note that XPath searches are expected to be less performant than other searches. |
| None provided | `a.click-me` | Defaults to searching using a CSS selector. |
| Selector type | Example | Description |
|---------------|------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `css` | `css:.password-field` | Searches for a HTML element having the supplied CSS selector. Selectors should be as specific as possible for performance reasons. |
| `id` | `id:element` | Searches for an HTML element with the provided element ID. |
| `name` | `name:element` | Searches for an HTML element with the provided element name. |
| `xpath` | `xpath://input[@id="my-button"]/a` | Searches for a HTML element with the provided XPath. Note that XPath searches are expected to be less performant than other searches. |
| None provided | `a.click-me` | Defaults to searching using a CSS selector. **{warning}** **[Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/383348)** in GitLab 15.8. Replaced by explicitly declaring the selector type. |
#### Find selectors with Google Chrome

View File

@ -208,8 +208,8 @@ is NDJSON.
### 13.0+
Starting with GitLab 13.0, GitLab can import bundles that were exported from a different GitLab deployment.
This ability is limited to two previous GitLab [minor](../../../policy/maintenance.md#versioning)
releases, which is similar to our process for [Security Releases](../../../policy/maintenance.md#security-releases).
**This ability is limited to two previous GitLab [minor](../../../policy/maintenance.md#versioning)
releases**, which is similar to our process for [Security Releases](../../../policy/maintenance.md#security-releases).
For example:

View File

@ -0,0 +1,40 @@
# frozen_string_literal: true
module Gitlab
module BackgroundMigration
# This class backfills the `environments.tier` column by using `guess_tier` logic.
# Environments created after 13.10 already have a value, however, environments created before 13.10 don't.
# See https://gitlab.com/gitlab-org/gitlab/-/issues/300741 for more information.
class BackfillEnvironmentTiers < BatchedMigrationJob
operation_name :backfill_environment_tiers
# Equivalent to `Environment#guess_tier` pattern matching.
PRODUCTION_TIER = 0
STAGING_TIER = 1
TESTING_TIER = 2
DEVELOPMENT_TIER = 3
OTHER_TIER = 4
TIER_REGEXP_PAIR = [
{ tier: DEVELOPMENT_TIER, regexp: '(dev|review|trunk)' },
{ tier: TESTING_TIER, regexp: '(test|tst|int|ac(ce|)pt|qa|qc|control|quality)' },
{ tier: STAGING_TIER, regexp: '(st(a|)g|mod(e|)l|pre|demo|non)' },
{ tier: PRODUCTION_TIER, regexp: '(pr(o|)d|live)' }
].freeze
def perform
TIER_REGEXP_PAIR.each do |pair|
each_sub_batch(
batching_scope: ->(relation) { relation.where(tier: nil).where("name ~* '#{pair[:regexp]}'") } # rubocop:disable GitlabSecurity/SqlInjection
) do |sub_batch|
sub_batch.update_all(tier: pair[:tier])
end
end
each_sub_batch(batching_scope: ->(relation) { relation.where(tier: nil) }) do |sub_batch|
sub_batch.update_all(tier: OTHER_TIER)
end
end
end
end
end

View File

@ -116,15 +116,9 @@ module Gitlab
# Returns an Array of branch names
# sorted by name ASC
def branch_names
if Feature.enabled?(:list_refs_for_find_all_tags_branches, self)
refs = list_refs([Gitlab::Git::BRANCH_REF_PREFIX])
refs = list_refs([Gitlab::Git::BRANCH_REF_PREFIX])
refs.map { |ref| Gitlab::Git.branch_name(ref.name) }
else
wrapped_gitaly_errors do
gitaly_ref_client.branch_names
end
end
refs.map { |ref| Gitlab::Git.branch_name(ref.name) }
end
# Returns an Array of Branches
@ -215,15 +209,9 @@ module Gitlab
# Returns an Array of tag names
def tag_names
if Feature.enabled?(:list_refs_for_find_all_tags_branches, self)
refs = list_refs([Gitlab::Git::TAG_REF_PREFIX])
refs = list_refs([Gitlab::Git::TAG_REF_PREFIX])
refs.map { |ref| Gitlab::Git.tag_name(ref.name) }
else
wrapped_gitaly_errors do
gitaly_ref_client.tag_names
end
end
refs.map { |ref| Gitlab::Git.tag_name(ref.name) }
end
# Returns an Array of Tags

View File

@ -56,18 +56,6 @@ module Gitlab
Gitlab::Git.branch_name(response.name)
end
def branch_names
request = Gitaly::FindAllBranchNamesRequest.new(repository: @gitaly_repo)
response = gitaly_client_call(@storage, :ref_service, :find_all_branch_names, request, timeout: GitalyClient.fast_timeout)
consume_refs_response(response) { |name| Gitlab::Git.branch_name(name) }
end
def tag_names
request = Gitaly::FindAllTagNamesRequest.new(repository: @gitaly_repo)
response = gitaly_client_call(@storage, :ref_service, :find_all_tag_names, request, timeout: GitalyClient.fast_timeout)
consume_refs_response(response) { |name| Gitlab::Git.tag_name(name) }
end
def local_branches(sort_by: nil, pagination_params: nil)
request = Gitaly::FindLocalBranchesRequest.new(repository: @gitaly_repo, pagination_params: pagination_params)
request.sort_by = sort_local_branches_by_param(sort_by) if sort_by

View File

@ -32743,10 +32743,10 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgid "ProjectSettings|Users can only push commits to this repository if the commit author name is consistent with their GitLab account name."
msgstr ""
msgid "ProjectSettings|Users can only push commits to this repository if the committer name is consistent with their git config username."
msgid "ProjectSettings|Users can only push commits to this repository if the committer email is one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
@ -46326,10 +46326,10 @@ msgstr ""
msgid "Webhooks|Pipeline events"
msgstr ""
msgid "Webhooks|Regex such as %{REGEX_CODE} is supported."
msgid "Webhooks|Regular expression"
msgstr ""
msgid "Webhooks|Regular expression"
msgid "Webhooks|Regular expressions such as %{REGEX_CODE} are supported."
msgstr ""
msgid "Webhooks|Releases events"

View File

@ -109,6 +109,14 @@ module QA
element :file_to_commit_content
end
# Used for stablility, due to feature_caching of vscode_web_ide
def wait_until_ide_loads
Support::Waiter.wait_until(sleep_interval: 2, max_duration: 60, reload_page: page,
retry_on_exception: true) do
has_element?(:commit_mode_tab)
end
end
def has_file?(file_name)
within_element(:file_list_container) do
has_element?(:file_name_content, file_name: file_name)

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
RSpec.describe 'Create', product_group: :editor do
RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
describe 'Web IDE file templates' do
include Runtime::Fixtures
@ -11,6 +11,11 @@ module QA
project.description = 'Add file templates via the Web IDE'
project.initialize_with_readme = true
end
Runtime::Feature.disable(:vscode_web_ide, project: @project)
end
after(:all) do
Runtime::Feature.enable(:vscode_web_ide, project: @project)
end
templates = [
@ -54,6 +59,7 @@ module QA
Page::Project::Show.perform(&:open_web_ide!)
Page::Project::WebIDE::Edit.perform do |ide|
ide.wait_until_ide_loads
ide.create_new_file_from_template template[:file_name], template[:name]
expect(ide.has_file?(template[:file_name])).to be_truthy

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
RSpec.describe 'Create', product_group: :editor do
RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
describe 'Add a directory in Web IDE' do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
@ -11,11 +11,15 @@ module QA
end
before do
Runtime::Feature.disable(:vscode_web_ide, project: project)
Flow::Login.sign_in
project.visit!
end
after do
Runtime::Feature.enable(:vscode_web_ide, project: project)
end
context 'when a directory with the same name already exists' do
let(:directory_name) { 'first_directory' }
@ -38,6 +42,11 @@ module QA
it 'throws an error', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347733' do
Page::Project::WebIDE::Edit.perform do |ide|
# Support::Waiter.wait_until(sleep_interval: 2, max_duration: 60, reload_page: page,
# retry_on_exception: true) do
# expect(ide).to have_element(:commit_mode_tab)
# end
ide.wait_until_ide_loads
ide.add_directory(directory_name)
end
@ -54,6 +63,7 @@ module QA
it 'shows in the tree view but cannot be committed', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347732' do
Page::Project::WebIDE::Edit.perform do |ide|
ide.wait_until_ide_loads
ide.add_directory(directory_name)
expect(ide).to have_file(directory_name)

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
RSpec.describe 'Create', product_group: :editor do
RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
describe 'First file using Web IDE' do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
@ -13,14 +13,20 @@ module QA
let(:file_name) { 'the very first file.txt' }
before do
Runtime::Feature.disable(:vscode_web_ide, project: project)
Flow::Login.sign_in
end
after do
Runtime::Feature.enable(:vscode_web_ide, project: project)
end
it "creates the first file in an empty project via Web IDE", testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347803' do
project.visit!
Page::Project::Show.perform(&:create_first_new_file!)
Page::Project::WebIDE::Edit.perform do |ide|
ide.wait_until_ide_loads
ide.create_first_file(file_name)
ide.commit_changes
end

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
RSpec.describe 'Create', product_group: :editor do
RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
describe 'Link to line in Web IDE' do
let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) }
let(:project) do
@ -11,10 +11,12 @@ module QA
end
before do
Runtime::Feature.disable(:vscode_web_ide, project: project)
Flow::Login.sign_in
end
after do
Runtime::Feature.enable(:vscode_web_ide, project: project)
project.remove_via_api!
end
@ -25,6 +27,7 @@ module QA
Page::Project::Show.perform(&:open_web_ide_via_shortcut)
Page::Project::WebIDE::Edit.perform do |ide|
ide.wait_until_ide_loads
ide.select_file('app.js')
@link = ide.link_line('26')
end

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
RSpec.describe 'Create', product_group: :editor do
RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
describe 'Open a fork in Web IDE',
skip: {
issue: "https://gitlab.com/gitlab-org/gitlab/-/issues/351696",
@ -14,6 +14,14 @@ module QA
end
end
before do
Runtime::Feature.disable(:vscode_web_ide, project: parent_project)
end
after do
Runtime::Feature.enable(:vscode_web_ide, project: parent_project)
end
context 'when a user does not have permissions to commit to the project' do
let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) }
@ -57,6 +65,7 @@ module QA
def submit_merge_request_upstream
Page::Project::WebIDE::Edit.perform do |ide|
ide.wait_until_ide_loads
expect(ide).to have_project_path("#{user.username}/#{parent_project.name}")
ide.add_file('new file', 'some random text')

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
RSpec.describe 'Create', product_group: :editor do
RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
describe 'Open Web IDE from Diff Tab' do
files = [
{
@ -44,11 +44,15 @@ module QA
end
before do
Runtime::Feature.disable(:vscode_web_ide, project: project)
Flow::Login.sign_in
merge_request.visit!
end
after do
Runtime::Feature.enable(:vscode_web_ide, project: project)
end
it 'opens and edits a multi-file merge request in Web IDE from Diff Tab', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347724' do
Page::MergeRequest::Show.perform do |show|
show.click_diffs_tab
@ -56,6 +60,7 @@ module QA
end
Page::Project::WebIDE::Edit.perform do |ide|
ide.wait_until_ide_loads
files.each do |files|
expect(ide).to have_file(files[:file_path])
expect(ide).to have_file_content(files[:file_path], files[:content])

View File

@ -1,31 +1,44 @@
# frozen_string_literal: true
module QA
RSpec.describe 'Create', product_group: :editor do
RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
describe 'Review a merge request in Web IDE' do
let(:new_file) { 'awesome_new_file.txt' }
let(:original_text) { 'Text' }
let(:review_text) { 'Reviewed ' }
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'review-merge-request-spec-project'
project.initialize_with_readme = true
end
end
let(:merge_request) do
Resource::MergeRequest.fabricate_via_api! do |mr|
mr.file_name = new_file
mr.file_content = original_text
mr.project = project
end
end
before do
Runtime::Feature.disable(:vscode_web_ide, project: project)
Flow::Login.sign_in
merge_request.visit!
end
after do
Runtime::Feature.enable(:vscode_web_ide, project: project)
end
it 'opens and edits a merge request in Web IDE', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347786' do
Page::MergeRequest::Show.perform do |show|
show.click_open_in_web_ide
end
Page::Project::WebIDE::Edit.perform do |ide|
ide.wait_until_ide_loads
ide.has_file?(new_file)
ide.add_to_modified_content(review_text)
ide.commit_changes

View File

@ -1,7 +1,9 @@
# frozen_string_literal: true
module QA
RSpec.describe 'Create', :skip_live_env, except: { job: 'review-qa-*' }, product_group: :editor do
RSpec.describe 'Create', :skip_live_env, except: { job: 'review-qa-*' },
feature_flag: { name: 'vscode_web_ide', scope: :project },
product_group: :editor do
describe 'Git Server Hooks' do
let(:file_path) { File.absolute_path(File.join('qa', 'fixtures', 'web_ide', 'README.md')) }
@ -14,15 +16,21 @@ module QA
end
before do
Runtime::Feature.disable(:vscode_web_ide, project: project)
Flow::Login.sign_in
project.visit!
end
after do
Runtime::Feature.enable(:vscode_web_ide, project: project)
end
context 'Custom error messages' do
it 'renders preconfigured error message when user hook failed on commit in WebIDE',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/364751' do
Page::Project::Show.perform(&:open_web_ide_via_shortcut)
Page::Project::WebIDE::Edit.perform do |ide|
ide.wait_until_ide_loads
ide.upload_file(file_path)
ide.commit_changes(wait_for_success: false)
expect(ide).to have_text('Custom error message rejecting prereceive hook for projects with GL_PROJECT_PATH')

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
RSpec.describe 'Create', product_group: :editor do
RSpec.describe 'Create', feature_flag: { name: 'vscode_web_ide', scope: :project }, product_group: :editor do
describe 'Upload a file in Web IDE' do
let(:file_path) { File.absolute_path(File.join('qa', 'fixtures', 'web_ide', file_name)) }
@ -13,17 +13,23 @@ module QA
end
before do
Runtime::Feature.disable(:vscode_web_ide, project: project)
Flow::Login.sign_in
project.visit!
Page::Project::Show.perform(&:open_web_ide!)
end
after do
Runtime::Feature.enable(:vscode_web_ide, project: project)
end
context 'when a file with the same name already exists' do
let(:file_name) { 'README.md' }
it 'throws an error', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347850' do
Page::Project::WebIDE::Edit.perform do |ide|
ide.wait_until_ide_loads
ide.upload_file(file_path)
end
@ -36,6 +42,7 @@ module QA
it 'shows the Edit tab with the text', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347852' do
Page::Project::WebIDE::Edit.perform do |ide|
ide.wait_until_ide_loads
ide.upload_file(file_path)
expect(ide).to have_file(file_name)

View File

@ -10,10 +10,12 @@ module QA
issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338179',
type: :bug
},
feature_flag: { name: 'vscode_web_ide', scope: :project },
product_group: :editor
) do
describe 'Web IDE web terminal' do
before do
Runtime::Feature.disable(:vscode_web_ide, project: project)
project = Resource::Project.fabricate_via_api! do |project|
project.name = 'web-terminal-project'
end
@ -56,6 +58,7 @@ module QA
end
after do
Runtime::Feature.enable(:vscode_web_ide, project: project)
@runner.remove_via_api! if @runner
end
@ -76,6 +79,7 @@ module QA
# There are also FE specs
# * spec/frontend/ide/components/terminal/terminal_controls_spec.js
Page::Project::WebIDE::Edit.perform do |edit|
edit.wait_until_ide_loads
edit.start_web_terminal
expect(edit).to have_no_alert

View File

@ -141,7 +141,7 @@ exports[`Webhook push events form editor component Different push events rules w
class="form-text text-muted custom-control"
>
<gl-sprintf-stub
message="Regex such as %{REGEX_CODE} is supported."
message="Regular expressions such as %{REGEX_CODE} are supported."
/>
</p>
</gl-form-radio-group-stub>
@ -367,7 +367,7 @@ exports[`Webhook push events form editor component Different push events rules w
class="form-text text-muted custom-control"
>
<gl-sprintf-stub
message="Regex such as %{REGEX_CODE} is supported."
message="Regular expressions such as %{REGEX_CODE} are supported."
/>
</p>
</gl-form-radio-group-stub>

View File

@ -0,0 +1,119 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Gitlab::BackgroundMigration::BackfillEnvironmentTiers,
:migration, schema: 20221205151917, feature_category: :continuous_delivery do
let!(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
let!(:project) { table(:projects).create!(namespace_id: namespace.id, project_namespace_id: namespace.id) }
let(:migration) do
described_class.new(start_id: 1, end_id: 1000,
batch_table: :environments, batch_column: :id,
sub_batch_size: 10, pause_ms: 0,
connection: ApplicationRecord.connection)
end
describe '#perform' do
let!(:production) { table(:environments).create!(name: 'production', slug: 'production', project_id: project.id) }
let!(:staging) { table(:environments).create!(name: 'staging', slug: 'staging', project_id: project.id) }
let!(:testing) { table(:environments).create!(name: 'testing', slug: 'testing', project_id: project.id) }
let!(:development) do
table(:environments).create!(name: 'development', slug: 'development', project_id: project.id)
end
let!(:other) { table(:environments).create!(name: 'other', slug: 'other', project_id: project.id) }
it 'backfill tiers for all environments in range' do
expect(production.tier).to be_nil
expect(staging.tier).to be_nil
expect(testing.tier).to be_nil
expect(development.tier).to be_nil
expect(other.tier).to be_nil
migration.perform
expect(production.reload.tier).to eq(described_class::PRODUCTION_TIER)
expect(staging.reload.tier).to eq(described_class::STAGING_TIER)
expect(testing.reload.tier).to eq(described_class::TESTING_TIER)
expect(development.reload.tier).to eq(described_class::DEVELOPMENT_TIER)
expect(other.reload.tier).to eq(described_class::OTHER_TIER)
end
end
# Equivalent to spec/models/environment_spec.rb#guess_tier
describe 'same behavior with guess tier' do
using RSpec::Parameterized::TableSyntax
let(:environment) { table(:environments).create!(name: name, slug: name, project_id: project.id) }
where(:name, :tier) do
'review/feature' | described_class::DEVELOPMENT_TIER
'review/product' | described_class::DEVELOPMENT_TIER
'DEV' | described_class::DEVELOPMENT_TIER
'development' | described_class::DEVELOPMENT_TIER
'trunk' | described_class::DEVELOPMENT_TIER
'dev' | described_class::DEVELOPMENT_TIER
'review/app' | described_class::DEVELOPMENT_TIER
'PRODUCTION' | described_class::PRODUCTION_TIER
'prod' | described_class::PRODUCTION_TIER
'prod-east-2' | described_class::PRODUCTION_TIER
'us-prod-east' | described_class::PRODUCTION_TIER
'fe-production' | described_class::PRODUCTION_TIER
'test' | described_class::TESTING_TIER
'TEST' | described_class::TESTING_TIER
'testing' | described_class::TESTING_TIER
'testing-prd' | described_class::TESTING_TIER
'acceptance-testing' | described_class::TESTING_TIER
'production-test' | described_class::TESTING_TIER
'test-production' | described_class::TESTING_TIER
'QC' | described_class::TESTING_TIER
'qa-env-2' | described_class::TESTING_TIER
'gstg' | described_class::STAGING_TIER
'staging' | described_class::STAGING_TIER
'stage' | described_class::STAGING_TIER
'Model' | described_class::STAGING_TIER
'MODL' | described_class::STAGING_TIER
'Pre-production' | described_class::STAGING_TIER
'pre' | described_class::STAGING_TIER
'Demo' | described_class::STAGING_TIER
'staging' | described_class::STAGING_TIER
'pre-prod' | described_class::STAGING_TIER
'blue-kit-stage' | described_class::STAGING_TIER
'nonprod' | described_class::STAGING_TIER
'nonlive' | described_class::STAGING_TIER
'non-prod' | described_class::STAGING_TIER
'non-live' | described_class::STAGING_TIER
'gprd' | described_class::PRODUCTION_TIER
'gprd-cny' | described_class::PRODUCTION_TIER
'production' | described_class::PRODUCTION_TIER
'Production' | described_class::PRODUCTION_TIER
'PRODUCTION' | described_class::PRODUCTION_TIER
'Production/eu' | described_class::PRODUCTION_TIER
'production/eu' | described_class::PRODUCTION_TIER
'PRODUCTION/EU' | described_class::PRODUCTION_TIER
'productioneu' | described_class::PRODUCTION_TIER
'store-produce' | described_class::PRODUCTION_TIER
'unproductive' | described_class::PRODUCTION_TIER
'production/www.gitlab.com' | described_class::PRODUCTION_TIER
'prod' | described_class::PRODUCTION_TIER
'PROD' | described_class::PRODUCTION_TIER
'Live' | described_class::PRODUCTION_TIER
'canary' | described_class::OTHER_TIER
'other' | described_class::OTHER_TIER
'EXP' | described_class::OTHER_TIER
'something-else' | described_class::OTHER_TIER
end
with_them do
it 'backfill tiers for all environments in range' do
expect(environment.tier).to be_nil
migration.perform
expect(environment.reload.tier).to eq(tier)
end
end
end
end

View File

@ -71,25 +71,6 @@ RSpec.describe Gitlab::Git::Repository do
it { is_expected.not_to include("branch-from-space") }
it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::RefService, :list_refs
context 'feature list_refs_for_find_all_tags_branches disabled' do
before do
stub_feature_flags(list_refs_for_find_all_tags_branches: false)
end
it 'has TestRepo::BRANCH_SHA.size elements' do
expect(subject.size).to eq(TestEnv::BRANCH_SHA.size)
end
it 'returns UTF-8' do
expect(subject.first).to be_utf8
end
it { is_expected.to include("master") }
it { is_expected.not_to include("branch-from-space") }
it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::RefService, :branch_names
end
end
describe '#tag_names' do
@ -115,33 +96,6 @@ RSpec.describe Gitlab::Git::Repository do
it { is_expected.not_to include("v5.0.0") }
it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::RefService, :list_refs
context 'feature list_refs_for_find_all_tags_branches disabled' do
before do
stub_feature_flags(list_refs_for_find_all_tags_branches: false)
end
it { is_expected.to be_kind_of Array }
it 'has some elements' do
expect(subject.size).to be >= 1
end
it 'returns UTF-8' do
expect(subject.first).to be_utf8
end
describe '#last' do
subject { super().last }
it { is_expected.to eq("v1.1.1") }
end
it { is_expected.to include("v1.0.0") }
it { is_expected.not_to include("v5.0.0") }
it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::RefService, :tag_names
end
end
describe '#tags' do
@ -1476,29 +1430,6 @@ RSpec.describe Gitlab::Git::Repository do
expect(repository.branch_count).to eq(repository.local_branches.count)
end
end
context 'feature list_refs_for_find_all_tags_branches disabled' do
before do
stub_feature_flags(list_refs_for_find_all_tags_branches: false)
end
it 'returns the number of branches' do
expect(repository.branch_count).to eq(TestEnv::BRANCH_SHA.size)
end
context 'with local and remote branches' do
let(:repository) { mutable_repository }
before do
create_remote_branch('joe', 'remote_branch', 'master')
repository.create_branch('local_branch')
end
it 'returns the count of local branches' do
expect(repository.branch_count).to eq(repository.local_branches.count)
end
end
end
end
describe '#merged_branch_names' do

View File

@ -71,28 +71,6 @@ RSpec.describe Gitlab::GitalyClient::RefService do
end
end
describe '#branch_names' do
it 'sends a find_all_branch_names message' do
expect_any_instance_of(Gitaly::RefService::Stub)
.to receive(:find_all_branch_names)
.with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
.and_return([])
client.branch_names
end
end
describe '#tag_names' do
it 'sends a find_all_tag_names message' do
expect_any_instance_of(Gitaly::RefService::Stub)
.to receive(:find_all_tag_names)
.with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
.and_return([])
client.tag_names
end
end
describe '#find_branch' do
it 'sends a find_branch message' do
expect_any_instance_of(Gitaly::RefService::Stub)

View File

@ -0,0 +1,24 @@
# frozen_string_literal: true
require 'spec_helper'
require_migration!
RSpec.describe ScheduleBackfillEnvironmentTier, category: :continuous_delivery do
let!(:batched_migration) { described_class::MIGRATION }
it 'schedules a new batched migration' do
reversible_migration do |migration|
migration.before -> {
expect(batched_migration).not_to have_scheduled_batched_migration
}
migration.after -> {
expect(batched_migration).to have_scheduled_batched_migration(
table_name: :environments,
column_name: :id,
interval: described_class::DELAY_INTERVAL
)
}
end
end
end

View File

@ -115,7 +115,7 @@ RSpec.describe Deployments::UpdateEnvironmentService do
let(:external_url) { 'javascript:alert("hello")' }
it 'fails to update the tier due to validation error' do
expect { subject.execute }.not_to change { environment.tier }
expect { subject.execute }.not_to change { environment.reload.tier }
end
it 'tracks an exception' do