From 79e30862e97e70ea54991966d0c6ca879cea60e4 Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 1 Sep 2016 15:58:53 +0800 Subject: [PATCH 1/5] change sonar method into restart and cancel push events --- .../quality_analysis_controller.rb | 158 +++++++++--------- app/views/quality_analysis/_show.html.erb | 6 +- app/views/repositories/show.html.erb | 8 +- 3 files changed, 87 insertions(+), 85 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 3a9eff0ce..365889640 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -16,8 +16,8 @@ class QualityAnalysisController < ApplicationController end # params 说明:{identifier:版本库名} + # type: 1 新的分析 2 重新分析 def create - logger.info("11111111111111111111111111111") begin user_name = User.find(params[:user_id]).try(:login) identifier = params[:identifier] @@ -30,98 +30,98 @@ class QualityAnalysisController < ApplicationController # 考虑到历史数据:有些用户创建类job但是build失败,即sonar没有结果,这个时候需要把job删除,并且删掉quality_analyses表数据 # 如果不要这句则需要迁移数据 @sonar_address = Redmine::Configuration['sonar_address'] - projects_date = open(@sonar_address + "/api/projects/index").read - arr = JSON.parse(projects_date).map {|m| m["nm"]} # eg: ["Hjqreturn:cc_rep", "Hjqreturn:putong", "Hjqreturn:sonar_rep2", "shitou:sonar_rep"] - quality_an = QualityAnalysis.where(:sonar_name => sonar_name).first - if @client_jenkins.job.exists?(job_name) && QualityAnalysis.where(:sonar_name => sonar_name).select{|qa| arr.include?(qa.sonar_name)}.blank? - aa = @client_jenkins.job.delete("#{job_name}") - quality_an.delete unless quality_an.blank? - end + # projects_date = open(@sonar_address + "/api/projects/index").read + # arr = JSON.parse(projects_date).map {|m| m["nm"]} # eg: ["Hjqreturn:cc_rep", "Hjqreturn:putong", "Hjqreturn:sonar_rep2", "shitou:sonar_rep"] + quality_an = QualityAnalysis.where(:sonar_name => sonar_name) + # if @client_jenkins.job.exists?(job_name) && QualityAnalysis.where(:sonar_name => sonar_name).select{|qa| arr.include?(qa.sonar_name)}.blank? + # aa = @client_jenkins.job.delete("#{job_name}") + # quality_an.delete unless quality_an.blank? + # end + + # type 1的时候之所以判断job是否存在,为了防止特殊情况,正常情况是不会出现的 + # 重新分析的时候需要删除以前的分析结果 + @client_jenkins.job.delete("#{job_name}") if @client_jenkins.job.exists?(job_name) + quality_an.delete_all unless quality_an.blank? # Checks if the given job exists in Jenkins. - unless @client_jenkins.job.exists?(job_name) - @g = Gitlab.client - branch = params[:branch] - language = swith_language_type(params[:language]) - path = params[:path].blank? ? "./" : params[:path] - # qa = QualityAnalysis.where(:project_id => @project.id, :author_login => user_name).first - version = quality_an.nil? ? 1 : quality_an.sonar_version + 1 - properties = "sonar.projectKey=#{sonar_name} + @g = Gitlab.client + branch = params[:branch] + language = swith_language_type(params[:language]) + path = params[:path].blank? ? "./" : params[:path] + # qa = QualityAnalysis.where(:project_id => @project.id, :author_login => user_name).first + version = 1 + properties = "sonar.projectKey=#{sonar_name} sonar.projectName=#{sonar_name} sonar.projectVersion=#{version} sonar.sources=#{path} sonar.language=#{language.downcase} sonar.sourceEncoding=utf-8" - git_url = @gitlab_address.to_s+"/"+@project.owner.to_s+"/"+ identifier + "."+"git" + git_url = @gitlab_address.to_s+"/"+@project.owner.to_s+"/"+ identifier + "."+"git" - # 替换配置文件 - @doc = Nokogiri::XML(File.open(File.join(Rails.root, 'tmp', 'config.xml'))) - @doc.at_xpath("//hudson.plugins.git.UserRemoteConfig/url").content = git_url - @doc.at_xpath("//hudson.plugins.git.BranchSpec/name").content = "*/#{branch}" - @doc.at_xpath("//hudson.plugins.sonar.SonarRunnerBuilder/properties").content = properties # sonar-properties + # 替换配置文件 + @doc = Nokogiri::XML(File.open(File.join(Rails.root, 'tmp', 'config.xml'))) + @doc.at_xpath("//hudson.plugins.git.UserRemoteConfig/url").content = git_url + @doc.at_xpath("//hudson.plugins.git.BranchSpec/name").content = "*/#{branch}" + @doc.at_xpath("//hudson.plugins.sonar.SonarRunnerBuilder/properties").content = properties # sonar-properties - # jenkins job创建 - jenkins_job = @client_jenkins.job.create("#{job_name}", @doc.to_xml) - logger.info("Jenkins status of create ==> #{jenkins_job}") + # jenkins job创建 + jenkins_job = @client_jenkins.job.create("#{job_name}", @doc.to_xml) - # 将地址作为hook值添加到gitlab - @g.add_project_hook(@project.gpid, @jenkins_address + "/project/#{job_name}") - # job创建完成后自动运行job,如果运行成功则返回‘200’ - code = @client_jenkins.job.build("#{job_name}") - logger.error("build result ==> #{code}") + # 将地址作为hook值添加到gitlab + # @g.add_project_hook(@project.gpid, @jenkins_address + "/project/#{job_name}") + # job创建完成后自动运行job,如果运行成功则返回‘200’ + code = @client_jenkins.job.build("#{job_name}") - # 判断调用sonar分析是否成功 - # 等待启动时间处理, 最长时间为30分钟 - for i in 0..360 do - sleep(5) - @current_build_status = @client_jenkins.job.get_current_build_status("#{job_name}") - if (@current_build_status == "success" || @current_build_status == "failure") + # 判断调用sonar分析是否成功 + # 等待启动时间处理, 最长时间为30分钟 + for i in 0..360 do + sleep(5) + @current_build_status = @client_jenkins.job.get_current_build_status("#{job_name}") + if (@current_build_status == "success" || @current_build_status == "failure") + break + if i == 360 + @build_console_result = false break - if i == 360 - @build_console_result = false - break - end - end - end - - # sonar 缓冲,sonar生成数据 - sleep(10) - - # 获取sonar output结果 - console_build = @client_jenkins.job.get_console_output("#{job_name}", build_num = 0, start = 0, mode = 'text')["output"] - logger.info("@current_build_status is ==> #{@current_build_status}") - - # 两种情况需要删除job: - # 1/创建成功但是build失败则删除job - # 2/creat和build成功,调用sonar启动失败则删除job - # 错误信息存储需存到Trustie数据库,否则一旦job删除则无法获取这些信息 - if jenkins_job == '200' && code != '201' - @client_jenkins.job.delete("#{job_name}") - else - if @current_build_status == "failure" - reg_console = /Exception:.*?\r/.match(console_build) - output = reg_console[0].gsub("\r", "") unless reg_console.nil? - se = SonarError.where(:jenkins_job_name => job_name).first - se.nil? ? SonarError.create(:project_id => @project.id, :jenkins_job_name => job_name, :output => output) : se.update_column(:output, output) - @client_jenkins.job.delete("#{job_name}") - elsif @current_build_status == "success" - if quality_an.blank? - QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, - :sonar_version => version, :path => path, :branch => branch, :language => language, :sonar_name => "#{user_name}:#{rep_id}") - else - qa.update_attribute(:sonar_version, version) - end - end - end - - respond_to do |format| - if @current_build_status == "success" - format.html{redirect_to project_quality_analysis_path(:project_id => @project.id, :resource_id => sonar_name, :branch => branch, :current_build_status => @current_build_status, :job_name => job_name)} - elsif @current_build_status == "failure" - format.html{redirect_to error_list_project_quality_analysi_path(:project_id => @project.id, :job_name => job_name)} end end end + + # sonar 缓冲,sonar生成数据 + sleep(10) + + # 获取sonar output结果 + console_build = @client_jenkins.job.get_console_output("#{job_name}", build_num = 0, start = 0, mode = 'text')["output"] + logger.info("@current_build_status is ==> #{@current_build_status}") + + # 两种情况需要删除job: + # 1/创建成功但是build失败则删除job + # 2/creat和build成功,调用sonar启动失败则删除job + # 错误信息存储需存到Trustie数据库,否则一旦job删除则无法获取这些信息 + if jenkins_job == '200' && code != '201' + @client_jenkins.job.delete("#{job_name}") + else + if @current_build_status == "failure" + reg_console = /Exception:.*?\r/.match(console_build) + output = reg_console[0].gsub("\r", "") unless reg_console.nil? + se = SonarError.where(:jenkins_job_name => job_name).first + se.nil? ? SonarError.create(:project_id => @project.id, :jenkins_job_name => job_name, :output => output) : se.update_column(:output, output) + @client_jenkins.job.delete("#{job_name}") + elsif @current_build_status == "success" + if quality_an.blank? + QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, + :sonar_version => version, :path => path, :branch => branch, :language => language, :sonar_name => "#{user_name}:#{rep_id}") + end + end + end + + respond_to do |format| + if @current_build_status == "success" + format.html{redirect_to project_quality_analysis_path(:project_id => @project.id, :resource_id => sonar_name, :branch => branch, :current_build_status => @current_build_status, :job_name => job_name)} + elsif @current_build_status == "failure" + format.html{redirect_to error_list_project_quality_analysi_path(:project_id => @project.id, :job_name => job_name)} + end + end + rescue => e @message = e.message logger.error("######################====>#{e.message}") @@ -302,10 +302,8 @@ class QualityAnalysisController < ApplicationController @jenkins_address = Redmine::Configuration['jenkins_address'] jenkins_username = Redmine::Configuration['jenkins_username'] jenkins_password = Redmine::Configuration['jenkins_password'] - logger.info("22222222222222222222222222222222") # connect jenkins @client_jenkins = JenkinsApi::Client.new(:server_url => @jenkins_address, :username => jenkins_username, :password => jenkins_password) - logger.info("333333333333333333333333333333") rescue => e logger.error("failed to connect Jenkins ==> #{e}") end diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index ff7863ce8..d6c8c0a56 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -127,7 +127,7 @@

<%= @ha["functions"].to_i %>

-<% unless @user_quality_infos.blank? %> +<% if !@user_quality_infos.blank? %>
贡献统计
diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index b80d9ee5b..ec63a1c73 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -3,8 +3,12 @@

<%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %>

<% unless @entries.nil? %> ZIP下载 - <% if quality_analysis(User.current.try(:login), @repository.id).nil? && User.current.member_of?(@project) && @project.is_public? %> - <%= link_to "质量分析", quality_analysis_path(:id => @project.id, :repository_id => @repository.identifier, :rev => @rev, :default_branch => @g_default_branch ), :remote => true, :class => "btn_zipdown fr" %> + <% if User.current.member_of?(@project) && @project.is_public? %> + <% if quality_analysis(User.current.try(:login), @repository.id).nil? %> + <%= link_to "质量分析", quality_analysis_path(:id => @project.id, :repository_id => @repository.identifier, :rev => @rev, :default_branch => @g_default_branch, :type => "1"), :remote => true, :class => "btn_zipdown fr" %> + <% else %> + <%= link_to "重新分析", quality_analysis_path(:id => @project.id, :repository_id => @repository.identifier, :rev => @rev, :default_branch => @g_default_branch, :type => "2"), :remote => true, :class => "btn_zipdown fr" %> + <% end %> <% end %> <% end %> From e798381feb81ffb52a16a530b219679cfa1b23cf Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 1 Sep 2016 16:39:09 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E6=95=B0=E6=94=B9=E6=88=90=E5=AE=9E=E6=97=B6=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/projects/_development_group.html.erb | 5 +++-- app/views/projects/_friend_group.html.erb | 5 +++-- app/views/projects/_research_team.html.erb | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/views/projects/_development_group.html.erb b/app/views/projects/_development_group.html.erb index 52f4e002a..17742f023 100644 --- a/app/views/projects/_development_group.html.erb +++ b/app/views/projects/_development_group.html.erb @@ -1,3 +1,4 @@ +<% project_file_num = Attachment.where(:container_type => "Project", :container_id => @project.id).count %>