diff options
45 files changed, 589 insertions, 969 deletions
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml index 1f6858020a0..2c833f0d65b 100644 --- a/.gitlab/ci/rules.gitlab-ci.yml +++ b/.gitlab/ci/rules.gitlab-ci.yml @@ -2136,107 +2136,6 @@ - <<: *if-merge-request changes: *code-backstage-qa-patterns -######################## -# GitLab monorepo gems # -######################## - -.gems:rules:activerecord-gitlab: - rules: - - <<: *if-merge-request - changes: ["gems/activerecord-gitlab/**/*"] - -.gems:rules:gitlab-rspec: - rules: - - <<: *if-merge-request - changes: ["gems/gitlab-rspec/**/*"] - -.gems:rules:gitlab-utils: - rules: - - <<: *if-merge-request - changes: ["gems/gitlab-utils/**/*"] - -####################### -# Vendored gems rules # -####################### - -.vendor:rules:mail-smtp_pool: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/mail-smtp_pool/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:attr_encrypted: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/attr_encrypted/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:microsoft_graph_mailer: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/microsoft_graph_mailer/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:ipynbdiff: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/ipynbdiff/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:omniauth-azure-oauth2: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/omniauth-azure-oauth2/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:omniauth_crowd: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/omniauth_crowd/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:omniauth-gitlab: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/omniauth-gitlab/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:omniauth-salesforce: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/omniauth-salesforce/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:devise-pbkdf2-encryptable: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/devise-pbkdf2-encryptable/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:gitlab_active_record: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/gitlab_active_record/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:bundler-checksum: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/bundler-checksum/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:cloud_profiler_agent: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/cloud_profiler_agent/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - -.vendor:rules:sidekiq-reliable-fetch: - rules: - - <<: *if-merge-request - changes: ["vendor/gems/sidekiq-reliable-fetch/**/*"] - - <<: *if-merge-request-labels-run-all-rspec - ################## # Releases rules # ################## diff --git a/.gitlab/ci/templates/gem.gitlab-ci.yml b/.gitlab/ci/templates/gem.gitlab-ci.yml index c5b1a1ecf45..1f995e8040f 100644 --- a/.gitlab/ci/templates/gem.gitlab-ci.yml +++ b/.gitlab/ci/templates/gem.gitlab-ci.yml @@ -2,18 +2,26 @@ # # Inputs: # - `gem_name`: The name of the gem, i.e. if the gem is located at `gems/gitlab-rspec`, `gem_name` should be set to `gitlab-rspec`. +# - `gem_path_prefix`: The prefix of the gem path, i.e. if the gem is located at `vendor/gems/gitlab-rspec`, `gem_path_prefix` should be set to `vendor/gems/`. Defaults to `gems/`. spec: inputs: gem_name: + gem_path_prefix: + default: "gems/" --- .gems:rules:$[[inputs.gem_name]]: rules: - if: '$CI_MERGE_REQUEST_EVENT_TYPE == "merged_result" || $CI_MERGE_REQUEST_EVENT_TYPE == "detached"' - changes: ["gems/$[[inputs.gem_name]]/**/*"] + changes: + - "$[[inputs.gem_path_prefix]]$[[inputs.gem_name]]/**/*" + - ".gitlab/ci/templates/gem.gitlab-ci.yml" + - "gems/gem.gitlab-ci.yml" gems $[[inputs.gem_name]]: - extends: .gems:rules:$[[inputs.gem_name]] + extends: ".gems:rules:$[[inputs.gem_name]]" needs: [] trigger: - include: gems/$[[inputs.gem_name]]/.gitlab-ci.yml + include: "$[[inputs.gem_path_prefix]]$[[inputs.gem_name]]/.gitlab-ci.yml" strategy: depend + inherit: + variables: false diff --git a/.gitlab/ci/vendored-gems.gitlab-ci.yml b/.gitlab/ci/vendored-gems.gitlab-ci.yml index 3773a343d6d..3c9dadb8332 100644 --- a/.gitlab/ci/vendored-gems.gitlab-ci.yml +++ b/.gitlab/ci/vendored-gems.gitlab-ci.yml @@ -1,103 +1,53 @@ -vendor mail-smtp_pool: - extends: - - .vendor:rules:mail-smtp_pool - needs: [] - trigger: - include: vendor/gems/mail-smtp_pool/.gitlab-ci.yml - strategy: depend - -vendor attr_encrypted: - extends: - - .vendor:rules:attr_encrypted - needs: [] - trigger: - include: vendor/gems/attr_encrypted/.gitlab-ci.yml - strategy: depend - -vendor microsoft_graph_mailer: - extends: - - .vendor:rules:microsoft_graph_mailer - needs: [] - trigger: - include: vendor/gems/microsoft_graph_mailer/.gitlab-ci.yml - strategy: depend - -vendor ipynbdiff: - extends: - - .vendor:rules:ipynbdiff - needs: [] - trigger: - include: vendor/gems/ipynbdiff/.gitlab-ci.yml - strategy: depend - -vendor omniauth-azure-oauth2: - extends: - - .vendor:rules:omniauth-azure-oauth2 - needs: [] - trigger: - include: vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml - strategy: depend - -vendor omniauth_crowd: - extends: - - .vendor:rules:omniauth_crowd - needs: [] - trigger: - include: vendor/gems/omniauth_crowd/.gitlab-ci.yml - strategy: depend - -vendor omniauth-gitlab: - extends: - - .vendor:rules:omniauth-gitlab - needs: [] - trigger: - include: vendor/gems/omniauth-gitlab/.gitlab-ci.yml - strategy: depend - -vendor omniauth-salesforce: - extends: - - .vendor:rules:omniauth-salesforce - needs: [] - trigger: - include: vendor/gems/omniauth-salesforce/.gitlab-ci.yml - strategy: depend - -vendor devise-pbkdf2-encryptable: - extends: - - .vendor:rules:devise-pbkdf2-encryptable - needs: [] - trigger: - include: vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml - strategy: depend - -vendor bundler-checksum: - extends: - - .vendor:rules:bundler-checksum - needs: [] - trigger: - include: vendor/gems/bundler-checksum/.gitlab-ci.yml - strategy: depend - -vendor gitlab_active_record: - extends: - - .vendor:rules:gitlab_active_record - needs: [] - trigger: - include: vendor/gems/gitlab_active_record/.gitlab-ci.yml - strategy: depend - -vendor cloud_profiler_agent: - extends: - - .vendor:rules:cloud_profiler_agent - needs: [] - trigger: - include: vendor/gems/cloud_profiler_agent/.gitlab-ci.yml - strategy: depend - -vendor sidekiq-reliable-fetch: - extends: - - .vendor:rules:sidekiq-reliable-fetch - needs: [] - trigger: - include: vendor/gems/sidekiq-reliable-fetch/.gitlab-ci.yml - strategy: depend +include: + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "mail-smtp_pool" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "attr_encrypted" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "microsoft_graph_mailer" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "ipynbdiff" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "omniauth-azure-oauth2" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "omniauth_crowd" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "omniauth-gitlab" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "omniauth-salesforce" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "devise-pbkdf2-encryptable" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "bundler-checksum" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "gitlab_active_record" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "cloud_profiler_agent" + gem_path_prefix: "vendor/gems/" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "sidekiq-reliable-fetch" + gem_path_prefix: "vendor/gems/" diff --git a/.gitlab/issue_templates/Analytics_Instrumentation_Incident_Template b/.gitlab/issue_templates/Analytics_Instrumentation_Incident_Template.md index 2ebd5acdcd4..2ebd5acdcd4 100644 --- a/.gitlab/issue_templates/Analytics_Instrumentation_Incident_Template +++ b/.gitlab/issue_templates/Analytics_Instrumentation_Incident_Template.md diff --git a/.rubocop_todo/rspec/before_all_role_assignment.yml b/.rubocop_todo/rspec/before_all_role_assignment.yml index 19b93eaad6d..8e3f8de920c 100644 --- a/.rubocop_todo/rspec/before_all_role_assignment.yml +++ b/.rubocop_todo/rspec/before_all_role_assignment.yml @@ -681,7 +681,7 @@ RSpec/BeforeAllRoleAssignment: - 'ee/spec/services/gitlab_subscriptions/reconciliations/calculate_seat_count_data_service_spec.rb' - 'ee/spec/services/group_saml/saml_group_links/create_service_spec.rb' - 'ee/spec/services/groups/destroy_service_spec.rb' - - 'ee/spec/services/groups/enterprise_users/create_service_spec.rb' + - 'ee/spec/services/groups/enterprise_users/associate_service_spec.rb' - 'ee/spec/services/groups/epics_count_service_spec.rb' - 'ee/spec/services/groups/transfer_service_spec.rb' - 'ee/spec/services/ide/schemas_config_service_spec.rb' diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss index b25a5b1c493..8b093e7bb7b 100644 --- a/app/assets/stylesheets/pages/commits.scss +++ b/app/assets/stylesheets/pages/commits.scss @@ -307,14 +307,6 @@ } } -.gpg-popover-user-link { - display: flex; - align-items: center; - margin-bottom: $gl-padding / 2; - text-decoration: none; - color: $gl-text-color; -} - .add-review-item { .gl-tab-nav-item { height: 100%; diff --git a/app/services/auto_merge/merge_when_pipeline_succeeds_service.rb b/app/services/auto_merge/merge_when_pipeline_succeeds_service.rb index 2bbb8f925a4..cb8e531f0e1 100644 --- a/app/services/auto_merge/merge_when_pipeline_succeeds_service.rb +++ b/app/services/auto_merge/merge_when_pipeline_succeeds_service.rb @@ -4,9 +4,7 @@ module AutoMerge class MergeWhenPipelineSucceedsService < AutoMerge::BaseService def execute(merge_request) super do - if merge_request.saved_change_to_auto_merge_enabled? - SystemNoteService.merge_when_pipeline_succeeds(merge_request, project, current_user, merge_request.actual_head_pipeline.sha) - end + add_system_note(merge_request) end end @@ -36,12 +34,20 @@ module AutoMerge def available_for?(merge_request) super do - merge_request.actual_head_pipeline&.active? + check_availability(merge_request) end end private + def add_system_note(merge_request) + SystemNoteService.merge_when_pipeline_succeeds(merge_request, project, current_user, merge_request.actual_head_pipeline.sha) if merge_request.saved_change_to_auto_merge_enabled? + end + + def check_availability(merge_request) + merge_request.actual_head_pipeline&.active? + end + def notify(merge_request) notification_service.async.merge_when_pipeline_succeeds(merge_request, current_user) if merge_request.saved_change_to_auto_merge_enabled? end diff --git a/app/services/system_notes/merge_requests_service.rb b/app/services/system_notes/merge_requests_service.rb index 7758c1e8597..d71388a1552 100644 --- a/app/services/system_notes/merge_requests_service.rb +++ b/app/services/system_notes/merge_requests_service.rb @@ -181,3 +181,5 @@ module SystemNotes end end end + +SystemNotes::MergeRequestsService.prepend_mod_with('SystemNotes::MergeRequestsService') diff --git a/app/views/projects/commit/_signature_badge_user.html.haml b/app/views/projects/commit/_signature_badge_user.html.haml deleted file mode 100644 index 656adef6a72..00000000000 --- a/app/views/projects/commit/_signature_badge_user.html.haml +++ /dev/null @@ -1,21 +0,0 @@ -- user = signature.signed_by_user - -- if user - = link_to user_path(user), class: 'gpg-popover-user-link' do - %div - = user_avatar_without_link(user: user, size: 32) - - %div - %strong= user.name - %div= user.to_reference -- elsif signature.gpg? # SSH signatures do not have an email embedded in them - - user_name = signature.gpg_key_user_name - - user_email = signature.gpg_key_user_email - - if user_name && user_email - = mail_to user_email do - %div - = user_avatar_without_link(user_name: user_name, user_email: user_email, size: 32) - - %div - %strong= user_name - %div= user_email diff --git a/app/views/projects/commit/x509/_signature_badge_user.html.haml b/app/views/projects/commit/x509/_signature_badge_user.html.haml deleted file mode 100644 index da749172369..00000000000 --- a/app/views/projects/commit/x509/_signature_badge_user.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -- user_email = signature.x509_certificate.email -- user = signature.signed_by_user - -- if user - = link_to user_path(user), class: 'gpg-popover-user-link' do - %div - = user_avatar_without_link(user: user, size: 32) - - %div - %strong= user.name - %div= user.to_reference - -- else - = mail_to user_email do - %div - = user_avatar_without_link(user_email: user_email, size: 32) - - %div - %strong= user_email diff --git a/config/feature_flags/development/introduce_rules_with_needs.yml b/config/feature_flags/development/introduce_rules_with_needs.yml deleted file mode 100644 index 8b2940438ee..00000000000 --- a/config/feature_flags/development/introduce_rules_with_needs.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: introduce_rules_with_needs -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/112725 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/394769 -milestone: '16.0' -type: development -group: group::pipeline authoring -default_enabled: false diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md index 4a08a9b0a0b..0db2fb0320f 100644 --- a/doc/ci/yaml/index.md +++ b/doc/ci/yaml/index.md @@ -3740,7 +3740,8 @@ If the rule matches, then the job is a manual job with `allow_failure: true`. #### `rules:needs` -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31581) in GitLab 16.0 [with a flag](../../user/feature_flags.md) named `introduce_rules_with_needs`. Disabled by default. +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31581) in GitLab 16.0 [with a flag](../../user/feature_flags.md) named `introduce_rules_with_needs`. Disabled by default. +> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/408871) in GitLab 16.2. Feature flag `introduce_rules_with_needs` removed. Use `needs` in rules to update a job's [`needs`](#needs) for specific conditions. When a condition matches a rule, the job's `needs` configuration is completely replaced with the `needs` in the rule. diff --git a/doc/user/project/integrations/mlflow_client.md b/doc/user/project/integrations/mlflow_client.md index 7afb0f51227..9d354c9a2d9 100644 --- a/doc/user/project/integrations/mlflow_client.md +++ b/doc/user/project/integrations/mlflow_client.md @@ -33,7 +33,7 @@ To enable MLflow client integration: This can be your local environment, CI pipeline, or remote host. For example: ```shell - export MLFLOW_TRACKING_URI="http://<your gitlab endpoint>/api/v4/projects/<your project id>/ml/mlflow" + export MLFLOW_TRACKING_URI="<your gitlab endpoint>/api/v4/projects/<your project id>/ml/mlflow" export MLFLOW_TRACKING_TOKEN="<your_access_token>" ``` diff --git a/gems/gem.gitlab-ci.yml b/gems/gem.gitlab-ci.yml index 63be78c6edb..8a0518fa415 100644 --- a/gems/gem.gitlab-ci.yml +++ b/gems/gem.gitlab-ci.yml @@ -2,40 +2,64 @@ # # Inputs # - `gem_name`: The name of the gem, i.e. if the gem is located at `gems/gitlab-rspec`, `gem_name` should be set to `gitlab-rspec`. +# - `gem_path_prefix`: The prefix of the gem path, i.e. if the gem is located at `vendor/gems/gitlab-rspec`, `gem_path_prefix` should be set to `vendor/gems/`. Defaults to `gems/`. spec: inputs: gem_name: + gem_path_prefix: + default: "gems/" --- workflow: + name: '$PIPELINE_NAME' rules: - if: $CI_MERGE_REQUEST_ID + variables: + PIPELINE_NAME: '[$[[inputs.gem_name]] gem] Ruby $RUBY_VERSION $CI_MERGE_REQUEST_EVENT_TYPE MR pipeline' + +variables: + GIT_DEPTH: "20" + # 'GIT_STRATEGY: clone' optimizes the pack-objects cache hit ratio + GIT_STRATEGY: "clone" + GIT_SUBMODULE_STRATEGY: "none" + GET_SOURCES_ATTEMPTS: "3" + # Default Ruby version for jobs that don't use .ruby_matrix + RUBY_VERSION: "3.1" default: image: "ruby:${RUBY_VERSION}" cache: key: "$[[inputs.gem_name]]-${RUBY_VERSION}" paths: - - "gems/$[[inputs.gem_name]]/vendor/ruby" + - "$[[inputs.gem_path_prefix]]$[[inputs.gem_name]]/vendor/ruby" before_script: - - cd gems/$[[inputs.gem_name]] + - cd $[[inputs.gem_path_prefix]]$[[inputs.gem_name]] - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image + - bundle_version=$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n 1 | sed -e 's/[[:space:]]//') + - gem install bundler --version $bundle_version --no-document # Bundler is not installed with the image - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - bundle config # Show bundler configuration - - bundle install -j $(nproc) + - bundle install --jobs=$(nproc) --retry=3 -rubocop: - script: - - bundle exec rubocop --config .rubocop.yml +.ruby_matrix: parallel: matrix: - RUBY_VERSION: ["3.0", "3.1", "3.2"] +rubocop: + extends: .ruby_matrix + rules: + - exists: ["$[[inputs.gem_path_prefix]]$[[inputs.gem_name]]/.rubocop.yml"] + script: + - bundle exec rubocop --config .rubocop.yml + rspec: + extends: .ruby_matrix script: - bundle exec rspec - parallel: - matrix: - - RUBY_VERSION: ["3.0", "3.1", "3.2"] + coverage: '/LOC \((\d+\.\d+%)\) covered.$/' + artifacts: + expire_in: 31d + when: always + paths: + - coverage/ diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index df080c8e666..b616f1b35b3 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -657,6 +657,19 @@ module API Gitlab::AppLogger.warn("Redis tracking event failed for event: #{event_name}, message: #{error.message}") end + def track_event(event_name, user_id:, namespace_id: nil, project_id: nil) + return unless user_id.present? + + Gitlab::InternalEvents.track_event( + event_name, + user_id: user_id, + namespace_id: namespace_id, + project_id: project_id + ) + rescue StandardError => error + Gitlab::AppLogger.warn("Internal Event tracking event failed for event: #{event_name}, message: #{error.message}") + end + def order_by_similarity?(allow_unauthorized: true) params[:order_by] == 'similarity' && params[:search].present? && (allow_unauthorized || current_user.present?) end diff --git a/lib/api/usage_data.rb b/lib/api/usage_data.rb index 3e2023d769f..0a343093c33 100644 --- a/lib/api/usage_data.rb +++ b/lib/api/usage_data.rb @@ -53,6 +53,38 @@ module API status :ok end + desc 'Track gitlab internal events' do + detail 'This feature was introduced in GitLab 16.2.' + success code: 200 + failure [ + { code: 403, message: 'Invalid CSRF token is provided' }, + { code: 404, message: 'Not found' } + ] + tags %w[usage_data] + end + params do + requires :event, type: String, desc: 'The event name that should be tracked', + documentation: { example: 'i_quickactions_page' } + optional :namespace_id, type: Integer, desc: 'Namespace ID', + documentation: { example: 1234 } + optional :project_id, type: Integer, desc: 'Project ID', + documentation: { example: 1234 } + end + post 'track_event', urgency: :low do + event_name = params[:event] + namespace_id = params[:namespace_id] + project_id = params[:project_id] + + track_event( + event_name, + user_id: current_user.id, + namespace_id: namespace_id, + project_id: project_id + ) + + status :ok + end + desc 'Get a list of all metric definitions' do detail 'This feature was introduced in GitLab 13.11.' success code: 200 diff --git a/lib/gitlab/ci/build/rules.rb b/lib/gitlab/ci/build/rules.rb index 17b9f30db33..8b503290e6e 100644 --- a/lib/gitlab/ci/build/rules.rb +++ b/lib/gitlab/ci/build/rules.rb @@ -32,18 +32,13 @@ module Gitlab if @rule_list.nil? Result.new(when: @default_when) elsif matched_rule = match_rule(pipeline, context) - result = Result.new( + Result.new( when: matched_rule.attributes[:when] || @default_when, start_in: matched_rule.attributes[:start_in], allow_failure: matched_rule.attributes[:allow_failure], - variables: matched_rule.attributes[:variables] + variables: matched_rule.attributes[:variables], + needs: matched_rule.attributes[:needs] ) - - if Feature.enabled?(:introduce_rules_with_needs, pipeline.project) - result.needs = matched_rule.attributes[:needs] - end - - result else Result.new(when: 'never') end diff --git a/lib/gitlab/sidekiq_middleware/server_metrics.rb b/lib/gitlab/sidekiq_middleware/server_metrics.rb index b3c3c94a0a3..d10ac2799a8 100644 --- a/lib/gitlab/sidekiq_middleware/server_metrics.rb +++ b/lib/gitlab/sidekiq_middleware/server_metrics.rb @@ -18,7 +18,7 @@ module Gitlab SIDEKIQ_QUEUE_DURATION_BUCKETS = [10, 60].freeze # These labels from Gitlab::SidekiqMiddleware::MetricsHelper are included in SLI metrics - SIDEKIQ_SLI_LABELS = [:worker, :feature_category, :urgency].freeze + SIDEKIQ_SLI_LABELS = [:worker, :feature_category, :urgency, :external_dependencies].freeze class << self include ::Gitlab::SidekiqMiddleware::MetricsHelper diff --git a/spec/factories/audit_events.rb b/spec/factories/audit_events.rb index 10f60591922..ceb7516441f 100644 --- a/spec/factories/audit_events.rb +++ b/spec/factories/audit_events.rb @@ -88,6 +88,29 @@ FactoryBot.define do end end + trait :instance_event do + transient { instance_scope { Gitlab::Audit::InstanceScope.new } } + + entity_type { Gitlab::Audit::InstanceScope.name } + entity_id { instance_scope.id } + entity_path { instance_scope.full_path } + target_details { instance_scope.name } + ip_address { IPAddr.new '127.0.0.1' } + details do + { + change: 'project_creation_level', + from: nil, + to: 'Developers + Maintainers', + author_name: user.name, + target_id: instance_scope.id, + target_type: Gitlab::Audit::InstanceScope.name, + target_details: instance_scope.name, + ip_address: '127.0.0.1', + entity_path: instance_scope.full_path + } + end + end + factory :project_audit_event, traits: [:project_event] factory :group_audit_event, traits: [:group_event] end diff --git a/spec/lib/api/helpers_spec.rb b/spec/lib/api/helpers_spec.rb index 40e80299033..667ee72f821 100644 --- a/spec/lib/api/helpers_spec.rb +++ b/spec/lib/api/helpers_spec.rb @@ -609,6 +609,39 @@ RSpec.describe API::Helpers, feature_category: :shared do end end + describe '#track_event' do + let(:user_id) { 345 } + let(:namespace_id) { 12 } + let(:project_id) { 56 } + let(:event_name) { 'i_compliance_dashboard' } + let(:unknown_event) { 'unknown' } + + it 'tracks internal event' do + expect(Gitlab::InternalEvents).to receive(:track_event).with( + event_name, + user_id: user_id, + namespace_id: namespace_id, + project_id: project_id + ) + + helper.track_event(event_name, user_id: user_id, namespace_id: namespace_id, project_id: project_id) + end + + it 'logs an exception for unknown event' do + expect(Gitlab::AppLogger).to receive(:warn).with( + "Internal Event tracking event failed for event: #{unknown_event}, message: Unknown event: #{unknown_event}" + ) + + helper.track_event(unknown_event, user_id: user_id, namespace_id: namespace_id, project_id: project_id) + end + + it 'does not track event for nil user_id' do + expect(Gitlab::InternalEvents).not_to receive(:track_event) + + helper.track_event(unknown_event, user_id: nil, namespace_id: namespace_id, project_id: project_id) + end + end + shared_examples '#order_options_with_tie_breaker' do subject { Class.new.include(described_class).new.order_options_with_tie_breaker } diff --git a/spec/lib/gitlab/ci/build/rules_spec.rb b/spec/lib/gitlab/ci/build/rules_spec.rb index 9f191fed581..99577539798 100644 --- a/spec/lib/gitlab/ci/build/rules_spec.rb +++ b/spec/lib/gitlab/ci/build/rules_spec.rb @@ -244,59 +244,6 @@ RSpec.describe Gitlab::Ci::Build::Rules, feature_category: :pipeline_composition when: 'never' }])) } end - - context 'when feature flag is disabled' do - before do - stub_feature_flags(introduce_rules_with_needs: false) - end - - context 'with needs' do - context 'when single need is specified' do - let(:rule_list) do - [{ if: '$VAR == null', needs: [{ name: 'test', artifacts: true, optional: false }] }] - end - - it { - is_expected.to eq(described_class::Result.new(when: 'on_success')) - } - end - - context 'when multiple needs are specified' do - let(:rule_list) do - [{ if: '$VAR == null', - needs: [{ name: 'test', artifacts: true, optional: false }, - { name: 'rspec', artifacts: true, optional: false }] }] - end - - it { - is_expected.to eq(described_class::Result.new(when: 'on_success')) - } - end - - context 'when there are no needs specified' do - let(:rule_list) { [{ if: '$VAR == null' }] } - - it { - is_expected.to eq(described_class::Result.new(when: 'on_success')) - } - end - - context 'when need is specified with additional attibutes' do - let(:rule_list) do - [{ if: '$VAR == null', needs: [{ - artifacts: false, - name: 'test', - optional: true, - when: 'never' - }] }] - end - - it { - is_expected.to eq(described_class::Result.new(when: 'on_success')) - } - end - end - end end context 'with variables' do diff --git a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb index 5c85f9388f9..9e4df5198a9 100644 --- a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb +++ b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb @@ -72,12 +72,14 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do { worker: 'MergeWorker', urgency: 'high', - feature_category: 'source_code_management' + feature_category: 'source_code_management', + external_dependencies: 'no' }, { worker: 'Ci::BuildFinishedWorker', urgency: 'high', - feature_category: 'continuous_integration' + feature_category: 'continuous_integration', + external_dependencies: 'no' } ]) @@ -162,10 +164,12 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do expect(sidekiq_mem_total_bytes).to receive(:set).with(labels_with_job_status, mem_total_bytes) expect(Gitlab::Metrics::SidekiqSlis).to receive(:record_execution_apdex).with(labels.slice(:worker, :feature_category, - :urgency), monotonic_time_duration) + :urgency, + :external_dependencies), monotonic_time_duration) expect(Gitlab::Metrics::SidekiqSlis).to receive(:record_execution_error).with(labels.slice(:worker, :feature_category, - :urgency), false) + :urgency, + :external_dependencies), false) subject.call(worker, job, :test) { nil } end @@ -221,7 +225,8 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do expect(Gitlab::Metrics::SidekiqSlis).not_to receive(:record_execution_apdex) expect(Gitlab::Metrics::SidekiqSlis).to receive(:record_execution_error).with(labels.slice(:worker, :feature_category, - :urgency), true) + :urgency, + :external_dependencies), true) expect { subject.call(worker, job, :test) { raise StandardError, "Failed" } }.to raise_error(StandardError, "Failed") end diff --git a/spec/requests/api/graphql/gitlab_schema_spec.rb b/spec/requests/api/graphql/gitlab_schema_spec.rb index c5286b93251..ad21006f99a 100644 --- a/spec/requests/api/graphql/gitlab_schema_spec.rb +++ b/spec/requests/api/graphql/gitlab_schema_spec.rb @@ -264,8 +264,8 @@ RSpec.describe 'GitlabSchema configurations', feature_category: :integrations do let(:headers) { {} } before do - allow(GitlabSchema).to receive(:execute).and_wrap_original do |method, *args| - mock_schema.execute(*args) + allow(GitlabSchema).to receive(:execute).and_wrap_original do |method, *args, **kwargs| + mock_schema.execute(*args, **kwargs) end end diff --git a/spec/requests/api/usage_data_spec.rb b/spec/requests/api/usage_data_spec.rb index 935ddbf4764..c8f1e8d6973 100644 --- a/spec/requests/api/usage_data_spec.rb +++ b/spec/requests/api/usage_data_spec.rb @@ -164,6 +164,61 @@ RSpec.describe API::UsageData, feature_category: :service_ping do end end + describe 'POST /usage_data/track_event' do + let(:endpoint) { '/usage_data/track_event' } + let(:known_event) { 'i_compliance_dashboard' } + let(:unknown_event) { 'unknown' } + let(:namespace_id) { 123 } + let(:project_id) { 123 } + + context 'without CSRF token' do + it 'returns forbidden' do + allow(Gitlab::RequestForgeryProtection).to receive(:verified?).and_return(false) + + post api(endpoint, user), params: { event: known_event, namespace_id: namespace_id, project_id: project_id } + + expect(response).to have_gitlab_http_status(:forbidden) + end + end + + context 'usage_data_api feature not enabled' do + it 'returns not_found' do + stub_feature_flags(usage_data_api: false) + + post api(endpoint, user), params: { event: known_event, namespace_id: namespace_id, project_id: project_id } + + expect(response).to have_gitlab_http_status(:not_found) + end + end + + context 'without authentication' do + it 'returns 401 response' do + post api(endpoint), params: { event: known_event, namespace_id: namespace_id, project_id: project_id } + + expect(response).to have_gitlab_http_status(:unauthorized) + end + end + + context 'with authentication' do + before do + stub_application_setting(usage_ping_enabled: true) + allow(Gitlab::RequestForgeryProtection).to receive(:verified?).and_return(true) + end + + context 'with correct params' do + it 'returns status ok' do + expect(Gitlab::InternalEvents).to receive(:track_event).with(known_event, anything) + # allow other events to also get triggered + allow(Gitlab::InternalEvents).to receive(:track_event) + + post api(endpoint, user), params: { event: known_event, namespace_id: namespace_id, project_id: project_id } + + expect(response).to have_gitlab_http_status(:ok) + end + end + end + end + describe 'GET /usage_data/metric_definitions' do let(:endpoint) { '/usage_data/metric_definitions' } let(:metric_yaml) do diff --git a/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb b/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb index a0b22267960..79c931990bb 100644 --- a/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb +++ b/spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb @@ -3,30 +3,7 @@ require 'spec_helper' RSpec.describe AutoMerge::MergeWhenPipelineSucceedsService, feature_category: :code_review_workflow do - let_it_be(:user) { create(:user) } - let_it_be(:project) { create(:project, :repository) } - - let(:mr_merge_if_green_enabled) do - create(:merge_request, merge_when_pipeline_succeeds: true, merge_user: user, - source_branch: "master", target_branch: 'feature', - source_project: project, target_project: project, state: "opened") - end - - let(:pipeline) do - create(:ci_pipeline, ref: mr_merge_if_green_enabled.source_branch, project: project) - end - - let(:service) do - described_class.new(project, user, commit_message: 'Awesome message') - end - - before_all do - project.add_maintainer(user) - end - - before do - allow(MergeWorker).to receive(:with_status).and_return(MergeWorker) - end + include_context 'for auto_merge strategy context' describe "#available_for?" do subject { service.available_for?(mr_merge_if_green_enabled) } @@ -64,152 +41,24 @@ RSpec.describe AutoMerge::MergeWhenPipelineSucceedsService, feature_category: :c end describe "#execute" do - let(:merge_request) do - create(:merge_request, target_project: project, source_project: project, - source_branch: "feature", target_branch: 'master') - end - - context 'first time enabling' do - before do - allow(merge_request) - .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline) - expect(MailScheduler::NotificationServiceWorker).to receive(:perform_async).with('merge_when_pipeline_succeeds', merge_request, user).once - - service.execute(merge_request) - end - - it 'sets the params, merge_user, and flag' do - expect(merge_request).to be_valid - expect(merge_request.merge_when_pipeline_succeeds).to be_truthy - expect(merge_request.merge_params).to include 'commit_message' => 'Awesome message' - expect(merge_request.merge_user).to be user - expect(merge_request.auto_merge_strategy).to eq AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS - end - - it 'creates a system note' do - pipeline = build(:ci_pipeline) - allow(merge_request).to receive(:actual_head_pipeline) { pipeline } - - note = merge_request.notes.last - expect(note.note).to match "enabled an automatic merge when the pipeline for #{pipeline.sha}" - end - end - - context 'already approved' do - let(:service) { described_class.new(project, user, should_remove_source_branch: true) } - let(:build) { create(:ci_build, ref: mr_merge_if_green_enabled.source_branch) } - - before do - allow(mr_merge_if_green_enabled) - .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline) - - allow(mr_merge_if_green_enabled).to receive(:mergeable?) - .and_return(true) - - allow(pipeline).to receive(:success?).and_return(true) - end - - it 'updates the merge params' do - expect(SystemNoteService).not_to receive(:merge_when_pipeline_succeeds) - expect(MailScheduler::NotificationServiceWorker).not_to receive(:perform_async).with('merge_when_pipeline_succeeds', any_args) - - service.execute(mr_merge_if_green_enabled) - expect(mr_merge_if_green_enabled.merge_params).to have_key('should_remove_source_branch') + it_behaves_like 'auto_merge service #execute', 'merge_when_pipeline_succeeds' do + let(:auto_merge_strategy) { AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS } + let(:expected_note) do + "enabled an automatic merge when the pipeline for #{pipeline.sha}" end end end describe "#process" do - let(:merge_request_ref) { mr_merge_if_green_enabled.source_branch } - let(:merge_request_head) do - project.commit(mr_merge_if_green_enabled.source_branch).id - end - - context 'when triggered by pipeline with valid ref and sha' do - let(:triggering_pipeline) do - create(:ci_pipeline, project: project, ref: merge_request_ref, - sha: merge_request_head, status: 'success', - head_pipeline_of: mr_merge_if_green_enabled) - end - - it "merges all merge requests with merge when the pipeline succeeds enabled" do - allow(mr_merge_if_green_enabled) - .to receive_messages(head_pipeline: triggering_pipeline, actual_head_pipeline: triggering_pipeline) - - expect(MergeWorker).to receive(:perform_async) - service.process(mr_merge_if_green_enabled) - end - end - - context 'when triggered by an old pipeline' do - let(:old_pipeline) do - create(:ci_pipeline, project: project, ref: merge_request_ref, - sha: '1234abcdef', status: 'success') - end - - it 'does not merge request' do - expect(MergeWorker).not_to receive(:perform_async) - service.process(mr_merge_if_green_enabled) - end - end - - context 'when triggered by pipeline from a different branch' do - let(:unrelated_pipeline) do - create(:ci_pipeline, project: project, ref: 'feature', - sha: merge_request_head, status: 'success') - end - - it 'does not merge request' do - expect(MergeWorker).not_to receive(:perform_async) - service.process(mr_merge_if_green_enabled) - end - end - - context 'when pipeline is merge request pipeline' do - let(:pipeline) do - create(:ci_pipeline, :success, - source: :merge_request_event, - ref: mr_merge_if_green_enabled.merge_ref_path, - merge_request: mr_merge_if_green_enabled, - merge_requests_as_head_pipeline: [mr_merge_if_green_enabled]) - end - - it 'merges the associated merge request' do - allow(mr_merge_if_green_enabled) - .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline) - - expect(MergeWorker).to receive(:perform_async) - service.process(mr_merge_if_green_enabled) - end - end + it_behaves_like 'auto_merge service #process' end - describe "#cancel" do - before do - service.cancel(mr_merge_if_green_enabled) - end - - it "resets all the pipeline succeeds params" do - expect(mr_merge_if_green_enabled.merge_when_pipeline_succeeds).to be_falsey - expect(mr_merge_if_green_enabled.merge_params).to eq({}) - expect(mr_merge_if_green_enabled.merge_user).to be nil - end - - it 'posts a system note' do - note = mr_merge_if_green_enabled.notes.last - expect(note.note).to include 'canceled the automatic merge' - end + describe '#cancel' do + it_behaves_like 'auto_merge service #cancel' end - describe "#abort" do - before do - service.abort(mr_merge_if_green_enabled, 'an error') - end - - it 'posts a system note' do - note = mr_merge_if_green_enabled.notes.last - expect(note.note).to include 'aborted the automatic merge' - end + describe '#abort' do + it_behaves_like 'auto_merge service #abort' end describe 'pipeline integration' do diff --git a/spec/services/ci/create_pipeline_service/rules_spec.rb b/spec/services/ci/create_pipeline_service/rules_spec.rb index 87112137675..a81d1487fab 100644 --- a/spec/services/ci/create_pipeline_service/rules_spec.rb +++ b/spec/services/ci/create_pipeline_service/rules_spec.rb @@ -452,42 +452,6 @@ RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectnes expect(job4.needs).to contain_exactly(an_object_having_attributes(name: 'job3')) end end - - context 'when the FF introduce_rules_with_needs is disabled' do - before do - stub_feature_flags(introduce_rules_with_needs: false) - end - - context 'when the `$var` rule matches' do - it 'creates a pipeline without overridden needs' do - expect(pipeline).to be_persisted - expect(build_names).to contain_exactly('job1', 'job2', 'job3', 'job4') - - expect(job1.needs).to be_empty - expect(job2.needs).to be_empty - expect(job3.needs).to be_empty - expect(job4.needs).to contain_exactly(an_object_having_attributes(name: 'job1')) - end - end - - context 'when the `$var` rule does not match' do - let(:initialization_params) { base_initialization_params.merge(variables_attributes: variables_attributes) } - - let(:variables_attributes) do - [{ key: 'var', secret_value: 'SOME_VAR' }] - end - - it 'creates a pipeline without overridden needs' do - expect(pipeline).to be_persisted - expect(build_names).to contain_exactly('job1', 'job2', 'job3', 'job4') - - expect(job1.needs).to be_empty - expect(job2.needs).to be_empty - expect(job3.needs).to be_empty - expect(job4.needs).to contain_exactly(an_object_having_attributes(name: 'job1')) - end - end - end end end diff --git a/spec/services/ci/pipeline_trigger_service_spec.rb b/spec/services/ci/pipeline_trigger_service_spec.rb index b6e07e82bb5..fbd1a765351 100644 --- a/spec/services/ci/pipeline_trigger_service_spec.rb +++ b/spec/services/ci/pipeline_trigger_service_spec.rb @@ -23,8 +23,8 @@ RSpec.describe Ci::PipelineTriggerService, feature_category: :continuous_integra shared_examples 'detecting an unprocessable pipeline trigger' do context 'when the pipeline was not created successfully' do let(:fail_pipeline) do - receive(:execute).and_wrap_original do |original, *args| - response = original.call(*args) + receive(:execute).and_wrap_original do |original, *args, **kwargs| + response = original.call(*args, **kwargs) pipeline = response.payload pipeline.update!(failure_reason: 'unknown_failure') diff --git a/spec/services/packages/cleanup/execute_policy_service_spec.rb b/spec/services/packages/cleanup/execute_policy_service_spec.rb index a083dc0d4ea..249fd50588f 100644 --- a/spec/services/packages/cleanup/execute_policy_service_spec.rb +++ b/spec/services/packages/cleanup/execute_policy_service_spec.rb @@ -122,13 +122,13 @@ RSpec.describe Packages::Cleanup::ExecutePolicyService, feature_category: :packa def mock_service_timeout(on_iteration:) execute_call_count = 1 expect_next_instances_of(::Packages::MarkPackageFilesForDestructionService, 3) do |service| - expect(service).to receive(:execute).and_wrap_original do |m, *args| + expect(service).to receive(:execute).and_wrap_original do |m, *args, **kwargs| # timeout if we are on the right iteration if execute_call_count == on_iteration service_timeout_response else execute_call_count += 1 - m.call(*args) + m.call(*args, **kwargs) end end end diff --git a/spec/simplecov_env.rb b/spec/simplecov_env.rb index 098c38ff212..47a2f43e30c 100644 --- a/spec/simplecov_env.rb +++ b/spec/simplecov_env.rb @@ -70,7 +70,6 @@ module SimpleCovEnv add_group 'Fixtures', %r{^/(ee/)?db/fixtures} add_group 'GraphQL', %r{^/(ee/)?app/graphql} add_group 'Helpers', %r{^/(ee/)?app/helpers} - add_group 'Initializers', %r{^/(ee/)?config/(initializers|initializers_before_autoloader)} add_group 'Libraries', %r{^/(ee/)?lib} add_group 'Mailers', %r{^/(ee/)?app/mailers} add_group 'Metrics server', %r{^/(ee/)?metrics_server} diff --git a/spec/support/shared_examples/services/auto_merge_shared_examples.rb b/spec/support/shared_examples/services/auto_merge_shared_examples.rb new file mode 100644 index 00000000000..b295b65fdd1 --- /dev/null +++ b/spec/support/shared_examples/services/auto_merge_shared_examples.rb @@ -0,0 +1,182 @@ +# frozen_string_literal: true + +RSpec.shared_context 'for auto_merge strategy context' do + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, :repository) } + + let(:mr_merge_if_green_enabled) do + create(:merge_request, + merge_when_pipeline_succeeds: true, + merge_user: user, + source_branch: 'master', target_branch: 'feature', + source_project: project, target_project: project, + state: 'opened') + end + + let(:pipeline) { create(:ci_pipeline, ref: mr_merge_if_green_enabled.source_branch, project: project) } + + let(:service) { described_class.new(project, user, commit_message: 'Awesome message') } + + before_all do + project.add_maintainer(user) + end + + before do + allow(MergeWorker).to receive(:with_status).and_return(MergeWorker) + end +end + +RSpec.shared_examples 'auto_merge service #execute' do + let(:merge_request) do + create(:merge_request, target_project: project, source_project: project, + source_branch: 'feature', target_branch: 'master') + end + + context 'when first time enabling' do + before do + allow(merge_request) + .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline) + allow(MailScheduler::NotificationServiceWorker).to receive(:perform_async) + + service.execute(merge_request) + end + + it 'sets the params, merge_user, and flag' do + expect(merge_request).to be_valid + expect(merge_request.merge_when_pipeline_succeeds).to be_truthy + expect(merge_request.merge_params).to include 'commit_message' => 'Awesome message' + expect(merge_request.merge_user).to be user + expect(merge_request.auto_merge_strategy).to eq auto_merge_strategy + end + + it 'schedules a notification' do + expect(MailScheduler::NotificationServiceWorker).to have_received(:perform_async).with( + 'merge_when_pipeline_succeeds', merge_request, user).once + end + + it 'creates a system note' do + pipeline = build(:ci_pipeline) + allow(merge_request).to receive(:actual_head_pipeline) { pipeline } + + note = merge_request.notes.last + expect(note.note).to match expected_note + end + end + + context 'when already approved' do + let(:service) { described_class.new(project, user, should_remove_source_branch: true) } + let(:build) { create(:ci_build, ref: mr_merge_if_green_enabled.source_branch) } + + before do + allow(mr_merge_if_green_enabled) + .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline) + + allow(mr_merge_if_green_enabled).to receive(:mergeable?) + .and_return(true) + + allow(pipeline).to receive(:success?).and_return(true) + end + + it 'updates the merge params' do + expect(SystemNoteService).not_to receive(:merge_when_pipeline_succeeds) + expect(MailScheduler::NotificationServiceWorker).not_to receive(:perform_async).with( + 'merge_when_pipeline_succeeds', any_args) + + service.execute(mr_merge_if_green_enabled) + expect(mr_merge_if_green_enabled.merge_params).to have_key('should_remove_source_branch') + end + end +end + +RSpec.shared_examples 'auto_merge service #process' do + let(:merge_request_ref) { mr_merge_if_green_enabled.source_branch } + let(:merge_request_head) do + project.commit(mr_merge_if_green_enabled.source_branch).id + end + + context 'when triggered by pipeline with valid ref and sha' do + let(:triggering_pipeline) do + create(:ci_pipeline, project: project, ref: merge_request_ref, + sha: merge_request_head, status: 'success', + head_pipeline_of: mr_merge_if_green_enabled) + end + + it "merges all merge requests with merge when the pipeline succeeds enabled" do + allow(mr_merge_if_green_enabled) + .to receive_messages(head_pipeline: triggering_pipeline, actual_head_pipeline: triggering_pipeline) + + expect(MergeWorker).to receive(:perform_async) + service.process(mr_merge_if_green_enabled) + end + end + + context 'when triggered by an old pipeline' do + let(:old_pipeline) do + create(:ci_pipeline, project: project, ref: merge_request_ref, + sha: '1234abcdef', status: 'success') + end + + it 'does not merge request' do + expect(MergeWorker).not_to receive(:perform_async) + service.process(mr_merge_if_green_enabled) + end + end + + context 'when triggered by pipeline from a different branch' do + let(:unrelated_pipeline) do + create(:ci_pipeline, project: project, ref: 'feature', + sha: merge_request_head, status: 'success') + end + + it 'does not merge request' do + expect(MergeWorker).not_to receive(:perform_async) + service.process(mr_merge_if_green_enabled) + end + end + + context 'when pipeline is merge request pipeline' do + let(:pipeline) do + create(:ci_pipeline, :success, + source: :merge_request_event, + ref: mr_merge_if_green_enabled.merge_ref_path, + merge_request: mr_merge_if_green_enabled, + merge_requests_as_head_pipeline: [mr_merge_if_green_enabled]) + end + + it 'merges the associated merge request' do + allow(mr_merge_if_green_enabled) + .to receive_messages(head_pipeline: pipeline, actual_head_pipeline: pipeline) + + expect(MergeWorker).to receive(:perform_async) + service.process(mr_merge_if_green_enabled) + end + end +end + +RSpec.shared_examples 'auto_merge service #cancel' do + before do + service.cancel(mr_merge_if_green_enabled) + end + + it "resets all the pipeline succeeds params" do + expect(mr_merge_if_green_enabled.merge_when_pipeline_succeeds).to be_falsey + expect(mr_merge_if_green_enabled.merge_params).to eq({}) + expect(mr_merge_if_green_enabled.merge_user).to be nil + end + + it 'posts a system note' do + note = mr_merge_if_green_enabled.notes.last + expect(note.note).to include 'canceled the automatic merge' + end +end + +RSpec.shared_examples 'auto_merge service #abort' do + before do + service.abort(mr_merge_if_green_enabled, 'an error') + end + + it 'posts a system note' do + note = mr_merge_if_green_enabled.notes.last + expect(note.note).to include 'aborted the automatic merge' + end +end diff --git a/vendor/gems/attr_encrypted/.gitlab-ci.yml b/vendor/gems/attr_encrypted/.gitlab-ci.yml index 7d954de43a0..c285eef6e64 100644 --- a/vendor/gems/attr_encrypted/.gitlab-ci.yml +++ b/vendor/gems/attr_encrypted/.gitlab-ci.yml @@ -1,26 +1,12 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID - -default: - image: "ruby:${RUBY_VERSION}" +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "attr_encrypted" + gem_path_prefix: "vendor/gems/" rspec: - cache: - key: attr_encrypted-ruby - paths: - - vendor/gems/attr_encrypted/vendor/ruby - before_script: - - cd vendor/gems/attr_encrypted - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' # This is set to 'deployment' otherwise - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) script: - bundle exec rake test parallel: matrix: - - RUBY_VERSION: ["2.7", "3.0", "3.1"] + - RUBY_VERSION: ["3.0", "3.1"] # 3.2 isn't supported yet diff --git a/vendor/gems/bundler-checksum/.gitlab-ci.yml b/vendor/gems/bundler-checksum/.gitlab-ci.yml index 2de1c5e982c..0ec9a5d94f1 100644 --- a/vendor/gems/bundler-checksum/.gitlab-ci.yml +++ b/vendor/gems/bundler-checksum/.gitlab-ci.yml @@ -1,24 +1,10 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "bundler-checksum" + gem_path_prefix: "vendor/gems/" rspec: - image: "ruby:${RUBY_VERSION}" - cache: - key: bundler-checksum - paths: - - vendor/gems/bundler-checksum/vendor/ruby - before_script: - - cd vendor/gems/bundler-checksum - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) + extends: .ruby_matrix script: - pushd test/project_with_checksum_lock && scripts/test - parallel: - matrix: - - RUBY_VERSION: ["2.7", "3.0", "3.1", "3.2"] diff --git a/vendor/gems/cloud_profiler_agent/.gitlab-ci.yml b/vendor/gems/cloud_profiler_agent/.gitlab-ci.yml index 9e508d920e8..aa4638486e5 100644 --- a/vendor/gems/cloud_profiler_agent/.gitlab-ci.yml +++ b/vendor/gems/cloud_profiler_agent/.gitlab-ci.yml @@ -1,32 +1,5 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID - -.rspec: - cache: - key: cloud_profiler_agent-ruby-${RUBY_VERSION} - paths: - - vendor/gems/cloud_profiler_agent/vendor/ruby - before_script: - - cd vendor/gems/cloud_profiler_agent - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) - script: - - bundle exec rspec - -rspec-3.0: - image: "ruby:3.0" - extends: .rspec - -rspec-3.1: - image: "ruby:3.1" - extends: .rspec - -rspec-3.2: - image: "ruby:3.2" - extends: .rspec +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "cloud_profiler_agent" + gem_path_prefix: "vendor/gems/" diff --git a/vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml b/vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml index ed5e27f5a8c..c8698943ca9 100644 --- a/vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml +++ b/vendor/gems/devise-pbkdf2-encryptable/.gitlab-ci.yml @@ -1,28 +1,5 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID - -.rspec: - cache: - key: devise-pbkdf2-encryptable - paths: - - vendor/gems/devise-pbkdf2-encryptable/vendor/ruby - before_script: - - cd vendor/gems/devise-pbkdf2-encryptable - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) - script: - - bundle exec rspec - -rspec-2.7: - image: "ruby:2.7" - extends: .rspec - -rspec-3.0: - image: "ruby:3.0" - extends: .rspec +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "devise-pbkdf2-encryptable" + gem_path_prefix: "vendor/gems/" diff --git a/vendor/gems/gitlab_active_record/.gitlab-ci.yml b/vendor/gems/gitlab_active_record/.gitlab-ci.yml index a1e883119e8..a9bc04659d7 100644 --- a/vendor/gems/gitlab_active_record/.gitlab-ci.yml +++ b/vendor/gems/gitlab_active_record/.gitlab-ci.yml @@ -1,28 +1,5 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID - -.rspec: - cache: - key: gitlab_active_record-ruby - paths: - - vendor/gems/gitlab_active_record/vendor/ruby - before_script: - - cd vendor/gems/gitlab_active_record - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) - script: - - bundle exec rspec - -rspec-2.7: - image: "ruby:2.7" - extends: .rspec - -rspec-3.0: - image: "ruby:3.0" - extends: .rspec +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "gitlab_active_record" + gem_path_prefix: "vendor/gems/" diff --git a/vendor/gems/ipynbdiff/.gitlab-ci.yml b/vendor/gems/ipynbdiff/.gitlab-ci.yml index bf8f8b15c26..dd8f61050bb 100644 --- a/vendor/gems/ipynbdiff/.gitlab-ci.yml +++ b/vendor/gems/ipynbdiff/.gitlab-ci.yml @@ -1,34 +1,10 @@ -# You can override the included template(s) by including variable overrides -# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings -# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings -# Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings -# Note that environment variables can be set in several places -# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "ipynbdiff" + gem_path_prefix: "vendor/gems/" -.rspec: - cache: - key: ipynbdiff - paths: - - vendor/gems/ipynbdiff/vendor/ruby - before_script: - - cd vendor/gems/ipynbdiff - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) - script: - - bundle exec rspec - -rspec-2.7: - image: "ruby:2.7" - extends: .rspec - -rspec-3.0: - image: "ruby:3.0" - extends: .rspec +rspec: + parallel: + matrix: + - RUBY_VERSION: ["3.0", "3.1"] # 3.2 isn't supported yet diff --git a/vendor/gems/mail-smtp_pool/.gitlab-ci.yml b/vendor/gems/mail-smtp_pool/.gitlab-ci.yml index dee865f3cd6..260bc1aaa1f 100644 --- a/vendor/gems/mail-smtp_pool/.gitlab-ci.yml +++ b/vendor/gems/mail-smtp_pool/.gitlab-ci.yml @@ -1,28 +1,10 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "mail-smtp_pool" + gem_path_prefix: "vendor/gems/" -.rspec: - cache: - key: mail-smtp_pool-ruby - paths: - - vendor/gems/mail-smtp_pool/vendor/ruby - before_script: - - cd vendor/gems/mail-smtp_pool - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) - script: - - bundle exec rspec - -rspec-2.7: - image: "ruby:2.7" - extends: .rspec - -rspec-3.0: - image: "ruby:3.0" - extends: .rspec +rspec: + parallel: + matrix: + - RUBY_VERSION: ["3.0"] # 3.1 & 3.2 aren't supported yet diff --git a/vendor/gems/microsoft_graph_mailer/.gitlab-ci.yml b/vendor/gems/microsoft_graph_mailer/.gitlab-ci.yml index 1b10debb1b9..d1055958749 100644 --- a/vendor/gems/microsoft_graph_mailer/.gitlab-ci.yml +++ b/vendor/gems/microsoft_graph_mailer/.gitlab-ci.yml @@ -1,32 +1,5 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID - -.rspec: - cache: - key: microsoft_graph_mailer-ruby - paths: - - vendor/gems/microsoft_graph_mailer/vendor/ruby - before_script: - - cd vendor/gems/microsoft_graph_mailer - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) - script: - - bundle exec rspec - -rspec-2.7: - image: "ruby:2.7" - extends: .rspec - -rspec-3.0: - image: "ruby:3.0" - extends: .rspec - -rspec-3.1: - image: "ruby:3.1" - extends: .rspec +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "microsoft_graph_mailer" + gem_path_prefix: "vendor/gems/" diff --git a/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml b/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml index 816b868915f..b49143ebd33 100644 --- a/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml +++ b/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml @@ -1,36 +1,5 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID - -.rspec: - cache: - key: omniauth-azure-oauth2 - paths: - - vendor/gems/omniauth-azure-oauth2/vendor/ruby - before_script: - - cd vendor/gems/omniauth-azure-oauth2 - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) - script: - - bundle exec rspec - -rspec-2.7: - image: "ruby:2.7" - extends: .rspec - -rspec-3.0: - image: "ruby:3.0" - extends: .rspec - -rspec-3.1: - image: "ruby:3.1" - extends: .rspec - -rspec-3.2: - image: "ruby:3.2" - extends: .rspec +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "omniauth-azure-oauth2" + gem_path_prefix: "vendor/gems/" diff --git a/vendor/gems/omniauth-gitlab/.gitlab-ci.yml b/vendor/gems/omniauth-gitlab/.gitlab-ci.yml index a802029c008..10382723643 100644 --- a/vendor/gems/omniauth-gitlab/.gitlab-ci.yml +++ b/vendor/gems/omniauth-gitlab/.gitlab-ci.yml @@ -1,36 +1,5 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID - -.rspec: - cache: - key: omniauth-gitlab-ruby - paths: - - vendor/gems/omniauth-gitlab/vendor/ruby - before_script: - - cd vendor/gems/omniauth-gitlab - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) - script: - - bundle exec rspec - -rspec-2.7: - image: "ruby:2.7" - extends: .rspec - -rspec-3.0: - image: "ruby:3.0" - extends: .rspec - -rspec-3.1: - image: "ruby:3.1" - extends: .rspec - -rspec-3.2: - image: "ruby:3.2" - extends: .rspec +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "omniauth-gitlab" + gem_path_prefix: "vendor/gems/" diff --git a/vendor/gems/omniauth-salesforce/.gitlab-ci.yml b/vendor/gems/omniauth-salesforce/.gitlab-ci.yml index 15e7392e46b..bd630fbdcd0 100644 --- a/vendor/gems/omniauth-salesforce/.gitlab-ci.yml +++ b/vendor/gems/omniauth-salesforce/.gitlab-ci.yml @@ -1,36 +1,5 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID - -.rspec: - cache: - key: omniauth-salesforce - paths: - - vendor/gems/omniauth-salesforce/vendor/ruby - before_script: - - cd vendor/gems/omniauth-salesforce - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) - script: - - bundle exec rspec - -rspec-2.7: - image: "ruby:2.7" - extends: .rspec - -rspec-3.0: - image: "ruby:3.0" - extends: .rspec - -rspec-3.1: - image: "ruby:3.1" - extends: .rspec - -rspec-3.2: - image: "ruby:3.2" - extends: .rspec +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "omniauth-salesforce" + gem_path_prefix: "vendor/gems/" diff --git a/vendor/gems/omniauth_crowd/.gitlab-ci.yml b/vendor/gems/omniauth_crowd/.gitlab-ci.yml index ddc5d2fa5c3..9265f7a04a0 100644 --- a/vendor/gems/omniauth_crowd/.gitlab-ci.yml +++ b/vendor/gems/omniauth_crowd/.gitlab-ci.yml @@ -1,36 +1,5 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID - -.rspec: - cache: - key: omniauth_crowd - paths: - - vendor/gems/omniauth_crowd/vendor/ruby - before_script: - - cd vendor/gems/omniauth_crowd - - ruby -v # Print out ruby version for debugging - - gem install bundler --no-document # Bundler is not installed with the image - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install -j $(nproc) - script: - - bundle exec rspec - -rspec-2.7: - image: "ruby:2.7" - extends: .rspec - -rspec-3.0: - image: "ruby:3.0" - extends: .rspec - -rspec-3.1: - image: "ruby:3.1" - extends: .rspec - -rspec-3.2: - image: "ruby:3.2" - extends: .rspec +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "omniauth_crowd" + gem_path_prefix: "vendor/gems/" diff --git a/vendor/gems/sidekiq-reliable-fetch/.gitlab-ci.yml b/vendor/gems/sidekiq-reliable-fetch/.gitlab-ci.yml index fdf9ccdeb55..9df01687447 100644 --- a/vendor/gems/sidekiq-reliable-fetch/.gitlab-ci.yml +++ b/vendor/gems/sidekiq-reliable-fetch/.gitlab-ci.yml @@ -1,71 +1,54 @@ -workflow: - rules: - - if: $CI_MERGE_REQUEST_ID - -default: - image: ruby:3.0 - -before_script: - - cd vendor/gems/sidekiq-reliable-fetch - - ruby -v - - which ruby - - gem install bundler - - bundle config set --local path 'vendor' # Install dependencies into ./vendor/ruby - - bundle config set with 'development' # This is set to 'deployment' otherwise - - bundle config set --local frozen 'true' # Disallow Gemfile.lock changes on CI - - bundle config # Show bundler configuration - - bundle install --jobs $(nproc) "${FLAGS[@]}" - -variables: - REDIS_URL: "redis://redis" +include: + - local: gems/gem.gitlab-ci.yml + inputs: + gem_name: "sidekiq-reliable-fetch" + gem_path_prefix: "vendor/gems/" rspec: - stage: test - coverage: '/LOC \((\d+\.\d+%)\) covered.$/' - script: - - bundle exec rspec + extends: + - .with_redis + parallel: + matrix: + - RUBY_VERSION: ["3.0", "3.1"] # 3.2 isn't supported yet + +.with_redis: services: - redis:alpine - artifacts: - expire_in: 31d - when: always - paths: - - coverage/ + variables: + REDIS_URL: "redis://redis" -.integration: - stage: test +.reliability: + extends: + - .with_redis + - .ruby_matrix script: - cd tests/reliability - bundle exec ruby reliability_test.rb - services: - - redis:alpine integration_semi: - extends: .integration + extends: .reliability variables: JOB_FETCHER: semi integration_reliable: - extends: .integration + extends: .reliability variables: JOB_FETCHER: reliable -kill_interruption: - stage: test +.interruption: + extends: + - .with_redis + - .ruby_matrix script: - cd tests/interruption - - bundle exec ruby test_kill_signal.rb - services: - - redis:alpine + - bundle exec ruby "test_${SIGNAL}_signal.rb" -term_interruption: - stage: test - script: - - cd tests/interruption - - bundle exec ruby test_term_signal.rb - services: - - redis:alpine +kill_interruption: + extends: .interruption + variables: + SIGNAL: kill -# rubocop: -# script: -# - bundle exec rubocop +term_interruption: + extends: .interruption + variables: + SIGNAL: term diff --git a/workhorse/go.mod b/workhorse/go.mod index 78e36c76da2..000593c6025 100644 --- a/workhorse/go.mod +++ b/workhorse/go.mod @@ -26,7 +26,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/smartystreets/goconvey v1.7.2 github.com/stretchr/testify v1.8.4 - gitlab.com/gitlab-org/gitaly/v16 v16.1.0 + gitlab.com/gitlab-org/gitaly/v16 v16.1.1 gitlab.com/gitlab-org/labkit v1.19.0 gocloud.dev v0.29.0 golang.org/x/image v0.7.0 diff --git a/workhorse/go.sum b/workhorse/go.sum index bdeb8569f89..03b95b15274 100644 --- a/workhorse/go.sum +++ b/workhorse/go.sum @@ -1931,8 +1931,8 @@ github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -gitlab.com/gitlab-org/gitaly/v16 v16.1.0 h1:4fdzT7tTfBNDSL6T9ZvpHA4A9cNq2GVD3AYxmPYWDd4= -gitlab.com/gitlab-org/gitaly/v16 v16.1.0/go.mod h1:gfmwpE66X4lwAO/RdchFhNINSwteGFer4loUOa94nQE= +gitlab.com/gitlab-org/gitaly/v16 v16.1.1 h1:0WFlmCii66ys0723lYkp8ZXp7nWbA2FcNUMK/pOw+fU= +gitlab.com/gitlab-org/gitaly/v16 v16.1.1/go.mod h1:gfmwpE66X4lwAO/RdchFhNINSwteGFer4loUOa94nQE= gitlab.com/gitlab-org/labkit v1.19.0 h1:7j5NOHE42R0Eu3Bj2BgfbGf4aN2HXMTmCN7H2wcqqyA= gitlab.com/gitlab-org/labkit v1.19.0/go.mod h1:zeATDAaSBelPcPLbTTq8J3ZJEHyPTLVBM1q3nva+/W4= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= |