Added quality gate operations
This commit is contained in:
parent
85f07d2ec6
commit
1633a6a437
|
@ -9,6 +9,7 @@ module Sonarqube
|
||||||
include Groups
|
include Groups
|
||||||
include Permissions
|
include Permissions
|
||||||
include Projects
|
include Projects
|
||||||
|
include QualityGates
|
||||||
include Tokens
|
include Tokens
|
||||||
include Users
|
include Users
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Sonarqube::Client
|
||||||
|
# Defines methods related to tokens.
|
||||||
|
# @see https://SONAR_URL/web_api/api/qualitygates
|
||||||
|
module QualityGates
|
||||||
|
ALLOWED_OPERATORS = %w(LT GT)
|
||||||
|
ALLOWED_METRICS = %w(
|
||||||
|
coverage new_coverage duplicated_lines_density
|
||||||
|
new_duplicated_lines_density reliability_rating new_reliability_rating
|
||||||
|
maintainability_rating new_maintainability_rating
|
||||||
|
)
|
||||||
|
# Create new quality gate.
|
||||||
|
#
|
||||||
|
# @example
|
||||||
|
# Sonarqube.create_quality_gate('name_quality_gate')
|
||||||
|
#
|
||||||
|
# # Gracefully continue if gate already exists
|
||||||
|
# begin
|
||||||
|
# Sonarqube.create_quality_gate('name_quality_gate')
|
||||||
|
# rescue Sonarqube::Error::BadRequest => error
|
||||||
|
# raise unless error.message =~ /Name has already been taken/
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# @param [String] name (required) Quality Gate name.
|
||||||
|
# @return [Sonarqube::ObjectifiedHash]
|
||||||
|
def create_quality_gate(name)
|
||||||
|
raise ArgumentError, 'Missing required parameters' if name.nil?
|
||||||
|
|
||||||
|
body = { name: name }
|
||||||
|
post('/api/qualitygates/create', body: body)
|
||||||
|
end
|
||||||
|
alias quality_gate_create create_quality_gate
|
||||||
|
|
||||||
|
# Create condition for a quality gate.
|
||||||
|
#
|
||||||
|
# @example
|
||||||
|
# # Create a condition that errors when coverage is below 90%
|
||||||
|
# Sonarqube.create_quality_gate_condition('name_quality_gate', 'coverage', '90')
|
||||||
|
#
|
||||||
|
# # Create a condition that errors when code duplication is > 3%
|
||||||
|
# Sonarqube.create_quality_gate_condition('name_quality_gate', 'duplicated_lines_density',
|
||||||
|
# '3', 'GT')
|
||||||
|
#
|
||||||
|
# @param [String] name (required) Quality Gate name.
|
||||||
|
# @param [String] metric (required) SonarQube metric name.
|
||||||
|
# @param [String] error_threshold (required) Error threshold value
|
||||||
|
# @param [String] operator (required) Operator - LT for <; GT for >
|
||||||
|
# @return [Sonarqube::ObjectifiedHash]
|
||||||
|
def create_quality_gate_condition(name, metric, error_threshold, operator = 'LT')
|
||||||
|
raise ArgumentError, 'Missing required parameters' if name.nil? || metric.nil? || error_threshold.nil?
|
||||||
|
raise ArgumentError, "Operator must be in #{ALLOWED_OPERATORS.join(', ')}" unless ALLOWED_OPERATORS.include?(operator)
|
||||||
|
raise ArgumentError, "Metric must be in #{ALLOWED_METRICS.join(', ')}" unless ALLOWED_METRICS.include?(metric)
|
||||||
|
|
||||||
|
body = {
|
||||||
|
gateName: name,
|
||||||
|
metric: metric,
|
||||||
|
error: error_threshold,
|
||||||
|
op: operator
|
||||||
|
}
|
||||||
|
post('/api/qualitygates/create_condition', body: body)
|
||||||
|
end
|
||||||
|
alias quality_gate_condition_create create_quality_gate_condition
|
||||||
|
|
||||||
|
# Set the default quality gate.
|
||||||
|
#
|
||||||
|
# @example
|
||||||
|
# Sonarqube.set_default_quality_gate('name_quality_gate')
|
||||||
|
#
|
||||||
|
# @param [String] name (required) Quality Gate name.
|
||||||
|
# @return [Sonarqube::ObjectifiedHash]
|
||||||
|
def set_default_quality_gate(name)
|
||||||
|
raise ArgumentError, 'Missing required parameters' if name.nil?
|
||||||
|
|
||||||
|
body = { name: name }
|
||||||
|
post('/api/qualitygates/set_as_default', body: body)
|
||||||
|
end
|
||||||
|
alias default_quality_gate_set set_default_quality_gate
|
||||||
|
|
||||||
|
# List quality gates.
|
||||||
|
#
|
||||||
|
# @example
|
||||||
|
# Sonarqube.list_quality_gates
|
||||||
|
#
|
||||||
|
# @return [Sonarqube::ObjectifiedHash].
|
||||||
|
def list_quality_gates
|
||||||
|
get('/api/qualitygates/list')
|
||||||
|
end
|
||||||
|
alias quality_gates_list list_quality_gates
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"id": "AU-Tpxb--iU5OvuD2FLy",
|
||||||
|
"metric": "coverage",
|
||||||
|
"op": "LT",
|
||||||
|
"error": "90"
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"id": "AU-Tpxb--iU5OvuD2FLy",
|
||||||
|
"name": "name_quality_gate"
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
{
|
||||||
|
"qualitygates": [
|
||||||
|
{
|
||||||
|
"id": "AU-Tpxb--iU5OvuD2FLy",
|
||||||
|
"name": "Sonar way",
|
||||||
|
"isDefault": true,
|
||||||
|
"isBuiltIn": true,
|
||||||
|
"actions": {
|
||||||
|
"rename": false,
|
||||||
|
"setAsDefault": false,
|
||||||
|
"copy": true,
|
||||||
|
"associateProjects": false,
|
||||||
|
"delete": false,
|
||||||
|
"manageConditions": false,
|
||||||
|
"delegate": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "AU-Tpxb--iU5OvuD2FLz",
|
||||||
|
"name": "Sonar way - Without Coverage",
|
||||||
|
"isDefault": false,
|
||||||
|
"isBuiltIn": false,
|
||||||
|
"actions": {
|
||||||
|
"rename": true,
|
||||||
|
"setAsDefault": true,
|
||||||
|
"copy": true,
|
||||||
|
"associateProjects": true,
|
||||||
|
"delete": true,
|
||||||
|
"manageConditions": true,
|
||||||
|
"delegate": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": 8,
|
||||||
|
"actions": {
|
||||||
|
"create": true
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
{}
|
|
@ -0,0 +1,65 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Sonarqube::Client do
|
||||||
|
describe '.quality_gate_create' do
|
||||||
|
before do
|
||||||
|
stub_post('/api/qualitygates/create', 'quality_gates_create')
|
||||||
|
@quality_gate = Sonarqube.create_quality_gate('name_quality_gate')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'gets the correct resource' do
|
||||||
|
expect(a_post('/api/qualitygates/create')).to have_been_made
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns the quality gate ID' do
|
||||||
|
expect(@quality_gate).to be_a Sonarqube::ObjectifiedHash
|
||||||
|
expect(@quality_gate.id).to eq('AU-Tpxb--iU5OvuD2FLy')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '.quality_gate_condition_create' do
|
||||||
|
before do
|
||||||
|
stub_post('/api/qualitygates/create_condition', 'quality_gates_condition_create')
|
||||||
|
@condition = Sonarqube.create_quality_gate_condition('name_quality_gate',
|
||||||
|
'coverage', '90',
|
||||||
|
'LT')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'gets the correct resource' do
|
||||||
|
expect(a_post('/api/qualitygates/create_condition')).to have_been_made
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns the quality gate condition details' do
|
||||||
|
expect(@condition).to be_a Sonarqube::ObjectifiedHash
|
||||||
|
expect(@condition.metric).to eq('coverage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '.default_quality_gate_set' do
|
||||||
|
before do
|
||||||
|
stub_post('/api/qualitygates/set_as_default', 'quality_gates_set_default')
|
||||||
|
Sonarqube.set_default_quality_gate('name_quality_gate')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'gets the correct resource' do
|
||||||
|
expect(a_post('/api/qualitygates/set_as_default')).to have_been_made
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '.quality_gates_list' do
|
||||||
|
before do
|
||||||
|
stub_get('/api/qualitygates/list', 'quality_gates_list')
|
||||||
|
@result = Sonarqube.list_quality_gates
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns array of quality gates' do
|
||||||
|
expect(@result.qualitygates).to be_a(Array)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'provides details of each quality gate' do
|
||||||
|
expect(@result.qualitygates.first.name).to eq('Sonar way')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue