Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
3ecc3508dc
commit
ae192a2f14
|
@ -52,7 +52,6 @@ qa:nightly-auto-quarantine-dequarantine:
|
|||
- bundle exec confiner -r .confiner/nightly.yml
|
||||
allow_failure: true
|
||||
|
||||
|
||||
qa:selectors-as-if-foss:
|
||||
extends:
|
||||
- qa:selectors
|
||||
|
@ -68,6 +67,28 @@ update-qa-cache:
|
|||
script:
|
||||
- echo "Cache has been updated and ready to be uploaded."
|
||||
|
||||
populate-qa-tests-var:
|
||||
image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine
|
||||
stage: prepare
|
||||
script:
|
||||
- tooling/bin/qa/check_if_qa_only_spec_changes ${CHANGES_FILE} ${ONLY_QA_CHANGES_FILE}
|
||||
- '[ -f $ONLY_QA_CHANGES_FILE ] && export QA_TESTS="`cat $ONLY_QA_CHANGES_FILE`"'
|
||||
- 'echo "QA_TESTS=$QA_TESTS" >> qa_tests_var.env'
|
||||
- 'echo "QA_TESTS: $QA_TESTS"'
|
||||
artifacts:
|
||||
expire_in: 2d
|
||||
reports:
|
||||
dotenv: qa_tests_var.env
|
||||
paths:
|
||||
- ${CHANGES_FILE}
|
||||
- ${ONLY_QA_CHANGES_FILE}
|
||||
- qa_tests_var.env
|
||||
variables:
|
||||
CHANGES_FILE: tmp/changed_files.txt
|
||||
ONLY_QA_CHANGES_FILE: tmp/qa_only_changed_files.txt
|
||||
needs:
|
||||
- detect-tests
|
||||
|
||||
.package-and-qa-base:
|
||||
image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine
|
||||
stage: qa
|
||||
|
@ -77,8 +98,6 @@ update-qa-cache:
|
|||
- install_gitlab_gem
|
||||
- tooling/bin/find_change_diffs ${CHANGES_DIFFS_DIR}
|
||||
script:
|
||||
- tooling/bin/qa/check_if_qa_only_spec_changes ${CHANGES_FILE} ${ONLY_QA_CHANGES_FILE}
|
||||
- '[ -f $ONLY_QA_CHANGES_FILE ] && export QA_TESTS="`cat $ONLY_QA_CHANGES_FILE`"'
|
||||
- 'echo "QA_TESTS: $QA_TESTS"'
|
||||
- exit_code=0 && tooling/bin/qa/package_and_qa_check ${CHANGES_DIFFS_DIR} || exit_code=$?
|
||||
- echo $exit_code
|
||||
|
@ -99,16 +118,13 @@ update-qa-cache:
|
|||
artifacts: false
|
||||
- job: build-assets-image
|
||||
artifacts: false
|
||||
- job: populate-qa-tests-var
|
||||
- detect-tests
|
||||
artifacts:
|
||||
expire_in: 7d
|
||||
paths:
|
||||
- ${CHANGES_FILE}
|
||||
- ${ONLY_QA_CHANGES_FILE}
|
||||
- ${CHANGES_DIFFS_DIR}/*
|
||||
variables:
|
||||
CHANGES_FILE: tmp/changed_files.txt
|
||||
ONLY_QA_CHANGES_FILE: tmp/qa_only_changed_files.txt
|
||||
CHANGES_DIFFS_DIR: tmp/diffs
|
||||
ALLURE_JOB_NAME: $CI_JOB_NAME
|
||||
|
||||
|
|
|
@ -6,22 +6,6 @@ Lint/RedundantCopDisableDirective:
|
|||
# REVEAL_RUBOCOP_TODO environment variable.
|
||||
Enabled: false
|
||||
Exclude:
|
||||
- 'app/controllers/admin/dashboard_controller.rb'
|
||||
- 'app/controllers/concerns/enforces_two_factor_authentication.rb'
|
||||
- 'app/controllers/concerns/integrations/actions.rb'
|
||||
- 'app/controllers/concerns/issues_calendar.rb'
|
||||
- 'app/controllers/concerns/snippets_actions.rb'
|
||||
- 'app/controllers/concerns/wiki_actions.rb'
|
||||
- 'app/controllers/groups/autocomplete_sources_controller.rb'
|
||||
- 'app/controllers/groups/labels_controller.rb'
|
||||
- 'app/controllers/import/fogbugz_controller.rb'
|
||||
- 'app/controllers/import/github_controller.rb'
|
||||
- 'app/controllers/projects/issues_controller.rb'
|
||||
- 'app/controllers/projects/jobs_controller.rb'
|
||||
- 'app/controllers/projects/pipeline_schedules_controller.rb'
|
||||
- 'app/controllers/projects/pipelines/tests_controller.rb'
|
||||
- 'app/controllers/search_controller.rb'
|
||||
- 'app/controllers/sessions_controller.rb'
|
||||
- 'app/finders/autocomplete/acts_as_taggable_on/tags_finder.rb'
|
||||
- 'app/finders/autocomplete/move_to_project_finder.rb'
|
||||
- 'app/finders/autocomplete/routes_finder.rb'
|
||||
|
|
|
@ -45,7 +45,6 @@ Rails/FilePath:
|
|||
- 'ee/spec/requests/api/experiments_spec.rb'
|
||||
- 'ee/spec/services/ee/merge_requests/refresh_service_spec.rb'
|
||||
- 'ee/spec/support/factory_bot.rb'
|
||||
- 'ee/spec/uploaders/every_gitlab_uploader_spec.rb'
|
||||
- 'ee/spec/validators/json_schema_validator_spec.rb'
|
||||
- 'lib/api/api.rb'
|
||||
- 'lib/error_tracking/collector/payload_validator.rb'
|
||||
|
|
|
@ -15,13 +15,10 @@ Rails/Pluck:
|
|||
- 'app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb'
|
||||
- 'app/services/feature_flags/update_service.rb'
|
||||
- 'app/services/pod_logs/base_service.rb'
|
||||
- 'app/services/prometheus/create_default_alerts_service.rb'
|
||||
- 'ee/app/graphql/mutations/incident_management/oncall_rotation/base.rb'
|
||||
- 'ee/app/models/boards/epic_list.rb'
|
||||
- 'ee/app/models/vulnerabilities/finding.rb'
|
||||
- 'ee/app/services/concerns/incident_management/oncall_rotations/shared_rotation_logic.rb'
|
||||
- 'ee/app/workers/geo/container_repository_sync_dispatch_worker.rb'
|
||||
- 'ee/app/workers/geo/file_download_dispatch_worker.rb'
|
||||
- 'ee/app/workers/geo/registry_sync_worker.rb'
|
||||
- 'ee/app/workers/geo/repository_shard_sync_worker.rb'
|
||||
- 'ee/app/workers/geo/repository_verification/secondary/shard_worker.rb'
|
||||
|
|
|
@ -52,7 +52,6 @@ Rails/RedundantForeignKey:
|
|||
- 'ee/app/models/incident_management/oncall_shift.rb'
|
||||
- 'ee/app/models/incident_management/pending_escalations/alert.rb'
|
||||
- 'ee/app/models/incident_management/pending_escalations/issue.rb'
|
||||
- 'ee/app/models/incident_management/timeline_event.rb'
|
||||
- 'ee/app/models/issuable_metric_image.rb'
|
||||
- 'ee/app/models/security/orchestration_policy_configuration.rb'
|
||||
- 'ee/app/models/security/orchestration_policy_rule_schedule.rb'
|
||||
|
|
|
@ -103,11 +103,9 @@ Rails/SkipsModelValidations:
|
|||
- 'app/services/keys/last_used_service.rb'
|
||||
- 'app/services/labels/promote_service.rb'
|
||||
- 'app/services/labels/transfer_service.rb'
|
||||
- 'app/services/merge_requests/base_service.rb'
|
||||
- 'app/services/merge_requests/bulk_remove_attention_requested_service.rb'
|
||||
- 'app/services/merge_requests/cleanup_refs_service.rb'
|
||||
- 'app/services/merge_requests/ff_merge_service.rb'
|
||||
- 'app/services/merge_requests/handle_assignees_change_service.rb'
|
||||
- 'app/services/merge_requests/merge_service.rb'
|
||||
- 'app/services/merge_requests/rebase_service.rb'
|
||||
- 'app/services/merge_requests/reopen_service.rb'
|
||||
|
@ -222,7 +220,6 @@ Rails/SkipsModelValidations:
|
|||
- 'ee/app/services/ee/users/migrate_to_ghost_user_service.rb'
|
||||
- 'ee/app/services/epics/strategies/due_date_inherited_strategy.rb'
|
||||
- 'ee/app/services/epics/strategies/start_date_inherited_strategy.rb'
|
||||
- 'ee/app/services/geo/job_artifact_deleted_event_store.rb'
|
||||
- 'ee/app/services/geo/repository_verification_reset.rb'
|
||||
- 'ee/app/services/incident_management/oncall_rotations/edit_service.rb'
|
||||
- 'ee/app/services/incident_management/oncall_rotations/remove_participant_service.rb'
|
||||
|
@ -291,9 +288,6 @@ Rails/SkipsModelValidations:
|
|||
- 'ee/spec/lib/gitlab/custom_file_templates_spec.rb'
|
||||
- 'ee/spec/lib/gitlab/geo/geo_tasks_spec.rb'
|
||||
- 'ee/spec/lib/gitlab/geo/jwt_request_decoder_spec.rb'
|
||||
- 'ee/spec/lib/gitlab/geo/replication/file_downloader_spec.rb'
|
||||
- 'ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb'
|
||||
- 'ee/spec/lib/gitlab/geo/replication/job_artifact_downloader_spec.rb'
|
||||
- 'ee/spec/lib/gitlab/geo/signed_data_spec.rb'
|
||||
- 'ee/spec/lib/gitlab/git_access_spec.rb'
|
||||
- 'ee/spec/models/application_setting_spec.rb'
|
||||
|
@ -305,7 +299,6 @@ Rails/SkipsModelValidations:
|
|||
- 'ee/spec/models/ee/groups/feature_setting_spec.rb'
|
||||
- 'ee/spec/models/ee/iteration_spec.rb'
|
||||
- 'ee/spec/models/ee/iterations/cadence_spec.rb'
|
||||
- 'ee/spec/models/ee/key_spec.rb'
|
||||
- 'ee/spec/models/ee/namespace_limit_spec.rb'
|
||||
- 'ee/spec/models/ee/vulnerability_spec.rb'
|
||||
- 'ee/spec/models/geo_node_spec.rb'
|
||||
|
@ -348,7 +341,6 @@ Rails/SkipsModelValidations:
|
|||
- 'ee/spec/services/epic_issues/update_service_spec.rb'
|
||||
- 'ee/spec/services/epics/issue_promote_service_spec.rb'
|
||||
- 'ee/spec/services/epics/update_service_spec.rb'
|
||||
- 'ee/spec/services/geo/file_download_service_spec.rb'
|
||||
- 'ee/spec/services/geo/file_registry_removal_service_spec.rb'
|
||||
- 'ee/spec/services/geo/hashed_storage_migration_service_spec.rb'
|
||||
- 'ee/spec/services/groups/create_service_spec.rb'
|
||||
|
@ -379,7 +371,6 @@ Rails/SkipsModelValidations:
|
|||
- 'ee/spec/workers/import_software_licenses_worker_spec.rb'
|
||||
- 'ee/spec/workers/iterations/roll_over_issues_worker_spec.rb'
|
||||
- 'ee/spec/workers/iterations_update_status_worker_spec.rb'
|
||||
- 'ee/spec/workers/network_policy_metrics_worker_spec.rb'
|
||||
- 'ee/spec/workers/security/orchestration_policy_rule_schedule_namespace_worker_spec.rb'
|
||||
- 'ee/spec/workers/security/orchestration_policy_rule_schedule_worker_spec.rb'
|
||||
- 'ee/spec/workers/update_all_mirrors_worker_spec.rb'
|
||||
|
@ -484,9 +475,7 @@ Rails/SkipsModelValidations:
|
|||
- 'spec/features/projects/diffs/diff_show_spec.rb'
|
||||
- 'spec/features/projects/features_visibility_spec.rb'
|
||||
- 'spec/features/projects/fork_spec.rb'
|
||||
- 'spec/features/projects/jobs/user_browses_jobs_spec.rb'
|
||||
- 'spec/features/projects/jobs_spec.rb'
|
||||
- 'spec/features/projects/members/invite_group_spec.rb'
|
||||
- 'spec/features/projects/milestones/milestone_spec.rb'
|
||||
- 'spec/features/projects/pipeline_schedules_spec.rb'
|
||||
- 'spec/features/projects/pipelines/pipeline_spec.rb'
|
||||
|
|
|
@ -6,7 +6,6 @@ Rails/TimeZone:
|
|||
- ee/lib/delay.rb
|
||||
- ee/lib/gitlab/elastic/helper.rb
|
||||
- ee/lib/gitlab/elastic/indexer.rb
|
||||
- ee/lib/gitlab/geo/base_request.rb
|
||||
- ee/lib/gitlab/geo/event_gap_tracking.rb
|
||||
- ee/lib/gitlab/geo/log_cursor/events/design_repository_updated_event.rb
|
||||
- ee/lib/gitlab/geo/log_cursor/events/repository_updated_event.rb
|
||||
|
@ -17,11 +16,9 @@ Rails/TimeZone:
|
|||
- ee/spec/lib/ee/gitlab/ci/pipeline/quota/job_activity_spec.rb
|
||||
- ee/spec/lib/gitlab/analytics/cycle_analytics/data_collector_spec.rb
|
||||
- ee/spec/lib/gitlab/analytics/cycle_analytics/summary/group/stage_summary_spec.rb
|
||||
- ee/spec/lib/gitlab/analytics/cycle_analytics/summary/group/stage_time_summary_spec.rb
|
||||
- ee/spec/lib/gitlab/auth/ldap/access_spec.rb
|
||||
- ee/spec/lib/gitlab/auth/smartcard/san_extension_spec.rb
|
||||
- ee/spec/lib/gitlab/auth/smartcard/session_spec.rb
|
||||
- ee/spec/lib/gitlab/background_migration/fix_orphan_promoted_issues_spec.rb
|
||||
- ee/spec/lib/gitlab/ci/pipeline/chain/limit/job_activity_spec.rb
|
||||
- ee/spec/lib/gitlab/elastic/client_spec.rb
|
||||
- ee/spec/lib/gitlab/geo/base_request_spec.rb
|
||||
|
@ -31,8 +28,6 @@ Rails/TimeZone:
|
|||
- ee/spec/lib/gitlab/geo/log_cursor/events/event_spec.rb
|
||||
- ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb
|
||||
- ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_migrated_event_spec.rb
|
||||
- ee/spec/lib/gitlab/geo/log_cursor/events/job_artifact_deleted_event_spec.rb
|
||||
- ee/spec/lib/gitlab/geo/log_cursor/events/lfs_object_deleted_event_spec.rb
|
||||
- ee/spec/lib/gitlab/geo/log_cursor/events/repositories_changed_event_spec.rb
|
||||
- ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb
|
||||
- ee/spec/lib/gitlab/geo/log_cursor/events/repository_deleted_event_spec.rb
|
||||
|
@ -51,23 +46,17 @@ Rails/TimeZone:
|
|||
- lib/gitlab/auth/ldap/access.rb
|
||||
- lib/gitlab/chaos.rb
|
||||
- lib/gitlab/checks/timed_logger.rb
|
||||
- lib/gitlab/ci/ansi2json/line.rb
|
||||
- lib/gitlab/ci/pipeline/chain/sequence.rb
|
||||
- lib/gitlab/ci/pipeline/duration.rb
|
||||
- lib/gitlab/cycle_analytics/summary/deployment_frequency.rb
|
||||
- lib/gitlab/database.rb
|
||||
- lib/gitlab/external_authorization/access.rb
|
||||
- lib/gitlab/external_authorization/cache.rb
|
||||
- lib/gitlab/gitaly_client.rb
|
||||
- lib/gitlab/gitaly_client/ref_service.rb
|
||||
- lib/gitlab/github_import/representation.rb
|
||||
- lib/gitlab/grape_logging/loggers/queue_duration_logger.rb
|
||||
- lib/gitlab/health_checks/base_abstract_check.rb
|
||||
- lib/gitlab/import_export.rb
|
||||
- lib/gitlab/instrumentation/elasticsearch_transport.rb
|
||||
- lib/gitlab/instrumentation/redis_interceptor.rb
|
||||
- lib/gitlab/instrumentation_helper.rb
|
||||
- lib/gitlab/kubernetes/helm/certificate.rb
|
||||
- lib/gitlab/lfs_token.rb
|
||||
- lib/gitlab/loop_helpers.rb
|
||||
- lib/gitlab/phabricator_import/representation/task.rb
|
||||
|
@ -80,8 +69,6 @@ Rails/TimeZone:
|
|||
- lib/json_web_token/token.rb
|
||||
- lib/object_storage/direct_upload.rb
|
||||
- lib/quality/seeders/issues.rb
|
||||
- tooling/rspec_flaky/flaky_example.rb
|
||||
- tooling/rspec_flaky/report.rb
|
||||
- lib/tasks/gitlab/assets.rake
|
||||
- lib/tasks/gitlab/backup.rake
|
||||
- lib/tasks/gitlab/cleanup.rake
|
||||
|
@ -91,14 +78,11 @@ Rails/TimeZone:
|
|||
- spec/lib/gitlab/app_json_logger_spec.rb
|
||||
- spec/lib/gitlab/app_text_logger_spec.rb
|
||||
- spec/lib/gitlab/auth/current_user_mode_spec.rb
|
||||
- spec/lib/gitlab/background_migration/recalculate_project_authorizations_spec.rb
|
||||
- spec/lib/gitlab/background_migration/wrongfully_confirmed_email_unconfirmer_spec.rb
|
||||
- spec/lib/gitlab/bitbucket_import/importer_spec.rb
|
||||
- spec/lib/gitlab/bitbucket_server_import/importer_spec.rb
|
||||
- spec/lib/gitlab/checks/timed_logger_spec.rb
|
||||
- spec/lib/gitlab/ci/cron_parser_spec.rb
|
||||
- spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb
|
||||
- spec/lib/gitlab/cycle_analytics/usage_data_spec.rb
|
||||
- spec/lib/gitlab/data_builder/note_spec.rb
|
||||
- spec/lib/gitlab/database/background_migration_job_spec.rb
|
||||
- spec/lib/gitlab/database_spec.rb
|
||||
|
@ -111,7 +95,6 @@ Rails/TimeZone:
|
|||
- spec/lib/gitlab/git/commit_spec.rb
|
||||
- spec/lib/gitlab/git/repository_spec.rb
|
||||
- spec/lib/gitlab/git_access_spec.rb
|
||||
- spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb
|
||||
- spec/lib/gitlab/github_import/importer/issue_importer_spec.rb
|
||||
- spec/lib/gitlab/github_import/importer/issues_importer_spec.rb
|
||||
- spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb
|
||||
|
@ -132,19 +115,14 @@ Rails/TimeZone:
|
|||
- spec/lib/gitlab/lfs_token_spec.rb
|
||||
- spec/lib/gitlab/log_timestamp_formatter_spec.rb
|
||||
- spec/lib/gitlab/middleware/rails_queue_duration_spec.rb
|
||||
- spec/lib/gitlab/omniauth_logging/json_formatter_spec.rb
|
||||
- spec/lib/gitlab/phabricator_import/issues/task_importer_spec.rb
|
||||
- spec/lib/gitlab/phabricator_import/representation/task_spec.rb
|
||||
- spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb
|
||||
- spec/lib/gitlab/prometheus/queries/deployment_query_spec.rb
|
||||
- spec/lib/gitlab/prometheus/queries/validate_query_spec.rb
|
||||
- spec/lib/gitlab/sidekiq_logging/json_formatter_spec.rb
|
||||
- spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing_spec.rb
|
||||
- spec/lib/gitlab/updated_notes_paginator_spec.rb
|
||||
- spec/lib/gitlab/utils/json_size_estimator_spec.rb
|
||||
- spec/lib/gitlab/x509/signature_spec.rb
|
||||
- spec/lib/grafana/time_window_spec.rb
|
||||
- spec/lib/json_web_token/hmac_token_spec.rb
|
||||
- spec/tooling/rspec_flaky/flaky_example_spec.rb
|
||||
- spec/tooling/rspec_flaky/listener_spec.rb
|
||||
- spec/tooling/rspec_flaky/report_spec.rb
|
||||
|
|
|
@ -177,6 +177,7 @@ export default class MergeRequestTabs {
|
|||
this.peek = document.getElementById('js-peek');
|
||||
this.sidebar = document.querySelector('.js-right-sidebar');
|
||||
this.pageLayout = document.querySelector('.layout-page');
|
||||
this.expandSidebar = document.querySelector('.js-expand-sidebar');
|
||||
this.paddingTop = 16;
|
||||
|
||||
this.scrollPositions = {};
|
||||
|
@ -281,6 +282,8 @@ export default class MergeRequestTabs {
|
|||
const tab = this.mergeRequestTabs.querySelector(`.${action}-tab`);
|
||||
if (tab) tab.classList.add('active');
|
||||
|
||||
this.expandSidebar?.classList.toggle('gl-display-none!', action !== 'show');
|
||||
|
||||
if (action === 'commits') {
|
||||
this.loadCommits(href);
|
||||
// this.hideSidebar();
|
||||
|
|
|
@ -7,7 +7,6 @@ class Admin::DashboardController < Admin::ApplicationController
|
|||
|
||||
feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def index
|
||||
@counts = Gitlab::Database::Count.approximate_counts(COUNTED_ITEMS)
|
||||
@projects = Project.order_id_desc.without_deleted.with_route.limit(10)
|
||||
|
@ -24,7 +23,6 @@ class Admin::DashboardController < Admin::ApplicationController
|
|||
Gitlab::Redis::Sessions
|
||||
].map(&:version).uniq
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
def stats
|
||||
@users_statistics = UsersStatistics.latest
|
||||
|
|
|
@ -51,11 +51,9 @@ module Integrations::Actions
|
|||
|
||||
private
|
||||
|
||||
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||
def integration
|
||||
@integration ||= find_or_initialize_non_project_specific_integration(params[:id])
|
||||
end
|
||||
# rubocop:enable Gitlab/ModuleWithInstanceVariables
|
||||
|
||||
def success_message
|
||||
if integration.active?
|
||||
|
|
|
@ -4,7 +4,6 @@ module IssuesCalendar
|
|||
extend ActiveSupport::Concern
|
||||
|
||||
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def render_issues_calendar(issuables)
|
||||
@issues = issuables
|
||||
.non_archived
|
||||
|
@ -23,6 +22,5 @@ module IssuesCalendar
|
|||
end
|
||||
end
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
# rubocop:enable Gitlab/ModuleWithInstanceVariables
|
||||
end
|
||||
|
|
|
@ -75,7 +75,6 @@ module SnippetsActions
|
|||
|
||||
private
|
||||
|
||||
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||
def blob
|
||||
@blob ||= blobs.first
|
||||
end
|
||||
|
@ -87,7 +86,6 @@ module SnippetsActions
|
|||
snippet.blobs
|
||||
end
|
||||
end
|
||||
# rubocop:enable Gitlab/ModuleWithInstanceVariables
|
||||
|
||||
def convert_line_endings(content)
|
||||
params[:line_ending] == 'raw' ? content : content.gsub(/\r\n/, "\n")
|
||||
|
|
|
@ -167,7 +167,7 @@ module WikiActions
|
|||
|
||||
render 'shared/wikis/diff'
|
||||
end
|
||||
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||
# rubocop:enable Gitlab/ModuleWithInstanceVariables
|
||||
|
||||
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||
def destroy
|
||||
|
|
|
@ -44,7 +44,6 @@ class Import::FogbugzController < Import::BaseController
|
|||
redirect_to status_import_fogbugz_path
|
||||
end
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def status
|
||||
unless client.valid?
|
||||
return redirect_to new_import_fogbugz_path
|
||||
|
@ -52,7 +51,6 @@ class Import::FogbugzController < Import::BaseController
|
|||
|
||||
super
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
def create
|
||||
credentials = { uri: session[:fogbugz_uri], token: session[:fogbugz_token] }
|
||||
|
|
|
@ -76,12 +76,10 @@ class Import::GithubController < Import::BaseController
|
|||
|
||||
protected
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
override :importable_repos
|
||||
def importable_repos
|
||||
client_repos.to_a
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
override :incompatible_repos
|
||||
def incompatible_repos
|
||||
|
|
|
@ -251,8 +251,8 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
end
|
||||
|
||||
def service_desk
|
||||
@issues = @issuables # rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||
@users.push(User.support_bot) # rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||
@issues = @issuables
|
||||
@users.push(User.support_bot)
|
||||
end
|
||||
|
||||
protected
|
||||
|
|
|
@ -42,7 +42,6 @@ class Projects::JobsController < Projects::ApplicationController
|
|||
@builds = @builds.page(params[:page]).per(30).without_count
|
||||
end
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def show
|
||||
respond_to do |format|
|
||||
format.html
|
||||
|
@ -55,7 +54,6 @@ class Projects::JobsController < Projects::ApplicationController
|
|||
end
|
||||
end
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
def trace
|
||||
@build.trace.being_watched! if @build.running?
|
||||
|
|
|
@ -14,13 +14,11 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
|
|||
feature_category :continuous_integration
|
||||
urgency :low
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def index
|
||||
@scope = params[:scope]
|
||||
@all_schedules = Ci::PipelineSchedulesFinder.new(@project).execute
|
||||
@schedules = Ci::PipelineSchedulesFinder.new(@project).execute(scope: params[:scope])
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
def new
|
||||
@schedule = project.pipeline_schedules.new
|
||||
|
|
|
@ -36,7 +36,6 @@ module Projects
|
|||
|
||||
private
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def builds
|
||||
@builds ||= pipeline.latest_builds.id_in(build_ids).presence || render_404
|
||||
end
|
||||
|
@ -56,7 +55,6 @@ module Projects
|
|||
|
||||
suite
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -72,7 +72,6 @@ class SearchController < ApplicationController
|
|||
render json: { count: count }
|
||||
end
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def autocomplete
|
||||
term = params[:term]
|
||||
|
||||
|
@ -81,7 +80,6 @@ class SearchController < ApplicationController
|
|||
|
||||
render json: search_autocomplete_opts(term).to_json
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
def opensearch
|
||||
end
|
||||
|
|
|
@ -183,7 +183,6 @@ class SessionsController < Devise::SessionsController
|
|||
|
||||
# Handle an "initial setup" state, where there's only one user, it's an admin,
|
||||
# and they require a password change.
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def check_initial_setup
|
||||
return unless User.limit(2).count == 1 # Count as much 2 to know if we have exactly one
|
||||
|
||||
|
@ -198,7 +197,6 @@ class SessionsController < Devise::SessionsController
|
|||
redirect_to edit_user_password_path(reset_password_token: @token),
|
||||
notice: _("Please create a password for your new account.")
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
def ensure_password_authentication_enabled!
|
||||
render_403 unless Gitlab::CurrentSettings.password_authentication_enabled_for_web?
|
||||
|
|
|
@ -23,6 +23,7 @@ module FormHelper
|
|||
|
||||
message = html_escape_once(errors.full_message(attribute, message)).html_safe
|
||||
message = tag.span(message, class: 'str-truncated-100') if truncate.include?(attribute)
|
||||
message = append_help_page_link(message, error.options) if error.options[:help_page_url].present?
|
||||
|
||||
tag.li(message)
|
||||
end
|
||||
|
@ -120,6 +121,20 @@ module FormHelper
|
|||
|
||||
private
|
||||
|
||||
def append_help_page_link(message, options)
|
||||
help_page_url = options[:help_page_url]
|
||||
help_link_text = options[:help_link_text] || _('Learn more.')
|
||||
|
||||
help_link = link_to(
|
||||
help_link_text,
|
||||
help_page_url,
|
||||
target: '_blank',
|
||||
rel: 'noopener noreferrer'
|
||||
)
|
||||
|
||||
message + " #{help_link}".html_safe
|
||||
end
|
||||
|
||||
def multiple_assignees_dropdown_options(options)
|
||||
new_options = options.dup
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
= c.footer do
|
||||
.d-flex.align-items-center
|
||||
= link_to(s_('AdminArea|View latest projects'), admin_projects_path)
|
||||
= sprite_icon('angle-right', size: 12, css_class: 'gl-text-gray-700 gl-ml-2')
|
||||
= sprite_icon('chevron-right', size: 12, css_class: 'gl-text-gray-700 gl-ml-2')
|
||||
.col-md-4.gl-mb-6
|
||||
= render Pajamas::CardComponent.new(**component_params) do |c|
|
||||
= c.body do
|
||||
|
@ -59,7 +59,7 @@
|
|||
= c.footer do
|
||||
.d-flex.align-items-center
|
||||
= link_to(s_('AdminArea|View latest users'), admin_users_path)
|
||||
= sprite_icon('angle-right', size: 12, css_class: 'gl-text-gray-700 gl-ml-2')
|
||||
= sprite_icon('chevron-right', size: 12, css_class: 'gl-text-gray-700 gl-ml-2')
|
||||
.col-md-4.gl-mb-6
|
||||
= render Pajamas::CardComponent.new(**component_params) do |c|
|
||||
= c.body do
|
||||
|
@ -72,7 +72,7 @@
|
|||
= c.footer do
|
||||
.d-flex.align-items-center
|
||||
= link_to(s_('AdminArea|View latest groups'), admin_groups_path)
|
||||
= sprite_icon('angle-right', size: 12, css_class: 'gl-text-gray-700 gl-ml-2')
|
||||
= sprite_icon('chevron-right', size: 12, css_class: 'gl-text-gray-700 gl-ml-2')
|
||||
.row
|
||||
.col-md-4.gl-mb-6
|
||||
#js-admin-statistics-container
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
maskable_regex: ci_variable_maskable_regex,
|
||||
protected_by_default: ci_variable_protected_by_default?.to_s,
|
||||
aws_logo_svg_path: image_path('aws_logo.svg'),
|
||||
aws_tip_deploy_link: help_page_path('ci/cloud_deployment/index.md', anchor: 'deploy-your-application-to-the-amazon-elastic-container-service-ecs'),
|
||||
aws_tip_deploy_link: help_page_path('ci/cloud_deployment/index.md', anchor: 'deploy-your-application-to-ecs'),
|
||||
aws_tip_commands_link: help_page_path('ci/cloud_deployment/index.md', anchor: 'use-an-image-to-run-aws-commands'),
|
||||
aws_tip_learn_link: help_page_path('ci/cloud_deployment/index.md'),
|
||||
contains_variable_reference_link: help_page_path('ci/variables/index', anchor: 'use-variables-in-other-variables'),
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
= _("Changes")
|
||||
= gl_badge_tag @diffs_count, { size: :sm }
|
||||
- if Feature.enabled?(:moved_mr_sidebar, @project)
|
||||
.gl-ml-auto.gl-align-items-center.gl-display-none.gl-md-display-flex{ class: "gl-lg-display-none!" }
|
||||
.gl-ml-auto.gl-align-items-center.gl-display-none.gl-md-display-flex.js-expand-sidebar{ class: "gl-lg-display-none!" }
|
||||
%button.btn.btn-default.gl-button.btn-sm.js-sidebar-toggle{ type: 'button' }
|
||||
= sprite_icon('angle-double-left', size: 12, css_class: 'gl-mr-2')
|
||||
= _('Expand')
|
||||
|
|
|
@ -63,7 +63,7 @@ Alternately, you can use an [Amazon Elastic Container Registry (ECR)](https://aw
|
|||
|
||||
You can also use an image from any third-party registry.
|
||||
|
||||
## Deploy your application to the Amazon Elastic Container Service (ECS)
|
||||
## Deploy your application to ECS
|
||||
|
||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207962) in GitLab 12.9.
|
||||
> - The `Deploy-ECS.gitlab-ci.yml` template was [moved](https://gitlab.com/gitlab-org/gitlab/-/issues/220821) to `AWS/Deploy-ECS.gitlab-ci.yml` in GitLab 13.2.
|
||||
|
@ -133,47 +133,49 @@ used only with the main template. They may move or change unexpectedly. Also, th
|
|||
these templates may change. Do not override these job names in your own pipeline,
|
||||
because the override stops working when the name changes.
|
||||
|
||||
## Deploy your application to Amazon EC2
|
||||
## Deploy your application to EC2
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/201742) in GitLab 13.5.
|
||||
|
||||
You can use the `AWS/CF-Provision-and-Deploy-EC2` CI template to perform the
|
||||
following actions within the same pipeline:
|
||||
GitLab provides a template, called `AWS/CF-Provision-and-Deploy-EC2`,
|
||||
to assist you in deploying to Amazon EC2.
|
||||
|
||||
1. **Create stack**: Provision your own infrastructure by leveraging the [AWS CloudFormation](https://aws.amazon.com/cloudformation/) API.
|
||||
1. **Push to S3**: Push your previously-built artifact to an [AWS S3](https://aws.amazon.com/s3/) bucket.
|
||||
1. **Deploy to EC2**: Deploy this pushed content onto an [AWS EC2](https://aws.amazon.com/ec2/) instance.
|
||||
When you configure related JSON objects and use the template, the pipeline:
|
||||
|
||||
1. **Creates the stack**: Your infrastructure is provisioned by using
|
||||
the [AWS CloudFormation](https://aws.amazon.com/cloudformation/) API.
|
||||
1. **Pushes to an S3 bucket**: When your build runs, it creates an artifact.
|
||||
The artifact is pushed to an [AWS S3](https://aws.amazon.com/s3/) bucket.
|
||||
1. **Deploys to EC2**: The content is deployed on an [AWS EC2](https://aws.amazon.com/ec2/) instance.
|
||||
|
||||
![CF-Provision-and-Deploy-EC2 diagram](../img/cf_ec2_diagram_v13_5.png)
|
||||
|
||||
### Run the `AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml` template
|
||||
### Configure the template and JSON
|
||||
|
||||
To run the `AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml` template, you must
|
||||
pass three JSON input objects, based on existing templates:
|
||||
To deploy to EC2, complete the following steps.
|
||||
|
||||
1. The AWS documentation provides templates for the _Create stack_ and _Deploy to EC2_ steps (links
|
||||
below). We provide the template for the remaining step, _Push to S3_:
|
||||
1. Create JSON for your stack. Use the [AWS template](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html).
|
||||
1. Create JSON to push to S3. Include the following details.
|
||||
|
||||
- [Template for the _Create stack_ step on AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html).
|
||||
- Template for the _Push to S3_ step. Note that `source` is where a preceding `build` job built
|
||||
your application, exporting the build through [`artifacts:paths`](../yaml/index.md#artifactspaths):
|
||||
```json
|
||||
{
|
||||
"applicationName": "string",
|
||||
"source": "string",
|
||||
"s3Location": "s3://your/bucket/project_built_file...]"
|
||||
}
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"applicationName": "string",
|
||||
"source": "string",
|
||||
"s3Location": "s3://your/bucket/project_built_file...]"
|
||||
}
|
||||
```
|
||||
The `source` is the location where a `build` job built your application.
|
||||
The build is saved to [`artifacts:paths`](../yaml/index.md#artifactspaths).
|
||||
|
||||
- [Template for the _Deploy to EC2_ step on AWS](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_CreateDeployment.html).
|
||||
1. Create JSON to deploy to EC2. Use the [AWS template](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_CreateDeployment.html).
|
||||
1. Make the JSON objects accessible to your pipeline:
|
||||
- If you want these JSON objects saved in your repository, save the objects as three
|
||||
separate files.
|
||||
|
||||
1. After you have completed these three templates based on your requirements, you
|
||||
have two ways to pass in these JSON objects:
|
||||
|
||||
- They can be three actual files located in your project. You must specify their path relative to
|
||||
your project root in your `.gitlab-ci.yml` file, using the following CI/CD variables. For example, if
|
||||
your files are in a `<project_root>/aws` folder:
|
||||
In your `.gitlab-ci.yml` file, add [CI/CD variables](../variables/index.md)
|
||||
that point to the file paths relative to the project root. For example,
|
||||
if your JSON files are in a `<project_root>/aws` folder:
|
||||
|
||||
```yaml
|
||||
variables:
|
||||
|
@ -182,67 +184,65 @@ pass three JSON input objects, based on existing templates:
|
|||
CI_AWS_EC2_DEPLOYMENT_FILE: 'aws/create_deployment.json'
|
||||
```
|
||||
|
||||
- Alternatively, you can provide these JSON objects as [file-typed CI/CD variables](../variables/index.md#cicd-variable-types).
|
||||
In your project, go to **Settings > CI/CD > Variables** and add
|
||||
the three variables listed above as file-typed CI/CD variables.
|
||||
For each variable, set the value to its corresponding JSON object.
|
||||
- If you do not want these JSON objects saved in your repository, add each object
|
||||
as a separate [file type CI/CD variable](../variables/index.md#cicd-variable-types)
|
||||
in the project settings. Use the same variable names as above.
|
||||
|
||||
1. Provide the name of the stack you're creating and/or targeting, as a CI/CD variable:
|
||||
1. In your `.gitlab-ci.yml` file, create a CI/CD variable for the name of the stack. For example:
|
||||
|
||||
```yaml
|
||||
variables:
|
||||
CI_AWS_CF_STACK_NAME: 'YourStackName'
|
||||
```
|
||||
|
||||
1. Add this CI template to your `.gitlab-ci.yml`:
|
||||
1. In your `.gitlab-ci.yml` file, add the CI template:
|
||||
|
||||
```yaml
|
||||
include:
|
||||
- template: AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml
|
||||
```
|
||||
|
||||
When running your project pipeline at this point:
|
||||
1. Run the pipeline.
|
||||
|
||||
- Your AWS CloudFormation stack is created based on the content of your
|
||||
`CI_AWS_CF_CREATE_STACK_FILE` file/variable.
|
||||
If your stack already exists, this step is skipped, but the `provision` job it belongs to still
|
||||
runs.
|
||||
- Your built application is pushed to your S3 bucket then and deployed to your EC2 instance, based
|
||||
on the related JSON object's content. The deployment job finishes whenever the deployment to EC2
|
||||
is done or has failed.
|
||||
- Your AWS CloudFormation stack is created based on the content of your
|
||||
`CI_AWS_CF_CREATE_STACK_FILE` variable.
|
||||
If your stack already exists, this step is skipped, but the `provision`
|
||||
job it belongs to still runs.
|
||||
- Your built application is pushed to your S3 bucket then and deployed to your EC2 instance, based
|
||||
on the related JSON object's content. The deployment job finishes when the deployment to EC2
|
||||
is done or has failed.
|
||||
|
||||
### Custom build job for Auto DevOps
|
||||
## Use Auto DevOps to deploy to EC2
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216008) in GitLab 13.6.
|
||||
|
||||
To leverage [Auto DevOps](../../topics/autodevops/index.md) for your project when deploying to
|
||||
AWS EC2, first you must define [your AWS credentials as CI/CD variables](#authenticate-gitlab-with-aws).
|
||||
To use [Auto DevOps](../../topics/autodevops/index.md) to deploy to EC2:
|
||||
|
||||
Next, define a job for the `build` stage. To do so, you must reference the
|
||||
`Auto-DevOps.gitlab-ci.yml` template and include a job named `build_artifact` in your
|
||||
`.gitlab-ci.yml` file. For example:
|
||||
1. Define [your AWS credentials as CI/CD variables](#authenticate-gitlab-with-aws).
|
||||
1. In your `.gitlab-ci.yml` file, reference the `Auto-Devops.gitlab-ci.yml` template.
|
||||
1. Define a job for the `build` stage named `build_artifact`. For example:
|
||||
|
||||
```yaml
|
||||
# .gitlab-ci.yml
|
||||
```yaml
|
||||
# .gitlab-ci.yml
|
||||
|
||||
include:
|
||||
- template: Auto-DevOps.gitlab-ci.yml
|
||||
include:
|
||||
- template: Auto-DevOps.gitlab-ci.yml
|
||||
|
||||
variables:
|
||||
AUTO_DEVOPS_PLATFORM_TARGET: EC2
|
||||
variables:
|
||||
AUTO_DEVOPS_PLATFORM_TARGET: EC2
|
||||
|
||||
build_artifact:
|
||||
stage: build
|
||||
script:
|
||||
- <your build script goes here>
|
||||
artifacts:
|
||||
paths:
|
||||
- <built artifact>
|
||||
```
|
||||
build_artifact:
|
||||
stage: build
|
||||
script:
|
||||
- <your build script goes here>
|
||||
artifacts:
|
||||
paths:
|
||||
- <built artifact>
|
||||
```
|
||||
|
||||
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
|
||||
For a video walkthrough of this configuration process, see [Auto Deploy to EC2](https://www.youtube.com/watch?v=4B-qSwKnacA).
|
||||
For a video walkthrough of this process, view [Auto Deploy to EC2](https://www.youtube.com/watch?v=4B-qSwKnacA).
|
||||
|
||||
### Deploy to Amazon EKS
|
||||
## Use Auto DevOps to deploy to EKS
|
||||
|
||||
- [Deploy your application to a GitLab-managed Amazon EKS cluster with Auto DevOps](https://about.gitlab.com/blog/2020/05/05/deploying-application-eks/)
|
||||
|
|
|
@ -214,7 +214,7 @@ You can target [AWS EC2](../../ci/cloud_deployment/index.md)
|
|||
as a deployment platform instead of Kubernetes. To use Auto DevOps with AWS EC2, you must add a
|
||||
specific CI/CD variable.
|
||||
|
||||
For more details, see [Custom build job for Auto DevOps](../../ci/cloud_deployment/index.md#custom-build-job-for-auto-devops)
|
||||
For more details, see [Custom build job for Auto DevOps](../../ci/cloud_deployment/index.md#use-auto-devops-to-deploy-to-ec2)
|
||||
for deployments to AWS EC2.
|
||||
|
||||
## Auto DevOps requirements for bare metal
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#
|
||||
# --------------------
|
||||
#
|
||||
# Documentation: https://docs.gitlab.com/ee/ci/cloud_deployment/#deploy-your-application-to-the-aws-elastic-container-service-ecs
|
||||
# Documentation: https://docs.gitlab.com/ee/ci/cloud_deployment/#deploy-your-application-to-ecs
|
||||
|
||||
stages:
|
||||
- build
|
||||
|
@ -23,5 +23,5 @@ stages:
|
|||
"error: Template has moved":
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Deploy-ECS.gitlab-ci.yml has been moved to AWS/Deploy-ECS.gitlab-ci.yml, see https://docs.gitlab.com/ee/ci/cloud_deployment/#deploy-your-application-to-the-aws-elastic-container-service-ecs for more details."
|
||||
- echo "Deploy-ECS.gitlab-ci.yml has been moved to AWS/Deploy-ECS.gitlab-ci.yml, see https://docs.gitlab.com/ee/ci/cloud_deployment/#deploy-your-application-to-ecs for more details."
|
||||
- exit 1
|
||||
|
|
|
@ -119,9 +119,9 @@ module Gitlab
|
|||
# See official parser: https://git.dpkg.org/cgit/dpkg/dpkg.git/tree/lib/dpkg/parsehelp.c?id=9e0c88ec09475f4d1addde9cdba1ad7849720356#n205
|
||||
@debian_version_regex ||= %r{
|
||||
\A(?:
|
||||
(?:([0-9]{1,9}):)? (?# epoch)
|
||||
([0-9][0-9a-z\.+~-]*) (?# version)
|
||||
(?:(-[0-0a-z\.+~]+))? (?# revision)
|
||||
(?:([0-9]{1,9}):)? (?# epoch)
|
||||
([0-9][0-9a-z\.+~]*-?){1,15} (?# version-revision)
|
||||
(?<!-)
|
||||
)\z}xi.freeze
|
||||
end
|
||||
|
||||
|
|
|
@ -794,9 +794,8 @@ module Gitlab
|
|||
# rubocop: enable UsageData/LargeTable:
|
||||
|
||||
0.upto(series_amount - 1).map do |series|
|
||||
# When there is an error with the query and it's not the Hash we expect, we return what we got from `count`.
|
||||
sent_count = sent_emails.is_a?(Hash) ? sent_emails.fetch([track, series], 0) : sent_emails
|
||||
clicked_count = clicked_emails.is_a?(Hash) ? clicked_emails.fetch([track, series], 0) : clicked_emails
|
||||
sent_count = sent_in_product_marketing_email_count(sent_emails, track, series)
|
||||
clicked_count = clicked_in_product_marketing_email_count(clicked_emails, track, series)
|
||||
|
||||
result["in_product_marketing_email_#{track}_#{series}_sent"] = sent_count
|
||||
result["in_product_marketing_email_#{track}_#{series}_cta_clicked"] = clicked_count unless track == 'experience'
|
||||
|
@ -805,6 +804,16 @@ module Gitlab
|
|||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
def sent_in_product_marketing_email_count(sent_emails, track, series)
|
||||
# When there is an error with the query and it's not the Hash we expect, we return what we got from `count`.
|
||||
sent_emails.is_a?(Hash) ? sent_emails.fetch([track, series], 0) : sent_emails
|
||||
end
|
||||
|
||||
def clicked_in_product_marketing_email_count(clicked_emails, track, series)
|
||||
# When there is an error with the query and it's not the Hash we expect, we return what we got from `count`.
|
||||
clicked_emails.is_a?(Hash) ? clicked_emails.fetch([track, series], 0) : clicked_emails
|
||||
end
|
||||
|
||||
def unique_visit_service
|
||||
strong_memoize(:unique_visit_service) do
|
||||
::Gitlab::Analytics::UniqueVisits.new
|
||||
|
|
|
@ -85,6 +85,16 @@ module Gitlab
|
|||
failures: []
|
||||
}
|
||||
end
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
def sent_in_product_marketing_email_count(sent_emails, track, series)
|
||||
count(Users::InProductMarketingEmail.where(track: track, series: series))
|
||||
end
|
||||
|
||||
def clicked_in_product_marketing_email_count(clicked_emails, track, series)
|
||||
count(Users::InProductMarketingEmail.where(track: track, series: series).where.not(cta_clicked_at: nil))
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -325,6 +325,28 @@ describe('MergeRequestTabs', () => {
|
|||
expect(window.scrollTo.mock.calls[0]).toEqual([0, 39]);
|
||||
});
|
||||
|
||||
it.each`
|
||||
tab | hides | hidesText
|
||||
${'show'} | ${false} | ${'shows'}
|
||||
${'diffs'} | ${true} | ${'hides'}
|
||||
${'commits'} | ${true} | ${'hides'}
|
||||
`('it $hidesText expand button on $tab tab', ({ tab, hides }) => {
|
||||
const expandButton = document.createElement('div');
|
||||
expandButton.classList.add('js-expand-sidebar');
|
||||
|
||||
const tabsContainer = document.createElement('div');
|
||||
tabsContainer.innerHTML =
|
||||
'<div class="tab-content"><div id="diff-notes-app"></div><div class="commits tab-pane"></div></div>';
|
||||
tabsContainer.classList.add('merge-request-tabs-container');
|
||||
tabsContainer.appendChild(expandButton);
|
||||
document.body.appendChild(tabsContainer);
|
||||
|
||||
testContext.class = new MergeRequestTabs({ stubLocation });
|
||||
testContext.class.tabShown(tab, 'foobar');
|
||||
|
||||
expect(testContext.class.expandSidebar.classList.contains('gl-display-none!')).toBe(hides);
|
||||
});
|
||||
|
||||
describe('when switching tabs', () => {
|
||||
const SCROLL_TOP = 100;
|
||||
|
||||
|
|
|
@ -58,6 +58,43 @@ RSpec.describe FormHelper do
|
|||
end
|
||||
end
|
||||
|
||||
it 'renders help page links' do
|
||||
stubbed_errors = ActiveModel::Errors.new(double).tap do |errors|
|
||||
errors.add(:base, 'No text.', help_page_url: 'http://localhost/doc/user/index.html')
|
||||
errors.add(
|
||||
:base,
|
||||
'With text.',
|
||||
help_link_text: 'Documentation page title.',
|
||||
help_page_url: 'http://localhost/doc/administration/index.html'
|
||||
)
|
||||
errors.add(
|
||||
:base,
|
||||
'With HTML text.',
|
||||
help_link_text: '<foo>',
|
||||
help_page_url: 'http://localhost/doc/security/index.html'
|
||||
)
|
||||
end
|
||||
|
||||
model = double(errors: stubbed_errors)
|
||||
|
||||
errors = helper.form_errors(model)
|
||||
|
||||
aggregate_failures do
|
||||
expect(errors).to include(
|
||||
'<li>No text. <a target="_blank" rel="noopener noreferrer" ' \
|
||||
'href="http://localhost/doc/user/index.html">Learn more.</a></li>'
|
||||
)
|
||||
expect(errors).to include(
|
||||
'<li>With text. <a target="_blank" rel="noopener noreferrer" ' \
|
||||
'href="http://localhost/doc/administration/index.html">Documentation page title.</a></li>'
|
||||
)
|
||||
expect(errors).to include(
|
||||
'<li>With HTML text. <a target="_blank" rel="noopener noreferrer" ' \
|
||||
'href="http://localhost/doc/security/index.html"><foo></a></li>'
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def errors_stub(*messages)
|
||||
ActiveModel::Errors.new(double).tap do |errors|
|
||||
messages.each { |msg| errors.add(:base, msg) }
|
||||
|
|
|
@ -570,8 +570,7 @@ RSpec.describe Gitlab::Regex do
|
|||
# nothing after colon in version number
|
||||
it { is_expected.not_to match('2:') }
|
||||
# revision number is empty
|
||||
# Note: we are less strict here
|
||||
# it { is_expected.not_to match('1.0-') }
|
||||
it { is_expected.not_to match('1.0-') }
|
||||
# version number is empty
|
||||
it { is_expected.not_to match('-1') }
|
||||
it { is_expected.not_to match('2:-1') }
|
||||
|
@ -593,6 +592,9 @@ RSpec.describe Gitlab::Regex do
|
|||
it { is_expected.not_to match('1.0 ') }
|
||||
# dpkg accepts multiple colons
|
||||
it { is_expected.not_to match('1:2:3') }
|
||||
# we limit the number of dashes
|
||||
it { is_expected.to match('1-2-3-4-5-6-7-8-9-10-11-12-13-14-15') }
|
||||
it { is_expected.not_to match('1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16') }
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -155,6 +155,11 @@ RSpec.describe Gitlab::Usage::ServicePingReport, :use_clean_rails_memory_store_c
|
|||
memoized_constatns += Gitlab::UsageData::EE_MEMOIZED_VALUES if defined? Gitlab::UsageData::EE_MEMOIZED_VALUES
|
||||
memoized_constatns.each { |v| Gitlab::UsageData.clear_memoization(v) }
|
||||
stub_database_flavor_check('Cloud SQL for PostgreSQL')
|
||||
|
||||
# in_product_marketing_email metrics values are extracted from a single group by query
|
||||
# to check if the queries for individual metrics return the same value as group by when the value is non-zero
|
||||
create(:in_product_marketing_email, track: :create, series: 0, cta_clicked_at: Time.current)
|
||||
create(:in_product_marketing_email, track: :verify, series: 0)
|
||||
end
|
||||
|
||||
let(:service_ping_payload) { described_class.for(output: :all_metrics_values) }
|
||||
|
|
|
@ -105,4 +105,25 @@ RSpec.describe Gitlab::UsageDataQueries do
|
|||
expect(described_class.maximum_id(Project)).to eq(nil)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'sent_in_product_marketing_email_count' do
|
||||
it 'returns sql query that returns correct value' do
|
||||
expect(described_class.sent_in_product_marketing_email_count(nil, 0, 0)).to eq(
|
||||
'SELECT COUNT("in_product_marketing_emails"."id") ' \
|
||||
'FROM "in_product_marketing_emails" ' \
|
||||
'WHERE "in_product_marketing_emails"."track" = 0 AND "in_product_marketing_emails"."series" = 0'
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'clicked_in_product_marketing_email_count' do
|
||||
it 'returns sql query that returns correct value' do
|
||||
expect(described_class.clicked_in_product_marketing_email_count(nil, 0, 0)).to eq(
|
||||
'SELECT COUNT("in_product_marketing_emails"."id") ' \
|
||||
'FROM "in_product_marketing_emails" ' \
|
||||
'WHERE "in_product_marketing_emails"."track" = 0 AND "in_product_marketing_emails"."series" = 0 ' \
|
||||
'AND "in_product_marketing_emails"."cta_clicked_at" IS NOT NULL'
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -100,12 +100,12 @@ func (m *Multipart) readAndUploadOnePart(ctx context.Context, partURL string, pu
|
|||
defer file.Close()
|
||||
|
||||
if err := os.Remove(file.Name()); err != nil {
|
||||
return nil, err
|
||||
return nil, fmt.Errorf("remove temporary buffer file: %v", err)
|
||||
}
|
||||
|
||||
n, err := io.Copy(file, src)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, fmt.Errorf("copy to temporary buffer file: %v", err)
|
||||
}
|
||||
if n == 0 {
|
||||
return nil, nil
|
||||
|
|
Loading…
Reference in New Issue