summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-03-21 09:33:14 +0100
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-03-21 09:33:25 +0100
commitab0cd2a8bf54209e5e1b9594752d5158d3cf5faa (patch)
tree0bd0de2b734caa767efcd836092e22b26fac8af4
parentd16bb44726a9bdfdd9d9b22f0c802aa65c2f6154 (diff)
downloadgitlab-ce-ab0cd2a8bf54209e5e1b9594752d5158d3cf5faa.tar.gz
Introduce pipeline build seeds
-rw-r--r--app/models/ci/pipeline.rb17
-rw-r--r--lib/gitlab/ci/pipeline/seed/build.rb28
-rw-r--r--lib/gitlab/ci/pipeline/seed/stage.rb35
-rw-r--r--spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/yaml_processor_spec.rb8
5 files changed, 63 insertions, 29 deletions
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index f2edcdd61fd..2e8d7f9dbfe 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -6,6 +6,7 @@ module Ci
include AfterCommitQueue
include Presentable
include Gitlab::OptimisticLocking
+ include Gitlab::Utils::StrongMemoize
belongs_to :project, inverse_of: :pipelines
belongs_to :user
@@ -472,6 +473,22 @@ module Ci
end
end
+ # TODO specs
+ #
+ def protected_ref?
+ strong_memoize(:protected_ref) do
+ project.protected_for?(ref)
+ end
+ end
+
+ # TODO specs
+ #
+ def legacy_trigger
+ strong_memoize(:legacy_trigger) do
+ trigger_requests.first
+ end
+ end
+
def predefined_variables
Gitlab::Ci::Variables::Collection.new
.append(key: 'CI_PIPELINE_ID', value: id.to_s)
diff --git a/lib/gitlab/ci/pipeline/seed/build.rb b/lib/gitlab/ci/pipeline/seed/build.rb
new file mode 100644
index 00000000000..f5dbb3a1c40
--- /dev/null
+++ b/lib/gitlab/ci/pipeline/seed/build.rb
@@ -0,0 +1,28 @@
+module Gitlab
+ module Ci
+ module Pipeline
+ module Seed
+ class Build < Seed::Base
+ def initialize(pipeline, attributes)
+ @pipeline = pipeline
+ @attributes = attributes
+ end
+
+ # TODO find a different solution
+ #
+ def user=(current_user)
+ @attributes.merge!(user: current_user)
+ end
+
+ def attributes
+ @attributes.merge(project: @pipeline.project,
+ ref: @pipeline.ref,
+ tag: @pipeline.tag,
+ trigger_request: @pipeline.legacy_trigger,
+ protected: @pipeline.protected_ref?)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/pipeline/seed/stage.rb b/lib/gitlab/ci/pipeline/seed/stage.rb
index 32631a30e8f..3665794f354 100644
--- a/lib/gitlab/ci/pipeline/seed/stage.rb
+++ b/lib/gitlab/ci/pipeline/seed/stage.rb
@@ -3,43 +3,35 @@ module Gitlab
module Pipeline
module Seed
class Stage < Seed::Base
- include ::Gitlab::Utils::StrongMemoize
-
attr_reader :pipeline
delegate :project, to: :pipeline
delegate :size, to: :@builds
- def initialize(pipeline, stage, builds)
+ def initialize(pipeline, name, builds)
@pipeline = pipeline
- @stage = stage # stage name
- @builds = builds.to_a.dup # builds array of hashes
+ @name = name
+
+ @builds = builds.map do |attributes|
+ Seed::Build.new(pipeline, attributes)
+ end
end
def user=(current_user)
- @builds.map! do |attributes|
- attributes.merge(user: current_user)
- end
+ @builds.each { |seed| seed.user = current_user }
end
- def stage_attributes
- { name: @stage, project: project }
+ def attributes
+ { name: @name, project: project }
end
+ # TODO decouple from Seed::Build
def builds_attributes
- trigger = pipeline.trigger_requests.first
-
- @builds.map do |attributes|
- attributes.merge(project: project,
- ref: pipeline.ref,
- tag: pipeline.tag,
- trigger_request: trigger,
- protected: protected_ref?)
- end
+ @builds.map(&:attributes)
end
def create!
- pipeline.stages.build(stage_attributes).tap do |stage|
+ pipeline.stages.build(attributes).tap do |stage|
builds_attributes.each do |build_attributes|
stage.builds.build(build_attributes).tap do |build|
build.pipeline = pipeline
@@ -57,9 +49,6 @@ module Gitlab
private
def protected_ref?
- strong_memoize(:protected_ref) do
- project.protected_for?(pipeline.ref)
- end
end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb
index d4a72b7c62c..30142e356a5 100644
--- a/spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb
@@ -19,8 +19,8 @@ describe Gitlab::Ci::Pipeline::Seed::Stage do
describe '#stage_attributes' do
it 'returns hash attributes of a stage' do
- expect(subject.stage_attributes).to be_a Hash
- expect(subject.stage_attributes).to include(:name, :project)
+ expect(subject.attributes).to be_a Hash
+ expect(subject.attributes).to include(:name, :project)
end
end
diff --git a/spec/lib/gitlab/ci/yaml_processor_spec.rb b/spec/lib/gitlab/ci/yaml_processor_spec.rb
index 1d852e2b3b2..e67b51b52b9 100644
--- a/spec/lib/gitlab/ci/yaml_processor_spec.rb
+++ b/spec/lib/gitlab/ci/yaml_processor_spec.rb
@@ -119,8 +119,8 @@ module Gitlab
seeds = subject.stage_seeds(pipeline)
expect(seeds.size).to eq 2
- expect(seeds.first.stage_attributes[:name]).to eq 'test'
- expect(seeds.second.stage_attributes[:name]).to eq 'deploy'
+ expect(seeds.first.attributes[:name]).to eq 'test'
+ expect(seeds.second.attributes[:name]).to eq 'deploy'
expect(seeds.first.builds_attributes.dig(0, :name)).to eq 'rspec'
expect(seeds.first.builds_attributes.dig(1, :name)).to eq 'spinach'
expect(seeds.second.builds_attributes.dig(0, :name)).to eq 'production'
@@ -141,7 +141,7 @@ module Gitlab
seeds = subject.stage_seeds(pipeline)
expect(seeds.size).to eq 1
- expect(seeds.first.stage_attributes[:name]).to eq 'test'
+ expect(seeds.first.attributes[:name]).to eq 'test'
expect(seeds.first.builds_attributes.dig(0, :name)).to eq 'spinach'
end
end
@@ -160,7 +160,7 @@ module Gitlab
seeds = subject.stage_seeds(pipeline)
expect(seeds.size).to eq 1
- expect(seeds.first.stage_attributes[:name]).to eq 'test'
+ expect(seeds.first.attributes[:name]).to eq 'test'
expect(seeds.first.builds_attributes.dig(0, :name)).to eq 'spinach'
end
end