Rename Ci::PipelineStatus -> Ci::ProjectBuildStatus
This commit is contained in:
parent
2d246df57d
commit
9082d1e046
|
|
@ -394,7 +394,7 @@ module Ci
|
|||
end
|
||||
|
||||
def refresh_build_status_cache
|
||||
Ci::PipelineStatus.new(project, sha: sha, status: status).store_in_cache_if_needed
|
||||
Gitlab::Cache::Ci::ProjectBuildStatus.new(project, sha: sha, status: status).store_in_cache_if_needed
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
|||
|
|
@ -1,86 +0,0 @@
|
|||
# This class is not backed by a table in the main database.
|
||||
# It loads the latest Pipeline for the HEAD of a repository, and caches that
|
||||
# in Redis.
|
||||
module Ci
|
||||
class PipelineStatus
|
||||
attr_accessor :sha, :status, :project, :loaded
|
||||
|
||||
delegate :commit, to: :project
|
||||
|
||||
def self.load_for_project(project)
|
||||
new(project).tap do |status|
|
||||
status.load_status
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(project, sha: nil, status: nil)
|
||||
@project = project
|
||||
@sha = sha
|
||||
@status = status
|
||||
end
|
||||
|
||||
def has_status?
|
||||
loaded? && sha.present? && status.present?
|
||||
end
|
||||
|
||||
def load_status
|
||||
return if loaded?
|
||||
|
||||
if has_cache?
|
||||
load_from_cache
|
||||
else
|
||||
load_from_commit
|
||||
store_in_cache
|
||||
end
|
||||
|
||||
self.loaded = true
|
||||
end
|
||||
|
||||
def load_from_commit
|
||||
return unless commit
|
||||
|
||||
self.sha = commit.sha
|
||||
self.status = commit.status
|
||||
end
|
||||
|
||||
# We only cache the status for the HEAD commit of a project
|
||||
# This status is rendered in project lists
|
||||
def store_in_cache_if_needed
|
||||
return unless sha
|
||||
return delete_from_cache unless commit
|
||||
store_in_cache if commit.sha == self.sha
|
||||
end
|
||||
|
||||
def load_from_cache
|
||||
Gitlab::Redis.with do |redis|
|
||||
self.sha, self.status = redis.hmget(cache_key, :sha, :status)
|
||||
end
|
||||
end
|
||||
|
||||
def store_in_cache
|
||||
Gitlab::Redis.with do |redis|
|
||||
redis.mapped_hmset(cache_key, { sha: sha, status: status })
|
||||
end
|
||||
end
|
||||
|
||||
def delete_from_cache
|
||||
Gitlab::Redis.with do |redis|
|
||||
redis.del(cache_key)
|
||||
end
|
||||
end
|
||||
|
||||
def has_cache?
|
||||
Gitlab::Redis.with do |redis|
|
||||
redis.exists(cache_key)
|
||||
end
|
||||
end
|
||||
|
||||
def loaded?
|
||||
self.loaded
|
||||
end
|
||||
|
||||
def cache_key
|
||||
"projects/#{project.id}/build_status"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1197,7 +1197,7 @@ class Project < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def pipeline_status
|
||||
@pipeline_status ||= Ci::PipelineStatus.load_for_project(self)
|
||||
@pipeline_status ||= Gitlab::Cache::Ci::ProjectBuildStatus.load_for_project(self)
|
||||
end
|
||||
|
||||
def mark_import_as_failed(error_message)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,90 @@
|
|||
# This class is not backed by a table in the main database.
|
||||
# It loads the latest Pipeline for the HEAD of a repository, and caches that
|
||||
# in Redis.
|
||||
module Gitlab
|
||||
module Cache
|
||||
module Ci
|
||||
class ProjectBuildStatus
|
||||
attr_accessor :sha, :status, :project, :loaded
|
||||
|
||||
delegate :commit, to: :project
|
||||
|
||||
def self.load_for_project(project)
|
||||
new(project).tap do |status|
|
||||
status.load_status
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(project, sha: nil, status: nil)
|
||||
@project = project
|
||||
@sha = sha
|
||||
@status = status
|
||||
end
|
||||
|
||||
def has_status?
|
||||
loaded? && sha.present? && status.present?
|
||||
end
|
||||
|
||||
def load_status
|
||||
return if loaded?
|
||||
|
||||
if has_cache?
|
||||
load_from_cache
|
||||
else
|
||||
load_from_commit
|
||||
store_in_cache
|
||||
end
|
||||
|
||||
self.loaded = true
|
||||
end
|
||||
|
||||
def load_from_commit
|
||||
return unless commit
|
||||
|
||||
self.sha = commit.sha
|
||||
self.status = commit.status
|
||||
end
|
||||
|
||||
# We only cache the status for the HEAD commit of a project
|
||||
# This status is rendered in project lists
|
||||
def store_in_cache_if_needed
|
||||
return unless sha
|
||||
return delete_from_cache unless commit
|
||||
store_in_cache if commit.sha == self.sha
|
||||
end
|
||||
|
||||
def load_from_cache
|
||||
Gitlab::Redis.with do |redis|
|
||||
self.sha, self.status = redis.hmget(cache_key, :sha, :status)
|
||||
end
|
||||
end
|
||||
|
||||
def store_in_cache
|
||||
Gitlab::Redis.with do |redis|
|
||||
redis.mapped_hmset(cache_key, { sha: sha, status: status })
|
||||
end
|
||||
end
|
||||
|
||||
def delete_from_cache
|
||||
Gitlab::Redis.with do |redis|
|
||||
redis.del(cache_key)
|
||||
end
|
||||
end
|
||||
|
||||
def has_cache?
|
||||
Gitlab::Redis.with do |redis|
|
||||
redis.exists(cache_key)
|
||||
end
|
||||
end
|
||||
|
||||
def loaded?
|
||||
self.loaded
|
||||
end
|
||||
|
||||
def cache_key
|
||||
"projects/#{project.id}/build_status"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -19,7 +19,11 @@ describe CiStatusHelper do
|
|||
|
||||
describe "#pipeline_status_cache_key" do
|
||||
it "builds a cache key for pipeline status" do
|
||||
pipeline_status = Ci::PipelineStatus.new(build(:project), sha: "123abc", status: "success")
|
||||
pipeline_status = Gitlab::Cache::Ci::ProjectBuildStatus.new(
|
||||
build(:project),
|
||||
sha: "123abc",
|
||||
status: "success"
|
||||
)
|
||||
expect(helper.pipeline_status_cache_key(pipeline_status)).to eq("pipeline-status/123abc-success")
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Ci::PipelineStatus do
|
||||
describe Gitlab::Cache::Ci::ProjectBuildStatus do
|
||||
let(:project) { create(:project) }
|
||||
let(:pipeline_status) { described_class.new(project) }
|
||||
|
||||
|
|
@ -1084,8 +1084,9 @@ describe Ci::Pipeline, models: true do
|
|||
|
||||
it 'updates the cached status' do
|
||||
fake_status = double
|
||||
# after updating the status, the status is set to `skipped` for this pipeline's builds
|
||||
expect(Ci::PipelineStatus).to receive(:new).with(pipeline.project, sha: '123456', status: 'skipped').and_return(fake_status)
|
||||
expect(Gitlab::Cache::Ci::ProjectBuildStatus).to receive(:new).
|
||||
with(pipeline.project, sha: '123456', status: 'skipped').
|
||||
and_return(fake_status)
|
||||
expect(fake_status).to receive(:store_in_cache_if_needed)
|
||||
|
||||
pipeline.update_status
|
||||
|
|
|
|||
|
|
@ -1949,7 +1949,7 @@ describe Project, models: true do
|
|||
describe '#pipeline_status' do
|
||||
let(:project) { create(:project) }
|
||||
it 'builds a pipeline status' do
|
||||
expect(project.pipeline_status).to be_a(Ci::PipelineStatus)
|
||||
expect(project.pipeline_status).to be_a(Gitlab::Cache::Ci::ProjectBuildStatus)
|
||||
end
|
||||
|
||||
it 'hase a loaded pipeline status' do
|
||||
|
|
|
|||
Loading…
Reference in New Issue