Fix an error where we were unable to create a CommitStatus for running state
This commit is contained in:
parent
45afdbef0d
commit
46b83f0605
3 changed files with 58 additions and 36 deletions
|
@ -121,6 +121,7 @@ v 8.12.0 (unreleased)
|
||||||
- Add notification_settings API calls !5632 (mahcsig)
|
- Add notification_settings API calls !5632 (mahcsig)
|
||||||
|
|
||||||
v 8.11.6 (unreleased)
|
v 8.11.6 (unreleased)
|
||||||
|
- Fix an error where we were unable to create a CommitStatus for running state
|
||||||
|
|
||||||
v 8.11.5
|
v 8.11.5
|
||||||
- Optimize branch lookups and force a repository reload for Repository#find_branch. !6087
|
- Optimize branch lookups and force a repository reload for Repository#find_branch. !6087
|
||||||
|
|
|
@ -37,7 +37,7 @@ module API
|
||||||
# id (required) - The ID of a project
|
# id (required) - The ID of a project
|
||||||
# sha (required) - The commit hash
|
# sha (required) - The commit hash
|
||||||
# ref (optional) - The ref
|
# ref (optional) - The ref
|
||||||
# state (required) - The state of the status. Can be: pending, running, success, error or failure
|
# state (required) - The state of the status. Can be: pending, running, success, failed or canceled
|
||||||
# target_url (optional) - The target URL to associate with this status
|
# target_url (optional) - The target URL to associate with this status
|
||||||
# description (optional) - A short description of the status
|
# description (optional) - A short description of the status
|
||||||
# name or context (optional) - A string label to differentiate this status from the status of other systems. Default: "default"
|
# name or context (optional) - A string label to differentiate this status from the status of other systems. Default: "default"
|
||||||
|
@ -46,7 +46,7 @@ module API
|
||||||
post ':id/statuses/:sha' do
|
post ':id/statuses/:sha' do
|
||||||
authorize! :create_commit_status, user_project
|
authorize! :create_commit_status, user_project
|
||||||
required_attributes! [:state]
|
required_attributes! [:state]
|
||||||
attrs = attributes_for_keys [:ref, :target_url, :description, :context, :name]
|
attrs = attributes_for_keys [:target_url, :description]
|
||||||
commit = @project.commit(params[:sha])
|
commit = @project.commit(params[:sha])
|
||||||
not_found! 'Commit' unless commit
|
not_found! 'Commit' unless commit
|
||||||
|
|
||||||
|
@ -58,36 +58,38 @@ module API
|
||||||
# the first found branch on that commit
|
# the first found branch on that commit
|
||||||
|
|
||||||
ref = params[:ref]
|
ref = params[:ref]
|
||||||
unless ref
|
ref ||= @project.repository.branch_names_contains(commit.sha).first
|
||||||
branches = @project.repository.branch_names_contains(commit.sha)
|
not_found! 'References for commit' unless ref
|
||||||
not_found! 'References for commit' if branches.none?
|
|
||||||
ref = branches.first
|
name = params[:name] || params[:context] || 'default'
|
||||||
end
|
|
||||||
|
|
||||||
pipeline = @project.ensure_pipeline(ref, commit.sha, current_user)
|
pipeline = @project.ensure_pipeline(ref, commit.sha, current_user)
|
||||||
|
|
||||||
name = params[:name] || params[:context]
|
status = GenericCommitStatus.running_or_pending.find_or_initialize_by(
|
||||||
status = GenericCommitStatus.running_or_pending.find_by(pipeline: pipeline, name: name, ref: params[:ref])
|
project: @project, pipeline: pipeline,
|
||||||
status ||= GenericCommitStatus.new(project: @project, pipeline: pipeline, user: current_user)
|
user: current_user, name: name, ref: ref)
|
||||||
status.update(attrs)
|
status.attributes = attrs
|
||||||
|
|
||||||
case params[:state].to_s
|
begin
|
||||||
when 'running'
|
case params[:state].to_s
|
||||||
status.run
|
when 'pending'
|
||||||
when 'success'
|
status.enqueue!
|
||||||
status.success
|
when 'running'
|
||||||
when 'failed'
|
status.enqueue
|
||||||
status.drop
|
status.run!
|
||||||
when 'canceled'
|
when 'success'
|
||||||
status.cancel
|
status.success!
|
||||||
else
|
when 'failed'
|
||||||
status.status = params[:state].to_s
|
status.drop!
|
||||||
end
|
when 'canceled'
|
||||||
|
status.cancel!
|
||||||
|
else
|
||||||
|
render_api_error!('invalid state', 400)
|
||||||
|
end
|
||||||
|
|
||||||
if status.save
|
|
||||||
present status, with: Entities::CommitStatus
|
present status, with: Entities::CommitStatus
|
||||||
else
|
rescue StateMachines::InvalidTransition => e
|
||||||
render_validation_error!(status)
|
render_api_error!(e.message, 400)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -117,17 +117,36 @@ describe API::CommitStatuses, api: true do
|
||||||
let(:post_url) { "/projects/#{project.id}/statuses/#{sha}" }
|
let(:post_url) { "/projects/#{project.id}/statuses/#{sha}" }
|
||||||
|
|
||||||
context 'developer user' do
|
context 'developer user' do
|
||||||
context 'only required parameters' do
|
%w[pending running success failed canceled].each do |status|
|
||||||
before { post api(post_url, developer), state: 'success' }
|
context "for #{status}" do
|
||||||
|
context 'uses only required parameters' do
|
||||||
|
it 'creates commit status' do
|
||||||
|
post api(post_url, developer), state: status
|
||||||
|
|
||||||
it 'creates commit status' do
|
expect(response).to have_http_status(201)
|
||||||
expect(response).to have_http_status(201)
|
expect(json_response['sha']).to eq(commit.id)
|
||||||
expect(json_response['sha']).to eq(commit.id)
|
expect(json_response['status']).to eq(status)
|
||||||
expect(json_response['status']).to eq('success')
|
expect(json_response['name']).to eq('default')
|
||||||
expect(json_response['name']).to eq('default')
|
expect(json_response['ref']).not_to be_empty
|
||||||
expect(json_response['ref']).to be_nil
|
expect(json_response['target_url']).to be_nil
|
||||||
expect(json_response['target_url']).to be_nil
|
expect(json_response['description']).to be_nil
|
||||||
expect(json_response['description']).to be_nil
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'transitions status from pending' do
|
||||||
|
before do
|
||||||
|
post api(post_url, developer), state: 'pending'
|
||||||
|
end
|
||||||
|
|
||||||
|
%w[running success failed canceled].each do |status|
|
||||||
|
it "to #{status}" do
|
||||||
|
expect { post api(post_url, developer), state: status }.not_to change { CommitStatus.count }
|
||||||
|
|
||||||
|
expect(response).to have_http_status(201)
|
||||||
|
expect(json_response['status']).to eq(status)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue