Commit 9912ad26 authored by Kamil Trzciński's avatar Kamil Trzciński

Store when and yaml variables in builds table

parent 50abec8c
...@@ -15,6 +15,7 @@ v 8.10.0 (unreleased) ...@@ -15,6 +15,7 @@ v 8.10.0 (unreleased)
- Align flash messages with left side of page content !4959 (winniehell) - Align flash messages with left side of page content !4959 (winniehell)
- Display tooltip for "Copy to Clipboard" button !5164 (winniehell) - Display tooltip for "Copy to Clipboard" button !5164 (winniehell)
- Use default cursor for table header of project files !5165 (winniehell) - Use default cursor for table header of project files !5165 (winniehell)
- Store when and yaml variables in builds table
- Display last commit of deleted branch in push events !4699 (winniehell) - Display last commit of deleted branch in push events !4699 (winniehell)
- Escape file extension when parsing search results !5141 (winniehell) - Escape file extension when parsing search results !5141 (winniehell)
- Apply the trusted_proxies config to the rack request object for use with rack_attack - Apply the trusted_proxies config to the rack request object for use with rack_attack
......
...@@ -5,6 +5,7 @@ module Ci ...@@ -5,6 +5,7 @@ module Ci
belongs_to :erased_by, class_name: 'User' belongs_to :erased_by, class_name: 'User'
serialize :options serialize :options
serialize :yaml_variables
validates :coverage, numericality: true, allow_blank: true validates :coverage, numericality: true, allow_blank: true
validates_presence_of :ref validates_presence_of :ref
...@@ -52,6 +53,8 @@ module Ci ...@@ -52,6 +53,8 @@ module Ci
new_build.stage = build.stage new_build.stage = build.stage
new_build.stage_idx = build.stage_idx new_build.stage_idx = build.stage_idx
new_build.trigger_request = build.trigger_request new_build.trigger_request = build.trigger_request
new_build.yaml_variables = build.yaml_variables
new_build.when = build.when
new_build.user = user new_build.user = user
new_build.save new_build.save
MergeRequests::AddTodoWhenBuildFailsService.new(build.project, nil).close(new_build) MergeRequests::AddTodoWhenBuildFailsService.new(build.project, nil).close(new_build)
...@@ -117,7 +120,12 @@ module Ci ...@@ -117,7 +120,12 @@ module Ci
end end
def variables def variables
predefined_variables + yaml_variables + project_variables + trigger_variables variables = []
variables += predefined_variables
variables += yaml_variables if yaml_variables
variables += project_variables
variables += trigger_variables
variables
end end
def merge_request def merge_request
...@@ -394,30 +402,6 @@ module Ci ...@@ -394,30 +402,6 @@ module Ci
self.update(erased_by: user, erased_at: Time.now, artifacts_expire_at: nil) self.update(erased_by: user, erased_at: Time.now, artifacts_expire_at: nil)
end end
def yaml_variables
global_yaml_variables + job_yaml_variables
end
def global_yaml_variables
if pipeline.config_processor
pipeline.config_processor.global_variables.map do |key, value|
{ key: key, value: value, public: true }
end
else
[]
end
end
def job_yaml_variables
if pipeline.config_processor
pipeline.config_processor.job_variables(name).map do |key, value|
{ key: key, value: value, public: true }
end
else
[]
end
end
def project_variables def project_variables
project.variables.map do |variable| project.variables.map do |variable|
{ key: variable.key, value: variable.value, public: false } { key: variable.key, value: variable.value, public: false }
......
...@@ -36,7 +36,9 @@ module Ci ...@@ -36,7 +36,9 @@ module Ci
:allow_failure, :allow_failure,
:stage, :stage,
:stage_idx, :stage_idx,
:environment) :environment,
:when,
:yaml_variables)
build_attrs.merge!(pipeline: @pipeline, build_attrs.merge!(pipeline: @pipeline,
ref: @pipeline.ref, ref: @pipeline.ref,
......
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class AddWhenAndYamlVariablesCiBuilds < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
# When using the methods "add_concurrent_index" or "add_column_with_default"
# you must disable the use of transactions as these methods can not run in an
# existing transaction. When using "add_concurrent_index" make sure that this
# method is the _only_ method called in the migration, any other changes
# should go in a separate migration. This ensures that upon failure _only_ the
# index creation fails and can be retried or reverted easily.
#
# To disable transactions uncomment the following line and remove these
# comments:
# disable_ddl_transaction!
def change
add_column :ci_builds, :when, :string
add_column :ci_builds, :yaml_variables, :text
end
end
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20160712171823) do ActiveRecord::Schema.define(version: 20160716115710) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
...@@ -168,6 +168,8 @@ ActiveRecord::Schema.define(version: 20160712171823) do ...@@ -168,6 +168,8 @@ ActiveRecord::Schema.define(version: 20160712171823) do
t.datetime "artifacts_expire_at" t.datetime "artifacts_expire_at"
t.string "environment" t.string "environment"
t.integer "artifacts_size" t.integer "artifacts_size"
t.string "when"
t.text "yaml_variables"
end end
add_index "ci_builds", ["commit_id", "stage_idx", "created_at"], name: "index_ci_builds_on_commit_id_and_stage_idx_and_created_at", using: :btree add_index "ci_builds", ["commit_id", "stage_idx", "created_at"], name: "index_ci_builds_on_commit_id_and_stage_idx_and_created_at", using: :btree
......
...@@ -31,28 +31,34 @@ module Ci ...@@ -31,28 +31,34 @@ module Ci
raise ValidationError, e.message raise ValidationError, e.message
end end
def builds_for_stage_and_ref(stage, ref, tag = false, trigger_request = nil) def jobs_for_ref(ref, tag = false, trigger_request = nil)
builds.select do |build| @jobs.select do |_, job|
build[:stage] == stage && process?(job[:only], job[:except], ref, tag, trigger_request)
process?(build[:only], build[:except], ref, tag, trigger_request)
end end
end end
def builds def jobs_for_stage_and_ref(stage, ref, tag = false, trigger_request = nil)
@jobs.map do |name, job| jobs_for_ref(ref, tag, trigger_request).select do |_, job|
build_job(name, job) job[:stage] == stage
end end
end end
def global_variables def builds_for_ref(ref, tag = false, trigger_request = nil)
@variables jobs_for_ref(ref, tag, trigger_request).map do |name, job|
build_job(name, job)
end
end end
def job_variables(name) def builds_for_stage_and_ref(stage, ref, tag = false, trigger_request = nil)
job = @jobs[name.to_sym] jobs_for_stage_and_ref(stage, ref, tag, trigger_request).map do |name, job|
return [] unless job build_job(name, job)
end
end
job[:variables] || [] def builds
@jobs.map do |name, job|
build_job(name, job)
end
end end
private private
...@@ -95,11 +101,10 @@ module Ci ...@@ -95,11 +101,10 @@ module Ci
commands: [job[:before_script] || @before_script, job[:script]].flatten.compact.join("\n"), commands: [job[:before_script] || @before_script, job[:script]].flatten.compact.join("\n"),
tag_list: job[:tags] || [], tag_list: job[:tags] || [],
name: name, name: name,
only: job[:only],
except: job[:except],
allow_failure: job[:allow_failure] || false, allow_failure: job[:allow_failure] || false,
when: job[:when] || 'on_success', when: job[:when] || 'on_success',
environment: job[:environment], environment: job[:environment],
yaml_variables: yaml_variables(name),
options: { options: {
image: job[:image] || @image, image: job[:image] || @image,
services: job[:services] || @services, services: job[:services] || @services,
...@@ -111,6 +116,24 @@ module Ci ...@@ -111,6 +116,24 @@ module Ci
} }
end end
def yaml_variables(name)
variables = global_variables.merge(job_variables(name))
variables.map do |key, value|
{ key: key, value: value, public: true }
end
end
def global_variables
@variables || {}
end
def job_variables(name)
job = @jobs[name.to_sym]
return {} unless job
job[:variables] || {}
end
def validate! def validate!
@jobs.each do |name, job| @jobs.each do |name, job|
validate_job!(name, job) validate_job!(name, job)
......
...@@ -15,6 +15,11 @@ FactoryGirl.define do ...@@ -15,6 +15,11 @@ FactoryGirl.define do
services: ["postgres"] services: ["postgres"]
} }
end end
yaml_variables do
[
{ key: :DB_NAME, value: 'postgres', public: true }
]
end
pipeline factory: :ci_pipeline pipeline factory: :ci_pipeline
......
...@@ -19,15 +19,14 @@ module Ci ...@@ -19,15 +19,14 @@ module Ci
expect(config_processor.builds_for_stage_and_ref(type, "master").first).to eq({ expect(config_processor.builds_for_stage_and_ref(type, "master").first).to eq({
stage: "test", stage: "test",
stage_idx: 1, stage_idx: 1,
except: nil,
name: :rspec, name: :rspec,
only: nil,
commands: "pwd\nrspec", commands: "pwd\nrspec",
tag_list: [], tag_list: [],
options: {}, options: {},
allow_failure: false, allow_failure: false,
when: "on_success", when: "on_success",
environment: nil, environment: nil,
yaml_variables: {}
}) })
end end
...@@ -432,11 +431,9 @@ module Ci ...@@ -432,11 +431,9 @@ module Ci
expect(config_processor.builds_for_stage_and_ref("test", "master").size).to eq(1) expect(config_processor.builds_for_stage_and_ref("test", "master").size).to eq(1)
expect(config_processor.builds_for_stage_and_ref("test", "master").first).to eq({ expect(config_processor.builds_for_stage_and_ref("test", "master").first).to eq({
except: nil,
stage: "test", stage: "test",
stage_idx: 1, stage_idx: 1,
name: :rspec, name: :rspec,
only: nil,
commands: "pwd\nrspec", commands: "pwd\nrspec",
tag_list: [], tag_list: [],
options: { options: {
...@@ -446,6 +443,7 @@ module Ci ...@@ -446,6 +443,7 @@ module Ci
allow_failure: false, allow_failure: false,
when: "on_success", when: "on_success",
environment: nil, environment: nil,
yaml_variables: {}
}) })
end end
...@@ -461,11 +459,9 @@ module Ci ...@@ -461,11 +459,9 @@ module Ci
expect(config_processor.builds_for_stage_and_ref("test", "master").size).to eq(1) expect(config_processor.builds_for_stage_and_ref("test", "master").size).to eq(1)
expect(config_processor.builds_for_stage_and_ref("test", "master").first).to eq({ expect(config_processor.builds_for_stage_and_ref("test", "master").first).to eq({
except: nil,
stage: "test", stage: "test",
stage_idx: 1, stage_idx: 1,
name: :rspec, name: :rspec,
only: nil,
commands: "pwd\nrspec", commands: "pwd\nrspec",
tag_list: [], tag_list: [],
options: { options: {
...@@ -475,6 +471,7 @@ module Ci ...@@ -475,6 +471,7 @@ module Ci
allow_failure: false, allow_failure: false,
when: "on_success", when: "on_success",
environment: nil, environment: nil,
yaml_variables: []
}) })
end end
end end
...@@ -681,11 +678,9 @@ module Ci ...@@ -681,11 +678,9 @@ module Ci
expect(config_processor.builds_for_stage_and_ref("test", "master").size).to eq(1) expect(config_processor.builds_for_stage_and_ref("test", "master").size).to eq(1)
expect(config_processor.builds_for_stage_and_ref("test", "master").first).to eq({ expect(config_processor.builds_for_stage_and_ref("test", "master").first).to eq({
except: nil,
stage: "test", stage: "test",
stage_idx: 1, stage_idx: 1,
name: :rspec, name: :rspec,
only: nil,
commands: "pwd\nrspec", commands: "pwd\nrspec",
tag_list: [], tag_list: [],
options: { options: {
...@@ -701,6 +696,7 @@ module Ci ...@@ -701,6 +696,7 @@ module Ci
when: "on_success", when: "on_success",
allow_failure: false, allow_failure: false,
environment: nil, environment: nil,
yaml_variables: {}
}) })
end end
...@@ -819,17 +815,16 @@ module Ci ...@@ -819,17 +815,16 @@ module Ci
it "doesn't create jobs that start with dot" do it "doesn't create jobs that start with dot" do
expect(subject.size).to eq(1) expect(subject.size).to eq(1)
expect(subject.first).to eq({ expect(subject.first).to eq({
except: nil,
stage: "test", stage: "test",
stage_idx: 1, stage_idx: 1,
name: :normal_job, name: :normal_job,
only: nil,
commands: "test", commands: "test",
tag_list: [], tag_list: [],
options: {}, options: {},
when: "on_success", when: "on_success",
allow_failure: false, allow_failure: false,
environment: nil, environment: nil,
yaml_variables: {}
}) })
end end
end end
...@@ -865,30 +860,28 @@ module Ci ...@@ -865,30 +860,28 @@ module Ci
it "is correctly supported for jobs" do it "is correctly supported for jobs" do
expect(subject.size).to eq(2) expect(subject.size).to eq(2)
expect(subject.first).to eq({ expect(subject.first).to eq({
except: nil,
stage: "build", stage: "build",
stage_idx: 0, stage_idx: 0,
name: :job1, name: :job1,
only: nil,
commands: "execute-script-for-job", commands: "execute-script-for-job",
tag_list: [], tag_list: [],
options: {}, options: {},
when: "on_success", when: "on_success",
allow_failure: false, allow_failure: false,
environment: nil, environment: nil,
yaml_variables: {}
}) })
expect(subject.second).to eq({ expect(subject.second).to eq({
except: nil,
stage: "build", stage: "build",
stage_idx: 0, stage_idx: 0,
name: :job2, name: :job2,
only: nil,
commands: "execute-script-for-job", commands: "execute-script-for-job",
tag_list: [], tag_list: [],
options: {}, options: {},
when: "on_success", when: "on_success",
allow_failure: false, allow_failure: false,
environment: nil, environment: nil,
yaml_variables: {}
}) })
end end
end end
......
...@@ -208,7 +208,7 @@ describe Ci::Build, models: true do ...@@ -208,7 +208,7 @@ describe Ci::Build, models: true do
end end
before do before do
build.update_attributes(stage: 'stage') build.update_attributes(stage: 'stage', yaml_variables: yaml_variables)
end end
it { is_expected.to eq(predefined_variables + yaml_variables) } it { is_expected.to eq(predefined_variables + yaml_variables) }
...@@ -260,22 +260,6 @@ describe Ci::Build, models: true do ...@@ -260,22 +260,6 @@ describe Ci::Build, models: true do
it { is_expected.to eq(predefined_variables + predefined_trigger_variable + yaml_variables + secure_variables + trigger_variables) } it { is_expected.to eq(predefined_variables + predefined_trigger_variable + yaml_variables + secure_variables + trigger_variables) }
end end
context 'when job variables are defined' do
##
# Job-level variables are defined in gitlab_ci.yml fixture
#
context 'when job variables are unique' do
let(:build) { create(:ci_build, name: 'staging') }
it 'includes job variables' do
expect(subject).to include(
{ key: :KEY1, value: 'value1', public: true },
{ key: :KEY2, value: 'value2', public: true }
)
end
end
end
end end
end end
end end
......
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