Commit 122e069d authored by Sean Carroll's avatar Sean Carroll Committed by Peter Leitzen

Collect release evidence at release timestamp

Closes https://gitlab.com/gitlab-org/gitlab/issues/38103

See merge request https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23697
parent dc28f770
...@@ -34,7 +34,6 @@ class Release < ApplicationRecord ...@@ -34,7 +34,6 @@ class Release < ApplicationRecord
delegate :repository, to: :project delegate :repository, to: :project
after_commit :create_evidence!, on: :create, unless: :importing?
after_commit :notify_new_release, on: :create, unless: :importing? after_commit :notify_new_release, on: :create, unless: :importing?
MAX_NUMBER_TO_DISPLAY = 3 MAX_NUMBER_TO_DISPLAY = 3
...@@ -70,6 +69,10 @@ class Release < ApplicationRecord ...@@ -70,6 +69,10 @@ class Release < ApplicationRecord
released_at.present? && released_at > Time.zone.now released_at.present? && released_at > Time.zone.now
end end
def historical_release?
released_at.present? && released_at < created_at
end
def name def name
self.read_attribute(:name) || tag self.read_attribute(:name) || tag
end end
...@@ -98,10 +101,6 @@ class Release < ApplicationRecord ...@@ -98,10 +101,6 @@ class Release < ApplicationRecord
end end
end end
def create_evidence!
CreateEvidenceWorker.perform_async(self.id)
end
def notify_new_release def notify_new_release
NewReleaseWorker.perform_async(id) NewReleaseWorker.perform_async(id)
end end
......
---
title: Collect release evidence at release timestamp
merge_request: 23697
author:
type: added
...@@ -67,6 +67,7 @@ module API ...@@ -67,6 +67,7 @@ module API
if result[:status] == :success if result[:status] == :success
log_release_created_audit_event(result[:release]) log_release_created_audit_event(result[:release])
create_evidence!
present result[:release], with: Entities::Release, current_user: current_user present result[:release], with: Entities::Release, current_user: current_user
else else
...@@ -164,6 +165,16 @@ module API ...@@ -164,6 +165,16 @@ module API
def log_release_milestones_updated_audit_event def log_release_milestones_updated_audit_event
# This is a separate method so that EE can extend its behaviour # This is a separate method so that EE can extend its behaviour
end end
def create_evidence!
return if release.historical_release?
if release.upcoming_release?
CreateEvidenceWorker.perform_at(release.released_at, release.id)
else
CreateEvidenceWorker.perform_async(release.id)
end
end
end end
end end
end end
......
...@@ -53,12 +53,6 @@ RSpec.describe Release do ...@@ -53,12 +53,6 @@ RSpec.describe Release do
end end
end end
describe 'callbacks' do
it 'creates a new Evidence object on after_commit', :sidekiq_inline do
expect { release }.to change(Evidence, :count).by(1)
end
end
describe '#assets_count' do describe '#assets_count' do
subject { release.assets_count } subject { release.assets_count }
......
...@@ -9,6 +9,7 @@ describe API::Releases do ...@@ -9,6 +9,7 @@ describe API::Releases do
let(:guest) { create(:user) } let(:guest) { create(:user) }
let(:non_project_member) { create(:user) } let(:non_project_member) { create(:user) }
let(:commit) { create(:commit, project: project) } let(:commit) { create(:commit, project: project) }
let(:last_release) { project.releases.last }
before do before do
project.add_maintainer(maintainer) project.add_maintainer(maintainer)
...@@ -709,6 +710,109 @@ describe API::Releases do ...@@ -709,6 +710,109 @@ describe API::Releases do
expect(response).to have_gitlab_http_status(:conflict) expect(response).to have_gitlab_http_status(:conflict)
end end
end end
context 'Evidence collection' do
let(:params) do
{
name: 'New release',
tag_name: 'v0.1',
description: 'Super nice release',
released_at: released_at
}.compact
end
around do |example|
Timecop.freeze { example.run }
end
subject do
post api("/projects/#{project.id}/releases", maintainer), params: params
end
context 'historical release' do
let(:released_at) { 3.weeks.ago }
it 'does not execute CreateEvidenceWorker' do
expect { subject }.not_to change(CreateEvidenceWorker.jobs, :size)
end
it 'does not create an Evidence object', :sidekiq_inline do
expect { subject }.not_to change(Evidence, :count)
end
it 'is a historical release' do
subject
expect(last_release.historical_release?).to be_truthy
end
it 'is not an upcoming release' do
subject
expect(last_release.upcoming_release?).to be_falsy
end
end
context 'immediate release' do
let(:released_at) { nil }
it 'sets `released_at` to the current dttm' do
subject
expect(last_release.updated_at).to be_like_time(Time.now)
end
it 'queues CreateEvidenceWorker' do
expect { subject }.to change(CreateEvidenceWorker.jobs, :size).by(1)
end
it 'creates Evidence', :sidekiq_inline do
expect { subject }.to change(Evidence, :count).by(1)
end
it 'is not a historical release' do
subject
expect(last_release.historical_release?).to be_falsy
end
it 'is not an upcoming release' do
subject
expect(last_release.upcoming_release?).to be_falsy
end
end
context 'upcoming release' do
let(:released_at) { 1.day.from_now }
it 'queues CreateEvidenceWorker' do
expect { subject }.to change(CreateEvidenceWorker.jobs, :size).by(1)
end
it 'queues CreateEvidenceWorker at the released_at timestamp' do
subject
expect(CreateEvidenceWorker.jobs.last['at']).to eq(released_at.to_i)
end
it 'creates Evidence', :sidekiq_inline do
expect { subject }.to change(Evidence, :count).by(1)
end
it 'is not a historical release' do
subject
expect(last_release.historical_release?).to be_falsy
end
it 'is an upcoming release' do
subject
expect(last_release.upcoming_release?).to be_truthy
end
end
end
end end
describe 'PUT /projects/:id/releases/:tag_name' do describe 'PUT /projects/:id/releases/:tag_name' do
......
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