summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-03-31 09:08:43 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2023-03-31 09:08:43 +0000
commiteb239d31bf02b9a199d6f2ce087c9a0113797df3 (patch)
treeaed942923f276e4694b4d730bd22ed13cd45c1dc
parente4805b324cb9e620788bb2d625f633f2be20091d (diff)
downloadgitlab-ce-eb239d31bf02b9a199d6f2ce087c9a0113797df3.tar.gz
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--.gitlab/ci/notify.gitlab-ci.yml12
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml7
-rw-r--r--.rubocop_todo/layout/argument_alignment.yml28
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue4
-rw-r--r--app/finders/autocomplete/users_finder.rb4
-rw-r--r--app/finders/group_descendants_finder.rb21
-rw-r--r--app/services/packages/debian/generate_distribution_service.rb2
-rw-r--r--danger/stable_branch_patch/Dangerfile2
-rw-r--r--doc/administration/server_hooks.md21
-rw-r--r--doc/subscriptions/self_managed/index.md1
-rw-r--r--doc/tutorials/index.md5
-rw-r--r--doc/user/application_security/vulnerability_report/index.md3
-rw-r--r--doc/user/group/index.md3
-rw-r--r--doc/user/group/manage.md3
-rw-r--r--lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb9
-rw-r--r--scripts/api/create_merge_request_discussion.rb33
-rw-r--r--scripts/api/get_package_and_test_job.rb39
-rwxr-xr-xscripts/generate-failed-package-and-test-mr-message.rb79
-rw-r--r--spec/factories/packages/debian/file_metadatum.rb2
-rw-r--r--spec/finders/alert_management/alerts_finder_spec.rb17
-rw-r--r--spec/finders/ci/pipelines_for_merge_request_finder_spec.rb68
-rw-r--r--spec/finders/deployments_finder_spec.rb8
-rw-r--r--spec/finders/group_descendants_finder_spec.rb22
-rw-r--r--spec/finders/groups/accepting_group_transfers_finder_spec.rb14
-rw-r--r--spec/finders/groups/accepting_project_transfers_finder_spec.rb42
-rw-r--r--spec/finders/merge_requests_finder_spec.rb34
-rw-r--r--spec/finders/notes_finder_spec.rb12
-rw-r--r--spec/finders/snippets_finder_spec.rb21
-rw-r--r--spec/finders/users_finder_spec.rb8
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb4
-rw-r--r--spec/lib/gitlab/template/finders/global_template_finder_spec.rb10
-rw-r--r--spec/scripts/api/create_merge_request_discussion_spec.rb40
-rw-r--r--spec/scripts/api/get_package_and_test_job_spec.rb47
-rw-r--r--spec/scripts/generate_failed_package_and_test_mr_message_spec.rb79
-rw-r--r--spec/support/shared_contexts/finders/issues_finder_shared_contexts.rb78
-rw-r--r--spec/support/shared_contexts/finders/merge_requests_finder_shared_contexts.rb42
-rw-r--r--spec/support/shared_contexts/finders/work_items_finder_shared_contexts.rb78
-rw-r--r--spec/support/shared_examples/finders/issues_finder_shared_examples.rb17
-rw-r--r--spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb2
-rw-r--r--spec/tooling/danger/stable_branch_spec.rb2
-rw-r--r--tooling/danger/stable_branch.rb10
42 files changed, 676 insertions, 259 deletions
diff --git a/.gitlab/ci/notify.gitlab-ci.yml b/.gitlab/ci/notify.gitlab-ci.yml
index 7fbecd8944b..99408419d86 100644
--- a/.gitlab/ci/notify.gitlab-ci.yml
+++ b/.gitlab/ci/notify.gitlab-ci.yml
@@ -95,3 +95,15 @@ create-issues-for-failing-tests:
- ${FAILING_ISSUE_JSON_DIR}/
when: always
expire_in: 2 days
+
+notify-package-and-test-failure:
+ extends:
+ - .notify-defaults
+ - .notify:rules:notify-package-and-test-failure
+ image: ${GITLAB_DEPENDENCY_PROXY_ADDRESS}ruby:${RUBY_VERSION}
+ before_script:
+ - source scripts/utils.sh
+ - apt-get update
+ - install_gitlab_gem
+ script:
+ - scripts/generate-failed-package-and-test-mr-message.rb
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index d8162d108ba..2f56678f8f5 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -1144,6 +1144,13 @@
when: on_failure
allow_failure: true
+.notify:rules:notify-package-and-test-failure:
+ rules:
+ - <<: *if-not-canonical-namespace
+ when: never
+ - <<: *if-merge-request-targeting-stable-branch
+ when: on_failure
+
###############
# Pages rules #
###############
diff --git a/.rubocop_todo/layout/argument_alignment.yml b/.rubocop_todo/layout/argument_alignment.yml
index 50a24a22ccc..a90163c8980 100644
--- a/.rubocop_todo/layout/argument_alignment.yml
+++ b/.rubocop_todo/layout/argument_alignment.yml
@@ -3,8 +3,6 @@
Layout/ArgumentAlignment:
Details: grace period
Exclude:
- - 'app/finders/autocomplete/users_finder.rb'
- - 'app/finders/group_descendants_finder.rb'
- 'app/graphql/mutations/achievements/create.rb'
- 'app/graphql/mutations/admin/sidekiq_queues/delete_jobs.rb'
- 'app/graphql/mutations/alert_management/alerts/set_assignees.rb'
@@ -818,8 +816,6 @@ Layout/ArgumentAlignment:
- 'ee/app/components/namespaces/free_user_cap/base_alert_component.rb'
- 'ee/app/components/namespaces/free_user_cap/enforcement_at_limit_alert_component.rb'
- 'ee/app/components/namespaces/free_user_cap/shared.rb'
- - 'ee/app/finders/security/findings_finder.rb'
- - 'ee/app/finders/security/training_providers/base_url_finder.rb'
- 'ee/app/graphql/ee/mutations/alert_management/http_integration/create.rb'
- 'ee/app/graphql/ee/mutations/alert_management/http_integration/update.rb'
- 'ee/app/graphql/ee/mutations/boards/issues/issue_move_list.rb'
@@ -1358,14 +1354,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/features/search/elastic/group_search_spec.rb'
- 'ee/spec/features/security/project/discover_spec.rb'
- 'ee/spec/features/users/identity_verification_spec.rb'
- - 'ee/spec/finders/boards/milestones_finder_spec.rb'
- - 'ee/spec/finders/epics/cross_hierarchy_ancestors_finder_spec.rb'
- - 'ee/spec/finders/epics/cross_hierarchy_children_finder_spec.rb'
- - 'ee/spec/finders/geo/project_registry_status_finder_spec.rb'
- - 'ee/spec/finders/merge_requests_finder_spec.rb'
- - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
- - 'ee/spec/finders/security/training_providers/kontra_url_finder_spec.rb'
- - 'ee/spec/finders/security/training_providers/secure_code_warrior_url_finder_spec.rb'
- 'ee/spec/frontend/fixtures/dora/metrics.rb'
- 'ee/spec/frontend/fixtures/oncall_schedule.rb'
- 'ee/spec/graphql/ee/mutations/boards/lists/create_spec.rb'
@@ -1698,7 +1686,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/support/shared_examples/controllers/analytics/cycle_analytics/shared_stage_shared_examples.rb'
- 'ee/spec/support/shared_examples/features/credentials_inventory_shared_examples.rb'
- 'ee/spec/support/shared_examples/features/password_complexity_shared_examples.rb'
- - 'ee/spec/support/shared_examples/finders/security/findings_finder_shared_examples.rb'
- 'ee/spec/support/shared_examples/graphql/dast/dast_profile_schedule_shared_examples.rb'
- 'ee/spec/support/shared_examples/graphql/mutations/set_multiple_assignees_shared_examples.rb'
- 'ee/spec/support/shared_examples/services/geo/geo_request_service_shared_examples.rb'
@@ -2197,16 +2184,6 @@ Layout/ArgumentAlignment:
- 'spec/features/users/email_verification_on_login_spec.rb'
- 'spec/features/users/login_spec.rb'
- 'spec/features/users/overview_spec.rb'
- - 'spec/finders/alert_management/alerts_finder_spec.rb'
- - 'spec/finders/ci/pipelines_for_merge_request_finder_spec.rb'
- - 'spec/finders/deployments_finder_spec.rb'
- - 'spec/finders/group_descendants_finder_spec.rb'
- - 'spec/finders/groups/accepting_group_transfers_finder_spec.rb'
- - 'spec/finders/groups/accepting_project_transfers_finder_spec.rb'
- - 'spec/finders/merge_requests_finder_spec.rb'
- - 'spec/finders/notes_finder_spec.rb'
- - 'spec/finders/snippets_finder_spec.rb'
- - 'spec/finders/users_finder_spec.rb'
- 'spec/frontend/fixtures/autocomplete.rb'
- 'spec/frontend/fixtures/autocomplete_sources.rb'
- 'spec/frontend/fixtures/environments.rb'
@@ -2477,7 +2454,6 @@ Layout/ArgumentAlignment:
- 'spec/lib/gitlab/suggestions/commit_message_spec.rb'
- 'spec/lib/gitlab/suggestions/file_suggestion_spec.rb'
- 'spec/lib/gitlab/suggestions/suggestion_set_spec.rb'
- - 'spec/lib/gitlab/template/finders/global_template_finder_spec.rb'
- 'spec/lib/gitlab/tracking/destinations/snowplow_spec.rb'
- 'spec/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll_spec.rb'
- 'spec/lib/gitlab/usage/metrics/instrumentations/count_ci_internal_pipelines_metric_spec.rb'
@@ -2841,9 +2817,6 @@ Layout/ArgumentAlignment:
- 'spec/support/redis/redis_shared_examples.rb'
- 'spec/support/shared_contexts/bulk_imports_requests_shared_context.rb'
- 'spec/support/shared_contexts/design_management_shared_contexts.rb'
- - 'spec/support/shared_contexts/finders/issues_finder_shared_contexts.rb'
- - 'spec/support/shared_contexts/finders/merge_requests_finder_shared_contexts.rb'
- - 'spec/support/shared_contexts/finders/work_items_finder_shared_contexts.rb'
- 'spec/support/shared_contexts/merge_request_create_shared_context.rb'
- 'spec/support/shared_contexts/merge_request_edit_shared_context.rb'
- 'spec/support/shared_contexts/merge_requests_allowing_collaboration_shared_context.rb'
@@ -2853,7 +2826,6 @@ Layout/ArgumentAlignment:
- 'spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb'
- 'spec/support/shared_examples/features/search/redacted_search_results_shared_examples.rb'
- 'spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb'
- - 'spec/support/shared_examples/finders/issues_finder_shared_examples.rb'
- 'spec/support/shared_examples/graphql/members_shared_examples.rb'
- 'spec/support/shared_examples/graphql/mutation_shared_examples.rb'
- 'spec/support/shared_examples/graphql/mutations/set_assignees_shared_examples.rb'
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 63ade8d646e..48da537bff7 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-e02b6e904f61a36fc84a02420dcac7d66d24fd4e
+b8709da8be08aa79642e96dd95341cf2d9eb50d2
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
index b95b9fccc7a..4e16b92fc05 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
@@ -187,7 +187,7 @@ export default {
class="gl-display-flex gl-align-items-center gl-ml-2"
>
<gl-icon
- name="question"
+ name="question-o"
:aria-label="__('Link to go to GitLab pipeline documentation')"
/>
</gl-link>
@@ -251,7 +251,7 @@ export default {
</span>
{{ pipelineCoverageJobNumberText }}
<span ref="pipelineCoverageQuestion">
- <gl-icon name="question" :size="12" />
+ <gl-icon name="question-o" :size="12" />
</span>
<gl-tooltip
:target="() => $refs.pipelineCoverageQuestion"
diff --git a/app/finders/autocomplete/users_finder.rb b/app/finders/autocomplete/users_finder.rb
index 99e68991836..7ecf5c98ac0 100644
--- a/app/finders/autocomplete/users_finder.rb
+++ b/app/finders/autocomplete/users_finder.rb
@@ -11,8 +11,8 @@ module Autocomplete
LIMIT = 20
attr_reader :current_user, :project, :group, :search, :skip_users,
- :author_id, :todo_filter, :todo_state_filter,
- :filter_by_current_user, :states
+ :author_id, :todo_filter, :todo_state_filter,
+ :filter_by_current_user, :states
def initialize(params:, current_user:, project:, group:)
@current_user = current_user
diff --git a/app/finders/group_descendants_finder.rb b/app/finders/group_descendants_finder.rb
index 033af0f42a6..07f39f98b12 100644
--- a/app/finders/group_descendants_finder.rb
+++ b/app/finders/group_descendants_finder.rb
@@ -64,9 +64,7 @@ class GroupDescendantsFinder
def direct_child_groups
# rubocop: disable CodeReuse/Finder
- GroupsFinder.new(current_user,
- parent: parent_group,
- all_available: true).execute
+ GroupsFinder.new(current_user, parent: parent_group, all_available: true).execute
# rubocop: enable CodeReuse/Finder
end
@@ -78,12 +76,11 @@ class GroupDescendantsFinder
.in(Gitlab::VisibilityLevel.levels_for_user(current_user))
if current_user
- authorized_groups = GroupsFinder.new(current_user,
- all_available: false)
- .execute.arel.as('authorized')
+ authorized_groups = GroupsFinder.new(current_user, all_available: false)
+ .execute.arel.as('authorized')
authorized_to_user = groups_table.project(1).from(authorized_groups)
- .where(authorized_groups[:id].eq(groups_table[:id]))
- .exists
+ .where(authorized_groups[:id].eq(groups_table[:id]))
+ .exists
visible_to_user = visible_to_user.or(authorized_to_user)
end
@@ -161,9 +158,11 @@ class GroupDescendantsFinder
projects_nested_in_group = Project.where(namespace_id: parent_group.self_and_descendants.as_ids)
params_with_search = params.merge(search: params[:filter])
- ProjectsFinder.new(params: params_with_search,
- current_user: current_user,
- project_ids_relation: projects_nested_in_group).execute
+ ProjectsFinder.new(
+ params: params_with_search,
+ current_user: current_user,
+ project_ids_relation: projects_nested_in_group
+ ).execute
# rubocop: enable CodeReuse/Finder
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/services/packages/debian/generate_distribution_service.rb b/app/services/packages/debian/generate_distribution_service.rb
index ee43fe208c9..0740da6c07e 100644
--- a/app/services/packages/debian/generate_distribution_service.rb
+++ b/app/services/packages/debian/generate_distribution_service.rb
@@ -196,7 +196,7 @@ module Packages
file: CarrierWaveStringFile.new(content),
file_md5: file_md5,
file_sha256: file_sha256,
- size: content.size
+ size: content.bytesize
)
end
diff --git a/danger/stable_branch_patch/Dangerfile b/danger/stable_branch_patch/Dangerfile
index 2ac1b14c91f..a4b557c1eaa 100644
--- a/danger/stable_branch_patch/Dangerfile
+++ b/danger/stable_branch_patch/Dangerfile
@@ -2,7 +2,7 @@
if stable_branch.encourage_package_and_qa_execution?
markdown(<<~MARKDOWN)
- ## QA `e2e:package-and-test`
+ ## QA `e2e:package-and-test-ee`
**@#{helper.mr_author}, the `package-and-test` job must complete before merging this merge request.***
diff --git a/doc/administration/server_hooks.md b/doc/administration/server_hooks.md
index f3d5acb312d..5e9863447a1 100644
--- a/doc/administration/server_hooks.md
+++ b/doc/administration/server_hooks.md
@@ -150,16 +150,33 @@ To create a global server hook for all repositories:
If the server hook code is properly implemented, it should execute when the Git hook is next triggered. Hooks are executed in alphabetical order by filename in the hook type
subdirectories.
-## Remove server hooks for a repository using Gitaly CLI
+## Remove server hooks for a repository
+
+::Tabs
+
+:::TabTitle GitLab 15.11 and later
> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/4629) in GitLab 15.11, `hooks set` command replaces direct file system access.
-To remove hooks using the Gitaly CLI, pass an empty tarball to `hook set` to indicate that the repository should contain no hooks. For example:
+Prerequisites:
+
+- The [storage name and relative path](repository_storage_types.md#from-project-name-to-hashed-path) for the repository.
+
+To remove server hooks, pass an empty tarball to `hook set` to indicate that the repository should contain no hooks. For example:
```shell
cat empty_hooks.tar | gitaly hooks set --storage <storage> --repository <relative path> --config <config path>`.
```
+:::TabTitle GitLab 15.10 and earlier
+
+To remove server hooks:
+
+1. Go to the location of the repository on disk.
+1. Delete the server hooks in the `custom_hooks` directory.
+
+::EndTabs
+
## Chained server hooks
GitLab can execute server hooks in a chain. GitLab searches for and executes server hooks in the following order:
diff --git a/doc/subscriptions/self_managed/index.md b/doc/subscriptions/self_managed/index.md
index 52a39fb3f49..37d12948809 100644
--- a/doc/subscriptions/self_managed/index.md
+++ b/doc/subscriptions/self_managed/index.md
@@ -75,6 +75,7 @@ billable user, with the following exceptions:
- [Support Bot](../../user/project/service_desk.md#support-bot-user).
- [Bot users for projects](../../user/project/settings/project_access_tokens.md#bot-users-for-projects).
- [Bot users for groups](../../user/group/settings/group_access_tokens.md#bot-users-for-groups).
+ - Other [internal users](../../development/internal_users.md#internal-users).
**Billable users** as reported in the `/admin` section is updated once per day.
diff --git a/doc/tutorials/index.md b/doc/tutorials/index.md
index 6e185bd2a88..fe295d13c09 100644
--- a/doc/tutorials/index.md
+++ b/doc/tutorials/index.md
@@ -80,13 +80,14 @@ Use GitLab Pages to publish a static website directly from your project.
| [Create a Pages website from a CI/CD template](../user/project/pages/getting_started/pages_ci_cd_template.md) | Quickly generate a Pages website for your project using a CI/CD template for a popular Static Site Generator (SSG). | **{star}** |
| [Create a Pages website from scratch](../user/project/pages/getting_started/pages_from_scratch.md) | Create all the components of a Pages website from a blank project. | |
-## Secure your application
+## Secure your application and check compliance
-GitLab can check your application for security vulnerabilities.
+GitLab can check your application for security vulnerabilities and that it meets compliance requirements.
| Topic | Description | Good for beginners |
|-------|-------------|--------------------|
| [Set up dependency scanning](https://about.gitlab.com/blog/2021/01/14/try-dependency-scanning/) | Try out dependency scanning, which checks for known vulnerabilities in dependencies. | **{star}** |
+| [Create a compliance pipeline](create_compliance_pipeline.md) | Learn how to create compliance pipelines for your groups. | **{star}** |
| [Get started with GitLab application security](../user/application_security/get-started-security.md) | Follow recommended steps to set up security tools. | |
| [GitLab Security Essentials](https://levelup.gitlab.com/courses/security-essentials) | Learn about the essential security capabilities of GitLab in this self-paced course. | |
diff --git a/doc/user/application_security/vulnerability_report/index.md b/doc/user/application_security/vulnerability_report/index.md
index 3d7565f97bc..a4c4737f767 100644
--- a/doc/user/application_security/vulnerability_report/index.md
+++ b/doc/user/application_security/vulnerability_report/index.md
@@ -19,6 +19,9 @@ At all levels, the Vulnerability Report contains:
- Filters for common vulnerability attributes.
- Details of each vulnerability, presented in tabular layout.
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an overview, see [Vulnerability Management](https://www.youtube.com/watch?v=8SJHz6BCgXM).
+
The **Activity** column contains icons to indicate the activity, if any, taken on the vulnerability
in that row:
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index d35a0920cf2..fc904ed5779 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -20,6 +20,9 @@ For larger organizations, you can also create [subgroups](subgroups/index.md).
For more information about creating and managing your groups, see [Manage groups](manage.md).
+NOTE:
+Self-managed customers should create a top-level group so you can see an overview of your organization. We are working on creating an [organization view](https://gitlab.com/groups/gitlab-org/-/epics/9266), so you can see all groups.
+
## Group visibility
Like projects, a group can be configured to limit the visibility of it to:
diff --git a/doc/user/group/manage.md b/doc/user/group/manage.md
index d0eb7e4b7a0..eadcf67dabe 100644
--- a/doc/user/group/manage.md
+++ b/doc/user/group/manage.md
@@ -8,6 +8,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Use groups to manage one or more related projects at the same time.
+NOTE:
+Self-managed customers should create a top-level group so you can see an overview of your organization. We are working on creating an [organization view](https://gitlab.com/groups/gitlab-org/-/epics/9266), so you can see all groups.
+
## View groups
To view groups, on the top bar, select **Main menu > Groups > View all groups**.
diff --git a/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb b/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
index b6e2209b475..bb87104630c 100644
--- a/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
+++ b/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
@@ -220,7 +220,12 @@ module Gitlab
end
def cookie_key
- "#{idempotency_key}:cookie:v2"
+ # This duplicates `Gitlab::Redis::Queues::SIDEKIQ_NAMESPACE` both here and in `#idempotency_key`
+ # This is because `Sidekiq.redis` used to add this prefix automatically through `redis-namespace`
+ # and we did not notice this in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25447
+ # Now we're keeping this as-is to avoid a key-migration when redis-namespace gets
+ # removed from Sidekiq: https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/944
+ "#{Gitlab::Redis::Queues::SIDEKIQ_NAMESPACE}:#{idempotency_key}:cookie:v2"
end
def get_cookie
@@ -252,7 +257,7 @@ module Gitlab
end
def with_redis(&block)
- Sidekiq.redis(&block) # rubocop:disable Cop/SidekiqRedisCall
+ Gitlab::Redis::Queues.with(&block) # rubocop:disable Cop/RedisQueueUsage, CodeReuse/ActiveRecord
end
end
end
diff --git a/scripts/api/create_merge_request_discussion.rb b/scripts/api/create_merge_request_discussion.rb
new file mode 100644
index 00000000000..2b380d2e216
--- /dev/null
+++ b/scripts/api/create_merge_request_discussion.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'gitlab'
+require_relative 'default_options'
+
+class CreateMergeRequestDiscussion
+ def initialize(options)
+ @merge_request = options.fetch(:merge_request)
+ @project = options.fetch(:project)
+
+ # If api_token is nil, it's set to '' to allow unauthenticated requests (for forks).
+ api_token = options.fetch(:api_token, '')
+
+ warn "No API token given." if api_token.empty?
+
+ @client = Gitlab.client(
+ endpoint: options.fetch(:endpoint, API::DEFAULT_OPTIONS[:endpoint]),
+ private_token: api_token
+ )
+ end
+
+ def execute(content)
+ client.create_merge_request_discussion(
+ project,
+ merge_request.fetch('iid'),
+ body: content
+ )
+ end
+
+ private
+
+ attr_reader :merge_request, :client, :project
+end
diff --git a/scripts/api/get_package_and_test_job.rb b/scripts/api/get_package_and_test_job.rb
new file mode 100644
index 00000000000..dbc29f754d0
--- /dev/null
+++ b/scripts/api/get_package_and_test_job.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'gitlab'
+
+require_relative 'default_options'
+
+class GetPackageAndTestJob
+ def initialize(options)
+ @project = options.fetch(:project)
+ @pipeline_id = options.fetch(:pipeline_id)
+
+ # If api_token is nil, it's set to '' to allow unauthenticated requests (for forks).
+ api_token = options.fetch(:api_token, '')
+
+ warn "No API token given." if api_token.empty?
+
+ @client = Gitlab.client(
+ endpoint: options.fetch(:endpoint) || API::DEFAULT_OPTIONS[:endpoint],
+ private_token: api_token
+ )
+ end
+
+ def execute
+ package_and_test_job = nil
+
+ client.pipeline_bridges(project, pipeline_id, scope: 'failed', per_page: 100).auto_paginate do |job|
+ if job['name'].include?('package-and-test')
+ package_and_test_job = job
+ break
+ end
+ end
+
+ package_and_test_job
+ end
+
+ private
+
+ attr_reader :project, :pipeline_id, :exclude_allowed_to_fail_jobs, :client
+end
diff --git a/scripts/generate-failed-package-and-test-mr-message.rb b/scripts/generate-failed-package-and-test-mr-message.rb
new file mode 100755
index 00000000000..a53b393498c
--- /dev/null
+++ b/scripts/generate-failed-package-and-test-mr-message.rb
@@ -0,0 +1,79 @@
+#!/usr/bin/env ruby
+
+# frozen_string_literal: true
+
+require 'optparse'
+require 'json'
+
+require_relative 'api/create_merge_request_discussion'
+require_relative 'api/commit_merge_requests'
+require_relative 'api/get_package_and_test_job'
+
+class GenerateFailedPackageAndTestMrMessage
+ DEFAULT_OPTIONS = {
+ project: nil
+ }.freeze
+
+ def initialize(options)
+ @project = options.fetch(:project)
+ end
+
+ def execute
+ return unless failed_package_and_test_job
+
+ add_discussion_to_mr
+ end
+
+ private
+
+ attr_reader :project
+
+ def add_discussion_to_mr
+ CreateMergeRequestDiscussion.new(
+ API::DEFAULT_OPTIONS.merge(merge_request: merge_request)
+ ).execute(content)
+ end
+
+ def failed_package_and_test_job
+ @failed_package_and_test_job ||= GetPackageAndTestJob.new(API::DEFAULT_OPTIONS).execute
+ end
+
+ def merge_request
+ @merge_request ||= CommitMergeRequests.new(
+ API::DEFAULT_OPTIONS.merge(sha: ENV['CI_MERGE_REQUEST_SOURCE_BRANCH_SHA'])
+ ).execute.first
+ end
+
+ def content
+ <<~MARKDOWN
+ :warning: @#{author_username} The `e2e:package-and-test-ee` job has failed.
+
+ - Pipeline: #{pipeline_link}
+ - `package-and-test` pipeline: #{failed_package_and_test_job['web_url']}
+
+ Ping your team's associated Software Engineer in Test (SET) to confirm the failures are unrelated to the merge request.
+ If there's no SET assigned, ask for assistance on the `#quality` Slack channel.
+ MARKDOWN
+ end
+
+ def author_username
+ merge_request['author']['username'] if merge_request
+ end
+
+ def pipeline_link
+ "[##{ENV['CI_PIPELINE_ID']}](#{ENV['CI_PIPELINE_URL']})"
+ end
+end
+
+if $PROGRAM_NAME == __FILE__
+ options = GenerateFailedPackageAndTestMrMessage::DEFAULT_OPTIONS.dup
+
+ OptionParser.new do |opts|
+ opts.on("-h", "--help", "Prints this help") do
+ puts opts
+ exit
+ end
+ end.parse!
+
+ GenerateFailedPackageAndTestMrMessage.new(options).execute
+end
diff --git a/spec/factories/packages/debian/file_metadatum.rb b/spec/factories/packages/debian/file_metadatum.rb
index 42729b25087..c9692c02248 100644
--- a/spec/factories/packages/debian/file_metadatum.rb
+++ b/spec/factories/packages/debian/file_metadatum.rb
@@ -61,7 +61,7 @@ FactoryBot.define do
'Source' => package_file.package.name,
'Version' => package_file.package.version,
'Architecture' => 'amd64',
- 'Maintainer' => "#{FFaker::Name.name} <#{FFaker::Internet.email}>",
+ 'Maintainer' => "#{FFaker::NameCN.name} #{FFaker::Name.name} <#{FFaker::Internet.email}>",
'Installed-Size' => '7',
'Section' => 'libs',
'Priority' => 'optional',
diff --git a/spec/finders/alert_management/alerts_finder_spec.rb b/spec/finders/alert_management/alerts_finder_spec.rb
index 7fcbc7b20a1..3c37d52d6c3 100644
--- a/spec/finders/alert_management/alerts_finder_spec.rb
+++ b/spec/finders/alert_management/alerts_finder_spec.rb
@@ -222,14 +222,15 @@ RSpec.describe AlertManagement::AlertsFinder, '#execute' do
context 'search query given' do
let_it_be(:alert) do
- create(:alert_management_alert,
- :with_fingerprint,
- project: project,
- title: 'Title',
- description: 'Desc',
- service: 'Service',
- monitoring_tool: 'Monitor'
- )
+ create(
+ :alert_management_alert,
+ :with_fingerprint,
+ project: project,
+ title: 'Title',
+ description: 'Desc',
+ service: 'Service',
+ monitoring_tool: 'Monitor'
+ )
end
context 'searching title' do
diff --git a/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb b/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb
index 6e218db1254..35effc265c4 100644
--- a/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb
+++ b/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb
@@ -17,8 +17,10 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
let_it_be(:forked_project) { fork_project(parent_project, nil, repository: true, target_project: create(:project, :private, :repository)) }
let(:merge_request) do
- create(:merge_request, source_project: forked_project, source_branch: 'feature',
- target_project: parent_project, target_branch: 'master')
+ create(
+ :merge_request, source_project: forked_project, source_branch: 'feature',
+ target_project: parent_project, target_branch: 'master'
+ )
end
let!(:pipeline_in_parent) do
@@ -125,8 +127,10 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
let(:merge_request) { build(:merge_request, source_project: create(:project, :repository)) }
let!(:pipeline) do
- create(:ci_empty_pipeline, project: project,
- sha: merge_request.diff_head_sha, ref: merge_request.source_branch)
+ create(
+ :ci_empty_pipeline, project: project,
+ sha: merge_request.diff_head_sha, ref: merge_request.source_branch
+ )
end
it 'returns pipelines from diff_head_sha' do
@@ -139,8 +143,10 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
let(:target_ref) { 'master' }
let!(:branch_pipeline) do
- create(:ci_pipeline, source: :push, project: project,
- ref: source_ref, sha: merge_request.merge_request_diff.head_commit_sha)
+ create(
+ :ci_pipeline, source: :push, project: project,
+ ref: source_ref, sha: merge_request.merge_request_diff.head_commit_sha
+ )
end
let!(:tag_pipeline) do
@@ -148,13 +154,17 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
end
let!(:detached_merge_request_pipeline) do
- create(:ci_pipeline, source: :merge_request_event, project: project,
- ref: source_ref, sha: shas.second, merge_request: merge_request)
+ create(
+ :ci_pipeline, source: :merge_request_event, project: project,
+ ref: source_ref, sha: shas.second, merge_request: merge_request
+ )
end
let(:merge_request) do
- create(:merge_request, source_project: project, source_branch: source_ref,
- target_project: project, target_branch: target_ref)
+ create(
+ :merge_request, source_project: project, source_branch: source_ref,
+ target_project: project, target_branch: target_ref
+ )
end
let(:project) { create(:project, :repository) }
@@ -166,13 +176,14 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
context 'when there are a branch pipeline and a merge request pipeline' do
let!(:branch_pipeline_2) do
- create(:ci_pipeline, source: :push, project: project,
- ref: source_ref, sha: shas.first)
+ create(:ci_pipeline, source: :push, project: project, ref: source_ref, sha: shas.first)
end
let!(:detached_merge_request_pipeline_2) do
- create(:ci_pipeline, source: :merge_request_event, project: project,
- ref: source_ref, sha: shas.first, merge_request: merge_request)
+ create(
+ :ci_pipeline, source: :merge_request_event, project: project,
+ ref: source_ref, sha: shas.first, merge_request: merge_request
+ )
end
it 'returns merge request pipelines first' do
@@ -183,8 +194,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
context 'when there are multiple merge request pipelines from the same branch' do
let!(:branch_pipeline_2) do
- create(:ci_pipeline, source: :push, project: project,
- ref: source_ref, sha: shas.first)
+ create(:ci_pipeline, source: :push, project: project, ref: source_ref, sha: shas.first)
end
let!(:branch_pipeline_with_sha_not_belonging_to_merge_request) do
@@ -192,20 +202,26 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
end
let!(:detached_merge_request_pipeline_2) do
- create(:ci_pipeline, source: :merge_request_event, project: project,
- ref: source_ref, sha: shas.first, merge_request: merge_request_2)
+ create(
+ :ci_pipeline, source: :merge_request_event, project: project,
+ ref: source_ref, sha: shas.first, merge_request: merge_request_2
+ )
end
let(:merge_request_2) do
- create(:merge_request, source_project: project, source_branch: source_ref,
- target_project: project, target_branch: 'stable')
+ create(
+ :merge_request, source_project: project, source_branch: source_ref,
+ target_project: project, target_branch: 'stable'
+ )
end
before do
shas.each.with_index do |sha, index|
- create(:merge_request_diff_commit,
- merge_request_diff: merge_request_2.merge_request_diff,
- sha: sha, relative_order: index)
+ create(
+ :merge_request_diff_commit,
+ merge_request_diff: merge_request_2.merge_request_diff,
+ sha: sha, relative_order: index
+ )
end
end
@@ -219,8 +235,10 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
context 'when detached merge request pipeline is run on head ref of the merge request' do
let!(:detached_merge_request_pipeline) do
- create(:ci_pipeline, source: :merge_request_event, project: project,
- ref: merge_request.ref_path, sha: shas.second, merge_request: merge_request)
+ create(
+ :ci_pipeline, source: :merge_request_event, project: project,
+ ref: merge_request.ref_path, sha: shas.second, merge_request: merge_request
+ )
end
it 'sets the head ref of the merge request to the pipeline ref' do
diff --git a/spec/finders/deployments_finder_spec.rb b/spec/finders/deployments_finder_spec.rb
index efb739c3d2f..28c7704244c 100644
--- a/spec/finders/deployments_finder_spec.rb
+++ b/spec/finders/deployments_finder_spec.rb
@@ -331,9 +331,11 @@ RSpec.describe DeploymentsFinder do
with_them do
it 'returns the deployments unordered' do
- expect(subject.to_a).to contain_exactly(group_project_1_deployment,
- group_project_2_deployment,
- subgroup_project_1_deployment)
+ expect(subject.to_a).to contain_exactly(
+ group_project_1_deployment,
+ group_project_2_deployment,
+ subgroup_project_1_deployment
+ )
end
end
end
diff --git a/spec/finders/group_descendants_finder_spec.rb b/spec/finders/group_descendants_finder_spec.rb
index 2a9e887450c..9d528355f54 100644
--- a/spec/finders/group_descendants_finder_spec.rb
+++ b/spec/finders/group_descendants_finder_spec.rb
@@ -130,8 +130,10 @@ RSpec.describe GroupDescendantsFinder do
it 'does not include projects shared with the group' do
project = create(:project, namespace: group)
other_project = create(:project)
- other_project.project_group_links.create!(group: group,
- group_access: Gitlab::Access::MAINTAINER)
+ other_project.project_group_links.create!(
+ group: group,
+ group_access: Gitlab::Access::MAINTAINER
+ )
expect(finder.execute).to contain_exactly(project)
end
@@ -140,9 +142,11 @@ RSpec.describe GroupDescendantsFinder do
context 'with shared groups' do
let_it_be(:other_group) { create(:group) }
let_it_be(:shared_group_link) do
- create(:group_group_link,
- shared_group: group,
- shared_with_group: other_group)
+ create(
+ :group_group_link,
+ shared_group: group,
+ shared_with_group: other_group
+ )
end
context 'without common ancestor' do
@@ -230,9 +234,11 @@ RSpec.describe GroupDescendantsFinder do
other_user = create(:user)
other_subgroup.add_developer(other_user)
- finder = described_class.new(current_user: other_user,
- parent_group: group,
- params: params)
+ finder = described_class.new(
+ current_user: other_user,
+ parent_group: group,
+ params: params
+ )
expect(finder.execute).to contain_exactly(other_subgroup, public_subgroup, other_subsubgroup)
end
diff --git a/spec/finders/groups/accepting_group_transfers_finder_spec.rb b/spec/finders/groups/accepting_group_transfers_finder_spec.rb
index 06e6fa05892..18407dd0196 100644
--- a/spec/finders/groups/accepting_group_transfers_finder_spec.rb
+++ b/spec/finders/groups/accepting_group_transfers_finder_spec.rb
@@ -39,14 +39,16 @@ RSpec.describe Groups::AcceptingGroupTransfersFinder do
describe '#execute' do
before_all do
- create(:group_group_link, :owner,
- shared_with_group: group_where_user_has_owner_access,
- shared_group: shared_with_group_where_direct_owner_as_owner
+ create(
+ :group_group_link, :owner,
+ shared_with_group: group_where_user_has_owner_access,
+ shared_group: shared_with_group_where_direct_owner_as_owner
)
- create(:group_group_link, :guest,
- shared_with_group: group_where_user_has_owner_access,
- shared_group: shared_with_group_where_direct_owner_as_guest
+ create(
+ :group_group_link, :guest,
+ shared_with_group: group_where_user_has_owner_access,
+ shared_group: shared_with_group_where_direct_owner_as_guest
)
end
diff --git a/spec/finders/groups/accepting_project_transfers_finder_spec.rb b/spec/finders/groups/accepting_project_transfers_finder_spec.rb
index e73318c763f..bb6731abbba 100644
--- a/spec/finders/groups/accepting_project_transfers_finder_spec.rb
+++ b/spec/finders/groups/accepting_project_transfers_finder_spec.rb
@@ -25,24 +25,28 @@ RSpec.describe Groups::AcceptingProjectTransfersFinder do
group_where_direct_maintainer.add_maintainer(user)
group_where_direct_developer.add_developer(user)
- create(:group_group_link, :owner,
- shared_with_group: group_where_direct_owner,
- shared_group: shared_with_group_where_direct_owner_as_owner
+ create(
+ :group_group_link, :owner,
+ shared_with_group: group_where_direct_owner,
+ shared_group: shared_with_group_where_direct_owner_as_owner
)
- create(:group_group_link, :guest,
- shared_with_group: group_where_direct_owner,
- shared_group: shared_with_group_where_direct_owner_as_guest
+ create(
+ :group_group_link, :guest,
+ shared_with_group: group_where_direct_owner,
+ shared_group: shared_with_group_where_direct_owner_as_guest
)
- create(:group_group_link, :maintainer,
- shared_with_group: group_where_direct_owner,
- shared_group: shared_with_group_where_direct_owner_as_maintainer
+ create(
+ :group_group_link, :maintainer,
+ shared_with_group: group_where_direct_owner,
+ shared_group: shared_with_group_where_direct_owner_as_maintainer
)
- create(:group_group_link, :owner,
- shared_with_group: group_where_direct_developer,
- shared_group: shared_with_group_where_direct_developer_as_owner
+ create(
+ :group_group_link, :owner,
+ shared_with_group: group_where_direct_developer,
+ shared_group: shared_with_group_where_direct_developer_as_owner
)
end
@@ -51,13 +55,13 @@ RSpec.describe Groups::AcceptingProjectTransfersFinder do
it 'only returns groups where the user has access to transfer projects to' do
expect(result).to match_array([
- group_where_direct_owner,
- subgroup_of_group_where_direct_owner,
- group_where_direct_maintainer,
- shared_with_group_where_direct_owner_as_owner,
- shared_with_group_where_direct_owner_as_maintainer,
- subgroup_of_shared_with_group_where_direct_owner_as_maintainer
- ])
+ group_where_direct_owner,
+ subgroup_of_group_where_direct_owner,
+ group_where_direct_maintainer,
+ shared_with_group_where_direct_owner_as_owner,
+ shared_with_group_where_direct_owner_as_maintainer,
+ subgroup_of_shared_with_group_where_direct_owner_as_maintainer
+ ])
end
end
end
diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb
index 306acb9391d..aa167fe7aba 100644
--- a/spec/finders/merge_requests_finder_spec.rb
+++ b/spec/finders/merge_requests_finder_spec.rb
@@ -582,24 +582,28 @@ RSpec.describe MergeRequestsFinder, feature_category: :code_review_workflow do
let_it_be(:new_project) { create(:project, forked_from_project: project1) }
let!(:new_merge_request) do
- create(:merge_request,
- :simple,
- author: user,
- created_at: 1.week.from_now,
- updated_at: 1.week.from_now,
- source_project: new_project,
- target_project: new_project)
+ create(
+ :merge_request,
+ :simple,
+ author: user,
+ created_at: 1.week.from_now,
+ updated_at: 1.week.from_now,
+ source_project: new_project,
+ target_project: new_project
+ )
end
let!(:old_merge_request) do
- create(:merge_request,
- :simple,
- author: user,
- source_branch: 'feature_1',
- created_at: 1.week.ago,
- updated_at: 1.week.ago,
- source_project: new_project,
- target_project: new_project)
+ create(
+ :merge_request,
+ :simple,
+ author: user,
+ source_branch: 'feature_1',
+ created_at: 1.week.ago,
+ updated_at: 1.week.ago,
+ source_project: new_project,
+ target_project: new_project
+ )
end
before_all do
diff --git a/spec/finders/notes_finder_spec.rb b/spec/finders/notes_finder_spec.rb
index 1255a882114..1df0aa411d6 100644
--- a/spec/finders/notes_finder_spec.rb
+++ b/spec/finders/notes_finder_spec.rb
@@ -74,11 +74,13 @@ RSpec.describe NotesFinder do
context 'on restricted projects' do
let(:project) do
- create(:project,
- :public,
- :issues_private,
- :snippets_private,
- :merge_requests_private)
+ create(
+ :project,
+ :public,
+ :issues_private,
+ :snippets_private,
+ :merge_requests_private
+ )
end
it 'publicly excludes notes on merge requests' do
diff --git a/spec/finders/snippets_finder_spec.rb b/spec/finders/snippets_finder_spec.rb
index 48880ec2c1f..9f4b7612be5 100644
--- a/spec/finders/snippets_finder_spec.rb
+++ b/spec/finders/snippets_finder_spec.rb
@@ -237,25 +237,28 @@ RSpec.describe SnippetsFinder do
it 'returns all personal snippets for the admin' do
snippets = described_class.new(admin, only_personal: true).execute
- expect(snippets).to contain_exactly(admin_private_personal_snippet,
- private_personal_snippet,
- internal_personal_snippet,
- public_personal_snippet)
+ expect(snippets).to contain_exactly(
+ admin_private_personal_snippet,
+ private_personal_snippet,
+ internal_personal_snippet,
+ public_personal_snippet
+ )
end
it 'returns only personal snippets visible by user' do
snippets = described_class.new(user, only_personal: true).execute
- expect(snippets).to contain_exactly(private_personal_snippet,
- internal_personal_snippet,
- public_personal_snippet)
+ expect(snippets).to contain_exactly(
+ private_personal_snippet,
+ internal_personal_snippet,
+ public_personal_snippet
+ )
end
it 'returns only internal or public personal snippets for user without snippets' do
snippets = described_class.new(user_without_snippets, only_personal: true).execute
- expect(snippets).to contain_exactly(internal_personal_snippet,
- public_personal_snippet)
+ expect(snippets).to contain_exactly(internal_personal_snippet, public_personal_snippet)
end
end
end
diff --git a/spec/finders/users_finder_spec.rb b/spec/finders/users_finder_spec.rb
index 5cf845a87b2..2e94ca5757a 100644
--- a/spec/finders/users_finder_spec.rb
+++ b/spec/finders/users_finder_spec.rb
@@ -61,9 +61,11 @@ RSpec.describe UsersFinder do
filtered_user_before = create(:user, created_at: 3.days.ago)
filtered_user_after = create(:user, created_at: Time.now + 3.days)
- users = described_class.new(user,
- created_after: 2.days.ago,
- created_before: Time.now + 2.days).execute
+ users = described_class.new(
+ user,
+ created_after: 2.days.ago,
+ created_before: Time.now + 2.days
+ ).execute
expect(users.map(&:username)).not_to include([filtered_user_before.username, filtered_user_after.username])
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb b/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
index 6a515a2b8a5..31258c42b5f 100644
--- a/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
@@ -79,10 +79,10 @@ RSpec.describe Gitlab::SidekiqMiddleware::DuplicateJobs::DuplicateJob, :clean_gi
context 'with Redis cookies' do
def with_redis(&block)
- Sidekiq.redis(&block)
+ Gitlab::Redis::Queues.with(&block)
end
- let(:cookie_key) { "#{idempotency_key}:cookie:v2" }
+ let(:cookie_key) { "#{Gitlab::Redis::Queues::SIDEKIQ_NAMESPACE}:#{idempotency_key}:cookie:v2" }
let(:cookie) { get_redis_msgpack(cookie_key) }
describe '#check!' do
diff --git a/spec/lib/gitlab/template/finders/global_template_finder_spec.rb b/spec/lib/gitlab/template/finders/global_template_finder_spec.rb
index 38ec28c2b9a..c1dfee3cccb 100644
--- a/spec/lib/gitlab/template/finders/global_template_finder_spec.rb
+++ b/spec/lib/gitlab/template/finders/global_template_finder_spec.rb
@@ -16,10 +16,12 @@ RSpec.describe Gitlab::Template::Finders::GlobalTemplateFinder do
end
subject(:finder) do
- described_class.new(base_dir, '',
- { 'General' => '', 'Bar' => 'Bar' },
- include_categories_for_file,
- excluded_patterns: excluded_patterns)
+ described_class.new(
+ base_dir, '',
+ { 'General' => '', 'Bar' => 'Bar' },
+ include_categories_for_file,
+ excluded_patterns: excluded_patterns
+ )
end
let(:excluded_patterns) { [] }
diff --git a/spec/scripts/api/create_merge_request_discussion_spec.rb b/spec/scripts/api/create_merge_request_discussion_spec.rb
new file mode 100644
index 00000000000..3867f6532a9
--- /dev/null
+++ b/spec/scripts/api/create_merge_request_discussion_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../scripts/api/create_merge_request_discussion'
+
+RSpec.describe CreateMergeRequestDiscussion, feature_category: :tooling do
+ describe '#execute' do
+ let(:project_id) { 12345 }
+ let(:iid) { 1 }
+ let(:content) { 'test123' }
+
+ let(:options) do
+ {
+ api_token: 'token',
+ endpoint: 'https://example.gitlab.com',
+ project: project_id,
+ merge_request: {
+ 'iid' => iid
+ }
+ }
+ end
+
+ subject { described_class.new(options).execute(content) }
+
+ it 'requests commit_merge_requests from the gitlab client' do
+ expected_result = true
+ client = double('Gitlab::Client') # rubocop:disable RSpec/VerifiedDoubles
+
+ expect(Gitlab).to receive(:client)
+ .with(endpoint: options[:endpoint], private_token: options[:api_token])
+ .and_return(client)
+
+ expect(client).to receive(:create_merge_request_discussion).with(
+ project_id, iid, body: content
+ ).and_return(expected_result)
+
+ expect(subject).to eq(expected_result)
+ end
+ end
+end
diff --git a/spec/scripts/api/get_package_and_test_job_spec.rb b/spec/scripts/api/get_package_and_test_job_spec.rb
new file mode 100644
index 00000000000..60bb26cbcaf
--- /dev/null
+++ b/spec/scripts/api/get_package_and_test_job_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../scripts/api/get_package_and_test_job'
+
+RSpec.describe GetPackageAndTestJob, feature_category: :tooling do
+ describe '#execute' do
+ let(:project) { 12345 }
+ let(:pipeline_id) { 1 }
+
+ let(:options) do
+ {
+ api_token: 'token',
+ endpoint: 'https://example.gitlab.com',
+ project: project,
+ pipeline_id: pipeline_id
+ }
+ end
+
+ subject { described_class.new(options).execute }
+
+ it 'requests commit_merge_requests from the gitlab client' do
+ client_result = [
+ { 'name' => 'foo' },
+ { 'name' => 'e2e:package-and-test-ee' },
+ { 'name' => 'bar' }
+ ]
+ client = double('Gitlab::Client') # rubocop:disable RSpec/VerifiedDoubles
+ client_response = double('Gitlab::ClientResponse') # rubocop:disable RSpec/VerifiedDoubles
+
+ expect(Gitlab).to receive(:client)
+ .with(endpoint: options[:endpoint], private_token: options[:api_token])
+ .and_return(client)
+
+ expect(client).to receive(:pipeline_bridges).with(
+ project, pipeline_id, scope: 'failed', per_page: 100
+ ).and_return(client_response)
+
+ expect(client_response).to receive(:auto_paginate)
+ .and_yield(client_result[0])
+ .and_yield(client_result[1])
+ .and_yield(client_result[2])
+
+ expect(subject).to eq(client_result[1])
+ end
+ end
+end
diff --git a/spec/scripts/generate_failed_package_and_test_mr_message_spec.rb b/spec/scripts/generate_failed_package_and_test_mr_message_spec.rb
new file mode 100644
index 00000000000..79e63c95f65
--- /dev/null
+++ b/spec/scripts/generate_failed_package_and_test_mr_message_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../scripts/generate-failed-package-and-test-mr-message'
+require_relative '../support/helpers/stub_env'
+
+RSpec.describe GenerateFailedPackageAndTestMrMessage, feature_category: :tooling do
+ include StubENV
+
+ describe '#execute' do
+ let(:options) do
+ {
+ project: 1234,
+ api_token: 'asdf1234'
+ }
+ end
+
+ let(:commit_merge_request) do
+ {
+ 'author' => {
+ 'id' => '2',
+ 'username' => 'test_user'
+ }
+ }
+ end
+
+ let(:package_and_test_job) do
+ { 'web_url' => 'http://example.com' }
+ end
+
+ let(:merge_request) { instance_double(CommitMergeRequests, execute: [commit_merge_request]) }
+ let(:content) { /The `e2e:package-and-test-ee` job has failed./ }
+ let(:merge_request_discussion_client) { instance_double(CreateMergeRequestDiscussion, execute: true) }
+ let(:package_and_test_job_client) { instance_double(GetPackageAndTestJob, execute: package_and_test_job) }
+
+ subject { described_class.new(options).execute }
+
+ before do
+ stub_env(
+ 'CI_MERGE_REQUEST_SOURCE_BRANCH_SHA' => 'bfcd2b9b5cad0b889494ce830697392c8ca11257',
+ 'CI_PROJECT_ID' => '13083',
+ 'CI_PIPELINE_ID' => '1234567',
+ 'CI_PIPELINE_URL' => 'https://gitlab.com/gitlab-org/gitlab/-/pipelines/1234567',
+ 'PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE' => 'asdf1234'
+ )
+
+ allow(GetPackageAndTestJob).to receive(:new)
+ .with(API::DEFAULT_OPTIONS)
+ .and_return(package_and_test_job_client)
+ end
+
+ context 'when package-and-test fails' do
+ before do
+ allow(CommitMergeRequests).to receive(:new)
+ .with(API::DEFAULT_OPTIONS.merge(sha: ENV['CI_MERGE_REQUEST_SOURCE_BRANCH_SHA']))
+ .and_return(merge_request)
+ end
+
+ it 'successfully creates a discussion' do
+ expect(CreateMergeRequestDiscussion).to receive(:new)
+ .with(API::DEFAULT_OPTIONS.merge(merge_request: commit_merge_request))
+ .and_return(merge_request_discussion_client)
+
+ expect(merge_request_discussion_client).to receive(:execute).with(content)
+
+ expect(subject).to eq(true)
+ end
+ end
+
+ context 'when package-and-test is did not fail' do
+ let(:package_and_test_job_client) { instance_double(GetPackageAndTestJob, execute: nil) }
+
+ it 'does not add a discussion' do
+ expect(CreateMergeRequestDiscussion).not_to receive(:new)
+ expect(subject).to eq(nil)
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_contexts/finders/issues_finder_shared_contexts.rb b/spec/support/shared_contexts/finders/issues_finder_shared_contexts.rb
index afb3976e3b8..16d23f63fd0 100644
--- a/spec/support/shared_contexts/finders/issues_finder_shared_contexts.rb
+++ b/spec/support/shared_contexts/finders/issues_finder_shared_contexts.rb
@@ -12,47 +12,55 @@ RSpec.shared_context 'IssuesFinder context' do
let_it_be(:milestone) { create(:milestone, project: project1, releases: [release]) }
let_it_be(:label) { create(:label, project: project2) }
let_it_be(:label2) { create(:label, project: project2) }
- let_it_be(:item1, reload: true) do
- create(:issue,
- author: user,
- assignees: [user],
- project: project1,
- milestone: milestone,
- title: 'gitlab',
- created_at: 1.week.ago,
- updated_at: 1.week.ago)
+ let_it_be_with_reload(:item1) do
+ create(
+ :issue,
+ author: user,
+ assignees: [user],
+ project: project1,
+ milestone: milestone,
+ title: 'gitlab',
+ created_at: 1.week.ago,
+ updated_at: 1.week.ago
+ )
end
- let_it_be(:item2, reload: true) do
- create(:issue,
- author: user,
- assignees: [user],
- project: project2,
- description: 'gitlab',
- created_at: 1.week.from_now,
- updated_at: 1.week.from_now)
+ let_it_be_with_reload(:item2) do
+ create(
+ :issue,
+ author: user,
+ assignees: [user],
+ project: project2,
+ description: 'gitlab',
+ created_at: 1.week.from_now,
+ updated_at: 1.week.from_now
+ )
end
- let_it_be(:item3, reload: true) do
- create(:issue,
- author: user2,
- assignees: [user2],
- project: project2,
- title: 'tanuki',
- description: 'tanuki',
- created_at: 2.weeks.from_now,
- updated_at: 2.weeks.from_now)
+ let_it_be_with_reload(:item3) do
+ create(
+ :issue,
+ author: user2,
+ assignees: [user2],
+ project: project2,
+ title: 'tanuki',
+ description: 'tanuki',
+ created_at: 2.weeks.from_now,
+ updated_at: 2.weeks.from_now
+ )
end
- let_it_be(:item4, reload: true) { create(:issue, project: project3) }
- let_it_be(:item5, reload: true) do
- create(:issue,
- author: user,
- assignees: [user],
- project: project1,
- title: 'wotnot',
- created_at: 3.days.ago,
- updated_at: 3.days.ago)
+ let_it_be_with_reload(:item4) { create(:issue, project: project3) }
+ let_it_be_with_reload(:item5) do
+ create(
+ :issue,
+ author: user,
+ assignees: [user],
+ project: project1,
+ title: 'wotnot',
+ created_at: 3.days.ago,
+ updated_at: 3.days.ago
+ )
end
let_it_be(:award_emoji1) { create(:award_emoji, name: 'thumbsup', user: user, awardable: item1) }
diff --git a/spec/support/shared_contexts/finders/merge_requests_finder_shared_contexts.rb b/spec/support/shared_contexts/finders/merge_requests_finder_shared_contexts.rb
index 8a64efe9df5..507bcd44ee8 100644
--- a/spec/support/shared_contexts/finders/merge_requests_finder_shared_contexts.rb
+++ b/spec/support/shared_contexts/finders/merge_requests_finder_shared_contexts.rb
@@ -54,34 +54,44 @@ RSpec.shared_context 'MergeRequestsFinder multiple projects with merge requests
let_it_be(:label2) { create(:label, project: project1) }
let!(:merge_request1) do
- create(:merge_request, assignees: [user], author: user, reviewers: [user2],
- source_project: project2, target_project: project1,
- target_branch: 'merged-target')
+ create(
+ :merge_request, assignees: [user], author: user, reviewers: [user2],
+ source_project: project2, target_project: project1,
+ target_branch: 'merged-target'
+ )
end
let!(:merge_request2) do
- create(:merge_request, :conflict, assignees: [user], author: user, reviewers: [user2],
- source_project: project2, target_project: project1,
- state: 'closed')
+ create(
+ :merge_request, :conflict, assignees: [user], author: user, reviewers: [user2],
+ source_project: project2, target_project: project1,
+ state: 'closed'
+ )
end
let!(:merge_request3) do
- create(:merge_request, :simple, author: user, assignees: [user2], reviewers: [user],
- source_project: project2, target_project: project2,
- state: 'locked',
- title: 'thing WIP thing')
+ create(
+ :merge_request, :simple, author: user, assignees: [user2], reviewers: [user],
+ source_project: project2, target_project: project2,
+ state: 'locked',
+ title: 'thing WIP thing'
+ )
end
let!(:merge_request4) do
- create(:merge_request, :simple, author: user,
- source_project: project3, target_project: project3,
- title: 'WIP thing')
+ create(
+ :merge_request, :simple, author: user,
+ source_project: project3, target_project: project3,
+ title: 'WIP thing'
+ )
end
let_it_be(:merge_request5) do
- create(:merge_request, :simple, author: user,
- source_project: project4, target_project: project4,
- title: '[WIP]')
+ create(
+ :merge_request, :simple, author: user,
+ source_project: project4, target_project: project4,
+ title: '[WIP]'
+ )
end
let!(:label_link) { create(:label_link, label: label, target: merge_request2) }
diff --git a/spec/support/shared_contexts/finders/work_items_finder_shared_contexts.rb b/spec/support/shared_contexts/finders/work_items_finder_shared_contexts.rb
index 8c5bc339db5..1118039d164 100644
--- a/spec/support/shared_contexts/finders/work_items_finder_shared_contexts.rb
+++ b/spec/support/shared_contexts/finders/work_items_finder_shared_contexts.rb
@@ -12,47 +12,55 @@ RSpec.shared_context 'WorkItemsFinder context' do
let_it_be(:milestone) { create(:milestone, project: project1, releases: [release]) }
let_it_be(:label) { create(:label, project: project2) }
let_it_be(:label2) { create(:label, project: project2) }
- let_it_be(:item1, reload: true) do
- create(:work_item,
- author: user,
- assignees: [user],
- project: project1,
- milestone: milestone,
- title: 'gitlab',
- created_at: 1.week.ago,
- updated_at: 1.week.ago)
+ let_it_be_with_reload(:item1) do
+ create(
+ :work_item,
+ author: user,
+ assignees: [user],
+ project: project1,
+ milestone: milestone,
+ title: 'gitlab',
+ created_at: 1.week.ago,
+ updated_at: 1.week.ago
+ )
end
- let_it_be(:item2, reload: true) do
- create(:work_item,
- author: user,
- assignees: [user],
- project: project2,
- description: 'gitlab',
- created_at: 1.week.from_now,
- updated_at: 1.week.from_now)
+ let_it_be_with_reload(:item2) do
+ create(
+ :work_item,
+ author: user,
+ assignees: [user],
+ project: project2,
+ description: 'gitlab',
+ created_at: 1.week.from_now,
+ updated_at: 1.week.from_now
+ )
end
- let_it_be(:item3, reload: true) do
- create(:work_item,
- author: user2,
- assignees: [user2],
- project: project2,
- title: 'tanuki',
- description: 'tanuki',
- created_at: 2.weeks.from_now,
- updated_at: 2.weeks.from_now)
+ let_it_be_with_reload(:item3) do
+ create(
+ :work_item,
+ author: user2,
+ assignees: [user2],
+ project: project2,
+ title: 'tanuki',
+ description: 'tanuki',
+ created_at: 2.weeks.from_now,
+ updated_at: 2.weeks.from_now
+ )
end
- let_it_be(:item4, reload: true) { create(:work_item, project: project3) }
- let_it_be(:item5, reload: true) do
- create(:work_item,
- author: user,
- assignees: [user],
- project: project1,
- title: 'wotnot',
- created_at: 3.days.ago,
- updated_at: 3.days.ago)
+ let_it_be_with_reload(:item4) { create(:work_item, project: project3) }
+ let_it_be_with_reload(:item5) do
+ create(
+ :work_item,
+ author: user,
+ assignees: [user],
+ project: project1,
+ title: 'wotnot',
+ created_at: 3.days.ago,
+ updated_at: 3.days.ago
+ )
end
let_it_be(:award_emoji1) { create(:award_emoji, name: 'thumbsup', user: user, awardable: item1) }
diff --git a/spec/support/shared_examples/finders/issues_finder_shared_examples.rb b/spec/support/shared_examples/finders/issues_finder_shared_examples.rb
index 93f9e42241b..b96d2a4b373 100644
--- a/spec/support/shared_examples/finders/issues_finder_shared_examples.rb
+++ b/spec/support/shared_examples/finders/issues_finder_shared_examples.rb
@@ -161,10 +161,12 @@ RSpec.shared_examples 'issues or work items finder' do |factory, execute_context
let_it_be(:another_release) { create(:release, project: project1, tag: 'v2.0.0') }
let_it_be(:another_milestone) { create(:milestone, project: project1, releases: [another_release]) }
let_it_be(:another_item) do
- create(factory,
- project: project1,
- milestone: another_milestone,
- title: 'another item')
+ create(
+ factory,
+ project: project1,
+ milestone: another_milestone,
+ title: 'another item'
+ )
end
let(:params) { { not: { release_tag: release.tag, project_id: project1.id } } }
@@ -421,8 +423,11 @@ RSpec.shared_examples 'issues or work items finder' do |factory, execute_context
let!(:created_items) do
milestones.map do |milestone|
- create(factory, project: milestone.project || project_in_group,
- milestone: milestone, author: user, assignees: [user])
+ create(
+ factory,
+ project: milestone.project || project_in_group,
+ milestone: milestone, author: user, assignees: [user]
+ )
end
end
diff --git a/spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb b/spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb
index 5abdac07431..cb544f42765 100644
--- a/spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb
+++ b/spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb
@@ -207,7 +207,7 @@ RSpec.shared_examples 'Generate Debian Distribution and component files' do
check_component_file(current_time.round, 'contrib', :sources, nil, nil)
- expected_main_amd64_size = expected_main_amd64_content.length
+ expected_main_amd64_size = expected_main_amd64_content.bytesize
expected_main_amd64_sha256 = Digest::SHA256.hexdigest(expected_main_amd64_content)
expected_main_amd64_di_size = expected_main_amd64_di_content.length
diff --git a/spec/tooling/danger/stable_branch_spec.rb b/spec/tooling/danger/stable_branch_spec.rb
index b6ec4ad8895..b0a8ab3c132 100644
--- a/spec/tooling/danger/stable_branch_spec.rb
+++ b/spec/tooling/danger/stable_branch_spec.rb
@@ -197,7 +197,7 @@ RSpec.describe Tooling::Danger::StableBranch, feature_category: :delivery do
let(:pipeline_bridges_response) do
[
{
- 'name' => 'e2e:package-and-test',
+ 'name' => 'e2e:package-and-test-ee',
'status' => pipeline_bridge_state,
'downstream_pipeline' => nil
}
diff --git a/tooling/danger/stable_branch.rb b/tooling/danger/stable_branch.rb
index be668731cb4..2751a6f0191 100644
--- a/tooling/danger/stable_branch.rb
+++ b/tooling/danger/stable_branch.rb
@@ -42,18 +42,18 @@ module Tooling
MSG
PIPELINE_EXPEDITE_ERROR_MESSAGE = <<~MSG
- ~"pipeline:expedite" is not allowed on stable branches because it causes the `e2e:package-and-test` job to be skipped.
+ ~"pipeline:expedite" is not allowed on stable branches because it causes the `e2e:package-and-test-ee` job to be skipped.
MSG
NEEDS_PACKAGE_AND_TEST_MESSAGE = <<~MSG
- The `e2e:package-and-test` job is not present, has been canceled, or needs to be automatically triggered.
+ The `e2e:package-and-test-ee` job is not present, has been canceled, or needs to be automatically triggered.
Please ensure the job is present in the latest pipeline, if necessary, retry the `danger-review` job.
- Read the "QA e2e:package-and-test" section for more details.
+ Read the "QA e2e:package-and-test-ee" section for more details.
MSG
WARN_PACKAGE_AND_TEST_MESSAGE = <<~MSG
- **The `e2e:package-and-test` job needs to succeed or have approval from a Software Engineer in Test.**
- Read the "QA e2e:package-and-test" section for more details.
+ **The `e2e:package-and-test-ee` job needs to succeed or have approval from a Software Engineer in Test.**
+ Read the "QA e2e:package-and-test-ee" section for more details.
MSG
# rubocop:disable Style/SignalException