Commit 26f577df authored by Steve Azzopardi's avatar Steve Azzopardi

Add terminal path to job API response

closes #51117
parent c6d315b4
...@@ -36,6 +36,10 @@ class BuildDetailsEntity < JobEntity ...@@ -36,6 +36,10 @@ class BuildDetailsEntity < JobEntity
erase_project_job_path(project, build) erase_project_job_path(project, build)
end end
expose :terminal_path, if: -> (*) { can_create_build_terminal? } do |build|
terminal_project_job_path(project, build)
end
expose :merge_request, if: -> (*) { can?(current_user, :read_merge_request, build.merge_request) } do expose :merge_request, if: -> (*) { can?(current_user, :read_merge_request, build.merge_request) } do
expose :iid do |build| expose :iid do |build|
build.merge_request.iid build.merge_request.iid
...@@ -69,4 +73,8 @@ class BuildDetailsEntity < JobEntity ...@@ -69,4 +73,8 @@ class BuildDetailsEntity < JobEntity
def project def project
build.project build.project
end end
def can_create_build_terminal?
can?(current_user, :create_build_terminal, build) && build.has_terminal?
end
end end
---
title: Add terminal_path to job API response
merge_request: 21537
author:
type: other
...@@ -135,7 +135,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do ...@@ -135,7 +135,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
end end
end end
context 'when requesting JSON with failed job' do context 'when requesting JSON' do
let(:merge_request) { create(:merge_request, source_project: project) } let(:merge_request) { create(:merge_request, source_project: project) }
before do before do
...@@ -147,28 +147,20 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do ...@@ -147,28 +147,20 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
get_show(id: job.id, format: :json) get_show(id: job.id, format: :json)
end end
context 'when job failed' do
it 'exposes needed information' do it 'exposes needed information' do
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details') expect(response).to match_response_schema('job/job_details')
expect(json_response['raw_path']).to match(%r{jobs/\d+/raw\z}) expect(json_response['raw_path']).to match(%r{jobs/\d+/raw\z})
expect(json_response['merge_request']['path']).to match(%r{merge_requests/\d+\z}) expect(json_response.dig('merge_request', 'path')).to match(%r{merge_requests/\d+\z})
expect(json_response['new_issue_path']).to include('/issues/new') expect(json_response['new_issue_path']).to include('/issues/new')
end end
end end
context 'when request JSON for successful job' do context 'when job has artifacts' do
let(:merge_request) { create(:merge_request, source_project: project) } context 'with not expiry date' do
let(:job) { create(:ci_build, :success, :artifacts, pipeline: pipeline) } let(:job) { create(:ci_build, :success, :artifacts, pipeline: pipeline) }
before do
project.add_developer(user)
sign_in(user)
allow_any_instance_of(Ci::Build).to receive(:merge_request).and_return(merge_request)
get_show(id: job.id, format: :json)
end
it 'exposes needed information' do it 'exposes needed information' do
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details') expect(response).to match_response_schema('job/job_details')
...@@ -176,23 +168,12 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do ...@@ -176,23 +168,12 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
expect(json_response['artifact']['browse_path']).to match(%r{artifacts/browse}) expect(json_response['artifact']['browse_path']).to match(%r{artifacts/browse})
expect(json_response['artifact']).not_to have_key(:expired) expect(json_response['artifact']).not_to have_key(:expired)
expect(json_response['artifact']).not_to have_key(:expired_at) expect(json_response['artifact']).not_to have_key(:expired_at)
expect(json_response['raw_path']).to match(%r{jobs/\d+/raw\z}) end
expect(json_response.dig('merge_request', 'path')).to match(%r{merge_requests/\d+\z})
end end
context 'when request JSON for successful job with expired artifacts' do context 'with expiry date' do
let(:merge_request) { create(:merge_request, source_project: project) }
let(:job) { create(:ci_build, :success, :artifacts, :expired, pipeline: pipeline) } let(:job) { create(:ci_build, :success, :artifacts, :expired, pipeline: pipeline) }
before do
project.add_developer(user)
sign_in(user)
allow_any_instance_of(Ci::Build).to receive(:merge_request).and_return(merge_request)
get_show(id: job.id, format: :json)
end
it 'exposes needed information' do it 'exposes needed information' do
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details') expect(response).to match_response_schema('job/job_details')
...@@ -200,8 +181,17 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do ...@@ -200,8 +181,17 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
expect(json_response['artifact']).not_to have_key(:browse_path) expect(json_response['artifact']).not_to have_key(:browse_path)
expect(json_response['artifact']['expired']).to eq(true) expect(json_response['artifact']['expired']).to eq(true)
expect(json_response['artifact']['expire_at']).not_to be_empty expect(json_response['artifact']['expire_at']).not_to be_empty
expect(json_response['raw_path']).to match(%r{jobs/\d+/raw\z}) end
expect(json_response.dig('merge_request', 'path')).to match(%r{merge_requests/\d+\z}) end
end
context 'when job has terminal' do
let(:job) { create(:ci_build, :running, :with_runner_session, pipeline: pipeline) }
it 'exposes the terminal path' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details')
expect(json_response['terminal_path']).to match(%r{/terminal})
end end
end end
end end
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
"allOf": [{ "$ref": "job.json" }], "allOf": [{ "$ref": "job.json" }],
"description": "An extension of job.json with more detailed information", "description": "An extension of job.json with more detailed information",
"properties": { "properties": {
"artifact": { "$ref": "artifact.json" } "artifact": { "$ref": "artifact.json" },
"terminal_path": { "type": "string" }
} }
} }
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