Merge branch '25045-add-variables-to-post-pipeline-api' into 'master'
Resolve "POST api/v4/projects/:id/pipeline should accept variables" Closes #25045 See merge request gitlab-org/gitlab-ce!19124
This commit is contained in:
commit
a93e34acc3
4 changed files with 71 additions and 2 deletions
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add variables to POST api/v4/projects/:id/pipeline
|
||||
merge_request: 19124
|
||||
author: Jacopo Beschi @jacopo-beschi
|
||||
type: added
|
|
@ -102,6 +102,7 @@ POST /projects/:id/pipeline
|
|||
|------------|---------|----------|---------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
|
||||
| `ref` | string | yes | Reference to commit |
|
||||
| `variables` | array | no | An array containing the variables available in the pipeline, matching the structure [{ 'key' => 'UPLOAD_TO_S3', 'value' => 'true' }] |
|
||||
|
||||
```
|
||||
curl --request POST --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v4/projects/1/pipeline?ref=master"
|
||||
|
|
|
@ -41,15 +41,20 @@ module API
|
|||
end
|
||||
params do
|
||||
requires :ref, type: String, desc: 'Reference'
|
||||
optional :variables, Array, desc: 'Array of variables available in the pipeline'
|
||||
end
|
||||
post ':id/pipeline' do
|
||||
Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42124')
|
||||
|
||||
authorize! :create_pipeline, user_project
|
||||
|
||||
pipeline_params = declared_params(include_missing: false)
|
||||
.merge(variables_attributes: params[:variables])
|
||||
.except(:variables)
|
||||
|
||||
new_pipeline = Ci::CreatePipelineService.new(user_project,
|
||||
current_user,
|
||||
declared_params(include_missing: false))
|
||||
pipeline_params)
|
||||
.execute(:api, ignore_skip_ci: true, save_on_errors: false)
|
||||
|
||||
if new_pipeline.persisted?
|
||||
|
|
|
@ -285,6 +285,15 @@ describe API::Pipelines do
|
|||
end
|
||||
|
||||
describe 'POST /projects/:id/pipeline ' do
|
||||
def expect_variables(variables, expected_variables)
|
||||
variables.each_with_index do |variable, index|
|
||||
expected_variable = expected_variables[index]
|
||||
|
||||
expect(variable.key).to eq(expected_variable['key'])
|
||||
expect(variable.value).to eq(expected_variable['value'])
|
||||
end
|
||||
end
|
||||
|
||||
context 'authorized user' do
|
||||
context 'with gitlab-ci.yml' do
|
||||
before do
|
||||
|
@ -294,13 +303,62 @@ describe API::Pipelines do
|
|||
it 'creates and returns a new pipeline' do
|
||||
expect do
|
||||
post api("/projects/#{project.id}/pipeline", user), ref: project.default_branch
|
||||
end.to change { Ci::Pipeline.count }.by(1)
|
||||
end.to change { project.pipelines.count }.by(1)
|
||||
|
||||
expect(response).to have_gitlab_http_status(201)
|
||||
expect(json_response).to be_a Hash
|
||||
expect(json_response['sha']).to eq project.commit.id
|
||||
end
|
||||
|
||||
context 'variables given' do
|
||||
let(:variables) { [{ 'key' => 'UPLOAD_TO_S3', 'value' => 'true' }] }
|
||||
|
||||
it 'creates and returns a new pipeline using the given variables' do
|
||||
expect do
|
||||
post api("/projects/#{project.id}/pipeline", user), ref: project.default_branch, variables: variables
|
||||
end.to change { project.pipelines.count }.by(1)
|
||||
expect_variables(project.pipelines.last.variables, variables)
|
||||
|
||||
expect(response).to have_gitlab_http_status(201)
|
||||
expect(json_response).to be_a Hash
|
||||
expect(json_response['sha']).to eq project.commit.id
|
||||
expect(json_response).not_to have_key('variables')
|
||||
end
|
||||
end
|
||||
|
||||
describe 'using variables conditions' do
|
||||
let(:variables) { [{ 'key' => 'STAGING', 'value' => 'true' }] }
|
||||
|
||||
before do
|
||||
config = YAML.dump(test: { script: 'test', only: { variables: ['$STAGING'] } })
|
||||
stub_ci_pipeline_yaml_file(config)
|
||||
end
|
||||
|
||||
it 'creates and returns a new pipeline using the given variables' do
|
||||
expect do
|
||||
post api("/projects/#{project.id}/pipeline", user), ref: project.default_branch, variables: variables
|
||||
end.to change { project.pipelines.count }.by(1)
|
||||
expect_variables(project.pipelines.last.variables, variables)
|
||||
|
||||
expect(response).to have_gitlab_http_status(201)
|
||||
expect(json_response).to be_a Hash
|
||||
expect(json_response['sha']).to eq project.commit.id
|
||||
expect(json_response).not_to have_key('variables')
|
||||
end
|
||||
|
||||
context 'condition unmatch' do
|
||||
let(:variables) { [{ 'key' => 'STAGING', 'value' => 'false' }] }
|
||||
|
||||
it "doesn't create a job" do
|
||||
expect do
|
||||
post api("/projects/#{project.id}/pipeline", user), ref: project.default_branch
|
||||
end.not_to change { project.pipelines.count }
|
||||
|
||||
expect(response).to have_gitlab_http_status(400)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it 'fails when using an invalid ref' do
|
||||
post api("/projects/#{project.id}/pipeline", user), ref: 'invalid_ref'
|
||||
|
||||
|
|
Loading…
Reference in a new issue