summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShinya Maeda <shinya@gitlab.com>2018-11-02 20:21:14 +0900
committerShinya Maeda <shinya@gitlab.com>2018-11-02 20:21:14 +0900
commit54824e5b8f36c2ab2c41511bdc5e363e4c771124 (patch)
tree1aef39487177c9c3d8d932343f2633acd3283184
parent88224ccea67290e1bfa600379715ab278984ccdf (diff)
downloadgitlab-ce-merge-request-pipeline.tar.gz
Merge request pipelinemerge-request-pipeline
-rw-r--r--app/services/ci/create_merge_request_pipeline_service.rb30
-rw-r--r--app/services/ci/create_pipeline_service.rb3
-rw-r--r--db/migrate/20181102185559_add_merge_request_id_to_ci_pipelines.rb10
-rw-r--r--db/schema.rb8
-rw-r--r--lib/api/pipelines.rb4
-rw-r--r--lib/gitlab/ci/pipeline/chain/command.rb2
6 files changed, 54 insertions, 3 deletions
diff --git a/app/services/ci/create_merge_request_pipeline_service.rb b/app/services/ci/create_merge_request_pipeline_service.rb
new file mode 100644
index 00000000000..e16382c36c0
--- /dev/null
+++ b/app/services/ci/create_merge_request_pipeline_service.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+module Ci
+ class CreateMergeRequestPipelineService < BaseService
+ attr_reader :source_branch, :source_project
+
+ def execute(pipeline)
+ return if pipeline.tag?
+ return unless pipeline.has_merge_request_option?
+
+ @source_branch = pipeline.ref
+ @source_project = pipeline.project
+
+ merge_requests.each do |merge_request|
+ Ci::CreatePipelineService
+ .new(merge_request.target_project,
+ pipeline.user,
+ ref: source_branch,
+ merge_request: merge_request)
+ .execute(pipeline.source)
+ end
+ end
+
+ private
+
+ def merge_requests
+ @merge_requests ||= MergeRequest.where(source_project: source_project, source_branch: source_branch)
+ end
+ end
+end
diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb
index 92a8438ab2f..81cbc8fa99f 100644
--- a/app/services/ci/create_pipeline_service.rb
+++ b/app/services/ci/create_pipeline_service.rb
@@ -12,7 +12,7 @@ module Ci
Gitlab::Ci::Pipeline::Chain::Populate,
Gitlab::Ci::Pipeline::Chain::Create].freeze
- def execute(source, ignore_skip_ci: false, save_on_errors: true, trigger_request: nil, schedule: nil, &block)
+ def execute(source, ignore_skip_ci: false, save_on_errors: true, trigger_request: nil, schedule: nil, merge_request: nil, &block)
@pipeline = Ci::Pipeline.new
command = Gitlab::Ci::Pipeline::Chain::Command.new(
@@ -23,6 +23,7 @@ module Ci
before_sha: params[:before],
trigger_request: trigger_request,
schedule: schedule,
+ merge_request: merge_request,
ignore_skip_ci: ignore_skip_ci,
save_incompleted: save_on_errors,
seeds_block: block,
diff --git a/db/migrate/20181102185559_add_merge_request_id_to_ci_pipelines.rb b/db/migrate/20181102185559_add_merge_request_id_to_ci_pipelines.rb
new file mode 100644
index 00000000000..a108f847bf9
--- /dev/null
+++ b/db/migrate/20181102185559_add_merge_request_id_to_ci_pipelines.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddMergeRequestIdToCiPipelines < ActiveRecord::Migration
+ DOWNTIME = false
+
+ def change
+ add_reference :ci_pipelines, :merge_requests
+ add_reference :ci_pipelines, :merge_requests, foreign_key: true
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 22474916034..25f2d0fbd9b 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -824,13 +824,20 @@ ActiveRecord::Schema.define(version: 20181031190559) do
t.datetime "created_at"
t.datetime "updated_at"
t.string "on_stop"
+ t.integer "status", limit: 2, default: 2, null: false
+ t.datetime_with_timezone "finished_at"
+ t.integer "action", limit: 2
end
+ add_index "deployments", ["action"], name: "index_deployments_on_action", using: :btree
add_index "deployments", ["created_at"], name: "index_deployments_on_created_at", using: :btree
add_index "deployments", ["deployable_type", "deployable_id"], name: "index_deployments_on_deployable_type_and_deployable_id", using: :btree
add_index "deployments", ["environment_id", "id"], name: "index_deployments_on_environment_id_and_id", using: :btree
add_index "deployments", ["environment_id", "iid", "project_id"], name: "index_deployments_on_environment_id_and_iid_and_project_id", using: :btree
+ add_index "deployments", ["environment_id", "status"], name: "index_deployments_on_environment_id_and_status", using: :btree
+ add_index "deployments", ["id"], name: "partial_index_deployments_for_legacy_successful_deployments", where: "((finished_at IS NULL) AND (status = 2))", using: :btree
add_index "deployments", ["project_id", "iid"], name: "index_deployments_on_project_id_and_iid", unique: true, using: :btree
+ add_index "deployments", ["project_id", "status"], name: "index_deployments_on_project_id_and_status", using: :btree
create_table "emails", force: :cascade do |t|
t.integer "user_id", null: false
@@ -1814,6 +1821,7 @@ ActiveRecord::Schema.define(version: 20181031190559) do
end
add_index "redirect_routes", ["path"], name: "index_redirect_routes_on_path", unique: true, using: :btree
+ add_index "redirect_routes", ["path"], name: "index_redirect_routes_on_path_text_pattern_ops", using: :btree, opclasses: {"path"=>"varchar_pattern_ops"}
add_index "redirect_routes", ["source_type", "source_id"], name: "index_redirect_routes_on_source_type_and_source_id", using: :btree
create_table "releases", force: :cascade do |t|
diff --git a/lib/api/pipelines.rb b/lib/api/pipelines.rb
index 1cfb982c04b..ec34be3b414 100644
--- a/lib/api/pipelines.rb
+++ b/lib/api/pipelines.rb
@@ -58,7 +58,9 @@ module API
new_pipeline = Ci::CreatePipelineService.new(user_project,
current_user,
pipeline_params)
- .execute(:api, ignore_skip_ci: true, save_on_errors: false)
+ .execute(:api, ignore_skip_ci: true, save_on_errors: false).tap do |pipeline|
+ Ci::CreateMergeRequestPipelineService.new(pipeline).execute
+ end
if new_pipeline.persisted?
present new_pipeline, with: Entities::Pipeline
diff --git a/lib/gitlab/ci/pipeline/chain/command.rb b/lib/gitlab/ci/pipeline/chain/command.rb
index 05978804d92..100b9521412 100644
--- a/lib/gitlab/ci/pipeline/chain/command.rb
+++ b/lib/gitlab/ci/pipeline/chain/command.rb
@@ -8,7 +8,7 @@ module Gitlab
Command = Struct.new(
:source, :project, :current_user,
:origin_ref, :checkout_sha, :after_sha, :before_sha,
- :trigger_request, :schedule,
+ :trigger_request, :schedule, :merge_request,
:ignore_skip_ci, :save_incompleted,
:seeds_block, :variables_attributes
) do