diff options
author | Kamil Trzcinski <ayufan@ayufan.eu> | 2017-12-03 13:07:07 +0100 |
---|---|---|
committer | Shinya Maeda <shinya@gitlab.com> | 2018-03-07 22:36:17 +0900 |
commit | c43521f7fc0e5d6f332709f9bf1730ce5dfd0bf2 (patch) | |
tree | eb966809226eaebd80d58a0ebac12abca0f87341 | |
parent | cda4296e9014755443fc70675cd09886594ae134 (diff) | |
download | gitlab-ce-rename-commit-status-to-ci-job.tar.gz |
Add column migrationrename-commit-status-to-ci-job
-rw-r--r-- | app/models/ci/build.rb | 2 | ||||
-rw-r--r-- | app/models/ci/job.rb | 2 | ||||
-rw-r--r-- | app/models/ci/pipeline.rb | 8 | ||||
-rw-r--r-- | app/policies/ci/build_policy.rb | 2 | ||||
-rw-r--r-- | app/policies/ci/job_policy.rb | 9 | ||||
-rw-r--r-- | app/policies/commit_status_policy.rb | 7 | ||||
-rw-r--r-- | app/serializers/pipeline_serializer.rb | 2 | ||||
-rw-r--r-- | db/migrate/20171203114527_rename_commit_status_to_ci_job_type.rb | 51 | ||||
-rw-r--r-- | spec/lib/gitlab/import_export/all_models.yml | 2 |
9 files changed, 69 insertions, 16 deletions
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index b230b7f47ef..646157e8087 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -1,5 +1,5 @@ module Ci - class Build < CommitStatus + class Build < Job prepend ArtifactMigratable include TokenAuthenticatable include AfterCommitQueue diff --git a/app/models/ci/job.rb b/app/models/ci/job.rb index 2d46bff21a9..80c10d3eca3 100644 --- a/app/models/ci/job.rb +++ b/app/models/ci/job.rb @@ -48,7 +48,7 @@ class Ci::Job < ActiveRecord::Base } ## - # We still create some CommitStatuses outside of CreatePipelineService. + # We still create some Ci::Job outside of CreatePipelineService. # # These are pages deployments and external statuses. # diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index f1ff84826c0..bc863fdfe17 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -24,12 +24,12 @@ module Ci has_many :pending_builds, -> { pending }, foreign_key: :commit_id, class_name: 'Ci::Build' has_many :retryable_builds, -> { latest.failed_or_canceled.includes(:project) }, foreign_key: :commit_id, class_name: 'Ci::Build' - has_many :cancelable_statuses, -> { cancelable }, foreign_key: :commit_id, class_name: 'CommitStatus' + has_many :cancelable_jobs, -> { cancelable }, foreign_key: :commit_id, class_name: 'Ci::Job' has_many :manual_actions, -> { latest.manual_actions.includes(:project) }, foreign_key: :commit_id, class_name: 'Ci::Build' has_many :artifacts, -> { latest.with_artifacts_not_expired.includes(:project) }, foreign_key: :commit_id, class_name: 'Ci::Build' has_many :auto_canceled_pipelines, class_name: 'Ci::Pipeline', foreign_key: 'auto_canceled_by_id' - has_many :auto_canceled_jobs, class_name: 'CommitStatus', foreign_key: 'auto_canceled_by_id' + has_many :auto_canceled_jobs, class_name: 'Ci::Job', foreign_key: 'auto_canceled_by_id' delegate :id, to: :project, prefix: true delegate :full_path, to: :project, prefix: true @@ -308,7 +308,7 @@ module Ci end def cancelable? - cancelable_statuses.any? + cancelable_jobs.any? end def auto_canceled? @@ -316,7 +316,7 @@ module Ci end def cancel_running - retry_optimistic_lock(cancelable_statuses) do |cancelable| + retry_optimistic_lock(cancelable_jobs) do |cancelable| cancelable.find_each do |job| yield(job) if block_given? job.cancel diff --git a/app/policies/ci/build_policy.rb b/app/policies/ci/build_policy.rb index 1ab391a5a9d..82d19b68e1b 100644 --- a/app/policies/ci/build_policy.rb +++ b/app/policies/ci/build_policy.rb @@ -1,5 +1,5 @@ module Ci - class BuildPolicy < CommitStatusPolicy + class BuildPolicy < JobPolicy condition(:protected_ref) do access = ::Gitlab::UserAccess.new(@user, project: @subject.project) diff --git a/app/policies/ci/job_policy.rb b/app/policies/ci/job_policy.rb new file mode 100644 index 00000000000..e11c9b1567c --- /dev/null +++ b/app/policies/ci/job_policy.rb @@ -0,0 +1,9 @@ +module Ci + class JobPolicy < BasePolicy + delegate { @subject.project } + + %w[read create update admin].each do |action| + rule { ~can?(:"#{action}_commit_status") }.prevent :"#{action}_build" + end + end +end diff --git a/app/policies/commit_status_policy.rb b/app/policies/commit_status_policy.rb deleted file mode 100644 index 24b2a4cc7fd..00000000000 --- a/app/policies/commit_status_policy.rb +++ /dev/null @@ -1,7 +0,0 @@ -class CommitStatusPolicy < BasePolicy - delegate { @subject.project } - - %w[read create update admin].each do |action| - rule { ~can?(:"#{action}_commit_status") }.prevent :"#{action}_build" - end -end diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb index 7181f8a6b04..8674ad686a5 100644 --- a/app/serializers/pipeline_serializer.rb +++ b/app/serializers/pipeline_serializer.rb @@ -10,7 +10,7 @@ class PipelineSerializer < BaseSerializer resource = resource.preload([ :retryable_builds, - :cancelable_statuses, + :cancelable_jobs, :trigger_requests, :project, :manual_actions, diff --git a/db/migrate/20171203114527_rename_commit_status_to_ci_job_type.rb b/db/migrate/20171203114527_rename_commit_status_to_ci_job_type.rb new file mode 100644 index 00000000000..b87742d97d5 --- /dev/null +++ b/db/migrate/20171203114527_rename_commit_status_to_ci_job_type.rb @@ -0,0 +1,51 @@ +class RenameCommitStatusToCiJobType < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + migrate_column_value(:deployments, :deployable_type, 'CommitStatus', 'Ci::Job') + migrate_column_value(:taggings, :taggable_type, 'CommitStatus', 'Ci::Job') + migrate_column_value(:ci_builds, :type, 'CommitStatus', 'Ci::Job') + end + + def down + migrate_column_value(:deployments, :deployable_type, 'Ci::Job', 'CommitStatus') + migrate_column_value(:taggings, :taggable_type, 'Ci::Job', 'CommitStatus') + migrate_column_value(:ci_builds, :type, 'Ci::Job', 'CommitStatus') + end + + private + + def migrate_column_value(table, column, from, to) + from = from.demodulize.underscore + to = to.demodulize.underscore + + create_partial_index(table, column, from) + + begin + update_column_in_batches(table, column, to) do |table, query| + query.where(table[column].eq(from)) + end + ensure + drop_partial_index(table, column, from) + end + end + + def index_name(table, column, value) + "index_on_#{table}_#{column}_when_#{value}" + end + + def create_partial_index(table, column, value) + name = index_name(table, column, value) + return if index_exists?(table, column, name: name) + + execute("CREATE INDEX CONCURRENTLY #{name} ON #{table} (#{column}) WHERE #{column}='#{value}'") + end + + def drop_partial_index(table, column, value) + execute("DROP INDEX CONCURRENTLY #{index_name(table, column, value)}") + end +end diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml index 9ff060e6979..f6c96ca4473 100644 --- a/spec/lib/gitlab/import_export/all_models.yml +++ b/spec/lib/gitlab/import_export/all_models.yml @@ -110,7 +110,7 @@ pipelines: - auto_canceled_jobs - pending_builds - retryable_builds -- cancelable_statuses +- cancelable_jobs - manual_actions - artifacts - pipeline_schedule |