Skip to content
Open
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
11 changes: 9 additions & 2 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
source 'https://rubygems.org'

gem 'jenkins_api_client', '~> 1.3.0'
gem 'jenkins_api_client', '> 1.3.0'

# HAML views
gem 'haml-rails'

gem 'devise'
# , git: 'https://github.com/gogovan/devise.git', branch: 'rails-5.1'
gem 'erubis'

# No: gem 'protected_attributes'
gem 'protected_attributes_continued'

group :development, :test do
gem 'rspec', '~> 3.0.0'
gem 'rspec-rails', '~> 3.0.1'
Expand All @@ -19,7 +26,7 @@ group :development, :test do
gem 'database_cleaner'

# Code coverage
gem 'simplecov', '~> 0.9.1'
gem 'simplecov', '~> 0.14.1'
gem 'simplecov-rcov'

# Junit results
Expand Down
6 changes: 3 additions & 3 deletions app/controllers/jenkins_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ class JenkinsController < ApplicationController
unloadable

# Redmine ApplicationController method
before_filter :find_project_by_project_id
before_filter :can_view_jenkins_jobs
before_filter :find_jenkins_settings
before_action :find_project_by_project_id
before_action :can_view_jenkins_jobs
before_action :find_jenkins_settings

require 'will_paginate/array'

Expand Down
6 changes: 3 additions & 3 deletions app/controllers/jenkins_jobs_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ class JenkinsJobsController < ApplicationController
unloadable

# Redmine ApplicationController method
before_filter :find_project_by_project_id
before_action :find_project_by_project_id

before_filter :can_build_jenkins_jobs, only: [:build]
before_filter :find_job, except: [:index, :new, :create]
before_action :can_build_jenkins_jobs, only: [:build]
before_action :find_job, except: [:index, :new, :create]

layout Proc.new { |controller| controller.request.xhr? ? false : 'base' }

Expand Down
4 changes: 2 additions & 2 deletions app/controllers/jenkins_settings_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ class JenkinsSettingsController < ApplicationController
unloadable

# Redmine ApplicationController method
before_filter :find_project_by_project_id
before_filter :load_jenkins_settings
before_action :find_project_by_project_id
before_action :load_jenkins_settings


def save
Expand Down
7 changes: 5 additions & 2 deletions app/models/jenkins_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,12 @@ def job_id


def url
"#{jenkins_url}/job/#{name}"
"#{jenkins_url}/job/" + name2url
end

def name2url
name.gsub('/', '/job/')
end

def latest_build_url
"#{url}/#{latest_build_number}"
Expand All @@ -44,7 +47,7 @@ def latest_build_url
def console
console_output =
begin
jenkins_connection.job.get_console_output(name, latest_build_number)['output'].gsub('\r\n', '<br />')
jenkins_connection.job.get_console_output(name2url, latest_build_number)['output'].gsub('\r\n', '<br />')
rescue => e
e.message
end
Expand Down
50 changes: 48 additions & 2 deletions app/services/jenkins_client.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require 'jenkins_api_client'
require 'logger'

class JenkinsClient

Expand All @@ -11,6 +12,12 @@ def initialize(url, opts = {})
@options[:http_read_timeout] = opts[:http_read_timeout] || 60
@options[:username] = opts[:username] if opts.has_key?(:username)
@options[:password] = opts[:password] if opts.has_key?(:password)

@log_location = STDOUT unless @log_location
@log_level = Logger::INFO unless @log_level
@logger = Logger.new(@log_location)
@logger.level = @log_level

end


Expand Down Expand Up @@ -44,12 +51,51 @@ def test_connection


def get_jobs_list
connection.job.list_all rescue []
response_json_jobs = connection.job.list_all_with_details rescue []
jobs = get_jobs_list_aux(response_json_jobs, '', [])
# connection.job.list_all rescue []
jobs
end

def get_jobs_list_aux(response_jobs_json, prefix, jobs_accumulator)
response_jobs_json.each do |job|
job_name = job["name"]
new_prefix = compute_new_prefix(prefix, job_name)

@logger.info "get_jobs_list: If isFolder('#{job["name"]}') -> getSubfolders "
@logger.info "'#{job}'"


if job["_class"] == "com.cloudbees.hudson.plugins.folder.Folder"
job_suburl = name2url(new_prefix)
@logger.info "Job is a folder. Getting details of folder '#{new_prefix}' ('#{job_suburl}'): "
details_response_json = connection.job.list_details(job_suburl)
@logger.info "'#{details_response_json}'"

jobs_accumulator = get_jobs_list_aux(details_response_json["jobs"], new_prefix, jobs_accumulator) rescue jobs_accumulator
else
jobs_accumulator << compute_new_prefix(prefix, job_name)
end
end
jobs_accumulator
end

def compute_new_prefix(prefix, job_name)
if '' == prefix
new_prefix = job_name
else
new_prefix = prefix + '/' + job_name
end
new_prefix
end

def name2url(job_name)
job_name.gsub('/', '/job/')
end

def number_of_builds_for(job_name)
connection.job.list_details(job_name)['builds'].size rescue 0
job_suburl = name2url(job_name)
connection.job.list_details(job_suburl)['builds'].size rescue 0
end

end
40 changes: 35 additions & 5 deletions app/use_cases/jenkins_jobs/base.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
require 'logger'

module JenkinsJobs
class Base

Expand All @@ -14,6 +16,12 @@ def initialize(jenkins_job)
@job_data = nil
@errors = []
@use_case = self.class.name.split('::').last.underscore

@log_location = STDOUT unless @log_location
@log_level = Logger::INFO unless @log_level
@logger = Logger.new(@log_location)
@logger.level = @log_level

end


Expand Down Expand Up @@ -102,25 +110,47 @@ def create_build(build_number)
build.save!

## Update changesets
create_changeset(build, build_details['changeSet']['items'])
create_changeset_if_possible(build, build_details)
end


def update_build(build, build_number)
@logger.info "update_build: Updating build information for build number '#{build_number}'"

## Get BuildDetails from Jenkins
build_details = get_jenkins_build_details(build_number)

@logger.info "update_build: build_details: '#{build_details}'"

## Update the AR object with new data
build.result = build_details['result'].nil? ? 'running' : build_details['result']
build.building = build_details['building']
build.duration = build_details['duration']
build.finished_at = Time.at(build_details['timestamp'].to_f / 1000)
build.save!

## Update changesets
create_changeset(build, build_details['changeSet']['items'])
## Update changesets.
create_changeset_if_possible(build, build_details)
end

def create_changeset_if_possible(build, build_details)
## Update changesets. Be careful: sometimes the answer does not have them ...
if (build_details['changeSet'] == nil)
errorMsg = "Could not create changeSet: changeSet not available in Jenkins response."
@logger.warn errorMsg
@errors << errorMsg
else
changeSet = build_details['changeSet']
if (changeSet['items'] == nil)
errorMsg = "Could not create changeSet: changeSetItems not available in Jenkins response."
@logger.warn errorMsg
@errors << errorMsg
else
changeSetItems = changeSet['items']
create_changeset(build, changeSetItems)
end
end
end

def clean_up_builds
jenkins_job.builds.first(number_of_builds_to_delete).map(&:destroy) if too_much_builds?
Expand Down Expand Up @@ -148,7 +178,7 @@ def create_changeset(build, changesets)

def get_jenkins_job_details
begin
data = jenkins_client.job.list_details(jenkins_job.name)
data = jenkins_client.job.list_details(jenkins_job.name2url)
rescue => e
@errors << e.message
else
Expand All @@ -159,7 +189,7 @@ def get_jenkins_job_details

def get_jenkins_build_details(build_number)
begin
data = jenkins_client.job.get_build_details(jenkins_job.name, build_number)
data = jenkins_client.job.get_build_details(jenkins_job.name2url, build_number)
rescue => e
@errors << e.message
nil
Expand Down
12 changes: 10 additions & 2 deletions app/use_cases/jenkins_jobs/trigger_build.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,21 @@ def execute
opts['build_start_timeout'] = 30 if jenkins_job.wait_for_build_id

begin
build_number = jenkins_client.job.build(jenkins_job.name, {}, opts)
jenkins_job_url = jenkins_job.name2url
@logger.info "Jenkins job suburl: '#{jenkins_job_url}' "
@logger.info "Jenkins job opts: '#{opts}' "
build_number = jenkins_client.job.build(jenkins_job_url, {}, opts)
rescue => e
@errors << e.message
errorMsg = "Jenkins Response: " + e.message
@errors << errorMsg
@logger.error errorMsg
@logger.error e.backtrace.join("\n")
else
jenkins_job.latest_build_number = build_number if jenkins_job.wait_for_build_id
jenkins_job.state = 'running'
@logger.error 'Jenkins job state is running'
jenkins_job.save!
@logger.error 'Jenkins job saved! '
end
end

Expand Down
12 changes: 10 additions & 2 deletions app/use_cases/jenkins_jobs/update_last_build.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,16 @@ class UpdateLastBuild < Base

def execute
return if !job_status_updated?
last_build = job_data['builds'].any? ? [job_data['builds'].first] : []
do_create_builds(last_build, true)

begin
last_build = job_data['builds'].any? ? [job_data['builds'].first] : []
do_create_builds(last_build, true)
rescue => e
@errors << e.message
@logger.error e.message
@logger.error e.backtrace.join("\n")
end

end

end
Expand Down
2 changes: 1 addition & 1 deletion db/migrate/20150316023100_create_jenkins_settings.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class CreateJenkinsSettings < ActiveRecord::Migration
class CreateJenkinsSettings < ActiveRecord::Migration[5.0]

def change
create_table :jenkins_settings do |t|
Expand Down
2 changes: 1 addition & 1 deletion db/migrate/20150316023101_create_jenkins_jobs.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class CreateJenkinsJobs < ActiveRecord::Migration
class CreateJenkinsJobs < ActiveRecord::Migration[5.0]

def change
create_table :jenkins_jobs do |t|
Expand Down
2 changes: 1 addition & 1 deletion db/migrate/20150316023102_create_jenkins_builds.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class CreateJenkinsBuilds < ActiveRecord::Migration
class CreateJenkinsBuilds < ActiveRecord::Migration[5.0]

def change
create_table :jenkins_builds do |t|
Expand Down
2 changes: 1 addition & 1 deletion db/migrate/20150316023103_create_jenkins_test_results.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class CreateJenkinsTestResults < ActiveRecord::Migration
class CreateJenkinsTestResults < ActiveRecord::Migration[5.0]

def change
create_table :jenkins_test_results do |t|
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class CreateChangesetsJenkinsBuilds < ActiveRecord::Migration
class CreateChangesetsJenkinsBuilds < ActiveRecord::Migration[5.0]

def change
create_table :changesets_jenkins_builds do |t|
Expand Down
35 changes: 35 additions & 0 deletions install_and_test_plugin.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/bin/bash

http_proxy=http://10.254.250.94:3128/
https_proxy=http://10.254.250.94:3128/


pushd /var/www/redmine-4.0/plugins/redmine_jenkins

http_proxy=http://10.254.250.94:3128/ https_proxy=http://10.254.250.94:3128/ bundle update
http_proxy=http://10.254.250.94:3128/ https_proxy=http://10.254.250.94:3128/ bundle install

popd

pushd /var/www/redmine-4.0/

http_proxy=http://10.254.250.94:3128/ https_proxy=http://10.254.250.94:3128/ bundle update
http_proxy=http://10.254.250.94:3128/ https_proxy=http://10.254.250.94:3128/ bundle install

popd

echo "Restarting httpd..."

systemctl stop httpd
systemctl start httpd

systemctl status httpd

echo " "
echo " "
echo "tail -f -n 100 /var/log/httpd/error_log /var/www/redmine-4.0/log/production.log"
echo " "
echo " "

tail -f -n 100 /var/log/httpd/error_log /var/www/redmine-4.0/log/production.log

11 changes: 7 additions & 4 deletions lib/redmine_jenkins/patches/projects_controller_patch.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,22 @@ module Patches
module ProjectsControllerPatch

def self.included(base)
base.send(:include, InstanceMethods)
# base.send(:include, InstanceMethods)
# base.send(:include)
base.class_eval do
unloadable

helper :jenkins
helper :redmine_bootstrap_kit

alias_method_chain :settings, :redmine_jenkins
# alias_method_chain :settings, :redmine_jenkins
alias_method :settings_without_redmine_jenkins, :settings
alias_method :settings, :settings_with_redmine_jenkins
end
end


module InstanceMethods
# module InstanceMethods

def settings_with_redmine_jenkins(&block)
settings_without_redmine_jenkins(&block)
Expand All @@ -30,7 +33,7 @@ def settings_with_redmine_jenkins(&block)
end
end

end
# end

end
end
Expand Down
Loading