Commit 1b388c79 authored by Steve Azzopardi's avatar Steve Azzopardi

Add trigger information for job API

Create new entity called TriggerVariablesEnitity for trigger variables,
to aid reuseablity in the future.

Update JSON schema to include trigger information in the response.

Refactor rspec tests a bit to reduce duplication and for the `context`
to make sense.

closes https://gitlab.com/gitlab-org/gitlab-ce/issues/50989
parent f87809f7
...@@ -40,6 +40,7 @@ module Ci ...@@ -40,6 +40,7 @@ module Ci
delegate :url, to: :runner_session, prefix: true, allow_nil: true delegate :url, to: :runner_session, prefix: true, allow_nil: true
delegate :terminal_specification, to: :runner_session, allow_nil: true delegate :terminal_specification, to: :runner_session, allow_nil: true
delegate :gitlab_deploy_token, to: :project delegate :gitlab_deploy_token, to: :project
delegate :trigger_short_token, to: :trigger_request, allow_nil: true
## ##
# The "environment" field for builds is a String, and is the unexpanded name! # The "environment" field for builds is a String, and is the unexpanded name!
......
...@@ -8,6 +8,8 @@ module Ci ...@@ -8,6 +8,8 @@ module Ci
belongs_to :pipeline, foreign_key: :commit_id belongs_to :pipeline, foreign_key: :commit_id
has_many :builds has_many :builds
delegate :short_token, to: :trigger, prefix: true, allow_nil: true
# We switched to Ci::PipelineVariable from Ci::TriggerRequest.variables. # We switched to Ci::PipelineVariable from Ci::TriggerRequest.variables.
# Ci::TriggerRequest doesn't save variables anymore. # Ci::TriggerRequest doesn't save variables anymore.
validates :variables, absence: true validates :variables, absence: true
......
...@@ -59,6 +59,12 @@ class BuildDetailsEntity < JobEntity ...@@ -59,6 +59,12 @@ class BuildDetailsEntity < JobEntity
raw_project_job_path(project, build) raw_project_job_path(project, build)
end end
expose :trigger, if: -> (*) { build.trigger_request } do
expose :trigger_short_token, as: :short_token
expose :trigger_variables, as: :variables, using: TriggerVariableEntity
end
private private
def build_failed_issue_options def build_failed_issue_options
......
# frozen_string_literal: true
class TriggerVariableEntity < Grape::Entity
include RequestAwareEntity
expose :key, :value, :public
end
---
title: Add trigger information in job API
merge_request: 21495
author:
type: other
...@@ -208,6 +208,51 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do ...@@ -208,6 +208,51 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
end end
end end
context 'when requesting JSON job is triggered' do
let!(:merge_request) { create(:merge_request, source_project: project) }
let(:trigger) { create(:ci_trigger, project: project) }
let(:trigger_request) { create(:ci_trigger_request, pipeline: pipeline, trigger: trigger) }
let(:job) { create(:ci_build, pipeline: pipeline, trigger_request: trigger_request) }
before do
project.add_developer(user)
sign_in(user)
allow_any_instance_of(Ci::Build).to receive(:merge_request).and_return(merge_request)
end
context 'with no variables' do
before do
get_show(id: job.id, format: :json)
end
it 'exposes trigger information' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details')
expect(json_response['trigger']['short_token']).to eq 'toke'
expect(json_response['trigger']['variables'].length).to eq 0
end
end
context 'with variables' do
before do
create(:ci_pipeline_variable, pipeline: pipeline, key: :TRIGGER_KEY_1, value: 'TRIGGER_VALUE_1')
get_show(id: job.id, format: :json)
end
it 'exposes trigger information and variables' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details')
expect(json_response['trigger']['short_token']).to eq 'toke'
expect(json_response['trigger']['variables'].length).to eq 1
expect(json_response['trigger']['variables'].first['key']).to eq "TRIGGER_KEY_1"
expect(json_response['trigger']['variables'].first['value']).to eq "TRIGGER_VALUE_1"
expect(json_response['trigger']['variables'].first['public']).to eq false
end
end
end
def get_show(**extra_params) def get_show(**extra_params)
params = { params = {
namespace_id: project.namespace.to_param, namespace_id: project.namespace.to_param,
......
{ {
"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" } "terminal_path": { "type": "string" },
"trigger": { "$ref": "trigger.json" }
} }
} }
{
"type": "object",
"required": [
"short_token",
"variables"
],
"properties": {
"short_token": { "type": "string" },
"variables": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"value",
"public"
],
"properties": {
"key": { "type": "string" },
"value": { "type": "string" },
"public": { "type": "boolean" }
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}
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