Commit 439fe345de21edcdc35be19d8ce3a5b53f835b20

Authored by Victor Costa
1 parent db037ae6

Refactoring serpro_integration

plugins/serpro_integration/lib/ext/community.rb
@@ -6,32 +6,38 @@ class Community @@ -6,32 +6,38 @@ class Community
6 settings_items :allow_gitlab_integration, :type => :boolean, :default => true 6 settings_items :allow_gitlab_integration, :type => :boolean, :default => true
7 settings_items :allow_jenkins_integration, :type => :boolean, :default => true 7 settings_items :allow_jenkins_integration, :type => :boolean, :default => true
8 8
9 - #FIXME make test for default option  
10 - settings_items :serpro_integration_plugin, :type => Hash, :default => {} 9 + settings_items :serpro_integration_plugin_gitlab, :type => Hash, :default => {}
  10 + settings_items :serpro_integration_plugin_jenkins, :type => Hash, :default => {}
  11 + settings_items :serpro_integration_plugin_sonar, :type => Hash, :default => {}
11 12
12 - attr_accessible :allow_unauthenticated_comments, :allow_gitlab_integration, :gitlab, :allow_sonar_integration, :sonar, :allow_jenkins_integration, :jenkins 13 + attr_accessible :allow_unauthenticated_comments, :allow_gitlab_integration, :allow_sonar_integration, :allow_jenkins_integration, :serpro_integration_plugin_gitlab, :serpro_integration_plugin_jenkins, :serpro_integration_plugin_sonar
13 14
14 after_update :create_integration_projects 15 after_update :create_integration_projects
15 16
16 def create_integration_projects 17 def create_integration_projects
17 - gitlab_project = SerproIntegrationPlugin::GitlabIntegration.create_gitlab_project(self)  
18 - SerproIntegrationPlugin::JenkinsIntegration.create_jenkis_project(self, jenkins_project_name, gitlab_project.path_with_namespace, gitlab_project.web_url, gitlab_project.http_url_to_repo) 18 + return unless setting_changed?(:serpro_integration_plugin_gitlab)
  19 +
  20 + if allow_gitlab_integration
  21 + gitlab_integration = SerproIntegrationPlugin::GitlabIntegration.new(gitlab_host, gitlab_private_token)
  22 + gitlab_project = gitlab_integration.create_gitlab_project(self)
  23 +
  24 + if allow_jenkins_integration
  25 + jenkins_integration = SerproIntegrationPlugin::JenkinsIntegration.new(jenkins_host, jenkins_private_token, jenkins_user)
  26 + jenkins_integration.create_jenkis_project(self, gitlab_project.path_with_namespace, gitlab_project.web_url, gitlab_project.http_url_to_repo)
  27 + end
  28 + end
19 end 29 end
20 30
21 def serpro_integration_plugin_settings 31 def serpro_integration_plugin_settings
22 @settings ||= Noosfero::Plugin::Settings.new(environment, SerproIntegrationPlugin) 32 @settings ||= Noosfero::Plugin::Settings.new(environment, SerproIntegrationPlugin)
23 end 33 end
24 34
25 - def gitlab= params  
26 - self.serpro_integration_plugin[:gitlab] = params  
27 - end  
28 -  
29 - def gitlab  
30 - self.serpro_integration_plugin[:gitlab] ||= {} 35 + def gitlab_group
  36 + serpro_integration_plugin_gitlab[:group] || self.identifier
31 end 37 end
32 38
33 def gitlab_project_name 39 def gitlab_project_name
34 - gitlab[:project_name] || self.identifier 40 + serpro_integration_plugin_gitlab[:project_name] || self.identifier
35 end 41 end
36 42
37 def gitlab_host 43 def gitlab_host
@@ -42,24 +48,20 @@ class Community @@ -42,24 +48,20 @@ class Community
42 serpro_integration_plugin_settings.gitlab[:private_token] 48 serpro_integration_plugin_settings.gitlab[:private_token]
43 end 49 end
44 50
45 - def sonar= params  
46 - self.serpro_integration_plugin[:sonar] = params  
47 - end  
48 -  
49 - def sonar  
50 - self.serpro_integration_plugin[:sonar] ||= {} 51 + def jenkins_host
  52 + serpro_integration_plugin_settings.jenkins[:host]
51 end 53 end
52 54
53 - def jenkins= params  
54 - self.serpro_integration_plugin[:jenkins] = params 55 + def jenkins_private_token
  56 + serpro_integration_plugin_settings.jenkins[:private_token]
55 end 57 end
56 58
57 - def jenkins  
58 - self.serpro_integration_plugin[:jenkins] ||= {} 59 + def jenkins_user
  60 + serpro_integration_plugin_settings.jenkins[:user]
59 end 61 end
60 62
61 def jenkins_project_name 63 def jenkins_project_name
62 - jenkins[:project_name] || self.identifier 64 + serpro_integration_plugin_jenkins[:project_name] || self.identifier
63 end 65 end
64 66
65 end 67 end
plugins/serpro_integration/lib/serpro_integration_plugin.rb
@@ -19,7 +19,7 @@ class SerproIntegrationPlugin < Noosfero::Plugin @@ -19,7 +19,7 @@ class SerproIntegrationPlugin < Noosfero::Plugin
19 #FIXME make this test 19 #FIXME make this test
20 def profile_editor_extras 20 def profile_editor_extras
21 lambda do 21 lambda do
22 - render :file => 'profile-editor-extras' 22 + render :file => 'profile-editor-extras' if profile.kind_of?(Community)
23 end 23 end
24 end 24 end
25 25
plugins/serpro_integration/lib/serpro_integration_plugin/gitlab_integration.rb
@@ -2,53 +2,61 @@ require 'gitlab' @@ -2,53 +2,61 @@ require 'gitlab'
2 2
3 class SerproIntegrationPlugin::GitlabIntegration 3 class SerproIntegrationPlugin::GitlabIntegration
4 4
5 - def self.create_gitlab_project(profile)  
6 - Gitlab.endpoint = profile.gitlab_host  
7 - Gitlab.private_token = profile.serpro_integration_plugin_settings.gitlab[:private_token]  
8 -  
9 - #Find user by email  
10 - begin  
11 - gitlab_user = Gitlab.users(:search => profile.gitlab[:email])  
12 - rescue Gitlab::Error::NotFound, Gitlab::Error::Parsing  
13 - gitlab_user = nil  
14 - end  
15 -  
16 - #User not found, create user  
17 - #FIXME  
18 - if gitlab_user == nil || gitlab_user.count == 0  
19 - gitlab_user = Gitlab.create_user(user.email, '123456', {:username => user.identifier, :name => user.name, :provider => 'ldap'})  
20 - end 5 + def initialize(host, private_token)
  6 + @client = Gitlab.client(:endpoint => host, :private_token => private_token)
  7 + end
21 8
22 - if gitlab_user.nil?  
23 - profile.gitlab[:errors] = _('Gitlab user could not be created')  
24 - return nil  
25 - end 9 + def create_group(group_name)
  10 + #FIXME find group by name
  11 + group = @client.groups.select {|group| group.name == group_name}.first
  12 + group ||= @client.create_group(group_name, group_name)
  13 + end
26 14
27 - #Create project for user  
28 - begin  
29 - #FIXME Why this?  
30 - if gitlab_user.is_a?(Array)  
31 - gitlab_user = gitlab_user[0]  
32 - end 15 + def create_project(project_name, group)
  16 + path_with_namespace = "#{group.name}/#{project_name}"
  17 + #FIXME find project by namespace
  18 + project = @client.projects(:scope => :all).select do |project|
  19 + project.path_with_namespace == path_with_namespace
  20 + end.first
33 21
  22 + if project.nil?
34 project_options = {} 23 project_options = {}
35 - project_options[:user_id] = gitlab_user.id 24 + project_options[:namespace_id] = group.id
36 project_options[:issues_enabled ] = true 25 project_options[:issues_enabled ] = true
37 project_options[:wall_enabled] = true 26 project_options[:wall_enabled] = true
38 project_options[:wiki_enabled] = true 27 project_options[:wiki_enabled] = true
39 project_options[:public] = true 28 project_options[:public] = true
40 - project = Gitlab.create_project(profile.gitlab_project_name, project_options)  
41 29
  30 + project = @client.create_project(project_name, project_options)
42 #Create Web Hook for Jenkins' integration 31 #Create Web Hook for Jenkins' integration
43 -# Gitlab.add_project_hook(project.id, "#{self.jenkins[:url]}/gitlab/build_now")  
44 -# createJenkinsJob(project.name, project.path_with_namespace, project.web_url, project.http_url_to_repo)  
45 -  
46 - rescue Gitlab::Error::NotFound, Gitlab::Error::Parsing  
47 - #Project already exists  
48 - end  
49 - profile.gitlab[:errors] = nil 32 + #Gitlab.add_project_hook(project.id, "#{self.jenkins[:url]}/gitlab/build_now")
  33 + end
50 project 34 project
51 end 35 end
52 36
  37 + def create_user(email, group)
  38 + user = @client.users(:search => email).first
  39 + username = name = email[/[^@]+/]
  40 + user ||= @client.create_user(email, '123456', {:username => username, :name => name, :provider => 'ldap'})
  41 +
  42 + begin
  43 + @client.add_group_member(group.id, user.id, 40)
  44 + rescue Gitlab::Error::Conflict => e
  45 + #already member
  46 + end
  47 + user
  48 + end
  49 +
  50 + #http://rubydoc.info/gems/gitlab/frames
  51 + def create_gitlab_project(profile)
  52 + group = create_group(profile.gitlab_group)
  53 +
  54 + #create admins and add to group
  55 + profile.admins.each do |person|
  56 + create_user(person.user.email, group)
  57 + end
  58 +
  59 + project = create_project(profile.gitlab_project_name, group)
  60 + end
53 61
54 end 62 end
plugins/serpro_integration/lib/serpro_integration_plugin/jenkins_integration.rb
@@ -2,27 +2,25 @@ @@ -2,27 +2,25 @@
2 require 'jenkins_api_client' 2 require 'jenkins_api_client'
3 3
4 class SerproIntegrationPlugin::JenkinsIntegration 4 class SerproIntegrationPlugin::JenkinsIntegration
5 - #FIXME make jenkins integration works  
6 - def self.create_jenkis_project(profile, projectName, repositoryPath, webUrl, gitUrl)  
7 5
8 - @client = JenkinsApi::Client.new(:server_url => profile.serpro_integration_plugin_settings.jenkins[:host],  
9 - :password => profile.serpro_integration_plugin_settings.jenkins[:private_token],  
10 - :username => profile.serpro_integration_plugin_settings.jenkins[:user]) 6 + def initialize(host, private_token, user)
  7 + @client = JenkinsApi::Client.new(:server_url => host, :password => private_token, :username => user)
  8 + end
11 9
  10 + #FIXME make jenkins integration works
  11 + def create_jenkis_project(profile, repository_path, web_url, git_url)
12 #begin 12 #begin
13 - @client.job.create(projectName, xml_jenkins(repositoryPath, webUrl, gitUrl)) 13 + @client.job.create(profile.jenkins_project_name, xml_jenkins(repository_path, web_url, git_url))
14 #rescue JenkinsApi::Exceptions::ApiException 14 #rescue JenkinsApi::Exceptions::ApiException
15 -  
16 #end 15 #end
17 -  
18 end 16 end
19 17
20 #FIXME 18 #FIXME
21 - def self.xml_jenkins(repositoryPath, webUrl, gitUrl) 19 + def xml_jenkins(repository_path, web_url, git_url)
22 " 20 "
23 <maven2-moduleset plugin='maven-plugin@1.509'> 21 <maven2-moduleset plugin='maven-plugin@1.509'>
24 <actions/> 22 <actions/>
25 - <description>Projeto criado para o repositório #{repositoryPath} do Gitlab - #{webUrl}</description> 23 + <description>Projeto criado para o repositório #{repository_path} do Gitlab - #{web_url}</description>
26 <logRotator class='hudson.tasks.LogRotator'> 24 <logRotator class='hudson.tasks.LogRotator'>
27 <daysToKeep>-1</daysToKeep> 25 <daysToKeep>-1</daysToKeep>
28 <numToKeep>2</numToKeep> 26 <numToKeep>2</numToKeep>
@@ -35,7 +33,7 @@ class SerproIntegrationPlugin::JenkinsIntegration @@ -35,7 +33,7 @@ class SerproIntegrationPlugin::JenkinsIntegration
35 <configVersion>2</configVersion> 33 <configVersion>2</configVersion>
36 <userRemoteConfigs> 34 <userRemoteConfigs>
37 <hudson.plugins.git.UserRemoteConfig> 35 <hudson.plugins.git.UserRemoteConfig>
38 - <url>#{gitUrl}</url> 36 + <url>#{git_url}</url>
39 </hudson.plugins.git.UserRemoteConfig> 37 </hudson.plugins.git.UserRemoteConfig>
40 </userRemoteConfigs> 38 </userRemoteConfigs>
41 <branches> 39 <branches>
plugins/serpro_integration/views/profile-editor-extras.html.erb
@@ -29,10 +29,10 @@ jQuery( document ).ready(function( $ ) { @@ -29,10 +29,10 @@ jQuery( document ).ready(function( $ ) {
29 </h3> 29 </h3>
30 <ul class='sonar'> 30 <ul class='sonar'>
31 <li> 31 <li>
32 - <%= labelled_text_field(_('Server Host'), 'profile_data[sonar]host]', profile.sonar[:host]) %> 32 + <%= labelled_text_field(_('Server Host'), 'profile_data[serpro_integration_plugin_sonar][host]', profile.serpro_integration_plugin_sonar[:host]) %>
33 </li> 33 </li>
34 <li> 34 <li>
35 - <%= labelled_text_field(_('Project: '), 'profile_data[sonar][project]', profile.sonar[:project]) %> 35 + <%= labelled_text_field(_('Project: '), 'profile_data[serpro_integration_plugin_sonar][project]', profile.serpro_integration_plugin_sonar[:project]) %>
36 </li> 36 </li>
37 </ul> 37 </ul>
38 </div> 38 </div>
plugins/serpro_integration/views/profile_editor/_gitlab.html.erb
@@ -11,14 +11,10 @@ @@ -11,14 +11,10 @@
11 <%= link_to _('Force'), {:controller => 'serpro_integration_plugin_myprofile', :action => 'create_gitlab'}, {:remote => true} %> 11 <%= link_to _('Force'), {:controller => 'serpro_integration_plugin_myprofile', :action => 'create_gitlab'}, {:remote => true} %>
12 </li> 12 </li>
13 <li> 13 <li>
14 - <%= labelled_text_field(_('Project Name:'), 'profile_data[gitlab][project_name]', profile.gitlab_project_name ) %> 14 + <%= labelled_text_field(_('Group Name:'), 'profile_data[serpro_integration_plugin_gitlab][group]', profile.gitlab_group) %>
15 </li> 15 </li>
16 <li> 16 <li>
17 - <%= labelled_text_field(_('Owner Email:'), 'profile_data[gitlab][email]', profile.gitlab[:email] || current_user.person.email ) %> 17 + <%= labelled_text_field(_('Project Name:'), 'profile_data[serpro_integration_plugin_gitlab][project_name]', profile.gitlab_project_name ) %>
18 </li> 18 </li>
19 - <li>  
20 - <%= _('Erros: %s') % (profile.gitlab[:errors] || _('None')) %>  
21 - </li>  
22 -  
23 </ul> 19 </ul>
24 </div> 20 </div>
plugins/serpro_integration/views/profile_editor/_jenkins.html.erb
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 </h3> 5 </h3>
6 <ul class='jenkins'> 6 <ul class='jenkins'>
7 <li> 7 <li>
8 - <%= labelled_text_field(_('Project Name:'), 'profile_data[jenkins][project_name]', profile.jenkins_project_name ) %> 8 + <%= labelled_text_field(_('Project Name:'), 'profile_data[serpro_integration_plugin_jenkins][project_name]', profile.jenkins_project_name ) %>
9 </li> 9 </li>
10 </ul> 10 </ul>
11 </div> 11 </div>