summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-04-10 14:12:48 +0000
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-04-10 14:12:48 +0000
commite202718ac70f5bd35fdc40b426cb6174eebdd1e0 (patch)
tree5a9f3da43ddeb4bf744b84bf5f86ec6fe53b0012
parent2c1040d4bd1f66db809aeb8433b124f67debb6e7 (diff)
parentc7123b5e66073f530744b870a59c87a2b2d1740f (diff)
downloadgitlab-ci-e202718ac70f5bd35fdc40b426cb6174eebdd1e0.tar.gz
Merge branch 'smart_commit_creation' into 'master'
Skip commit creation if there is no appropriate job https://dev.gitlab.org/gitlab/gitlab-ci/issues/175 See merge request !62
-rw-r--r--CHANGELOG1
-rw-r--r--app/models/job.rb2
-rw-r--r--app/models/project.rb5
-rw-r--r--app/services/create_commit_service.rb4
-rw-r--r--spec/factories/job.rb4
-rw-r--r--spec/services/create_commit_service_spec.rb44
6 files changed, 57 insertions, 3 deletions
diff --git a/CHANGELOG b/CHANGELOG
index b852f5a..b065337 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -8,6 +8,7 @@ v7.10.0
- UI improvements: created separated admin section, removed useless project show page
- Runners sorting in admin area (by id)
- Remove protected_attributes gem
+ - Skip commit creation if there is no appropriate job
v7.9.3
- Contains no changes
diff --git a/app/models/job.rb b/app/models/job.rb
index 005a778..82dac8f 100644
--- a/app/models/job.rb
+++ b/app/models/job.rb
@@ -33,7 +33,7 @@ class Job < ActiveRecord::Base
end
def run_for_ref?(ref)
- if !refs.blank?
+ if refs.present?
refs.split(",").map(&:strip).each do |refs_val|
return true if File.fnmatch(refs_val, ref)
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 10916ab..247824c 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -179,6 +179,11 @@ ls -la
end
end
+ def create_commit_for_tag?(tag)
+ jobs.where(build_tags: true).active.parallel.any? ||
+ jobs.active.deploy.any?{ |job| job.run_for_ref?(tag)}
+ end
+
def coverage_enabled?
coverage_regex.present?
end
diff --git a/app/services/create_commit_service.rb b/app/services/create_commit_service.rb
index 1d1d3dc..0671a70 100644
--- a/app/services/create_commit_service.rb
+++ b/app/services/create_commit_service.rb
@@ -15,6 +15,10 @@ class CreateCommitService
return false
end
+ if origin_ref.start_with?('refs/tags/') && !project.create_commit_for_tag?(ref)
+ return false
+ end
+
if project.skip_ref?(ref)
return false
end
diff --git a/spec/factories/job.rb b/spec/factories/job.rb
index 93f2ff7..9a00a13 100644
--- a/spec/factories/job.rb
+++ b/spec/factories/job.rb
@@ -2,5 +2,9 @@ FactoryGirl.define do
factory :job do
name 'rspec'
commands 'bundle exec rspec spec'
+
+ factory :deploy_job do
+ job_type :deploy
+ end
end
end
diff --git a/spec/services/create_commit_service_spec.rb b/spec/services/create_commit_service_spec.rb
index 725ea08..761bfaf 100644
--- a/spec/services/create_commit_service_spec.rb
+++ b/spec/services/create_commit_service_spec.rb
@@ -25,12 +25,52 @@ describe CreateCommitService do
it "calls create_deploy_builds if there are no builds" do
project.jobs.destroy_all
Commit.any_instance.should_receive(:create_deploy_builds)
- service.execute(project, ref: 'refs/heads/master', before: '00000000', after: '31das312')
+ service.execute(project, ref: 'refs/heads/master', before: '00000000', after: '31das312')
end
it "does not call create_deploy_builds if there is build" do
Commit.any_instance.should_not_receive(:create_deploy_builds)
- service.execute(project, ref: 'refs/heads/master', before: '00000000', after: '31das312')
+ service.execute(project, ref: 'refs/heads/master', before: '00000000', after: '31das312')
+ end
+ end
+
+ context "skip tag if there is no build for it" do
+ it "does not create commit if there is no appropriate job" do
+ project.jobs
+
+ result = service.execute(project, ref: 'refs/tags/0_1', before: '00000000', after: '31das312')
+ result.should be_false
+ end
+
+ it "creates commit if there is appropriate job" do
+ project.jobs.first.update(build_tags: true)
+
+ result = service.execute(project, ref: 'refs/tags/0_1', before: '00000000', after: '31das312')
+ result.should be_persisted
+ end
+
+ it "does not create commit if there is no appropriate job nor deploy job" do
+ project.jobs.first.update(build_tags: false)
+ FactoryGirl.create(:deploy_job, project: project, refs: "release")
+
+ result = service.execute(project, ref: 'refs/tags/0_1', before: '00000000', after: '31das312')
+ result.should be_false
+ end
+
+ it "creates commit if there is no appropriate job but deploy job has right ref setting" do
+ project.jobs.first.update(build_tags: false)
+ FactoryGirl.create(:deploy_job, project: project, refs: "0_1")
+
+ result = service.execute(project, ref: 'refs/tags/0_1', before: '00000000', after: '31das312')
+ result.should be_persisted
+ end
+
+ it "creates commit if there is no appropriate job and deploy job has no ref setting" do
+ project.jobs.first.update(build_tags: true)
+ FactoryGirl.create(:deploy_job, project: project)
+
+ result = service.execute(project, ref: 'refs/tags/0_1', before: '00000000', after: '31das312')
+ result.should be_persisted
end
end
end