Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new Gitlab runner API support #677

Merged
merged 3 commits into from
Jun 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions lib/gitlab/client/runners.rb
Original file line number Diff line number Diff line change
Expand Up @@ -207,5 +207,72 @@ def verify_auth_registered_runner(token)
body = { token: token }
post('/runners/verify', body: body)
end

# Creates a new group runner with the new Gitlab approach (v16.0+) and returns the id/token information
# https://docs.gitlab.com/ee/api/users.html#create-a-runner
# You must use an access token with the create_runner scope
#
# @example
# Gitlab.create_group_runner(9, tag_list: ['one', 'two'])
# Gitlab.create_group_runner(9, paused: false, description: 'A note', run_untagged: true)
#
# @param [String] group(required) Group ID.
# @param [Hash] options A customizable set of options.
# @return <Gitlab::ObjectifiedHash> Response against runner registration
def create_group_runner(group, options = {})
create_runner({ runner_type: 'group_type', group_id: group }.merge(options))
end

# Creates a new project runner with the new Gitlab approach (v16.0+) and returns the id/token information
# https://docs.gitlab.com/ee/api/users.html#create-a-runner
# You must use an access token with the create_runner scope
#
# @example
# Gitlab.create_project_runner(12, tag_list: ['one', 'two'])
# Gitlab.create_project_runner(12, paused: false, description: 'A note', run_untagged: true)
#
# @param [String] project(required) Project ID.
# @param [Hash] options A customizable set of options.
# @return <Gitlab::ObjectifiedHash> Response against runner registration
def create_project_runner(project, options = {})
create_runner({ runner_type: 'project_type', project_id: project }.merge(options))
end

# Creates a new instance runner with the new Gitlab approach (v16.0+) and returns the id/token information
# You must be an administrator of the GitLab instance
# You must use an access token with the create_runner scope
# https://docs.gitlab.com/ee/api/users.html#create-a-runner
#
# @example
# Gitlab.create_instance_runner(tag_list: ['one', 'two'])
# Gitlab.create_instance_runner(paused: false, description: 'A note', run_untagged: true)
#
# @param [String] group(required) Project ID.
# @param [Hash] options A customizable set of options.
# @return <Gitlab::ObjectifiedHash> Response against runner registration
def create_instance_runner(options = {})
create_runner({ runner_type: 'instance_type' }.merge(options))
end

private

# Creates a runner linked to the current user.
# You must use an access token with the create_runner scope
# https://docs.gitlab.com/ee/api/users.html#create-a-runner
#
# @param [Hash] options(required) A customizable set of options.
# @option options [String] :description(optional) Runner description.
# @option options [Hash] :info(optional) Runner metadata.
# @option options [Boolean] :paused(optional) Whether the Runner ignores new jobs.
# @option options [Boolean] :locked(optional) Whether the Runner should be locked for current project.
# @option options [Boolean] :run_untagged(optional) Whether the Runner should handle untagged jobs.
# @option options [Array<String>] :tag_list(optional) List of Runner tags.
# @option options [String] :access_level(optional) Access level of the runner; not_protected or ref_protected.
# @option options [Integer] :maximum_timeout(optional) Maximum timeout set when this Runner will handle the job.
# @option options [String] :maintenance_note(optional) Free-form maintenance notes for the runner (1024 characters).
# @return <Gitlab::ObjectifiedHash> Response against runner registration {"id": 1, "token": foo "token_expires_at": null}
def create_runner(options)
post('/user/runners', body: options)
end
end
end
5 changes: 5 additions & 0 deletions spec/fixtures/create_group_runner_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"id": 12345,
"token": "glrt-kyahzxLaj4Dc1jQf4xjX",
"token_expires_at": null
}
5 changes: 5 additions & 0 deletions spec/fixtures/create_instance_runner_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"id": 9171,
"token": "glrt-kyahzxLaj4Dc1jQf4xjX",
"token_expires_at": null
}
5 changes: 5 additions & 0 deletions spec/fixtures/create_project_runner_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"id": 56789,
"token": "glrt-kyahzxLaj4Dc1jQf4xjX",
"token_expires_at": null
}
32 changes: 32 additions & 0 deletions spec/gitlab/client/runners_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,38 @@
end
end

describe 'create_runner' do
it 'creates the correct group runner call' do
stub_post('/user/runners', 'create_group_runner_response.json').with(body: { runner_type: 'group_type', group_id: 12_345, tag_list: %w[foo bar], description: 'desc', locked: false })

@runner_response = Gitlab.create_group_runner(12_345, tag_list: %w[foo bar], description: 'desc', locked: false)

expect(a_post('/user/runners').with(body: { runner_type: 'group_type', group_id: 12_345, tag_list: %w[foo bar], description: 'desc', locked: false })).to have_been_made

expect(@runner_response.to_h).to eq({ 'id' => 12_345, 'token' => 'glrt-kyahzxLaj4Dc1jQf4xjX', 'token_expires_at' => nil })
end

it 'creates the correct project runner call' do
stub_post('/user/runners', 'create_project_runner_response.json').with(body: { runner_type: 'project_type', project_id: 56_789, tag_list: %w[foo bar], paused: true, maximum_timeout: 60 })

@runner_response = Gitlab.create_project_runner(56_789, tag_list: %w[foo bar], paused: true, maximum_timeout: 60)

expect(a_post('/user/runners').with(body: { runner_type: 'project_type', project_id: 56_789, tag_list: %w[foo bar], paused: true, maximum_timeout: 60 })).to have_been_made

expect(@runner_response.to_h).to eq({ 'id' => 56_789, 'token' => 'glrt-kyahzxLaj4Dc1jQf4xjX', 'token_expires_at' => nil })
end

it 'creates the correct instance runner call' do
stub_post('/user/runners', 'create_instance_runner_response.json').with(body: { runner_type: 'instance_type', tag_list: %w[foo bar], maintenance_note: 'note', run_untagged: false, access_level: 'ref_protected' })

@runner_response = Gitlab.create_instance_runner(tag_list: %w[foo bar], maintenance_note: 'note', run_untagged: false, access_level: 'ref_protected')

expect(a_post('/user/runners').with(body: { runner_type: 'instance_type', tag_list: %w[foo bar], maintenance_note: 'note', run_untagged: false, access_level: 'ref_protected' })).to have_been_made

expect(@runner_response.to_h).to eq({ 'id' => 9171, 'token' => 'glrt-kyahzxLaj4Dc1jQf4xjX', 'token_expires_at' => nil })
end
end

describe '.delete_registered_runner' do
before do
stub_delete('/runners', 'empty').with(body: { token: '6337ff461c94fd3fa32ba3b1ff4125' })
Expand Down
Loading