Commit 6ef27f77 authored by Grzegorz Bizon's avatar Grzegorz Bizon Committed by Filipa Lacerda

Expose build environment latest deployable name and path

parent a96b9ebf
...@@ -22,8 +22,18 @@ class DeploymentEntity < Grape::Entity ...@@ -22,8 +22,18 @@ class DeploymentEntity < Grape::Entity
expose :last? expose :last?
expose :user, using: UserEntity expose :user, using: UserEntity
expose :deployable do |deployment, opts|
deployment.deployable.yield_self do |deployable|
if include_details?
JobEntity.represent(deployable, opts)
elsif can_read_deployables?
{ name: deployable.name,
build_path: project_job_path(deployable.project, deployable) }
end
end
end
expose :commit, using: CommitEntity, if: -> (*) { include_details? } expose :commit, using: CommitEntity, if: -> (*) { include_details? }
expose :deployable, using: JobEntity, if: -> (*) { include_details? }
expose :manual_actions, using: JobEntity, if: -> (*) { include_details? && can_create_deployment? } expose :manual_actions, using: JobEntity, if: -> (*) { include_details? && can_create_deployment? }
expose :scheduled_actions, using: JobEntity, if: -> (*) { include_details? && can_create_deployment? } expose :scheduled_actions, using: JobEntity, if: -> (*) { include_details? && can_create_deployment? }
...@@ -36,4 +46,13 @@ class DeploymentEntity < Grape::Entity ...@@ -36,4 +46,13 @@ class DeploymentEntity < Grape::Entity
def can_create_deployment? def can_create_deployment?
can?(request.current_user, :create_deployment, request.project) can?(request.current_user, :create_deployment, request.project)
end end
def can_read_deployables?
##
# We intentionally do not check `:read_build, deployment.deployable`
# because it triggers a policy evaluation that involves multiple
# Gitaly calls that might not be cached.
#
can?(request.current_user, :read_build, request.project)
end
end end
...@@ -31,7 +31,11 @@ ...@@ -31,7 +31,11 @@
"last_deployment": { "last_deployment": {
"oneOf": [ "oneOf": [
{ "type": "null" }, { "type": "null" },
{ "$ref": "deployment.json" } { "$ref": "deployment.json" },
{
"name": { "type": "string" },
"build_path": { "type": "string" }
}
] ]
} }
}, },
......
...@@ -142,7 +142,7 @@ describe BuildDetailsEntity do ...@@ -142,7 +142,7 @@ describe BuildDetailsEntity do
response = subject.with_indifferent_access response = subject.with_indifferent_access
response.dig(:deployment_status, :environment, :last_deployment).tap do |deployment| response.dig(:deployment_status, :environment, :last_deployment).tap do |deployment|
expect(deployment).not_to include(:commit, :deployable, :manual_actions, :scheduled_actions) expect(deployment).not_to include(:commit, :manual_actions, :scheduled_actions)
end end
end end
end end
......
...@@ -93,13 +93,22 @@ describe DeploymentEntity do ...@@ -93,13 +93,22 @@ describe DeploymentEntity do
end end
context 'when deployment details serialization was disabled' do context 'when deployment details serialization was disabled' do
include Gitlab::Routing
let(:entity) do let(:entity) do
described_class.new(deployment, request: request, deployment_details: false) described_class.new(deployment, request: request, deployment_details: false)
end end
it 'does not serialize deployment details' do it 'does not serialize deployment details' do
expect(subject.with_indifferent_access) expect(subject.with_indifferent_access)
.not_to include(:commit, :deployable, :manual_actions, :scheduled_actions) .not_to include(:commit, :manual_actions, :scheduled_actions)
end
it 'only exposes deployable name and path' do
project_job_path(project, deployment.deployable).tap do |path|
expect(subject.fetch(:deployable))
.to eq('name' => 'test', 'build_path' => path)
end
end end
end 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