Commit b2e4a795 authored by Sean McGivern's avatar Sean McGivern

Merge branch 'gsemet/gitlab-ce-gsemet-master-patch-33258' into 'master'

Multiple pipeline support for Build status

See merge request gitlab-org/gitlab-ce!30828
parents 69adeb37 41b8dca8
...@@ -1481,12 +1481,20 @@ class Project < ApplicationRecord ...@@ -1481,12 +1481,20 @@ class Project < ApplicationRecord
!namespace.share_with_group_lock !namespace.share_with_group_lock
end end
def pipeline_for(ref, sha = nil) def pipeline_for(ref, sha = nil, id = nil)
if id.present?
pipelines_for(ref, sha).find_by(id: id)
else
pipelines_for(ref, sha).take
end
end
def pipelines_for(ref, sha = nil)
sha ||= commit(ref).try(:sha) sha ||= commit(ref).try(:sha)
return unless sha return unless sha
ci_pipelines.order(id: :desc).find_by(sha: sha, ref: ref) ci_pipelines.order(id: :desc).where(sha: sha, ref: ref)
end end
def latest_successful_pipeline_for_default_branch def latest_successful_pipeline_for_default_branch
......
---
title: Multiple pipeline support for Commit status
merge_request: 30828
author: Gaetan Semet
type: changed
...@@ -582,6 +582,7 @@ POST /projects/:id/statuses/:sha ...@@ -582,6 +582,7 @@ POST /projects/:id/statuses/:sha
| `target_url` | string | no | The target URL to associate with this status | `target_url` | string | no | The target URL to associate with this status
| `description` | string | no | The short description of the status | `description` | string | no | The short description of the status
| `coverage` | float | no | The total code coverage | `coverage` | float | no | The total code coverage
| `pipeline_id` | integer | no | The ID of the pipeline to set status. Use in case of several pipeline on same SHA.
```bash ```bash
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/17/statuses/18f3e63d05582537db6d183d9d557be09e1f90c8?state=success" curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/17/statuses/18f3e63d05582537db6d183d9d557be09e1f90c8?state=success"
......
...@@ -52,6 +52,7 @@ module API ...@@ -52,6 +52,7 @@ module API
optional :name, type: String, desc: 'A string label to differentiate this status from the status of other systems. Default: "default"' optional :name, type: String, desc: 'A string label to differentiate this status from the status of other systems. Default: "default"'
optional :context, type: String, desc: 'A string label to differentiate this status from the status of other systems. Default: "default"' optional :context, type: String, desc: 'A string label to differentiate this status from the status of other systems. Default: "default"'
optional :coverage, type: Float, desc: 'The total code coverage' optional :coverage, type: Float, desc: 'The total code coverage'
optional :pipeline_id, type: Integer, desc: 'An existing pipeline ID, when multiple pipelines on the same commit SHA have been triggered'
end end
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
post ':id/statuses/:sha' do post ':id/statuses/:sha' do
...@@ -73,7 +74,8 @@ module API ...@@ -73,7 +74,8 @@ module API
name = params[:name] || params[:context] || 'default' name = params[:name] || params[:context] || 'default'
pipeline = @project.pipeline_for(ref, commit.sha) pipeline = @project.pipeline_for(ref, commit.sha, params[:pipeline_id])
unless pipeline unless pipeline
pipeline = @project.ci_pipelines.create!( pipeline = @project.ci_pipelines.create!(
source: :external, source: :external,
......
...@@ -1190,6 +1190,14 @@ describe Project do ...@@ -1190,6 +1190,14 @@ describe Project do
subject { project.pipeline_for('master', pipeline.sha) } subject { project.pipeline_for('master', pipeline.sha) }
it_behaves_like 'giving the correct pipeline' it_behaves_like 'giving the correct pipeline'
context 'with supplied id' do
let!(:other_pipeline) { create_pipeline(project) }
subject { project.pipeline_for('master', pipeline.sha, other_pipeline.id) }
it { is_expected.to eq(other_pipeline) }
end
end end
context 'with implicit sha' do context 'with implicit sha' do
...@@ -1199,6 +1207,18 @@ describe Project do ...@@ -1199,6 +1207,18 @@ describe Project do
end end
end end
describe '#pipelines_for' do
let(:project) { create(:project, :repository) }
let!(:pipeline) { create_pipeline(project) }
let!(:other_pipeline) { create_pipeline(project) }
context 'with implicit sha' do
subject { project.pipelines_for('master') }
it { is_expected.to contain_exactly(pipeline, other_pipeline) }
end
end
describe '#builds_enabled' do describe '#builds_enabled' do
let(:project) { create(:project) } let(:project) { create(:project) }
......
...@@ -8,10 +8,6 @@ describe API::CommitStatuses do ...@@ -8,10 +8,6 @@ describe API::CommitStatuses do
let(:developer) { create_user(:developer) } let(:developer) { create_user(:developer) }
let(:sha) { commit.id } let(:sha) { commit.id }
let(:commit_status) do
create(:commit_status, status: :pending, pipeline: pipeline)
end
describe "GET /projects/:id/repository/commits/:sha/statuses" do describe "GET /projects/:id/repository/commits/:sha/statuses" do
let(:get_url) { "/projects/#{project.id}/repository/commits/#{sha}/statuses" } let(:get_url) { "/projects/#{project.id}/repository/commits/#{sha}/statuses" }
...@@ -239,6 +235,26 @@ describe API::CommitStatuses do ...@@ -239,6 +235,26 @@ describe API::CommitStatuses do
expect(CommitStatus.count).to eq 1 expect(CommitStatus.count).to eq 1
end end
end end
context 'when a pipeline id is specified' do
let!(:first_pipeline) { project.ci_pipelines.create(source: :push, sha: commit.id, ref: 'master', status: 'created') }
let!(:other_pipeline) { project.ci_pipelines.create(source: :push, sha: commit.id, ref: 'master', status: 'created') }
subject do
post api(post_url, developer), params: {
pipeline_id: other_pipeline.id,
state: 'success',
ref: 'master'
}
end
it 'update the correct pipeline' do
subject
expect(first_pipeline.reload.status).to eq('created')
expect(other_pipeline.reload.status).to eq('success')
end
end
end end
context 'when retrying a commit status' do context 'when retrying a commit status' 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