Commit 317a7469 authored by Kamil Trzcinski's avatar Kamil Trzcinski
Browse files

Make commit_spec run

parent 4da13c952e7f
......@@ -80,6 +80,8 @@ def create_from(build)
def retry(build)
new_build = Ci::Build.new(status: :pending)
new_build.ref = build.ref
new_build.tag = build.tag
new_build.options = build.options
new_build.commands = build.commands
new_build.tag_list = build.tag_list
......@@ -141,7 +143,7 @@ def retry(build)
state :canceled, value: 'canceled'
end
delegate :sha, :short_sha, :before_sha, :ref, :project,
delegate :sha, :short_sha, :project,
to: :commit, prefix: false
def trace_html
......
......@@ -58,14 +58,6 @@ def valid_commit_sha
end
end
def new_branch?
before_sha == Ci::Git::BLANK_SHA
end
def compare?
!new_branch?
end
def git_author_name
commit_data.author_name if commit_data
end
......@@ -78,10 +70,6 @@ def git_commit_message
commit_data.message if commit_data
end
def short_before_sha
Ci::Commit.truncate_sha(before_sha)
end
def short_sha
Ci::Commit.truncate_sha(sha)
end
......@@ -99,7 +87,22 @@ def stage
def create_builds(ref, tag, user, trigger_request = nil)
return if skip_ci? && trigger_request.blank?
return unless config_processor
CreateBuildsService.new.execute(self, config_processor, ref, tag, user, trigger_request)
config_processor.stages.any? do |stage|
CreateBuildsService.new.execute(self, stage, ref, tag, user, trigger_request).present?
end
end
def create_next_builds(ref, tag, user, trigger_request)
return if skip_ci? && trigger_request.blank?
return unless config_processor
stages = builds.where(ref: ref, tag: tag, trigger_request: trigger_request).group_by(&:stage)
config_processor.stages.any? do |stage|
unless stages.include?(stage)
CreateBuildsService.new.execute(self, stage, ref, tag, user, trigger_request).present?
end
end
end
def refs
......@@ -111,7 +114,14 @@ def last_ref
end
def builds_without_retry
builds.latest
@builds_without_retry ||=
begin
grouped_builds = builds.group_by(&:name)
latest_builds = grouped_builds.map do |name, builds|
builds.sort_by(&:id).last
end
latest_builds.sort_by(&:stage_idx)
end
end
def retried_builds
......@@ -125,32 +135,35 @@ def status
return 'failed'
elsif builds.none?
return 'skipped'
end
statuses = builds_without_retry.ignore_failures.pluck(:status)
if statuses.all? { |status| status == 'success' }
return 'success'
elsif statuses.all? { |status| status == 'pending' }
return 'pending'
elsif statuses.include?('running') || statuses.include?('pending')
return 'running'
elsif statuses.all? { |status| status == 'canceled' }
return 'canceled'
elsif success?
'success'
elsif pending?
'pending'
elsif running?
'running'
elsif canceled?
'canceled'
else
return 'failed'
'failed'
end
end
def pending?
status == 'pending'
builds_without_retry.all? do |build|
build.pending?
end
end
def running?
status == 'running'
builds_without_retry.any? do |build|
build.running? || build.pending?
end
end
def success?
status == 'success'
builds_without_retry.all? do |build|
build.success? || build.ignored?
end
end
def failed?
......@@ -158,7 +171,9 @@ def failed?
end
def canceled?
status == 'canceled'
builds_without_retry.all? do |build|
build.canceled?
end
end
def duration
......
module Ci
class CreateBuildsService
def execute(commit, ref, tag, user, config_processor, trigger_request)
config_processor.stages.any? do |stage|
builds_attrs = config_processor.builds_for_stage_and_ref(stage, ref, tag)
builds_attrs.map do |build_attrs|
# don't create the same build twice
unless commit.builds.find_by_name_and_trigger_request(name: build_attrs[:name], ref: ref, tag: tag, trigger_request: trigger_request)
commit.builds.create!({
name: build_attrs[:name],
commands: build_attrs[:script],
tag_list: build_attrs[:tags],
options: build_attrs[:options],
allow_failure: build_attrs[:allow_failure],
stage: build_attrs[:stage],
stage_idx: build_attrs[:stage_idx],
trigger_request: trigger_request,
ref: ref,
tag: tag,
user: user,
})
end
end
def execute(commit, stage, ref, tag, user, trigger_request)
builds_attrs = commit.config_processor.builds_for_stage_and_ref(stage, ref, tag)
builds_attrs.map do |build_attrs|
build_attrs.slice!(:name,
:commands,
:tag_list,
:options,
:allow_failure,
:stage,
:stage_idx)
build_attrs.merge!(ref: ref,
tag: tag,
trigger_request: trigger_request,
user: user)
commit.builds.create!(build_attrs)
end
end
end
......
......@@ -28,8 +28,6 @@ def build_data(build)
gitlab_url: project.gitlab_url,
ref: build.ref,
sha: build.sha,
before_sha: build.before_sha,
push_data: build.commit.push_data
})
end
end
......
......@@ -122,11 +122,6 @@
Commit
.pull-right
%small #{build_commit_link @build}
- if @build.commit.compare?
%p
%span.attr-name Compare:
#{build_compare_link @build}
%p
%span.attr-name Branch:
#{build_ref_link @build}
......
......@@ -9,14 +9,9 @@
.gray-content-block.second-block
.row
.col-sm-6
- if @commit.compare?
%p
%span.attr-name Compare:
#{gitlab_compare_link(@project, @commit.short_before_sha, @commit.short_sha)}
- else
%p
%span.attr-name Commit:
#{gitlab_commit_link(@project, @commit.sha)}
%p
%span.attr-name Commit:
#{gitlab_commit_link(@project, @commit.sha)}
.col-sm-6
- if @commit.git_author_name || @commit.git_author_email
%p
......
......@@ -11,10 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20150930095736) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
ActiveRecord::Schema.define(version: 20151005075649) do
create_table "abuse_reports", force: true do |t|
t.integer "reporter_id"
......@@ -45,8 +42,8 @@
t.string "after_sign_out_path"
t.integer "session_expire_delay", default: 10080, null: false
t.text "import_sources"
t.text "help_page_text"
t.boolean "ci_enabled", default: true, null: false
t.text "help_page_text"
end
create_table "audit_events", force: true do |t|
......@@ -85,37 +82,60 @@
t.integer "project_id"
t.string "status"
t.datetime "finished_at"
t.text "trace"
t.text "trace", limit: 2147483647
t.datetime "created_at"
t.datetime "updated_at"
t.datetime "started_at"
t.integer "runner_id"
t.float "coverage"
t.float "coverage", limit: 24
t.integer "commit_id"
t.text "commands"
t.integer "job_id"
t.string "name"
t.boolean "deploy", default: false
t.boolean "deploy", default: false
t.text "options"
t.boolean "allow_failure", default: false, null: false
t.boolean "allow_failure", default: false, null: false
t.string "stage"
t.integer "trigger_request_id"
t.integer "gl_project_id"
t.integer "stage_idx"
t.boolean "tag"
t.string "ref"
t.text "push_data"
t.integer "user_id"
end
add_index "ci_builds", ["commit_id", "name"], name: "index_ci_builds_on_commit_id_and_name", 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
add_index "ci_builds", ["commit_id"], name: "index_ci_builds_on_commit_id", using: :btree
add_index "ci_builds", ["project_id", "commit_id"], name: "index_ci_builds_on_project_id_and_commit_id", using: :btree
add_index "ci_builds", ["project_id"], name: "index_ci_builds_on_project_id", using: :btree
add_index "ci_builds", ["runner_id"], name: "index_ci_builds_on_runner_id", using: :btree
create_table "ci_commit_statuses", force: true do |t|
t.integer "commit_id"
t.string "sha"
t.string "ref"
t.string "state"
t.string "target_url"
t.string "description"
t.string "context", default: "default"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "ci_commit_statuses", ["commit_id", "context", "ref"], name: "index_ci_commit_statuses_on_commit_id_and_context_and_ref", using: :btree
add_index "ci_commit_statuses", ["commit_id", "ref"], name: "index_ci_commit_statuses_on_commit_id_and_ref", using: :btree
create_table "ci_commits", force: true do |t|
t.integer "project_id"
t.string "ref"
t.string "sha"
t.string "before_sha"
t.text "push_data"
t.text "push_data", limit: 16777215
t.datetime "created_at"
t.datetime "updated_at"
t.boolean "tag", default: false
t.boolean "tag", default: false
t.text "yaml_errors"
t.datetime "committed_at"
t.integer "gl_project_id"
......@@ -134,6 +154,7 @@
t.text "description"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "gl_project_id"
end
add_index "ci_events", ["created_at"], name: "index_ci_events_on_created_at", using: :btree
......@@ -181,10 +202,11 @@
end
create_table "ci_runner_projects", force: true do |t|
t.integer "runner_id", null: false
t.integer "project_id", null: false
t.integer "runner_id", null: false
t.integer "project_id", null: false
t.datetime "created_at"
t.datetime "updated_at"
t.integer "gl_project_id"
end
add_index "ci_runner_projects", ["project_id"], name: "index_ci_runner_projects_on_project_id", using: :btree
......@@ -208,11 +230,12 @@
create_table "ci_services", force: true do |t|
t.string "type"
t.string "title"
t.integer "project_id", null: false
t.integer "project_id", null: false
t.datetime "created_at"
t.datetime "updated_at"
t.boolean "active", default: false, null: false
t.boolean "active", default: false, null: false
t.text "properties"
t.integer "gl_project_id"
end
add_index "ci_services", ["project_id"], name: "index_ci_services_on_project_id", using: :btree
......@@ -257,10 +280,11 @@
create_table "ci_triggers", force: true do |t|
t.string "token"
t.integer "project_id", null: false
t.integer "project_id", null: false
t.datetime "deleted_at"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "gl_project_id"
end
add_index "ci_triggers", ["deleted_at"], name: "index_ci_triggers_on_deleted_at", using: :btree
......@@ -272,15 +296,17 @@
t.text "encrypted_value"
t.string "encrypted_value_salt"
t.string "encrypted_value_iv"
t.integer "gl_project_id"
end
add_index "ci_variables", ["project_id"], name: "index_ci_variables_on_project_id", using: :btree
create_table "ci_web_hooks", force: true do |t|
t.string "url", null: false
t.integer "project_id", null: false
t.string "url", null: false
t.integer "project_id", null: false
t.datetime "created_at"
t.datetime "updated_at"
t.integer "gl_project_id"
end
create_table "deploy_keys_projects", force: true do |t|
......@@ -426,9 +452,9 @@
create_table "merge_request_diffs", force: true do |t|
t.string "state"
t.text "st_commits"
t.text "st_diffs"
t.integer "merge_request_id", null: false
t.text "st_commits", limit: 2147483647
t.text "st_diffs", limit: 2147483647
t.integer "merge_request_id", null: false
t.datetime "created_at"
t.datetime "updated_at"
end
......@@ -511,8 +537,8 @@
t.string "line_code"
t.string "commit_id"
t.integer "noteable_id"
t.boolean "system", default: false, null: false
t.text "st_diff"
t.boolean "system", default: false, null: false
t.text "st_diff", limit: 2147483647
t.integer "updated_by_id"
end
......@@ -581,25 +607,26 @@
t.datetime "created_at"
t.datetime "updated_at"
t.integer "creator_id"
t.boolean "issues_enabled", default: true, null: false
t.boolean "wall_enabled", default: true, null: false
t.boolean "merge_requests_enabled", default: true, null: false
t.boolean "wiki_enabled", default: true, null: false
t.boolean "issues_enabled", default: true, null: false
t.boolean "wall_enabled", default: true, null: false
t.boolean "merge_requests_enabled", default: true, null: false
t.boolean "wiki_enabled", default: true, null: false
t.integer "namespace_id"
t.string "issues_tracker", default: "gitlab", null: false
t.string "issues_tracker", default: "gitlab", null: false
t.string "issues_tracker_id"
t.boolean "snippets_enabled", default: true, null: false
t.boolean "snippets_enabled", default: true, null: false
t.datetime "last_activity_at"
t.string "import_url"
t.integer "visibility_level", default: 0, null: false
t.boolean "archived", default: false, null: false
t.integer "visibility_level", default: 0, null: false
t.boolean "archived", default: false, null: false
t.string "avatar"
t.string "import_status"
t.float "repository_size", default: 0.0
t.integer "star_count", default: 0, null: false
t.float "repository_size", limit: 24, default: 0.0
t.integer "star_count", default: 0, null: false
t.string "import_type"
t.string "import_source"
t.integer "commit_count", default: 0
t.integer "commit_count", default: 0
t.boolean "shared_runners_enabled", default: false
end
add_index "projects", ["created_at", "id"], name: "index_projects_on_created_at_and_id", using: :btree
......@@ -651,15 +678,15 @@
create_table "snippets", force: true do |t|
t.string "title"
t.text "content"
t.integer "author_id", null: false
t.text "content", limit: 2147483647
t.integer "author_id", null: false
t.integer "project_id"
t.datetime "created_at"
t.datetime "updated_at"
t.string "file_name"
t.datetime "expires_at"
t.string "type"
t.integer "visibility_level", default: 0, null: false
t.integer "visibility_level", default: 0, null: false
end
add_index "snippets", ["author_id"], name: "index_snippets_on_author_id", using: :btree
......
......@@ -87,8 +87,8 @@ def build_job(name, job)
{
stage_idx: stages.index(job[:stage]),
stage: job[:stage],
script: "#{@before_script.join("\n")}\n#{normalize_script(job[:script])}",
tags: job[:tags] || [],
commands: "#{@before_script.join("\n")}\n#{normalize_script(job[:script])}",
tag_list: job[:tags] || [],
name: name,
only: job[:only],
except: job[:except],
......
......@@ -23,20 +23,26 @@
gl_project factory: :empty_project
factory :ci_commit_without_jobs do
after(:create) do |commit, evaluator|
after(:build) do |commit|
allow(commit).to receive(:ci_yaml_file) { YAML.dump({}) }
end
end
factory :ci_commit_with_one_job do
after(:create) do |commit, evaluator|
allow(commit).to receive(:ci_yaml_file) { YAML.dump({ rspec: { script: "ls" } }) }
after(:build) do |commit|
allow(commit).to receive(:ci_yaml_file) { YAML.dump({rspec: {script: "ls"}}) }
end
end
factory :ci_commit_with_two_jobs do
after(:create) do |commit, evaluator|
allow(commit).to receive(:ci_yaml_file) { YAML.dump({ rspec: { script: "ls" }, spinach: { script: "ls" } }) }
after(:build) do |commit|
allow(commit).to receive(:ci_yaml_file) { YAML.dump({rspec: {script: "ls"}, spinach: {script: "ls"}}) }
end
end
factory :ci_commit_yaml_stub do
after(:build) do |commit|
allow(commit).to receive(:ci_yaml_file) { File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml')) }
end
end
end
......
......@@ -28,11 +28,14 @@
describe Ci::Build do
let(:project) { FactoryGirl.create :ci_project }
let(:gl_project) { FactoryGirl.create :empty_project, gitlab_ci_project: project }
let(:commit) { FactoryGirl.create :ci_commit, gl_project: gl_project }
let(:commit) { FactoryGirl.create :ci_commit_yaml_stub, gl_project: gl_project }
let(:build) { FactoryGirl.create :ci_build, commit: commit }
subject { build }
it { is_expected.to belong_to(:commit) }
it { is_expected.to belong_to(:user) }
it { is_expected.to validate_presence_of :status }
it { is_expected.to validate_presence_of :ref }
it { is_expected.to respond_to :success? }
it { is_expected.to respond_to :failed? }
......@@ -236,12 +239,6 @@
it { is_expected.to eq(options) }
end
describe :ref do
subject { build.ref }
it { is_expected.to eq(commit.ref) }
end
describe :sha do
subject { build.sha }
......@@ -254,12 +251,6 @@
it { is_expected.to eq(commit.short_sha) }
end
describe :before_sha do
subject { build.before_sha }
it { is_expected.to eq(commit.before_sha) }
end
describe :allow_git_fetch do
subject { build.allow_git_fetch }
......@@ -359,4 +350,38 @@
end
end
end
describe :project_recipients do
let (:pusher_email) { 'pusher@gitlab.test' }
let (:user) { User.new(notification_email: pusher_email) }
subject { build.project_recipients }
before do
build.update_attributes(user: user)
end
it 'should return pusher_email as only recipient when no additional recipients are given' do
project.update_attributes(email_add_pusher: true,
email_recipients: '')
is_expected.to eq([pusher_email])
end
it 'should return pusher_email and additional recipients' do
project.update_attributes(email_add_pusher: true,
email_recipients: 'rec1 rec2')
is_expected.to eq(['rec1', 'rec2', pusher_email])
end
it 'should return recipients' do
project.update_attributes(email_add_pusher: false,
email_recipients: 'rec1 rec2')
is_expected.to eq(['rec1', 'rec2'])
end
it 'should return unique recipients only' do
project.update_attributes(email_add_pusher: true,
email_recipients: "rec1 rec1 #{pusher_email}")
is_expected.to eq(['rec1', pusher_email])
end
end
end
......@@ -21,15 +21,10 @@
let(:project) { FactoryGirl.create :ci_project }
let(:gl_project) { FactoryGirl.create :empty_project, gitlab_ci_project: project }
let(:commit) { FactoryGirl.create :ci_commit, gl_project: gl_project }
let(:commit_with_project) { FactoryGirl.create :ci_commit, gl_project: gl_project }
let(:config_processor) { Ci::GitlabCiYamlProcessor.new(gitlab_ci_yaml) }
it { is_expected.to belong_to(:gl_project) }
it { is_expected.to have_many(:builds) }
it { is_expected.to validate_presence_of :before_sha }
it { is_expected.to validate_presence_of :sha }
it { is_expected.to validate_presence_of :ref }
it { is_expected.to validate_presence_of :push_data }
it { is_expected.to respond_to :git_author_name }
it { is_expected.to respond_to :git_author_email }
......@@ -59,53 +54,6 @@
end
end
describe :project_recipients do
context 'always sending notification' do
it 'should return commit_pusher_email as only recipient when no additional recipients are given' do
project = FactoryGirl.create :ci_project,