Commit a97e039e authored by Grzegorz Bizon's avatar Grzegorz Bizon

Merge branch 'limit-amount-of-created-pipelines' into 'master'

Process at most 4 pipelines during push

See merge request gitlab-org/gitlab-ce!27205
parents df6f9fdd 2b9492a2
...@@ -51,6 +51,8 @@ module Git ...@@ -51,6 +51,8 @@ module Git
end end
def create_pipelines def create_pipelines
return unless params.fetch(:create_pipelines, true)
Ci::CreatePipelineService Ci::CreatePipelineService
.new(project, current_user, push_data) .new(project, current_user, push_data)
.execute(:push, pipeline_options) .execute(:push, pipeline_options)
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
class PostReceive class PostReceive
include ApplicationWorker include ApplicationWorker
PIPELINE_PROCESS_LIMIT = 4
def perform(gl_repository, identifier, changes, push_options = {}) def perform(gl_repository, identifier, changes, push_options = {})
project, repo_type = Gitlab::GlRepository.parse(gl_repository) project, repo_type = Gitlab::GlRepository.parse(gl_repository)
...@@ -36,23 +38,24 @@ class PostReceive ...@@ -36,23 +38,24 @@ class PostReceive
return false return false
end end
post_received.changes_refs do |oldrev, newrev, ref| post_received.enum_for(:changes_refs).with_index do |(oldrev, newrev, ref), index|
service_klass =
if Gitlab::Git.tag_ref?(ref) if Gitlab::Git.tag_ref?(ref)
Git::TagPushService.new( Git::TagPushService
post_received.project,
@user,
oldrev: oldrev,
newrev: newrev,
ref: ref,
push_options: post_received.push_options).execute
elsif Gitlab::Git.branch_ref?(ref) elsif Gitlab::Git.branch_ref?(ref)
Git::BranchPushService.new( Git::BranchPushService
end
if service_klass
service_klass.new(
post_received.project, post_received.project,
@user, @user,
oldrev: oldrev, oldrev: oldrev,
newrev: newrev, newrev: newrev,
ref: ref, ref: ref,
push_options: post_received.push_options).execute push_options: post_received.push_options,
create_pipelines: index < PIPELINE_PROCESS_LIMIT || Feature.enabled?(:git_push_create_all_pipelines, post_received.project)
).execute
end end
changes << Gitlab::DataBuilder::Repository.single_change(oldrev, newrev, ref) changes << Gitlab::DataBuilder::Repository.single_change(oldrev, newrev, ref)
......
---
title: Process at most 4 pipelines during push
merge_request: 27205
author:
type: performance
...@@ -2701,6 +2701,15 @@ Not to be confused with [`trigger`](#trigger-premium). ...@@ -2701,6 +2701,15 @@ Not to be confused with [`trigger`](#trigger-premium).
[Read more in the triggers documentation.](../triggers/README.md) [Read more in the triggers documentation.](../triggers/README.md)
## Processing Git pushes
GitLab will create at most 4 branch and tags pipelines when
doing pushing multiple changes in single `git push` invocation.
This limitation does not affect any of the updated Merge Request pipelines,
all updated Merge Requests will have a pipeline created when using
[pipelines for merge requests](../merge_request_pipelines/index.md).
## Skipping jobs ## Skipping jobs
If your commit message contains `[ci skip]` or `[skip ci]`, using any If your commit message contains `[ci skip]` or `[skip ci]`, using any
......
...@@ -99,11 +99,21 @@ describe PostReceive do ...@@ -99,11 +99,21 @@ describe PostReceive do
end end
context "gitlab-ci.yml" do context "gitlab-ci.yml" do
let(:changes) { "123456 789012 refs/heads/feature\n654321 210987 refs/tags/tag" } let(:changes) do
<<-EOF.strip_heredoc
123456 789012 refs/heads/feature
654321 210987 refs/tags/tag
123456 789012 refs/heads/feature2
123458 789013 refs/heads/feature3
123459 789015 refs/heads/feature4
EOF
end
let(:changes_count) { changes.lines.count }
subject { described_class.new.perform(gl_repository, key_id, base64_changes) } subject { described_class.new.perform(gl_repository, key_id, base64_changes) }
context "creates a Ci::Pipeline for every change" do context "with valid .gitlab-ci.yml" do
before do before do
stub_ci_pipeline_to_return_yaml_file stub_ci_pipeline_to_return_yaml_file
...@@ -116,7 +126,33 @@ describe PostReceive do ...@@ -116,7 +126,33 @@ describe PostReceive do
.and_return(true) .and_return(true)
end end
it { expect { subject }.to change { Ci::Pipeline.count }.by(2) } context 'when git_push_create_all_pipelines is disabled' do
before do
stub_feature_flags(git_push_create_all_pipelines: false)
end
it "creates pipeline for branches and tags" do
subject
expect(Ci::Pipeline.pluck(:ref)).to contain_exactly("feature", "tag", "feature2", "feature3")
end
it "creates exactly #{described_class::PIPELINE_PROCESS_LIMIT} pipelines" do
expect(changes_count).to be > described_class::PIPELINE_PROCESS_LIMIT
expect { subject }.to change { Ci::Pipeline.count }.by(described_class::PIPELINE_PROCESS_LIMIT)
end
end
context 'when git_push_create_all_pipelines is enabled' do
before do
stub_feature_flags(git_push_create_all_pipelines: true)
end
it "creates all pipelines" do
expect { subject }.to change { Ci::Pipeline.count }.by(changes_count)
end
end
end end
context "does not create a Ci::Pipeline" do context "does not create a Ci::Pipeline" do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment