Commit c2dde812 authored by Dylan Griffith's avatar Dylan Griffith

Ensure ci_pipelines.iid set before transaction in commit status API

Prior to this we were using `create!` which triggered the
`ensure_project_iid!` in a callback. This causes a
`CrossDatabaseModificationAcrossUnsupportedTablesError`. To avoid this
we will create the `iid` before saving. This is consistent with all
other places we create pipelines.

This change still doesn't allow us to remove
`spec/requests/api/commit_statuses_spec.rb` from the allowlist as there
are other calls to `project.ci_pipelines.create!` in this file.

We need a more holistic solution for that which is being discussed in
https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75316 .
parent b18bfee3
......@@ -78,13 +78,16 @@ module API
name = params[:name] || params[:context] || 'default'
pipeline ||= user_project.ci_pipelines.create!(
pipeline ||= user_project.ci_pipelines.build(
source: :external,
sha: commit.sha,
ref: ref,
user: current_user,
protected: user_project.protected_for?(ref))
pipeline.ensure_project_iid!
pipeline.save!
authorize! :update_pipeline, pipeline
status = GenericCommitStatus.running_or_pending.find_or_initialize_by(
......
......@@ -131,7 +131,7 @@ RSpec.describe API::CommitStatuses do
%w[pending running success failed canceled].each do |status|
context "for #{status}" do
context 'when pipeline for sha does not exists' do
it 'creates commit status' do
it 'creates commit status and sets pipeline iid' do
post api(post_url, developer), params: { state: status }
expect(response).to have_gitlab_http_status(:created)
......@@ -145,6 +145,8 @@ RSpec.describe API::CommitStatuses do
if status == 'failed'
expect(CommitStatus.find(json_response['id'])).to be_api_failure
end
expect(::Ci::Pipeline.last.iid).not_to be_nil
end
end
end
......
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