2021-05-25 14:10:42 -04:00
# frozen_string_literal: true
module Integrations
class Jenkins < BaseCi
2021-07-14 14:08:31 -04:00
include HasWebHook
2022-03-02 04:13:50 -05:00
2022-02-03 19:13:53 -05:00
prepend EnableSslVerification
2021-07-14 14:08:31 -04:00
extend Gitlab :: Utils :: Override
2021-05-25 14:10:42 -04:00
2022-05-05 05:08:00 -04:00
field :jenkins_url ,
2022-06-16 14:09:35 -04:00
title : - > { s_ ( 'ProjectService|Jenkins server URL' ) } ,
2022-05-05 05:08:00 -04:00
required : true ,
placeholder : 'http://jenkins.example.com' ,
2022-06-16 14:09:35 -04:00
help : - > { s_ ( 'The URL of the Jenkins server.' ) }
2022-05-05 05:08:00 -04:00
field :project_name ,
required : true ,
placeholder : 'my_project_name' ,
2022-06-16 14:09:35 -04:00
help : - > { s_ ( 'The name of the Jenkins project. Copy the name from the end of the URL to the project.' ) }
2022-05-05 05:08:00 -04:00
field :username ,
2022-06-16 14:09:35 -04:00
help : - > { s_ ( 'The username for the Jenkins server.' ) }
2022-05-05 05:08:00 -04:00
field :password ,
type : 'password' ,
2022-06-16 14:09:35 -04:00
help : - > { s_ ( 'The password for the Jenkins server.' ) } ,
non_empty_password_title : - > { s_ ( 'ProjectService|Enter new password.' ) } ,
non_empty_password_help : - > { s_ ( 'ProjectService|Leave blank to use your current password.' ) }
2021-05-25 14:10:42 -04:00
2021-07-21 08:09:35 -04:00
before_validation :reset_password
2021-05-25 14:10:42 -04:00
validates :jenkins_url , presence : true , addressable_url : true , if : :activated?
validates :project_name , presence : true , if : :activated?
validates :username , presence : true , if : - > ( service ) { service . activated? && service . password_touched? && service . password . present? }
default_value_for :merge_requests_events , false
default_value_for :tag_push_events , false
def reset_password
# don't reset the password if a new one is provided
if ( jenkins_url_changed? || username . blank? ) && ! password_touched?
self . password = nil
end
end
def execute ( data )
return unless supported_events . include? ( data [ :object_kind ] )
2021-07-14 14:08:31 -04:00
execute_web_hook! ( data , " #{ data [ :object_kind ] } _hook " )
2021-05-25 14:10:42 -04:00
end
def test ( data )
begin
result = execute ( data )
return { success : false , result : result [ :message ] } if result [ :http_status ] != 200
rescue StandardError = > error
return { success : false , result : error }
end
{ success : true , result : result [ :message ] }
end
2021-07-14 14:08:31 -04:00
override :hook_url
2021-05-25 14:10:42 -04:00
def hook_url
url = URI . parse ( jenkins_url )
url . path = File . join ( url . path || '/' , " project/ #{ project_name } " )
url . user = ERB :: Util . url_encode ( username ) unless username . blank?
url . password = ERB :: Util . url_encode ( password ) unless password . blank?
url . to_s
end
def self . supported_events
%w( push merge_request tag_push )
end
def title
'Jenkins'
end
def description
s_ ( 'Run CI/CD pipelines with Jenkins.' )
end
def help
2022-03-02 04:13:50 -05:00
docs_link = ActionController :: Base . helpers . link_to _ ( 'Learn more.' ) , Rails . application . routes . url_helpers . help_page_url ( 'integration/jenkins' ) , target : '_blank' , rel : 'noopener noreferrer'
2021-05-25 14:10:42 -04:00
s_ ( 'Run CI/CD pipelines with Jenkins when you push to a repository, or when a merge request is created, updated, or merged. %{docs_link}' ) . html_safe % { docs_link : docs_link . html_safe }
end
def self . to_param
'jenkins'
end
end
end