Refactorize Ci::Build and Ci::BuildMetadata models
This commit is contained in:
parent
9ef86b1b12
commit
bb64b20a1f
|
@ -24,7 +24,7 @@ module Ci
|
||||||
has_one :job_artifacts_metadata, -> { where(file_type: Ci::JobArtifact.file_types[:metadata]) }, class_name: 'Ci::JobArtifact', inverse_of: :job, foreign_key: :job_id
|
has_one :job_artifacts_metadata, -> { where(file_type: Ci::JobArtifact.file_types[:metadata]) }, class_name: 'Ci::JobArtifact', inverse_of: :job, foreign_key: :job_id
|
||||||
has_one :job_artifacts_trace, -> { where(file_type: Ci::JobArtifact.file_types[:trace]) }, class_name: 'Ci::JobArtifact', inverse_of: :job, foreign_key: :job_id
|
has_one :job_artifacts_trace, -> { where(file_type: Ci::JobArtifact.file_types[:trace]) }, class_name: 'Ci::JobArtifact', inverse_of: :job, foreign_key: :job_id
|
||||||
|
|
||||||
has_one :metadata, class_name: 'Ci::BuildMetadata'
|
has_one :build_metadata, class_name: 'Ci::BuildMetadata'
|
||||||
|
|
||||||
# The "environment" field for builds is a String, and is the unexpanded name
|
# The "environment" field for builds is a String, and is the unexpanded name
|
||||||
def persisted_environment
|
def persisted_environment
|
||||||
|
@ -85,10 +85,6 @@ module Ci
|
||||||
before_save :ensure_token
|
before_save :ensure_token
|
||||||
before_destroy { unscoped_project }
|
before_destroy { unscoped_project }
|
||||||
|
|
||||||
before_create do |build|
|
|
||||||
build.metadata = Ci::BuildMetadata.new
|
|
||||||
end
|
|
||||||
|
|
||||||
after_create unless: :importing? do |build|
|
after_create unless: :importing? do |build|
|
||||||
run_after_commit { BuildHooksWorker.perform_async(build.id) }
|
run_after_commit { BuildHooksWorker.perform_async(build.id) }
|
||||||
end
|
end
|
||||||
|
@ -161,10 +157,14 @@ module Ci
|
||||||
end
|
end
|
||||||
|
|
||||||
before_transition pending: :running do |build|
|
before_transition pending: :running do |build|
|
||||||
build.metadata.save_timeout_state! unless build.metadata.nil?
|
build.metadata.save_timeout_state!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def metadata
|
||||||
|
self.build_metadata ||= Ci::BuildMetadata.new
|
||||||
|
end
|
||||||
|
|
||||||
def detailed_status(current_user)
|
def detailed_status(current_user)
|
||||||
Gitlab::Ci::Status::Build::Factory
|
Gitlab::Ci::Status::Build::Factory
|
||||||
.new(self, current_user)
|
.new(self, current_user)
|
||||||
|
@ -242,7 +242,7 @@ module Ci
|
||||||
end
|
end
|
||||||
|
|
||||||
def timeout
|
def timeout
|
||||||
[project.build_timeout, runner&.maximum_job_timeout].compact.min
|
metadata.used_timeout
|
||||||
end
|
end
|
||||||
|
|
||||||
def triggered_by?(current_user)
|
def triggered_by?(current_user)
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
module Ci
|
module Ci
|
||||||
|
# The purpose of this class is to store Build related data that can be disposed.
|
||||||
|
# Data that should be persisted forever, should be stored with Ci::Build model.
|
||||||
class BuildMetadata < ActiveRecord::Base
|
class BuildMetadata < ActiveRecord::Base
|
||||||
extend Gitlab::Ci::Model
|
extend Gitlab::Ci::Model
|
||||||
include Presentable
|
include Presentable
|
||||||
|
@ -11,14 +13,18 @@ module Ci
|
||||||
chronic_duration_attr_reader :used_timeout_human_readable, :used_timeout
|
chronic_duration_attr_reader :used_timeout_human_readable, :used_timeout
|
||||||
|
|
||||||
enum timeout_source: {
|
enum timeout_source: {
|
||||||
unknown_timeout_source: nil,
|
unknown_timeout_source: 1,
|
||||||
project_timeout_source: 1,
|
project_timeout_source: 2,
|
||||||
runner_timeout_source: 2
|
runner_timeout_source: 3
|
||||||
}
|
}
|
||||||
|
|
||||||
def save_timeout_state!
|
def save_timeout_state!
|
||||||
self.used_timeout = build.timeout
|
project_timeout = build.project&.build_timeout
|
||||||
self.timeout_source = build.timeout < build.project.build_timeout ? :runner_timeout_source : :project_timeout_source
|
timeout = [project_timeout, build.runner&.maximum_job_timeout].compact.min
|
||||||
|
|
||||||
|
self.used_timeout = timeout
|
||||||
|
self.timeout_source = timeout < project_timeout ? :runner_timeout_source : :project_timeout_source
|
||||||
|
|
||||||
save!
|
save!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,10 +4,13 @@ class CreateCiBuildsMetadataTable < ActiveRecord::Migration
|
||||||
DOWNTIME = false
|
DOWNTIME = false
|
||||||
|
|
||||||
def change
|
def change
|
||||||
create_table :ci_builds_metadata do |t|
|
create_table :ci_builds_metadata, id: false do |t|
|
||||||
t.integer :build_id, null: false
|
t.integer :build_id, null: false
|
||||||
t.integer :used_timeout
|
t.integer :used_timeout
|
||||||
t.integer :timeout_source
|
t.integer :timeout_source, null: false, default: 1
|
||||||
|
|
||||||
|
t.primary_key :build_id
|
||||||
|
t.foreign_key :ci_builds, column: :build_id, on_delete: :cascade
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
class AddBuildForeignKeyToCiBuildsMetadata < ActiveRecord::Migration
|
|
||||||
include Gitlab::Database::MigrationHelpers
|
|
||||||
|
|
||||||
DOWNTIME = false
|
|
||||||
|
|
||||||
disable_ddl_transaction!
|
|
||||||
|
|
||||||
def up
|
|
||||||
add_concurrent_foreign_key(:ci_builds_metadata, :ci_builds, column: :build_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def down
|
|
||||||
remove_foreign_key(:ci_builds_metadata, column: :build_id)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -329,10 +329,9 @@ ActiveRecord::Schema.define(version: 20180327101207) do
|
||||||
add_index "ci_builds", ["updated_at"], name: "index_ci_builds_on_updated_at", using: :btree
|
add_index "ci_builds", ["updated_at"], name: "index_ci_builds_on_updated_at", using: :btree
|
||||||
add_index "ci_builds", ["user_id"], name: "index_ci_builds_on_user_id", using: :btree
|
add_index "ci_builds", ["user_id"], name: "index_ci_builds_on_user_id", using: :btree
|
||||||
|
|
||||||
create_table "ci_builds_metadata", force: :cascade do |t|
|
create_table "ci_builds_metadata", primary_key: "build_id", force: :cascade do |t|
|
||||||
t.integer "build_id", null: false
|
|
||||||
t.integer "used_timeout"
|
t.integer "used_timeout"
|
||||||
t.integer "timeout_source"
|
t.integer "timeout_source", default: 1, null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "ci_group_variables", force: :cascade do |t|
|
create_table "ci_group_variables", force: :cascade do |t|
|
||||||
|
@ -2035,7 +2034,7 @@ ActiveRecord::Schema.define(version: 20180327101207) do
|
||||||
add_foreign_key "ci_builds", "ci_pipelines", column: "auto_canceled_by_id", name: "fk_a2141b1522", on_delete: :nullify
|
add_foreign_key "ci_builds", "ci_pipelines", column: "auto_canceled_by_id", name: "fk_a2141b1522", on_delete: :nullify
|
||||||
add_foreign_key "ci_builds", "ci_stages", column: "stage_id", name: "fk_3a9eaa254d", on_delete: :cascade
|
add_foreign_key "ci_builds", "ci_stages", column: "stage_id", name: "fk_3a9eaa254d", on_delete: :cascade
|
||||||
add_foreign_key "ci_builds", "projects", name: "fk_befce0568a", on_delete: :cascade
|
add_foreign_key "ci_builds", "projects", name: "fk_befce0568a", on_delete: :cascade
|
||||||
add_foreign_key "ci_builds_metadata", "ci_builds", column: "build_id", name: "fk_e20479742e", on_delete: :cascade
|
add_foreign_key "ci_builds_metadata", "ci_builds", column: "build_id", on_delete: :cascade
|
||||||
add_foreign_key "ci_group_variables", "namespaces", column: "group_id", name: "fk_33ae4d58d8", on_delete: :cascade
|
add_foreign_key "ci_group_variables", "namespaces", column: "group_id", name: "fk_33ae4d58d8", on_delete: :cascade
|
||||||
add_foreign_key "ci_job_artifacts", "ci_builds", column: "job_id", on_delete: :cascade
|
add_foreign_key "ci_job_artifacts", "ci_builds", column: "job_id", on_delete: :cascade
|
||||||
add_foreign_key "ci_job_artifacts", "projects", on_delete: :cascade
|
add_foreign_key "ci_job_artifacts", "projects", on_delete: :cascade
|
||||||
|
|
|
@ -1275,17 +1275,21 @@ describe Ci::Build do
|
||||||
set(:project2) { create(:project, :repository, group: group, build_timeout: 1000) }
|
set(:project2) { create(:project, :repository, group: group, build_timeout: 1000) }
|
||||||
set(:pipeline2) { create(:ci_pipeline, project: project2, sha: project2.commit.id, ref: project2.default_branch, status: 'success') }
|
set(:pipeline2) { create(:ci_pipeline, project: project2, sha: project2.commit.id, ref: project2.default_branch, status: 'success') }
|
||||||
|
|
||||||
let(:build) { create(:ci_build, :manual, pipeline: pipeline2) }
|
let(:build) { create(:ci_build, :pending, pipeline: pipeline2) }
|
||||||
|
|
||||||
subject { build.timeout }
|
subject { build.timeout }
|
||||||
|
|
||||||
|
before do
|
||||||
|
build.run!
|
||||||
|
end
|
||||||
|
|
||||||
it 'returns project timeout configuration' do
|
it 'returns project timeout configuration' do
|
||||||
is_expected.to eq(project2.build_timeout)
|
is_expected.to eq(project2.build_timeout)
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when runner sets timeout to bigger value' do
|
context 'when runner sets timeout to bigger value' do
|
||||||
let(:runner2) { create(:ci_runner, maximum_job_timeout: 2000) }
|
let(:runner2) { create(:ci_runner, maximum_job_timeout: 2000) }
|
||||||
let(:build) { create(:ci_build, :manual, pipeline: pipeline2, runner: runner2) }
|
let(:build) { create(:ci_build, :pending, pipeline: pipeline2, runner: runner2) }
|
||||||
|
|
||||||
it 'returns project timeout configuration' do
|
it 'returns project timeout configuration' do
|
||||||
is_expected.to eq(project2.build_timeout)
|
is_expected.to eq(project2.build_timeout)
|
||||||
|
@ -1294,7 +1298,7 @@ describe Ci::Build do
|
||||||
|
|
||||||
context 'when runner sets timeout to smaller value' do
|
context 'when runner sets timeout to smaller value' do
|
||||||
let(:runner2) { create(:ci_runner, maximum_job_timeout: 500) }
|
let(:runner2) { create(:ci_runner, maximum_job_timeout: 500) }
|
||||||
let(:build) { create(:ci_build, :manual, pipeline: pipeline2, runner: runner2) }
|
let(:build) { create(:ci_build, :pending, pipeline: pipeline2, runner: runner2) }
|
||||||
|
|
||||||
it 'returns project timeout configuration' do
|
it 'returns project timeout configuration' do
|
||||||
is_expected.to eq(runner2.maximum_job_timeout)
|
is_expected.to eq(runner2.maximum_job_timeout)
|
||||||
|
|
Loading…
Reference in New Issue