Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
9082d1e0
Commit
9082d1e0
authored
Mar 30, 2017
by
Bob Van Landuyt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Rename Ci::PipelineStatus -> Ci::ProjectBuildStatus
parent
2d246df5
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
102 additions
and
93 deletions
+102
-93
app/models/ci/pipeline.rb
app/models/ci/pipeline.rb
+1
-1
app/models/ci/pipeline_status.rb
app/models/ci/pipeline_status.rb
+0
-86
app/models/project.rb
app/models/project.rb
+1
-1
lib/gitlab/cache/ci/project_build_status.rb
lib/gitlab/cache/ci/project_build_status.rb
+90
-0
spec/helpers/ci_status_helper_spec.rb
spec/helpers/ci_status_helper_spec.rb
+5
-1
spec/lib/gitlab/cache/ci/project_build_status_spec.rb
spec/lib/gitlab/cache/ci/project_build_status_spec.rb
+1
-1
spec/models/ci/pipeline_spec.rb
spec/models/ci/pipeline_spec.rb
+3
-2
spec/models/project_spec.rb
spec/models/project_spec.rb
+1
-1
No files found.
app/models/ci/pipeline.rb
View file @
9082d1e0
...
@@ -394,7 +394,7 @@ module Ci
...
@@ -394,7 +394,7 @@ module Ci
end
end
def
refresh_build_status_cache
def
refresh_build_status_cache
Ci
::
Pipeline
Status
.
new
(
project
,
sha:
sha
,
status:
status
).
store_in_cache_if_needed
Gitlab
::
Cache
::
Ci
::
ProjectBuild
Status
.
new
(
project
,
sha:
sha
,
status:
status
).
store_in_cache_if_needed
end
end
private
private
...
...
app/models/ci/pipeline_status.rb
deleted
100644 → 0
View file @
2d246df5
# 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
app/models/project.rb
View file @
9082d1e0
...
@@ -1197,7 +1197,7 @@ class Project < ActiveRecord::Base
...
@@ -1197,7 +1197,7 @@ class Project < ActiveRecord::Base
end
end
def
pipeline_status
def
pipeline_status
@pipeline_status
||=
Ci
::
Pipeline
Status
.
load_for_project
(
self
)
@pipeline_status
||=
Gitlab
::
Cache
::
Ci
::
ProjectBuild
Status
.
load_for_project
(
self
)
end
end
def
mark_import_as_failed
(
error_message
)
def
mark_import_as_failed
(
error_message
)
...
...
lib/gitlab/cache/ci/project_build_status.rb
0 → 100644
View file @
9082d1e0
# 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
spec/helpers/ci_status_helper_spec.rb
View file @
9082d1e0
...
@@ -19,7 +19,11 @@ describe CiStatusHelper do
...
@@ -19,7 +19,11 @@ describe CiStatusHelper do
describe
"#pipeline_status_cache_key"
do
describe
"#pipeline_status_cache_key"
do
it
"builds a cache key for pipeline status"
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"
)
expect
(
helper
.
pipeline_status_cache_key
(
pipeline_status
)).
to
eq
(
"pipeline-status/123abc-success"
)
end
end
end
end
...
...
spec/
models/ci/pipeline
_status_spec.rb
→
spec/
lib/gitlab/cache/ci/project_build
_status_spec.rb
View file @
9082d1e0
require
'spec_helper'
require
'spec_helper'
describe
Ci
::
Pipeline
Status
do
describe
Gitlab
::
Cache
::
Ci
::
ProjectBuild
Status
do
let
(
:project
)
{
create
(
:project
)
}
let
(
:project
)
{
create
(
:project
)
}
let
(
:pipeline_status
)
{
described_class
.
new
(
project
)
}
let
(
:pipeline_status
)
{
described_class
.
new
(
project
)
}
...
...
spec/models/ci/pipeline_spec.rb
View file @
9082d1e0
...
@@ -1084,8 +1084,9 @@ describe Ci::Pipeline, models: true do
...
@@ -1084,8 +1084,9 @@ describe Ci::Pipeline, models: true do
it
'updates the cached status'
do
it
'updates the cached status'
do
fake_status
=
double
fake_status
=
double
# after updating the status, the status is set to `skipped` for this pipeline's builds
expect
(
Gitlab
::
Cache
::
Ci
::
ProjectBuildStatus
).
to
receive
(
:new
).
expect
(
Ci
::
PipelineStatus
).
to
receive
(
:new
).
with
(
pipeline
.
project
,
sha:
'123456'
,
status:
'skipped'
).
and_return
(
fake_status
)
with
(
pipeline
.
project
,
sha:
'123456'
,
status:
'skipped'
).
and_return
(
fake_status
)
expect
(
fake_status
).
to
receive
(
:store_in_cache_if_needed
)
expect
(
fake_status
).
to
receive
(
:store_in_cache_if_needed
)
pipeline
.
update_status
pipeline
.
update_status
...
...
spec/models/project_spec.rb
View file @
9082d1e0
...
@@ -1949,7 +1949,7 @@ describe Project, models: true do
...
@@ -1949,7 +1949,7 @@ describe Project, models: true do
describe
'#pipeline_status'
do
describe
'#pipeline_status'
do
let
(
:project
)
{
create
(
:project
)
}
let
(
:project
)
{
create
(
:project
)
}
it
'builds a pipeline status'
do
it
'builds a pipeline status'
do
expect
(
project
.
pipeline_status
).
to
be_a
(
Ci
::
Pipeline
Status
)
expect
(
project
.
pipeline_status
).
to
be_a
(
Gitlab
::
Cache
::
Ci
::
ProjectBuild
Status
)
end
end
it
'hase a loaded pipeline status'
do
it
'hase a loaded pipeline status'
do
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment