From 9e27f0d920cc3891fa7644c5cc0bc280c519fb20 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 1 Oct 2019 12:05:59 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .../boards/components/issue_card_inner.vue | 7 - .../boards/mixins/issue_card_inner.js | 5 + .../jobs/components/job_container_item.vue | 4 +- app/assets/stylesheets/pages/builds.scss | 4 - app/assets/stylesheets/pages/projects.scss | 8 ++ app/models/ci/group.rb | 19 ++- app/models/ci/legacy_stage.rb | 14 +- app/models/ci/pipeline.rb | 36 +++++- app/models/ci/stage.rb | 9 +- app/models/commit_status.rb | 8 +- app/models/concerns/has_status.rb | 22 +++- app/models/namespace.rb | 6 + app/models/pages_domain.rb | 10 ++ app/models/project.rb | 5 + .../project_services/issue_tracker_service.rb | 5 + app/models/service.rb | 11 ++ app/services/ci/process_pipeline_service.rb | 7 +- app/views/shared/projects/_project.html.haml | 8 +- changelogs/unreleased/22904-fix-overflow.yml | 5 + ...28781-migrate-pages-metadata-on-demand.yml | 5 + .../29284-video-preview-not-working.yml | 5 - ...e-star-icon-to-project-row-in-case-the.yml | 5 + ...x-project-export-for-pipelines-for-mrs.yml | 5 + ...pages_deploy_partial_index_on_ci_builds.rb | 23 ++++ db/schema.rb | 1 + doc/security/rack_attack.md | 6 + .../settings/img/protected_paths.png | Bin 0 -> 198802 bytes doc/user/admin_area/settings/index.md | 1 + .../admin_area/settings/protected_paths.md | 76 +++++++++++ doc/user/gitlab_com/index.md | 4 +- lib/api/helpers/graphql_helpers.rb | 2 +- lib/api/version.rb | 5 +- lib/banzai/filter/video_link_filter.rb | 22 +++- .../migrate_pages_metadata.rb | 38 ++++++ lib/gitlab/ci/status/composite.rb | 120 ++++++++++++++++++ .../import_export/project_tree_restorer.rb | 22 ++++ lib/gitlab/import_export/relation_factory.rb | 30 ++++- scripts/rspec_helpers.sh | 8 +- .../projects/jobs/user_browses_job_spec.rb | 10 +- .../lib/gitlab/import_export/project.json | 2 + spec/javascripts/boards/issue_card_spec.js | 15 --- spec/lib/api/helpers/graphql_helpers_spec.rb | 44 +++++++ .../banzai/filter/video_link_filter_spec.rb | 43 +++---- .../migrate_pages_metadata_spec.rb | 44 +++++++ spec/lib/gitlab/ci/status/composite_spec.rb | 61 +++++++++ .../project_tree_restorer_spec.rb | 11 ++ .../import_export/relation_factory_spec.rb | 2 + spec/models/ci/group_spec.rb | 26 ++++ spec/models/ci/legacy_stage_spec.rb | 13 +- spec/models/ci/pipeline_spec.rb | 106 +++++++++------- spec/models/ci/stage_spec.rb | 2 +- spec/models/commit_status_spec.rb | 6 +- spec/models/concerns/has_status_spec.rb | 35 +++-- spec/models/namespace_spec.rb | 30 ++++- spec/models/pages_domain_spec.rb | 10 +- .../project_services/jira_service_spec.rb | 2 +- spec/models/project_spec.rb | 10 ++ spec/models/service_spec.rb | 62 ++++++++- 58 files changed, 914 insertions(+), 191 deletions(-) create mode 100644 changelogs/unreleased/22904-fix-overflow.yml create mode 100644 changelogs/unreleased/28781-migrate-pages-metadata-on-demand.yml delete mode 100644 changelogs/unreleased/29284-video-preview-not-working.yml create mode 100644 changelogs/unreleased/32036-add-some-spacing-offset-to-the-star-icon-to-project-row-in-case-the.yml create mode 100644 changelogs/unreleased/sh-fix-project-export-for-pipelines-for-mrs.yml create mode 100644 db/migrate/20190919040324_add_successfull_pages_deploy_partial_index_on_ci_builds.rb create mode 100644 doc/user/admin_area/settings/img/protected_paths.png create mode 100644 doc/user/admin_area/settings/protected_paths.md create mode 100644 lib/gitlab/background_migration/migrate_pages_metadata.rb create mode 100644 lib/gitlab/ci/status/composite.rb create mode 100644 spec/lib/api/helpers/graphql_helpers_spec.rb create mode 100644 spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb create mode 100644 spec/lib/gitlab/ci/status/composite_spec.rb diff --git a/app/assets/javascripts/boards/components/issue_card_inner.vue b/app/assets/javascripts/boards/components/issue_card_inner.vue index 2acd92069ca..1d53a21c8ac 100644 --- a/app/assets/javascripts/boards/components/issue_card_inner.vue +++ b/app/assets/javascripts/boards/components/issue_card_inner.vue @@ -104,13 +104,6 @@ export default { helpLink() { return boardsStore.scopedLabels.helpLink; }, - validIssueWeight() { - if (_.isNumber(this.issue.weight)) { - return this.issue.weight >= 0; - } - - return false; - }, }, methods: { isIndexLessThanlimit(index) { diff --git a/app/assets/javascripts/boards/mixins/issue_card_inner.js b/app/assets/javascripts/boards/mixins/issue_card_inner.js index 8000237da6d..04e971b756d 100644 --- a/app/assets/javascripts/boards/mixins/issue_card_inner.js +++ b/app/assets/javascripts/boards/mixins/issue_card_inner.js @@ -1,4 +1,9 @@ export default { + computed: { + validIssueWeight() { + return false; + }, + }, methods: { filterByWeight() {}, }, diff --git a/app/assets/javascripts/jobs/components/job_container_item.vue b/app/assets/javascripts/jobs/components/job_container_item.vue index a55dffbe488..7bd299bcfa0 100644 --- a/app/assets/javascripts/jobs/components/job_container_item.vue +++ b/app/assets/javascripts/jobs/components/job_container_item.vue @@ -54,7 +54,7 @@ export default { :href="job.status.details_path" :title="tooltipText" data-boundary="viewport" - class="js-job-link" + class="js-job-link d-flex" > - {{ job.name ? job.name : job.id }} + {{ job.name ? job.name : job.id }} diff --git a/app/assets/stylesheets/pages/builds.scss b/app/assets/stylesheets/pages/builds.scss index 73166940146..89fd160b575 100644 --- a/app/assets/stylesheets/pages/builds.scss +++ b/app/assets/stylesheets/pages/builds.scss @@ -308,12 +308,8 @@ } a { - display: block; padding: $gl-padding 10px $gl-padding 40px; width: 270px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; &:hover { color: $gl-text-color; diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 7577112cb0e..b2c1d0b6dc5 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -1001,6 +1001,14 @@ pre.light-well { } } + &:not(.with-pipeline-status) { + .icon-wrapper:first-of-type { + @include media-breakpoint-up(lg) { + margin-left: $gl-padding-32; + } + } + } + .ci-status-link { display: inline-flex; } diff --git a/app/models/ci/group.rb b/app/models/ci/group.rb index 9b2c3c807ac..0e05318b253 100644 --- a/app/models/ci/group.rb +++ b/app/models/ci/group.rb @@ -9,6 +9,7 @@ module Ci # class Group include StaticModel + include Gitlab::Utils::StrongMemoize attr_reader :stage, :name, :jobs @@ -21,7 +22,17 @@ module Ci end def status - @status ||= commit_statuses.status + strong_memoize(:status) do + if Feature.enabled?(:ci_composite_status, default_enabled: false) + Gitlab::Ci::Status::Composite + .new(@jobs) + .status + else + CommitStatus + .where(id: @jobs) + .legacy_status + end + end end def detailed_status(current_user) @@ -40,11 +51,5 @@ module Ci self.new(stage, name: group_name, jobs: grouped_statuses) end end - - private - - def commit_statuses - @commit_statuses ||= CommitStatus.where(id: jobs.map(&:id)) - end end end diff --git a/app/models/ci/legacy_stage.rb b/app/models/ci/legacy_stage.rb index 930c8a71453..2fd369c9aff 100644 --- a/app/models/ci/legacy_stage.rb +++ b/app/models/ci/legacy_stage.rb @@ -14,7 +14,8 @@ module Ci @pipeline = pipeline @name = name @status = status - @warnings = warnings + # support ints and booleans + @has_warnings = ActiveRecord::Type::Boolean.new.cast(warnings) end def groups @@ -30,7 +31,7 @@ module Ci end def status - @status ||= statuses.latest.status + @status ||= statuses.latest.slow_composite_status end def detailed_status(current_user) @@ -52,11 +53,12 @@ module Ci end def has_warnings? - if @warnings.is_a?(Integer) - @warnings > 0 - else - statuses.latest.failed_but_allowed.any? + # lazilly calculate the warnings + if @has_warnings.nil? + @has_warnings = statuses.latest.failed_but_allowed.any? end + + @has_warnings end def manual_playable? diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 9a96429d3a9..7fa290610aa 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -386,13 +386,12 @@ module Ci end end - def legacy_stages + def legacy_stages_using_sql # TODO, this needs refactoring, see gitlab-foss#26481. - stages_query = statuses .group('stage').select(:stage).order('max(stage_idx)') - status_sql = statuses.latest.where('stage=sg.stage').status_sql + status_sql = statuses.latest.where('stage=sg.stage').legacy_status_sql warnings_sql = statuses.latest.select('COUNT(*)') .where('stage=sg.stage').failed_but_allowed.to_sql @@ -405,6 +404,30 @@ module Ci end end + def legacy_stages_using_composite_status + stages = statuses.latest + .order(:stage_idx, :stage) + .group_by(&:stage) + + stages.map do |stage_name, jobs| + composite_status = Gitlab::Ci::Status::Composite + .new(jobs) + + Ci::LegacyStage.new(self, + name: stage_name, + status: composite_status.status, + warnings: composite_status.warnings?) + end + end + + def legacy_stages + if Feature.enabled?(:ci_composite_status, default_enabled: false) + legacy_stages_using_composite_status + else + legacy_stages_using_sql + end + end + def valid_commit_sha if self.sha == Gitlab::Git::BLANK_SHA self.errors.add(:sha, " cant be 00000000 (branch removal)") @@ -635,7 +658,8 @@ module Ci def update_status retry_optimistic_lock(self) do - case latest_builds_status.to_s + new_status = latest_builds_status.to_s + case new_status when 'created' then nil when 'preparing' then prepare when 'pending' then enqueue @@ -648,7 +672,7 @@ module Ci when 'scheduled' then delay else raise HasStatus::UnknownStatusError, - "Unknown status `#{latest_builds_status}`" + "Unknown status `#{new_status}`" end end end @@ -907,7 +931,7 @@ module Ci def latest_builds_status return 'failed' unless yaml_errors.blank? - statuses.latest.status || 'skipped' + statuses.latest.slow_composite_status || 'skipped' end def keep_around_commits diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb index d90339d90dc..77ac8bfe875 100644 --- a/app/models/ci/stage.rb +++ b/app/models/ci/stage.rb @@ -78,7 +78,8 @@ module Ci def update_status retry_optimistic_lock(self) do - case statuses.latest.status + new_status = latest_stage_status.to_s + case new_status when 'created' then nil when 'preparing' then prepare when 'pending' then enqueue @@ -91,7 +92,7 @@ module Ci when 'skipped', nil then skip else raise HasStatus::UnknownStatusError, - "Unknown status `#{statuses.latest.status}`" + "Unknown status `#{new_status}`" end end end @@ -124,5 +125,9 @@ module Ci def manual_playable? blocked? || skipped? end + + def latest_stage_status + statuses.latest.slow_composite_status || 'skipped' + end end end diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb index 5d9d3179f9d..39a6247b3b2 100644 --- a/app/models/commit_status.rb +++ b/app/models/commit_status.rb @@ -48,6 +48,10 @@ class CommitStatus < ApplicationRecord scope :processables, -> { where(type: %w[Ci::Build Ci::Bridge]) } scope :for_ids, -> (ids) { where(id: ids) } + scope :with_preloads, -> do + preload(:project, :user) + end + scope :with_needs, -> (names = nil) do needs = Ci::BuildNeed.scoped_build.select(1) needs = needs.where(name: names) if names @@ -161,11 +165,11 @@ class CommitStatus < ApplicationRecord end def self.status_for_prior_stages(index) - before_stage(index).latest.status || 'success' + before_stage(index).latest.slow_composite_status || 'success' end def self.status_for_names(names) - where(name: names).latest.status || 'success' + where(name: names).latest.slow_composite_status || 'success' end def locking_enabled? diff --git a/app/models/concerns/has_status.rb b/app/models/concerns/has_status.rb index bcbbb27a9a8..c01fb4740e5 100644 --- a/app/models/concerns/has_status.rb +++ b/app/models/concerns/has_status.rb @@ -10,6 +10,8 @@ module HasStatus ACTIVE_STATUSES = %w[preparing pending running].freeze COMPLETED_STATUSES = %w[success failed canceled skipped].freeze ORDERED_STATUSES = %w[failed preparing pending running manual scheduled canceled success skipped created].freeze + PASSED_WITH_WARNINGS_STATUSES = %w[failed canceled].to_set.freeze + EXCLUDE_IGNORED_STATUSES = %w[manual failed canceled].to_set.freeze STATUSES_ENUM = { created: 0, pending: 1, running: 2, success: 3, failed: 4, canceled: 5, skipped: 6, manual: 7, scheduled: 8, preparing: 9 }.freeze @@ -17,7 +19,7 @@ module HasStatus UnknownStatusError = Class.new(StandardError) class_methods do - def status_sql + def legacy_status_sql scope_relevant = respond_to?(:exclude_ignored) ? exclude_ignored : all scope_warnings = respond_to?(:failed_but_allowed) ? failed_but_allowed : none @@ -53,8 +55,22 @@ module HasStatus ) end - def status - all.pluck(status_sql).first + def legacy_status + all.pluck(legacy_status_sql).first + end + + # This method should not be used. + # This method performs expensive calculation of status: + # 1. By plucking all related objects, + # 2. Or executes expensive SQL query + def slow_composite_status + if Feature.enabled?(:ci_composite_status, default_enabled: false) + Gitlab::Ci::Status::Composite + .new(all, with_allow_failure: columns_hash.key?('allow_failure')) + .status + else + legacy_status + end end def started_at diff --git a/app/models/namespace.rb b/app/models/namespace.rb index fb90ddc1048..2fe691bd959 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -319,6 +319,12 @@ class Namespace < ApplicationRecord private def all_projects_with_pages + if all_projects.pages_metadata_not_migrated.exists? + Gitlab::BackgroundMigration::MigratePagesMetadata.new.perform_on_relation( + all_projects.pages_metadata_not_migrated + ) + end + all_projects.with_pages_deployed end diff --git a/app/models/pages_domain.rb b/app/models/pages_domain.rb index 6be3053f637..7903a2182dd 100644 --- a/app/models/pages_domain.rb +++ b/app/models/pages_domain.rb @@ -194,6 +194,16 @@ class PagesDomain < ApplicationRecord private def pages_deployed? + # TODO: remove once `pages_metadatum` is migrated + # https://gitlab.com/gitlab-org/gitlab/issues/33106 + unless project.pages_metadatum + Gitlab::BackgroundMigration::MigratePagesMetadata + .new + .perform_on_relation(Project.where(id: project_id)) + + project.reset + end + project.pages_metadatum&.deployed? end diff --git a/app/models/project.rb b/app/models/project.rb index 2a7d652678d..318d1473a70 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -433,6 +433,11 @@ class Project < ApplicationRecord joins(:pages_metadatum).merge(ProjectPagesMetadatum.deployed) end + scope :pages_metadata_not_migrated, -> do + left_outer_joins(:pages_metadatum) + .where(project_pages_metadata: { project_id: nil }) + end + enum auto_cancel_pending_pipelines: { disabled: 0, enabled: 1 } chronic_duration_attr :build_timeout_human_readable, :build_timeout, diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index 3ecd5390d79..278677edcdf 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -62,6 +62,7 @@ class IssueTrackerService < Service end data_values.reject! { |key| data_fields.changed.include?(key) } + data_values.slice!(*data_fields.attributes.keys) data_fields.assign_attributes(data_values) if data_values.present? self.properties = {} @@ -71,6 +72,10 @@ class IssueTrackerService < Service @legacy_properties_data ||= {} end + def supports_data_fields? + true + end + def data_fields issue_tracker_data || self.build_issue_tracker_data end diff --git a/app/models/service.rb b/app/models/service.rb index 43ed0c7dfaa..305cf7b78a2 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -291,6 +291,12 @@ class Service < ApplicationRecord def self.build_from_template(project_id, template) service = template.dup + + if template.supports_data_fields? + data_fields = template.data_fields.dup + data_fields.service = service + end + service.template = false service.project_id = project_id service.active = false if service.active? && !service.valid? @@ -309,6 +315,11 @@ class Service < ApplicationRecord find_by(template: true) end + # override if needed + def supports_data_fields? + false + end + private def cache_project_has_external_issue_tracker diff --git a/app/services/ci/process_pipeline_service.rb b/app/services/ci/process_pipeline_service.rb index 3b145a65d79..039670f58c8 100644 --- a/app/services/ci/process_pipeline_service.rb +++ b/app/services/ci/process_pipeline_service.rb @@ -2,6 +2,8 @@ module Ci class ProcessPipelineService < BaseService + include Gitlab::Utils::StrongMemoize + attr_reader :pipeline def execute(pipeline, trigger_build_ids = nil) @@ -33,9 +35,9 @@ module Ci return unless HasStatus::COMPLETED_STATUSES.include?(current_status) - created_processables_in_stage_without_needs(index).select do |build| + created_processables_in_stage_without_needs(index).find_each.select do |build| process_build(build, current_status) - end + end.any? end def process_builds_with_needs(trigger_build_ids) @@ -92,6 +94,7 @@ module Ci def created_processables_in_stage_without_needs(index) created_processables_without_needs + .with_preloads .for_stage(index) end diff --git a/app/views/shared/projects/_project.html.haml b/app/views/shared/projects/_project.html.haml index 5432607f82f..67dad9b7a75 100644 --- a/app/views/shared/projects/_project.html.haml +++ b/app/views/shared/projects/_project.html.haml @@ -12,7 +12,9 @@ - css_class += " no-description" if project.description.blank? && !show_last_commit_as_description - cache_key = project_list_cache_key(project, pipeline_status: pipeline_status) - updated_tooltip = time_ago_with_tooltip(project.last_activity_date) -- css_controls_class = compact_mode ? "" : "flex-lg-row justify-content-lg-between" +- show_pipeline_status_icon = pipeline_status && can?(current_user, :read_cross_project) && project.pipeline_status.has_status? && can?(current_user, :read_build, project) +- css_controls_class = compact_mode ? [] : ["flex-lg-row", "justify-content-lg-between"] +- css_controls_class << "with-pipeline-status" if show_pipeline_status_icon - avatar_container_class = project.creator && use_creator_avatar ? '' : 'rect-avatar' %li.project-row.d-flex{ class: css_class } @@ -58,9 +60,9 @@ .description.d-none.d-sm-block.append-right-default = markdown_field(project, :description) - .controls.d-flex.flex-sm-column.align-items-center.align-items-sm-end.flex-wrap.flex-shrink-0.text-secondary{ class: css_controls_class } + .controls.d-flex.flex-sm-column.align-items-center.align-items-sm-end.flex-wrap.flex-shrink-0.text-secondary{ class: css_controls_class.join(" ") } .icon-container.d-flex.align-items-center - - if pipeline_status && can?(current_user, :read_cross_project) && project.pipeline_status.has_status? && can?(current_user, :read_build, project) + - if show_pipeline_status_icon - pipeline_path = pipelines_project_commit_path(project.pipeline_status.project, project.pipeline_status.sha, ref: project.pipeline_status.ref) %span.icon-wrapper.pipeline-status = render 'ci/status/icon', status: project.last_pipeline.detailed_status(current_user), tooltip_placement: 'top', path: pipeline_path diff --git a/changelogs/unreleased/22904-fix-overflow.yml b/changelogs/unreleased/22904-fix-overflow.yml new file mode 100644 index 00000000000..06669d5b548 --- /dev/null +++ b/changelogs/unreleased/22904-fix-overflow.yml @@ -0,0 +1,5 @@ +--- +title: Fixes job overflow in stages dropdown +merge_request: +author: +type: fixed diff --git a/changelogs/unreleased/28781-migrate-pages-metadata-on-demand.yml b/changelogs/unreleased/28781-migrate-pages-metadata-on-demand.yml new file mode 100644 index 00000000000..ad478c8895d --- /dev/null +++ b/changelogs/unreleased/28781-migrate-pages-metadata-on-demand.yml @@ -0,0 +1,5 @@ +--- +title: Add index on ci_builds for successful Pages deploys +merge_request: 17204 +author: +type: added diff --git a/changelogs/unreleased/29284-video-preview-not-working.yml b/changelogs/unreleased/29284-video-preview-not-working.yml deleted file mode 100644 index 304700dea30..00000000000 --- a/changelogs/unreleased/29284-video-preview-not-working.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix inline rendering of videos for uploads with uppercase file extensions -merge_request: 17581 -author: -type: fixed diff --git a/changelogs/unreleased/32036-add-some-spacing-offset-to-the-star-icon-to-project-row-in-case-the.yml b/changelogs/unreleased/32036-add-some-spacing-offset-to-the-star-icon-to-project-row-in-case-the.yml new file mode 100644 index 00000000000..6ec9504b1a9 --- /dev/null +++ b/changelogs/unreleased/32036-add-some-spacing-offset-to-the-star-icon-to-project-row-in-case-the.yml @@ -0,0 +1,5 @@ +--- +title: 'Project list: Align star icons' +merge_request: 17833 +author: +type: other diff --git a/changelogs/unreleased/sh-fix-project-export-for-pipelines-for-mrs.yml b/changelogs/unreleased/sh-fix-project-export-for-pipelines-for-mrs.yml new file mode 100644 index 00000000000..1236255e3fd --- /dev/null +++ b/changelogs/unreleased/sh-fix-project-export-for-pipelines-for-mrs.yml @@ -0,0 +1,5 @@ +--- +title: Fix project imports for pipelines for merge requests +merge_request: 17799 +author: +type: fixed diff --git a/db/migrate/20190919040324_add_successfull_pages_deploy_partial_index_on_ci_builds.rb b/db/migrate/20190919040324_add_successfull_pages_deploy_partial_index_on_ci_builds.rb new file mode 100644 index 00000000000..d736b21dddf --- /dev/null +++ b/db/migrate/20190919040324_add_successfull_pages_deploy_partial_index_on_ci_builds.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +class AddSuccessfullPagesDeployPartialIndexOnCiBuilds < ActiveRecord::Migration[5.2] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + INDEX_NAME = 'index_ci_builds_on_project_id_for_successfull_pages_deploy' + + def up + add_concurrent_index( + :ci_builds, :project_id, + name: INDEX_NAME, + where: "type='GenericCommitStatus' AND stage='deploy' AND name='pages:deploy' AND status = 'success'" + ) + end + + def down + remove_concurrent_index_by_name :ci_builds, INDEX_NAME + end +end diff --git a/db/schema.rb b/db/schema.rb index ef52143da73..f5eb39d2087 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -643,6 +643,7 @@ ActiveRecord::Schema.define(version: 2019_09_27_074328) do t.index ["name"], name: "index_ci_builds_on_name_for_security_products_values", where: "((name)::text = ANY (ARRAY[('container_scanning'::character varying)::text, ('dast'::character varying)::text, ('dependency_scanning'::character varying)::text, ('license_management'::character varying)::text, ('sast'::character varying)::text]))" t.index ["project_id", "id"], name: "index_ci_builds_on_project_id_and_id" t.index ["project_id", "status"], name: "index_ci_builds_project_id_and_status_for_live_jobs_partial2", where: "(((type)::text = 'Ci::Build'::text) AND ((status)::text = ANY (ARRAY[('running'::character varying)::text, ('pending'::character varying)::text, ('created'::character varying)::text])))" + t.index ["project_id"], name: "index_ci_builds_on_project_id_for_successfull_pages_deploy", where: "(((type)::text = 'GenericCommitStatus'::text) AND ((stage)::text = 'deploy'::text) AND ((name)::text = 'pages:deploy'::text) AND ((status)::text = 'success'::text))" t.index ["protected"], name: "index_ci_builds_on_protected" t.index ["queued_at"], name: "index_ci_builds_on_queued_at" t.index ["runner_id"], name: "index_ci_builds_on_runner_id" diff --git a/doc/security/rack_attack.md b/doc/security/rack_attack.md index 09d29bf3446..51b7d7db3e4 100644 --- a/doc/security/rack_attack.md +++ b/doc/security/rack_attack.md @@ -36,6 +36,9 @@ will be enabled: ### Protected paths throttle +NOTE: **Note:** Omnibus GitLab protected paths throttle is deprecated and is scheduled for removal in +GitLab 13.0. Please refer to [Migrate settings from GitLab 12.3 and earlier](../user/admin_area/settings/protected_paths.md#migrate-settings-from-gitlab-123-and-earlier). + GitLab responds with HTTP status code `429` to POST requests at protected paths that exceed 10 requests per minute per IP address. @@ -124,6 +127,9 @@ The following settings can be configured: **Installations from source** +NOTE: **Note:** Rack Attack initializer was temporarily renamed to `rack_attack_new`, to +support backwards compatibility with the one [Omnibus initializer](https://docs.gitlab.com/omnibus/settings/configuration.html#setting-up-paths-to-be-protected-by-rack-attack). It'll be renamed back to `rack_attack.rb` once Omnibus throttle is removed. Please see the [GitLab issue](https://gitlab.com/gitlab-org/gitlab/issues/29952) for more information. + These settings can be found in `config/initializers/rack_attack.rb`. If you are missing `config/initializers/rack_attack.rb`, the following steps need to be taken in order to enable protection for your GitLab instance: diff --git a/doc/user/admin_area/settings/img/protected_paths.png b/doc/user/admin_area/settings/img/protected_paths.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa9124b8453f37d2599c464430256dc8591f83a GIT binary patch literal 198802 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 literal 0 HcmV?d00001 diff --git a/doc/user/admin_area/settings/index.md b/doc/user/admin_area/settings/index.md index 2a12614e325..ee776faa572 100644 --- a/doc/user/admin_area/settings/index.md +++ b/doc/user/admin_area/settings/index.md @@ -20,6 +20,7 @@ include: - [Visibility and access controls](visibility_and_access_controls.md) - [User and IP rate limits](user_and_ip_rate_limits.md) - [Custom templates repository](instance_template_repository.md) **(PREMIUM)** +- [Protected paths](protected_paths.md) **(CORE ONLY)** NOTE: **Note:** You can change the [first day of the week](../../profile/preferences.md) for the entire GitLab instance diff --git a/doc/user/admin_area/settings/protected_paths.md b/doc/user/admin_area/settings/protected_paths.md new file mode 100644 index 00000000000..21c8d79b138 --- /dev/null +++ b/doc/user/admin_area/settings/protected_paths.md @@ -0,0 +1,76 @@ +--- +type: reference +--- + +# Protected paths **(CORE ONLY)** + +GitLab protects the following paths with Rack Attack by default: + +``` +'/users/password', +'/users/sign_in', +'/api/#{API::API.version}/session.json', +'/api/#{API::API.version}/session', +'/users', +'/users/confirmation', +'/unsubscribes/', +'/import/github/personal_access_token' +``` + +GitLab responds with HTTP status code `429` to POST requests at protected paths +that exceed 10 requests per minute per IP address. + +This header is included in responses to blocked requests: + +``` +Retry-After: 60 +``` + +For example, the following are limited to a maximum 10 requests per minute: + +- User sign-in +- User sign-up (if enabled) +- User password reset + +After 10 requests, the client must wait 60 seconds before it can +try again. + +## Configure using GitLab UI + +> Introduced in [GitLab 12.4](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31246). + +Throttling of protected paths is enabled by default and can be disabled or +customized on **Admin > Network > Protected Paths**, along with these options: + +- Maximum number of requests per period per user. +- Rate limit period in seconds. +- Paths to be protected. + +![protected-paths](img/protected_paths.png) + +Requests over the rate limit are logged into `auth.log`. + +## Migrate settings from GitLab 12.3 and earlier + +Omnibus GitLab protected paths throttle is deprecated and is scheduled for removal in +GitLab 13.0. Please see the [GitLab issue](https://gitlab.com/gitlab-org/gitlab/issues/29952) and the [Omnibus GitLab issue](https://gitlab.com/gitlab-org/omnibus-gitlab/issues/4688) for more information. + +NOTE: **Note:** If Omnibus settings are present, applications settings will be automatically ignored to avoid generating multiple requests blocks. + +To migrate from Omnibus GitLab 12.3 and earlier settings: + +1. Disable the Protected Paths throttle from Omnibus, by changing `rack_attack_enabled` value to `false` on [`rack_attack.rb.erb`](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-cookbooks/gitlab/templates/default/rack_attack.rb.erb#L18): + + ```ruby + rack_attack_enabled = false + ``` + +1. Customize and enable your protected paths settings by following [Configure using GitLab UI](#configure-using-gitlab-ui) section. + +1. Restart GitLab: + + ```bash + sudo gitlab-ctl restart + ``` + +That's it. Protected paths throttle are now managed by GitLab admin settings. diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md index 0fd5c90494e..cfb561481d6 100644 --- a/doc/user/gitlab_com/index.md +++ b/doc/user/gitlab_com/index.md @@ -316,9 +316,7 @@ This header is included in responses to blocked requests: Retry-After: 60 ``` -Source: - -- Search for `rate_limit_requests_per_period`, `rate_limit_period`, and `rack_attack_protected_paths` in [GitLab.com's current Rails app settings](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-cookbooks/gitlab/attributes/default.rb). +See [Protected Paths](../admin_area/settings/protected_paths.md) for more details. #### Git and container registry failed authentication ban diff --git a/lib/api/helpers/graphql_helpers.rb b/lib/api/helpers/graphql_helpers.rb index bd60470fbd6..3ddef0c16b3 100644 --- a/lib/api/helpers/graphql_helpers.rb +++ b/lib/api/helpers/graphql_helpers.rb @@ -6,7 +6,7 @@ module API # against the graphql API. Helper code for the graphql server implementation # should be in app/graphql/ or lib/gitlab/graphql/ module GraphqlHelpers - def conditionally_graphql!(fallback:, query:, context: {}, transform: nil) + def run_graphql!(query:, context: {}, transform: nil) result = GitlabSchema.execute(query, context: context) if transform diff --git a/lib/api/version.rb b/lib/api/version.rb index eca1b529094..f79bb3428f2 100644 --- a/lib/api/version.rb +++ b/lib/api/version.rb @@ -19,11 +19,10 @@ module API detail 'This feature was introduced in GitLab 8.13.' end get '/version' do - conditionally_graphql!( + run_graphql!( query: METADATA_QUERY, context: { current_user: current_user }, - transform: ->(result) { result.dig('data', 'metadata') }, - fallback: -> { { version: Gitlab::VERSION, revision: Gitlab.revision } } + transform: ->(result) { result.dig('data', 'metadata') } ) end end diff --git a/lib/banzai/filter/video_link_filter.rb b/lib/banzai/filter/video_link_filter.rb index b3d5d2c95d7..a35b0d7a0b5 100644 --- a/lib/banzai/filter/video_link_filter.rb +++ b/lib/banzai/filter/video_link_filter.rb @@ -8,8 +8,8 @@ module Banzai # a "Download" link in the case the video cannot be played. class VideoLinkFilter < HTML::Pipeline::Filter def call - doc.xpath('descendant-or-self::img[not(ancestor::a)]').each do |el| - el.replace(video_node(doc, el)) if has_video_extension?(el) + doc.xpath(query).each do |el| + el.replace(video_node(doc, el)) end doc @@ -17,10 +17,22 @@ module Banzai private - def has_video_extension?(element) - src_attr = context[:asset_proxy_enabled] ? 'data-canonical-src' : 'src' + def query + @query ||= begin + src_query = UploaderHelper::SAFE_VIDEO_EXT.map do |ext| + "'.#{ext}' = substring(@src, string-length(@src) - #{ext.size})" + end - element.attr(src_attr).downcase.end_with?(*UploaderHelper::SAFE_VIDEO_EXT) + if context[:asset_proxy_enabled].present? + src_query.concat( + UploaderHelper::SAFE_VIDEO_EXT.map do |ext| + "'.#{ext}' = substring(@data-canonical-src, string-length(@data-canonical-src) - #{ext.size})" + end + ) + end + + "descendant-or-self::img[not(ancestor::a) and (#{src_query.join(' or ')})]" + end end def video_node(doc, element) diff --git a/lib/gitlab/background_migration/migrate_pages_metadata.rb b/lib/gitlab/background_migration/migrate_pages_metadata.rb new file mode 100644 index 00000000000..68fd0c17d29 --- /dev/null +++ b/lib/gitlab/background_migration/migrate_pages_metadata.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module Gitlab + module BackgroundMigration + # Class that will insert record into project_pages_metadata + # for each existing project + class MigratePagesMetadata + def perform(start_id, stop_id) + perform_on_relation(Project.where(id: start_id..stop_id)) + end + + def perform_on_relation(relation) + successful_pages_deploy = <<~SQL + SELECT TRUE + FROM ci_builds + WHERE ci_builds.type = 'GenericCommitStatus' + AND ci_builds.status = 'success' + AND ci_builds.stage = 'deploy' + AND ci_builds.name = 'pages:deploy' + AND ci_builds.project_id = projects.id + LIMIT 1 + SQL + + select_from = relation + .select("projects.id", "COALESCE((#{successful_pages_deploy}), FALSE)") + .to_sql + + ActiveRecord::Base.connection_pool.with_connection do |connection| + connection.execute <<~SQL + INSERT INTO project_pages_metadata (project_id, deployed) + #{select_from} + ON CONFLICT (project_id) DO NOTHING + SQL + end + end + end + end +end diff --git a/lib/gitlab/ci/status/composite.rb b/lib/gitlab/ci/status/composite.rb new file mode 100644 index 00000000000..3c00b67911f --- /dev/null +++ b/lib/gitlab/ci/status/composite.rb @@ -0,0 +1,120 @@ +# frozen_string_literal: true + +module Gitlab + module Ci + module Status + class Composite + include Gitlab::Utils::StrongMemoize + + # This class accepts an array of arrays/hashes/or objects + def initialize(all_statuses, with_allow_failure: true) + unless all_statuses.respond_to?(:pluck) + raise ArgumentError, "all_statuses needs to respond to `.pluck`" + end + + @status_set = Set.new + @status_key = 0 + @allow_failure_key = 1 if with_allow_failure + + consume_all_statuses(all_statuses) + end + + # The status calculation is order dependent, + # 1. In some cases we assume that that status is exact + # if the we only have given statues, + # 2. In other cases we assume that status is of that type + # based on what statuses are no longer valid based on the + # data set that we have + def status + return if none? + + strong_memoize(:status) do + if only_of?(:skipped, :ignored) + 'skipped' + elsif only_of?(:success, :skipped, :success_with_warnings, :ignored) + 'success' + elsif only_of?(:created, :success_with_warnings, :ignored) + 'created' + elsif only_of?(:preparing, :success_with_warnings, :ignored) + 'preparing' + elsif only_of?(:canceled, :success, :skipped, :success_with_warnings, :ignored) + 'canceled' + elsif only_of?(:pending, :created, :skipped, :success_with_warnings, :ignored) + 'pending' + elsif any_of?(:running, :pending) + 'running' + elsif any_of?(:manual) + 'manual' + elsif any_of?(:scheduled) + 'scheduled' + elsif any_of?(:preparing) + 'preparing' + elsif any_of?(:created) + 'running' + else + 'failed' + end + end + end + + def warnings? + @status_set.include?(:success_with_warnings) + end + + private + + def none? + @status_set.empty? + end + + def any_of?(*names) + names.any? { |name| @status_set.include?(name) } + end + + def only_of?(*names) + matching = names.count { |name| @status_set.include?(name) } + matching > 0 && + matching == @status_set.size + end + + def consume_all_statuses(all_statuses) + columns = [] + columns[@status_key] = :status + columns[@allow_failure_key] = :allow_failure if @allow_failure_key + + all_statuses + .pluck(*columns) # rubocop: disable CodeReuse/ActiveRecord + .each(&method(:consume_status)) + end + + def consume_status(description) + # convert `"status"` into `["status"]` + description = Array(description) + + status = + if success_with_warnings?(description) + :success_with_warnings + elsif ignored_status?(description) + :ignored + else + description[@status_key].to_sym + end + + @status_set.add(status) + end + + def success_with_warnings?(status) + @allow_failure_key && + status[@allow_failure_key] && + HasStatus::PASSED_WITH_WARNINGS_STATUSES.include?(status[@status_key]) + end + + def ignored_status?(status) + @allow_failure_key && + status[@allow_failure_key] && + HasStatus::EXCLUDE_IGNORED_STATUSES.include?(status[@status_key]) + end + end + end + end +end diff --git a/lib/gitlab/import_export/project_tree_restorer.rb b/lib/gitlab/import_export/project_tree_restorer.rb index 39a243bd433..017e536c3e7 100644 --- a/lib/gitlab/import_export/project_tree_restorer.rb +++ b/lib/gitlab/import_export/project_tree_restorer.rb @@ -52,6 +52,11 @@ module Gitlab project: restored_project) end + # A Hash of the imported merge request ID -> imported ID. + def merge_requests_mapping + @merge_requests_mapping ||= {} + end + # Loops through the tree of models defined in import_export.yml and # finds them in the imported JSON so they can be instantiated and saved # in the DB. The structure and relationships between models are guessed from @@ -80,10 +85,26 @@ module Gitlab @saved = false unless restored_project.append_or_update_attribute(relation_key, relation_hash) + save_id_mappings(relation_key, relation_hash_batch, relation_hash) + # Restore the project again, extra query that skips holding the AR objects in memory @restored_project = Project.find(@project_id) end + # Older, serialized CI pipeline exports may only have a + # merge_request_id and not the full hash of the merge request. To + # import these pipelines, we need to preserve the mapping between + # the old and new the merge request ID. + def save_id_mappings(relation_key, relation_hash_batch, relation_hash) + return unless relation_key == 'merge_requests' + + relation_hash = Array(relation_hash) + + Array(relation_hash_batch).each_with_index do |raw_data, index| + merge_requests_mapping[raw_data['id']] = relation_hash[index]['id'] + end + end + # Remove project models that became group models as we found them at group level. # This no longer required saving them at the root project level. # For example, in the case of an existing group label that matched the title. @@ -222,6 +243,7 @@ module Gitlab relation_sym: relation_key.to_sym, relation_hash: relation_hash, members_mapper: members_mapper, + merge_requests_mapping: merge_requests_mapping, user: @user, project: @restored_project, excluded_keys: excluded_keys_for_relation(relation_key)) diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb index 37f625288a9..9ec244b0960 100644 --- a/lib/gitlab/import_export/relation_factory.rb +++ b/lib/gitlab/import_export/relation_factory.rb @@ -55,10 +55,11 @@ module Gitlab relation_name.to_s.constantize end - def initialize(relation_sym:, relation_hash:, members_mapper:, user:, project:, excluded_keys: []) + def initialize(relation_sym:, relation_hash:, members_mapper:, merge_requests_mapping:, user:, project:, excluded_keys: []) @relation_name = self.class.overrides[relation_sym]&.to_sym || relation_sym @relation_hash = relation_hash.except('noteable_id') @members_mapper = members_mapper + @merge_requests_mapping = merge_requests_mapping @user = user @project = project @imported_object_retries = 0 @@ -109,7 +110,10 @@ module Gitlab update_group_references remove_duplicate_assignees - setup_pipeline if @relation_name == :'Ci::Pipeline' + if @relation_name == :'Ci::Pipeline' + update_merge_request_references + setup_pipeline + end reset_tokens! remove_encrypted_attributes! @@ -194,6 +198,28 @@ module Gitlab @relation_hash['group_id'] = @project.namespace_id end + # This code is a workaround for broken project exports that don't + # export merge requests with CI pipelines (i.e. exports that were + # generated from + # https://gitlab.com/gitlab-org/gitlab/merge_requests/17844). + # This method can be removed in GitLab 12.6. + def update_merge_request_references + # If a merge request was properly created, we don't need to fix + # up this export. + return if @relation_hash['merge_request'] + + merge_request_id = @relation_hash['merge_request_id'] + + return unless merge_request_id + + new_merge_request_id = @merge_requests_mapping[merge_request_id] + + return unless new_merge_request_id + + @relation_hash['merge_request_id'] = new_merge_request_id + parsed_relation_hash['merge_request_id'] = new_merge_request_id + end + def reset_tokens! return unless Gitlab::ImportExport.reset_tokens? && TOKEN_RESET_MODELS.include?(@relation_name) diff --git a/scripts/rspec_helpers.sh b/scripts/rspec_helpers.sh index a959ae0549d..9c9d33235c9 100644 --- a/scripts/rspec_helpers.sh +++ b/scripts/rspec_helpers.sh @@ -15,14 +15,14 @@ function retrieve_tests_metadata() { function update_tests_metadata() { echo "{}" > "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}" - scripts/merge-reports "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}" "knapsack/rspec*_pg9_*.json" + scripts/merge-reports "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}" knapsack/rspec*_pg9_*.json if [[ -n "${TESTS_METADATA_S3_BUCKET}" ]]; then scripts/sync-reports put "${TESTS_METADATA_S3_BUCKET}" "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}" fi - rm -f "knapsack/rspec*.json" + rm -f knapsack/rspec*.json - scripts/merge-reports "${FLAKY_RSPEC_SUITE_REPORT_PATH}" "rspec_flaky/all_*.json" + scripts/merge-reports "${FLAKY_RSPEC_SUITE_REPORT_PATH}" rspec_flaky/all_*.json export FLAKY_RSPEC_GENERATE_REPORT="1" scripts/prune-old-flaky-specs "${FLAKY_RSPEC_SUITE_REPORT_PATH}" @@ -31,7 +31,7 @@ function update_tests_metadata() { scripts/sync-reports put "${TESTS_METADATA_S3_BUCKET}" "${FLAKY_RSPEC_SUITE_REPORT_PATH}" fi - rm -f "rspec_flaky/all_*.json" "rspec_flaky/new_*.json" + rm -f rspec_flaky/all_*.json rspec_flaky/new_*.json scripts/insert-rspec-profiling-data } diff --git a/spec/features/projects/jobs/user_browses_job_spec.rb b/spec/features/projects/jobs/user_browses_job_spec.rb index 4d8a4812123..82ad08d0ff2 100644 --- a/spec/features/projects/jobs/user_browses_job_spec.rb +++ b/spec/features/projects/jobs/user_browses_job_spec.rb @@ -104,20 +104,20 @@ describe 'User browses a job', :js do it 'displays the failure reason' do wait_for_all_requests within('.builds-container') do - build_link = first('.build-job > a') - expect(build_link['data-original-title']).to eq('test - failed - (unknown failure)') + expect(page).to have_selector( + ".build-job > a[data-original-title='test - failed - (unknown failure)']") end end end context 'when a failed job has been retried' do - let!(:build) { create(:ci_build, :failed, :retried, :trace_artifact, pipeline: pipeline) } + let!(:build_retried) { create(:ci_build, :failed, :retried, :trace_artifact, pipeline: pipeline) } it 'displays the failure reason and retried label' do wait_for_all_requests within('.builds-container') do - build_link = first('.build-job > a') - expect(build_link['data-original-title']).to eq('test - failed - (unknown failure) (retried)') + expect(page).to have_selector( + ".build-job > a[data-original-title='test - failed - (unknown failure) (retried)']") end end end diff --git a/spec/fixtures/lib/gitlab/import_export/project.json b/spec/fixtures/lib/gitlab/import_export/project.json index 4544c38f39a..7d9c8cdef8f 100644 --- a/spec/fixtures/lib/gitlab/import_export/project.json +++ b/spec/fixtures/lib/gitlab/import_export/project.json @@ -6175,6 +6175,8 @@ "finished_at": null, "user_id": 9999, "duration": null, + "source": "push", + "merge_request_id": null, "notes": [ { "id": 999, diff --git a/spec/javascripts/boards/issue_card_spec.js b/spec/javascripts/boards/issue_card_spec.js index 9b5e8afa4ef..9e99f961797 100644 --- a/spec/javascripts/boards/issue_card_spec.js +++ b/spec/javascripts/boards/issue_card_spec.js @@ -286,19 +286,4 @@ describe('Issue card component', () => { .catch(done.fail); }); }); - - describe('weights', () => { - it('shows weight component is greater than 0', () => { - expect(component.$el.querySelector('.board-card-weight')).not.toBeNull(); - }); - - it('shows weight component when weight is 0', done => { - component.issue.weight = 0; - - Vue.nextTick(() => { - expect(component.$el.querySelector('.board-card-weight')).not.toBeNull(); - done(); - }); - }); - }); }); diff --git a/spec/lib/api/helpers/graphql_helpers_spec.rb b/spec/lib/api/helpers/graphql_helpers_spec.rb new file mode 100644 index 00000000000..c775ba6d5e8 --- /dev/null +++ b/spec/lib/api/helpers/graphql_helpers_spec.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe API::Helpers::GraphqlHelpers do + describe 'run_graphql!' do + let(:query) { '{ metadata { version } }' } + + let(:graphql_helper) do + Class.new do + include API::Helpers::GraphqlHelpers + end.new + end + + context 'when transform function is provided' do + let(:result) { { 'data' => { 'metadata' => { 'version' => '1.0.0' } } } } + + before do + allow(GitlabSchema).to receive(:execute).and_return(result) + end + + it 'returns the expected result' do + expect( + graphql_helper.run_graphql!( + query: query, + transform: ->(result) { result.dig('data', 'metadata') } + ) + ).to eq({ 'version' => '1.0.0' }) + end + end + + context 'when a transform function is not provided' do + let(:result) { double('result') } + + before do + allow(GitlabSchema).to receive(:execute).and_return(result) + end + + it 'returns the expected result' do + expect(graphql_helper.run_graphql!(query: query)).to eq(result) + end + end + end +end diff --git a/spec/lib/banzai/filter/video_link_filter_spec.rb b/spec/lib/banzai/filter/video_link_filter_spec.rb index afcc846ba05..b5be204d680 100644 --- a/spec/lib/banzai/filter/video_link_filter_spec.rb +++ b/spec/lib/banzai/filter/video_link_filter_spec.rb @@ -17,32 +17,27 @@ describe Banzai::Filter::VideoLinkFilter do let(:project) { create(:project, :repository) } - shared_examples 'replaces the image tag with a video tag' do |ext| - it "replaces the image tag 'path/video.#{ext}' with a video tag" do - container = filter(link_to_image("/path/video.#{ext}")).children.first - - expect(container.name).to eq 'div' - expect(container['class']).to eq 'video-container' - - video, paragraph = container.children - - expect(video.name).to eq 'video' - expect(video['src']).to eq "/path/video.#{ext}" - - expect(paragraph.name).to eq 'p' - - link = paragraph.children.first - - expect(link.name).to eq 'a' - expect(link['href']).to eq "/path/video.#{ext}" - expect(link['target']).to eq '_blank' - end - end - context 'when the element src has a video extension' do UploaderHelper::SAFE_VIDEO_EXT.each do |ext| - it_behaves_like 'replaces the image tag with a video tag', ext - it_behaves_like 'replaces the image tag with a video tag', ext.upcase + it "replaces the image tag 'path/video.#{ext}' with a video tag" do + container = filter(link_to_image("/path/video.#{ext}")).children.first + + expect(container.name).to eq 'div' + expect(container['class']).to eq 'video-container' + + video, paragraph = container.children + + expect(video.name).to eq 'video' + expect(video['src']).to eq "/path/video.#{ext}" + + expect(paragraph.name).to eq 'p' + + link = paragraph.children.first + + expect(link.name).to eq 'a' + expect(link['href']).to eq "/path/video.#{ext}" + expect(link['target']).to eq '_blank' + end end end diff --git a/spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb b/spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb new file mode 100644 index 00000000000..d94a312f605 --- /dev/null +++ b/spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Gitlab::BackgroundMigration::MigratePagesMetadata, :migration, schema: 20190919040324 do + let(:projects) { table(:projects) } + + subject(:migrate_pages_metadata) { described_class.new } + + describe '#perform_on_relation' do + let(:namespaces) { table(:namespaces) } + let(:builds) { table(:ci_builds) } + let(:pages_metadata) { table(:project_pages_metadata) } + + it 'marks specified projects with successful pages deployment' do + namespace = namespaces.create!(name: 'gitlab', path: 'gitlab-org') + not_migrated_with_pages = projects.create!(namespace_id: namespace.id, name: 'Not Migrated With Pages') + builds.create!(project_id: not_migrated_with_pages.id, type: 'GenericCommitStatus', status: 'success', stage: 'deploy', name: 'pages:deploy') + + migrated = projects.create!(namespace_id: namespace.id, name: 'Migrated') + pages_metadata.create!(project_id: migrated.id, deployed: true) + + not_migrated_no_pages = projects.create!(namespace_id: namespace.id, name: 'Not Migrated No Pages') + project_not_in_relation_scope = projects.create!(namespace_id: namespace.id, name: 'Other') + + projects_relation = projects.where(id: [not_migrated_with_pages, not_migrated_no_pages, migrated]) + + migrate_pages_metadata.perform_on_relation(projects_relation) + + expect(pages_metadata.find_by_project_id(not_migrated_with_pages.id).deployed).to eq(true) + expect(pages_metadata.find_by_project_id(not_migrated_no_pages.id).deployed).to eq(false) + expect(pages_metadata.find_by_project_id(migrated.id).deployed).to eq(true) + expect(pages_metadata.find_by_project_id(project_not_in_relation_scope.id)).to be_nil + end + end + + describe '#perform' do + it 'creates relation and delegates to #perform_on_relation' do + expect(migrate_pages_metadata).to receive(:perform_on_relation).with(projects.where(id: 3..5)) + + migrate_pages_metadata.perform(3, 5) + end + end +end diff --git a/spec/lib/gitlab/ci/status/composite_spec.rb b/spec/lib/gitlab/ci/status/composite_spec.rb new file mode 100644 index 00000000000..1725d954b92 --- /dev/null +++ b/spec/lib/gitlab/ci/status/composite_spec.rb @@ -0,0 +1,61 @@ +require 'spec_helper' + +describe Gitlab::Ci::Status::Composite do + set(:pipeline) { create(:ci_pipeline) } + + before(:all) do + @statuses = HasStatus::STATUSES_ENUM.map do |status, idx| + [status, create(:ci_build, pipeline: pipeline, status: status, importing: true)] + end.to_h + + @statuses_with_allow_failure = HasStatus::STATUSES_ENUM.map do |status, idx| + [status, create(:ci_build, pipeline: pipeline, status: status, allow_failure: true, importing: true)] + end.to_h + end + + describe '#status' do + shared_examples 'compares composite with SQL status' do + it 'returns exactly the same result' do + builds = Ci::Build.where(id: all_statuses) + + expect(composite_status.status).to eq(builds.legacy_status) + expect(composite_status.warnings?).to eq(builds.failed_but_allowed.any?) + end + end + + shared_examples 'validate all combinations' do |perms| + HasStatus::STATUSES_ENUM.keys.combination(perms).each do |statuses| + context "with #{statuses.join(",")}" do + it_behaves_like 'compares composite with SQL status' do + let(:all_statuses) do + statuses.map { |status| @statuses[status] } + end + + let(:composite_status) do + described_class.new(all_statuses) + end + end + + HasStatus::STATUSES_ENUM.each do |allow_failure_status, _| + context "and allow_failure #{allow_failure_status}" do + it_behaves_like 'compares composite with SQL status' do + let(:all_statuses) do + statuses.map { |status| @statuses[status] } + + [@statuses_with_allow_failure[allow_failure_status]] + end + + let(:composite_status) do + described_class.new(all_statuses) + end + end + end + end + end + end + end + + it_behaves_like 'validate all combinations', 0 + it_behaves_like 'validate all combinations', 1 + it_behaves_like 'validate all combinations', 2 + end +end diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb index fcc79279b6f..c619a2ab237 100644 --- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb @@ -96,6 +96,17 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do expect(Ci::Pipeline.where(ref: nil)).not_to be_empty end + it 'restores pipeline for merge request' do + pipeline = Ci::Pipeline.find_by_sha('048721d90c449b244b7b4c53a9186b04330174ec') + + expect(pipeline).to be_valid + expect(pipeline.tag).to be_falsey + expect(pipeline.source).to eq('merge_request_event') + expect(pipeline.merge_request.id).to be > 0 + expect(pipeline.merge_request.target_branch).to eq('feature') + expect(pipeline.merge_request.source_branch).to eq('feature_conflict') + end + it 'preserves updated_at on issues' do issue = Issue.where(description: 'Aliquam enim illo et possimus.').first diff --git a/spec/lib/gitlab/import_export/relation_factory_spec.rb b/spec/lib/gitlab/import_export/relation_factory_spec.rb index a31f77484d8..51b2fd06b46 100644 --- a/spec/lib/gitlab/import_export/relation_factory_spec.rb +++ b/spec/lib/gitlab/import_export/relation_factory_spec.rb @@ -3,12 +3,14 @@ require 'spec_helper' describe Gitlab::ImportExport::RelationFactory do let(:project) { create(:project) } let(:members_mapper) { double('members_mapper').as_null_object } + let(:merge_requests_mapping) { {} } let(:user) { create(:admin) } let(:excluded_keys) { [] } let(:created_object) do described_class.create(relation_sym: relation_sym, relation_hash: relation_hash, members_mapper: members_mapper, + merge_requests_mapping: merge_requests_mapping, user: user, project: project, excluded_keys: excluded_keys) diff --git a/spec/models/ci/group_spec.rb b/spec/models/ci/group_spec.rb index 36c65d92840..b3b158a111e 100644 --- a/spec/models/ci/group_spec.rb +++ b/spec/models/ci/group_spec.rb @@ -22,6 +22,32 @@ describe Ci::Group do end end + describe '#status' do + let(:jobs) do + [create(:ci_build, :failed)] + end + + context 'when ci_composite_status is enabled' do + before do + stub_feature_flags(ci_composite_status: true) + end + + it 'returns a failed status' do + expect(subject.status).to eq('failed') + end + end + + context 'when ci_composite_status is disabled' do + before do + stub_feature_flags(ci_composite_status: false) + end + + it 'returns a failed status' do + expect(subject.status).to eq('failed') + end + end + end + describe '#detailed_status' do context 'when there is only one item in the group' do it 'calls the status from the object itself' do diff --git a/spec/models/ci/legacy_stage_spec.rb b/spec/models/ci/legacy_stage_spec.rb index bb812cc0533..477f4036218 100644 --- a/spec/models/ci/legacy_stage_spec.rb +++ b/spec/models/ci/legacy_stage_spec.rb @@ -216,7 +216,7 @@ describe Ci::LegacyStage do context 'when stage has warnings' do context 'when using memoized warnings flag' do context 'when there are warnings' do - let(:stage) { build(:ci_stage, warnings: 2) } + let(:stage) { build(:ci_stage, warnings: true) } it 'returns true using memoized value' do expect(stage).not_to receive(:statuses) @@ -225,22 +225,13 @@ describe Ci::LegacyStage do end context 'when there are no warnings' do - let(:stage) { build(:ci_stage, warnings: 0) } + let(:stage) { build(:ci_stage, warnings: false) } it 'returns false using memoized value' do expect(stage).not_to receive(:statuses) expect(stage).not_to have_warnings end end - - context 'when number of warnings is not a valid value' do - let(:stage) { build(:ci_stage, warnings: true) } - - it 'calculates statuses using database queries' do - expect(stage).to receive(:statuses).and_call_original - expect(stage).not_to have_warnings - end - end end context 'when calculating warnings from statuses' do diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 3c625784132..0e11c595388 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -1136,59 +1136,71 @@ describe Ci::Pipeline, :mailer do end describe '#legacy_stages' do + using RSpec::Parameterized::TableSyntax + subject { pipeline.legacy_stages } - context 'stages list' do - it 'returns ordered list of stages' do - expect(subject.map(&:name)).to eq(%w[build test deploy]) - end + where(:ci_composite_status) do + [false, true] end - context 'stages with statuses' do - let(:statuses) do - subject.map { |stage| [stage.name, stage.status] } + with_them do + before do + stub_feature_flags(ci_composite_status: ci_composite_status) end - it 'returns list of stages with correct statuses' do - expect(statuses).to eq([%w(build failed), - %w(test success), - %w(deploy running)]) + context 'stages list' do + it 'returns ordered list of stages' do + expect(subject.map(&:name)).to eq(%w[build test deploy]) + end end - context 'when commit status is retried' do - before do - create(:commit_status, pipeline: pipeline, - stage: 'build', - name: 'mac', - stage_idx: 0, - status: 'success') - - pipeline.process! + context 'stages with statuses' do + let(:statuses) do + subject.map { |stage| [stage.name, stage.status] } end - it 'ignores the previous state' do - expect(statuses).to eq([%w(build success), + it 'returns list of stages with correct statuses' do + expect(statuses).to eq([%w(build failed), %w(test success), %w(deploy running)]) end - end - end - context 'when there is a stage with warnings' do - before do - create(:commit_status, pipeline: pipeline, - stage: 'deploy', - name: 'prod:2', - stage_idx: 2, - status: 'failed', - allow_failure: true) + context 'when commit status is retried' do + before do + create(:commit_status, pipeline: pipeline, + stage: 'build', + name: 'mac', + stage_idx: 0, + status: 'success') + + pipeline.process! + end + + it 'ignores the previous state' do + expect(statuses).to eq([%w(build success), + %w(test success), + %w(deploy running)]) + end + end end - it 'populates stage with correct number of warnings' do - deploy_stage = pipeline.legacy_stages.third + context 'when there is a stage with warnings' do + before do + create(:commit_status, pipeline: pipeline, + stage: 'deploy', + name: 'prod:2', + stage_idx: 2, + status: 'failed', + allow_failure: true) + end - expect(deploy_stage).not_to receive(:statuses) - expect(deploy_stage).to have_warnings + it 'populates stage with correct number of warnings' do + deploy_stage = pipeline.legacy_stages.third + + expect(deploy_stage).not_to receive(:statuses) + expect(deploy_stage).to have_warnings + end end end end @@ -2326,36 +2338,38 @@ describe Ci::Pipeline, :mailer do describe '#update_status' do context 'when pipeline is empty' do it 'updates does not change pipeline status' do - expect(pipeline.statuses.latest.status).to be_nil + expect(pipeline.statuses.latest.slow_composite_status).to be_nil expect { pipeline.update_status } - .to change { pipeline.reload.status }.to 'skipped' + .to change { pipeline.reload.status } + .from('created') + .to('skipped') end end context 'when updating status to pending' do before do - allow(pipeline) - .to receive_message_chain(:statuses, :latest, :status) - .and_return(:running) + create(:ci_build, pipeline: pipeline, status: :running) end it 'updates pipeline status to running' do expect { pipeline.update_status } - .to change { pipeline.reload.status }.to 'running' + .to change { pipeline.reload.status } + .from('created') + .to('running') end end context 'when updating status to scheduled' do before do - allow(pipeline) - .to receive_message_chain(:statuses, :latest, :status) - .and_return(:scheduled) + create(:ci_build, pipeline: pipeline, status: :scheduled) end it 'updates pipeline status to scheduled' do expect { pipeline.update_status } - .to change { pipeline.reload.status }.to 'scheduled' + .to change { pipeline.reload.status } + .from('created') + .to('scheduled') end end diff --git a/spec/models/ci/stage_spec.rb b/spec/models/ci/stage_spec.rb index 85cd32fb03a..8827509edda 100644 --- a/spec/models/ci/stage_spec.rb +++ b/spec/models/ci/stage_spec.rb @@ -130,7 +130,7 @@ describe Ci::Stage, :models do context 'when statuses status was not recognized' do before do allow(stage) - .to receive_message_chain(:statuses, :latest, :status) + .to receive(:latest_stage_status) .and_return(:unknown) end diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb index 017cca0541e..95e9b0d0f92 100644 --- a/spec/models/commit_status_spec.rb +++ b/spec/models/commit_status_spec.rb @@ -321,7 +321,7 @@ describe CommitStatus do end it 'returns a correct compound status' do - expect(described_class.all.status).to eq 'running' + expect(described_class.all.slow_composite_status).to eq 'running' end end @@ -331,7 +331,7 @@ describe CommitStatus do end it 'returns status that indicates success' do - expect(described_class.all.status).to eq 'success' + expect(described_class.all.slow_composite_status).to eq 'success' end end @@ -342,7 +342,7 @@ describe CommitStatus do end it 'returns status according to the scope' do - expect(described_class.latest.status).to eq 'success' + expect(described_class.latest.slow_composite_status).to eq 'success' end end end diff --git a/spec/models/concerns/has_status_spec.rb b/spec/models/concerns/has_status_spec.rb index 09fb2fff521..21e4dda6dab 100644 --- a/spec/models/concerns/has_status_spec.rb +++ b/spec/models/concerns/has_status_spec.rb @@ -3,12 +3,15 @@ require 'spec_helper' describe HasStatus do - describe '.status' do - subject { CommitStatus.status } + describe '.slow_composite_status' do + using RSpec::Parameterized::TableSyntax + + subject { CommitStatus.slow_composite_status } shared_examples 'build status summary' do context 'all successful' do let!(:statuses) { Array.new(2) { create(type, status: :success) } } + it { is_expected.to eq 'success' } end @@ -165,16 +168,26 @@ describe HasStatus do end end - context 'ci build statuses' do - let(:type) { :ci_build } - - it_behaves_like 'build status summary' + where(:ci_composite_status) do + [false, true] end - context 'generic commit statuses' do - let(:type) { :generic_commit_status } + with_them do + before do + stub_feature_flags(ci_composite_status: ci_composite_status) + end - it_behaves_like 'build status summary' + context 'ci build statuses' do + let(:type) { :ci_build } + + it_behaves_like 'build status summary' + end + + context 'generic commit statuses' do + let(:type) { :generic_commit_status } + + it_behaves_like 'build status summary' + end end end @@ -372,8 +385,8 @@ describe HasStatus do end end - describe '.status_sql' do - subject { Ci::Build.status_sql } + describe '.legacy_status_sql' do + subject { Ci::Build.legacy_status_sql } it 'returns SQL' do puts subject diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb index e72e272f4d2..a4d60467071 100644 --- a/spec/models/namespace_spec.rb +++ b/spec/models/namespace_spec.rb @@ -928,12 +928,34 @@ describe Namespace do let(:project) { create(:project, namespace: namespace) } context 'when there are pages deployed for the project' do - before do - project.mark_pages_as_deployed + context 'but pages metadata is not migrated' do + before do + generic_commit_status = create(:generic_commit_status, :success, stage: 'deploy', name: 'pages:deploy') + generic_commit_status.update!(project: project) + project.pages_metadatum.destroy! + end + + it 'migrates pages metadata and returns the virual domain' do + virtual_domain = namespace.pages_virtual_domain + + expect(project.reload.pages_metadatum.deployed).to eq(true) + + expect(virtual_domain).to be_an_instance_of(Pages::VirtualDomain) + expect(virtual_domain.lookup_paths).not_to be_empty + end end - it 'returns the virual domain' do - expect(namespace.pages_virtual_domain).to be_an_instance_of(Pages::VirtualDomain) + context 'and pages metadata is migrated' do + before do + project.mark_pages_as_deployed + end + + it 'returns the virual domain' do + virtual_domain = namespace.pages_virtual_domain + + expect(virtual_domain).to be_an_instance_of(Pages::VirtualDomain) + expect(virtual_domain.lookup_paths).not_to be_empty + end end end end diff --git a/spec/models/pages_domain_spec.rb b/spec/models/pages_domain_spec.rb index 9ac80f8b795..2e7b2b88432 100644 --- a/spec/models/pages_domain_spec.rb +++ b/spec/models/pages_domain_spec.rb @@ -569,7 +569,9 @@ describe PagesDomain do context 'when there are pages deployed for the project' do before do - project.mark_pages_as_deployed + generic_commit_status = create(:generic_commit_status, :success, stage: 'deploy', name: 'pages:deploy') + generic_commit_status.update!(project: project) + project.pages_metadatum.destroy! project.reload end @@ -578,6 +580,12 @@ describe PagesDomain do expect(pages_domain.pages_virtual_domain).to be_an_instance_of(Pages::VirtualDomain) end + + it 'migrates project pages metadata' do + expect { pages_domain.pages_virtual_domain }.to change { + project.reload.pages_metadatum&.deployed + }.from(nil).to(true) + end end end end diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb index 39c1176f238..c3b2e52848c 100644 --- a/spec/models/project_services/jira_service_spec.rb +++ b/spec/models/project_services/jira_service_spec.rb @@ -282,7 +282,7 @@ describe JiraService do context 'when data are stored in properties' do let(:properties) { data_params.merge(title: title, description: description) } let!(:service) do - create(:jira_service, :without_properties_callback, properties: properties) + create(:jira_service, :without_properties_callback, properties: properties.merge(additional: 'something')) end it_behaves_like 'issue tracker fields' diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index e97e8c58bbd..daccd143b6d 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -5107,6 +5107,16 @@ describe Project do end end + describe '.pages_metadata_not_migrated' do + it 'returns only projects that have pages deployed' do + _project_with_pages_metadata_migrated = create(:project) + project_with_pages_metadata_not_migrated = create(:project) + project_with_pages_metadata_not_migrated.pages_metadatum.destroy! + + expect(described_class.pages_metadata_not_migrated).to contain_exactly(project_with_pages_metadata_not_migrated) + end + end + describe '#pages_group_root?' do it 'returns returns true if pages_url is same as pages_group_url' do project = build(:project) diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb index d96e1398677..4049ddcff7f 100644 --- a/spec/models/service_spec.rb +++ b/spec/models/service_spec.rb @@ -78,10 +78,11 @@ describe Service do end describe "Template" do + let(:project) { create(:project) } + describe '.build_from_template' do context 'when template is invalid' do it 'sets service template to inactive when template is invalid' do - project = create(:project) template = build(:prometheus_service, template: true, active: true, properties: {}) template.save(validate: false) @@ -91,6 +92,64 @@ describe Service do expect(service.active).to be false end end + + describe 'build issue tracker from a template' do + let(:title) { 'custom title' } + let(:description) { 'custom description' } + let(:url) { 'http://jira.example.com' } + let(:api_url) { 'http://api-jira.example.com' } + let(:username) { 'jira-username' } + let(:password) { 'jira-password' } + let(:data_params) do + { + url: url, api_url: api_url, + username: username, password: password + } + end + + shared_examples 'service creation from a template' do + it 'creates a correct service' do + service = described_class.build_from_template(project.id, template) + + expect(service).to be_active + expect(service.title).to eq(title) + expect(service.description).to eq(description) + expect(service.url).to eq(url) + expect(service.api_url).to eq(api_url) + expect(service.username).to eq(username) + expect(service.password).to eq(password) + end + end + + # this will be removed as part of https://gitlab.com/gitlab-org/gitlab-foss/issues/63084 + context 'when data are stored in properties' do + let(:properties) { data_params.merge(title: title, description: description) } + let!(:template) do + create(:jira_service, :without_properties_callback, template: true, properties: properties.merge(additional: 'something')) + end + + it_behaves_like 'service creation from a template' + end + + context 'when data are stored in separated fields' do + let(:template) do + create(:jira_service, data_params.merge(properties: {}, title: title, description: description, template: true)) + end + + it_behaves_like 'service creation from a template' + end + + context 'when data are stored in both properties and separated fields' do + let(:properties) { data_params.merge(title: title, description: description) } + let(:template) do + create(:jira_service, :without_properties_callback, active: true, template: true, properties: properties).tap do |service| + create(:jira_tracker_data, data_params.merge(service: service)) + end + end + + it_behaves_like 'service creation from a template' + end + end end describe "for pushover service" do @@ -104,7 +163,6 @@ describe Service do api_key: '123456789' }) end - let(:project) { create(:project) } describe 'is prefilled for projects pushover service' do it "has all fields prefilled" do