jenkins-cli 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source :rubygems
2
+
3
+ gem "trollop"
4
+ gem "rake-remote_task"
5
+
6
+ gemspec
data/README ADDED
@@ -0,0 +1,29 @@
1
+ What does jenkins-cli do?
2
+ ==================================
3
+
4
+ 1. Allows you to modify Jenkins slave configurations
5
+ 2. Allows you to disable/enable emails if you're using the Ext-email plugin
6
+ 3. Start a build
7
+ 4. Lists all failing jobs
8
+ 5. Retrieve details pertaining to a Jenkins job (e.g. current build status, last successful, last failed, etc.)
9
+ 6. Ability to query for what is current building and pending
10
+ 7. Ability to modify Jenkins job labels
11
+ 8. Can retrieve the build history of a Jenkins job
12
+ 9. Retrieve details of a particular build (e.g. committers, SCM changes, etc.)
13
+ 10. Ability to stream logs of a currently building job.
14
+
15
+ How to install jenkins-cli
16
+ ==================================
17
+
18
+ Install jenkins-cli into your gemset
19
+ gem install jenkins-cli
20
+
21
+ Optionally set $JENKINS_URL to your Jenkins master machine.
22
+ Optionally set $JENKINS_USER to your Jenkins username you wish to operate as.
23
+
24
+ How to use jenkins-cli
25
+ =================================
26
+
27
+ Usage: jenkins-cli <command> [OPTIONS]
28
+
29
+ For a list of available commands just use type 'jenkins-cli'
@@ -0,0 +1,15 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ load "#{ENV['REPO_ROOT']}/ooyala/shared_lib/ooyala_gems/ooyala_gems.rake"
5
+
6
+ namespace :jenkins_cli do
7
+ desc "Push latest jenkins-cli gem to gems.sv2"
8
+ task :push_gem do
9
+ gem_to_push = nil
10
+ Dir.glob('jenkins-cli*.gem').each do |f|
11
+ gem_to_push = f
12
+ end
13
+ puts `rake gem:push #{gem_to_push}` if gem_to_push
14
+ end
15
+ end
data/TODO ADDED
@@ -0,0 +1,20 @@
1
+ [x] Ability to modify slaves
2
+ [x] Ability to disable/enable emails
3
+ [x] Ability to set emails addresses
4
+ [x] Ability to start the build for any task
5
+ [x] Ability to list all failing jobs
6
+ [x] Ability to retrieve details of a job (i.e. lastSuccessfulBuild, lastFailingBuild, currentStatus)
7
+ [x] Ability to query queue and what is building
8
+ [x] Ability to modify labels
9
+ [x] Default to JENKINS_USER if it exists
10
+ [] Grant users access to Jenkins
11
+ [x] Stream the logs to the current console
12
+ [] Output log to a file
13
+ [x] Get build history for a job
14
+ [x] Get build details
15
+ Ability to query for machines with certain labels
16
+ Ability to add a label to multiple machines
17
+ Ability to add a label to multiple jobs
18
+
19
+
20
+
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+ require "#{File.dirname(__FILE__)}/../lib/jenkins_controller"
5
+
6
+ DEFAULT_SSH_USER = "role-c3"
7
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
8
+
9
+ usage = <<-EOF
10
+ Usage:
11
+ jenkins-cli <command> [OPTIONS]
12
+ Examples:
13
+ jenkins-cli list-failures
14
+ jenkins-cli disable-email --jenkins-url http://localhost:8080 --user jenkins --projects "sas-coverage rails-coverage"
15
+ Supported Commands:
16
+ add-node [jenkins-url | user | name | ssh_user | mode | slave-url | v]
17
+ build-details [jenkins-url | user | job | build-number]
18
+ build-history [jenkins-url | user | job | limit]
19
+ disable-email [jenkins-url | user | projects]
20
+ enable-email [jenkins-url | user | projects | emails]
21
+ grant-access [jenkins-url | user | grant-user]
22
+ job-details [jenkins-url | user | job]
23
+ job-labels [jenkins-url | user | job | labels]
24
+ list-failures [jenkins-url | user]
25
+ list-jobs [jenkins-url | user]
26
+ log [jenkins-url | user | job]
27
+ queue [jenkins-url | user]
28
+ start-job [jenkins-url | user | job]
29
+ EOF
30
+
31
+ opts = Trollop::options do
32
+ banner usage
33
+ opt :name, "Slave name", :default => nil, :type => String, :short => "-n"
34
+ opt :user, "Jenkins username", :default => nil, :type => String, :short => "-u"
35
+ opt :password, "Jenkins password", :default => nil, :type => String
36
+ opt :ssh_user, "SSH username", :default => DEFAULT_SSH_USER
37
+ opt :jenkins_url, "Jenkins main URL", :default => nil, :type => String
38
+ opt :mode, "Jenkins slave mode", :default => "exclusive"
39
+ opt :slave_url, "Slave URL", :default => nil, :type => String
40
+ opt :verbose, "Verbose", :default => false, :short => "-v"
41
+ opt :projects, "Jenkins projects to disable emails from.", :default => nil, :type => String, :short => "-p"
42
+ opt :emails, "List of recipients to receive email.", :default => "", :type => String, :short => "-e"
43
+ opt :job, "Jenkins job", :default => nil, :type => String, :short => "-j"
44
+ opt :labels, "Jenkins label expression", :default => nil, :type => String
45
+ opt :grant_user, "Jenkins user to grant write permissions to.", :default => nil, :type => String
46
+ opt :build_number, "Build number of a particular Jenkins job.", :default => nil, :type => String, :short => "-b"
47
+ opt :limit, "The number of entries to show", :default => nil, :type => String, :short => "-l"
48
+ end
49
+
50
+ # If jenkins_url is not set then set it to JENKINS_URL env var if it exists
51
+ opts[:jenkins_url] = ENV['JENKINS_URL'] if opts[:jenkins_url].nil?
52
+ opts[:user] = ENV['JENKINS_USER'] if opts[:user].nil?
53
+ opts[:password] = ENV['JENKINS_PASSWORD'] if opts[:password].nil?
54
+
55
+ # Otherwise set it to DEFAULT_JENKINS_URL
56
+ opts[:jenkins_url] = DEFAULT_JENKINS_URL if opts[:jenkins_url].nil?
57
+
58
+ if ARGV[0] && ARGV[0] == "list-jobs"
59
+ JenkinsController.list_jobs(opts[:jenkins_url], opts[:user], opts[:password])
60
+ elsif ARGV[0] && ARGV[0] == "disable-email"
61
+ JenkinsController.disable_email(opts[:jenkins_url], opts[:user], opts[:password], opts[:projects])
62
+ elsif ARGV[0] && ARGV[0] == "enable-email"
63
+ JenkinsController.enable_email(opts[:jenkins_url], opts[:user], opts[:password], opts[:projects], opts[:emails])
64
+ elsif ARGV[0] && ARGV[0] == "add-node"
65
+ JenkinsController.add_node(opts[:jenkins_url], opts[:user], opts[:password], opts[:name], opts[:ssh_user], opts[:mode], opts[:slave_url], opts[:v])
66
+ elsif ARGV[0] && ARGV[0] == "start-job"
67
+ JenkinsController.start_job(opts[:jenkins_url], opts[:user], opts[:password], opts[:job])
68
+ elsif ARGV[0] && ARGV[0] == "list-failures"
69
+ JenkinsController.list_failures(opts[:jenkins_url], opts[:user], opts[:password])
70
+ elsif ARGV[0] && ARGV[0] == "job-details"
71
+ JenkinsController.job_details(opts[:jenkins_url], opts[:user], opts[:password], opts[:job])
72
+ elsif ARGV[0] && ARGV[0] == "queue"
73
+ JenkinsController.queue(opts[:jenkins_url], opts[:user], opts[:password])
74
+ elsif ARGV[0] && ARGV[0] == "job-labels"
75
+ JenkinsController.job_labels(opts[:jenkins_url], opts[:user], opts[:password], opts[:job], opts[:labels])
76
+ elsif ARGV[0] && ARGV[0] == "grant-access"
77
+ JenkinsController.grant_access(opts[:jenkins_url], opts[:user], opts[:password], opts[:grant_user])
78
+ elsif ARGV[0] && ARGV[0] == "log"
79
+ JenkinsController.log(opts[:jenkins_url], opts[:user], opts[:password], opts[:job])
80
+ elsif ARGV[0] && ARGV[0] == "build-history"
81
+ JenkinsController.build_history(opts[:jenkins_url], opts[:user], opts[:password], opts[:job], opts[:limit])
82
+ elsif ARGV[0] && ARGV[0] == "build-details"
83
+ JenkinsController.build_details(opts[:jenkins_url], opts[:user], opts[:password], opts[:job], opts[:build_number])
84
+ else
85
+ puts usage
86
+ exit(1)
87
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "jenkins-cli/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "jenkins-cli"
7
+ s.version = JenkinsCLI::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Viet Nguyen"]
10
+ s.email = ["viet@ooyala.com"]
11
+ s.homepage = "http://www.ooyala.com"
12
+ s.summary = "This jenkins-cli gem is an internal tool to Ooyala for managing a Jenkins instance from the command"
13
+ s.description = "Jenkins gem"
14
+
15
+ s.rubyforge_project = "jenkins-cli"
16
+
17
+ s.add_dependency("trollop")
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.require_paths = ["lib"]
22
+ end
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_SSH_USER = "role-c3"
6
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
7
+
8
+ OPTIONS = Trollop::options do
9
+ opt :name, "Slave name", :default => nil, :type => String
10
+ opt :user, "Jenkins username", :default => nil, :type => String
11
+ opt :password, "Jenkins password", :default => nil, :type => String
12
+ opt :ssh_user, "SSH username", :default => DEFAULT_SSH_USER
13
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
14
+ opt :mode, "Jenkins slave mode", :default => "exclusive"
15
+ opt :slave_url, "Slave URL", :default => nil, :type => String
16
+ opt :v, "Verbose", :default => false
17
+ end
18
+
19
+ p OPTIONS
20
+
21
+ Trollop::die :slave_url, "Must be set with a protocol" if OPTIONS[:slave_url].nil?
22
+ Trollop::die :name, "Must be set" if OPTIONS[:name].nil?
23
+ Trollop::die :mode, "Must be either exclusive or normal" unless ["exclusive", "normal"].include?(OPTIONS[:mode])
24
+
25
+ jenkins_username = "--username #{OPTIONS[:user]}"
26
+ jenkins_username = "" if OPTIONS[:user].nil?
27
+ jenkins_password = "--password #{OPTIONS[:password]}"
28
+ jenkins_password = "" if OPTIONS[:password].nil?
29
+
30
+ groovy_params = "#{OPTIONS[:name]} #{OPTIONS[:mode]} #{OPTIONS[:slave_url]} #{OPTIONS[:ssh_user]}"
31
+
32
+ base_dir = File.dirname(__FILE__)
33
+
34
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/add_slave.groovy #{groovy_params}"
35
+
36
+ puts "Command: #{cmd}" if OPTIONS[:v]
37
+ system( cmd )
38
+
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ OPTIONS = Trollop::options do
8
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
9
+ opt :user, "Jenkins username", :default => nil, :type => String
10
+ opt :password, "Jenkins password", :default => nil, :type => St
11
+ opt :job, "Jenkins job to view the detail of", :default => nil, :type => String
12
+ opt :build_number, "Build number of a particular Jenkins job.", :default => nil, :type => String
13
+ end
14
+
15
+ Trollop::die :job, "Must specify a Jenkins job to view the details" if OPTIONS[:job].nil?
16
+
17
+ jenkins_username = "--username #{OPTIONS[:user]}"
18
+ jenkins_username = "" if OPTIONS[:user].nil?
19
+ jenkins_password = "--password #{OPTIONS[:password]}"
20
+ jenkins_password = "" if OPTIONS[:password].nil?
21
+
22
+ base_dir = File.dirname(__FILE__)
23
+
24
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/build_details.groovy #{OPTIONS[:job]} #{OPTIONS[:build_number]}"
25
+
26
+ system( cmd )
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ OPTIONS = Trollop::options do
8
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
9
+ opt :user, "Jenkins username", :default => nil, :type => String
10
+ opt :password, "Jenkins password", :default => nil, :type => String
11
+ opt :job, "Jenkins job to view the detail of", :default => nil, :type => String
12
+ opt :limit, "The number of builds in the history to show.", :default => nil, :type => String
13
+ end
14
+
15
+ Trollop::die :job, "Must specify a Jenkins job to view the details" if OPTIONS[:job].nil?
16
+
17
+ jenkins_username = "--username #{OPTIONS[:user]}"
18
+ jenkins_username = "" if OPTIONS[:user].nil?
19
+ jenkins_password = "--password #{OPTIONS[:password]}"
20
+ jenkins_password = "" if OPTIONS[:password].nil?
21
+
22
+ base_dir = File.dirname(__FILE__)
23
+
24
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/build_history.groovy #{OPTIONS[:job]} #{OPTIONS[:limit]}"
25
+
26
+ system( cmd )
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ OPTIONS = Trollop::options do
8
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
9
+ opt :user, "Jenkins username", :default => nil, :type => String
10
+ opt :password, "Jenkins password", :default => nil, :type => String
11
+ opt :projects, "Jenkins projects to disable emails from.", :default => nil, :type => String
12
+ end
13
+
14
+ Trollop::die :projects, "Must be a space delimited list of Jenkins projects" if OPTIONS[:projects].nil?
15
+
16
+ jenkins_username = "--username #{OPTIONS[:user]}"
17
+ jenkins_username = "" if OPTIONS[:user].nil?
18
+ jenkins_password = "--password #{OPTIONS[:password]}"
19
+ jenkins_password = "" if OPTIONS[:password].nil?
20
+
21
+ base_dir = File.dirname(__FILE__)
22
+
23
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/disable_email.groovy #{OPTIONS[:projects]}"
24
+
25
+ system( cmd )
26
+
27
+
28
+
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ OPTIONS = Trollop::options do
8
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
9
+ opt :user, "Jenkins username", :default => nil, :type => String
10
+ opt :password, "Jenkins password", :default => nil, :type => String
11
+ end
12
+
13
+ jenkins_username = "--username #{OPTIONS[:user]}"
14
+ jenkins_username = "" if OPTIONS[:user].nil?
15
+ jenkins_password = "--password #{OPTIONS[:password]}"
16
+ jenkins_password = "" if OPTIONS[:password].nil?
17
+
18
+ base_dir = File.dirname(__FILE__)
19
+
20
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/display_queue.groovy"
21
+
22
+ system( cmd )
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ OPTIONS = Trollop::options do
8
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
9
+ opt :user, "Jenkins username", :default => nil, :type => String
10
+ opt :password, "Jenkins password", :default => nil, :type => String
11
+ opt :projects, "Jenkins projects to disable emails from.", :default => nil, :type => String
12
+ opt :emails, "List of recipients to receive email.", :default => "", :type => String
13
+ end
14
+
15
+ Trollop::die :projects, "Must be a space delimited list of Jenkins projects" if OPTIONS[:projects].nil?
16
+
17
+ jenkins_username = "--username #{OPTIONS[:user]}"
18
+ jenkins_username = "" if OPTIONS[:user].nil?
19
+ jenkins_password = "--password #{OPTIONS[:password]}"
20
+ jenkins_password = "" if OPTIONS[:password].nil?
21
+
22
+ base_dir = File.dirname(__FILE__)
23
+
24
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/enable_email.groovy '#{OPTIONS[:projects]}' '#{OPTIONS[:emails]}'"
25
+
26
+ puts cmd
27
+
28
+ system( cmd )
29
+
30
+
31
+
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ OPTIONS = Trollop::options do
8
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
9
+ opt :user, "Jenkins username", :default => nil, :type => String
10
+ opt :password, "Jenkins password", :default => nil, :type => String
11
+ opt :grant_user, "Jenkins user to grant permissions to.", :default => nil, :type => String
12
+ end
13
+
14
+ jenkins_username = "--username #{OPTIONS[:user]}"
15
+ jenkins_username = "" if OPTIONS[:user].nil?
16
+ jenkins_password = "--password #{OPTIONS[:password]}"
17
+ jenkins_password = "" if OPTIONS[:password].nil?
18
+
19
+ base_dir = File.dirname(__FILE__)
20
+
21
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/grant_user.groovy #{OPTIONS[:grant_user]}"
22
+
23
+ system( cmd )
@@ -0,0 +1,65 @@
1
+ import hudson.model.*
2
+ import hudson.slaves.*
3
+ import hudson.plugins.sshslaves.SSHLauncher
4
+
5
+ if(this.args.length != 4) {
6
+ println("Usage: add_slave.groovy <slave_name> <exclusive/normal> <slave_url> <user>")
7
+ return
8
+ }
9
+
10
+ def slave_name = this.args[0]
11
+ def mode = this.args[1].equals("exclusive") ? Node.Mode.EXCLUSIVE : Node.Mode.NORMAL
12
+ def slave_url = this.args[2]
13
+ def user = this.args[3]
14
+
15
+ jenkins = jenkins.model.Jenkins.instance
16
+
17
+ def slaveExists = false
18
+ def slaves = jenkins.getNodes()
19
+ def currSlave = null
20
+ slaves.each {
21
+ slave ->
22
+ if(slave.getNodeName().equals( slave_name )) {
23
+ slaveExists = true
24
+ currSlave = slave
25
+ jenkins.removeNode(slave)
26
+ return
27
+ }
28
+ }
29
+
30
+ println("Attempting to modify/add Jenkins node: " + slave_name )
31
+ println(" + Slave URL: " + slave_url)
32
+ println(" + Slave Name: " + slave_name)
33
+ println(" + Mode: " + mode)
34
+ println(" + User: " + user)
35
+
36
+ sshLauncher = new SSHLauncher(
37
+ slave_url,
38
+ 22,
39
+ user,
40
+ "",
41
+ "",
42
+ "")
43
+
44
+ if( !slaveExists ) {
45
+ // Preparing a new Node to add
46
+ def node = new DumbSlave(
47
+ slave_name,
48
+ "",
49
+ "/var/lib/jenkins",
50
+ "1",
51
+ mode,
52
+ "",
53
+ sshLauncher,
54
+ RetentionStrategy.Always.INSTANCE,
55
+ new ArrayList<NodeProperty>())
56
+
57
+ jenkins.addNode( node )
58
+ } else {
59
+ // Modifying an existing Node
60
+ currSlave.setLauncher( sshLauncher )
61
+ currSlave.setMode( mode )
62
+ currSlave.setNodeName( slave_name )
63
+ // TODO
64
+ jenkins.addNode( currSlave )
65
+ }
@@ -0,0 +1,53 @@
1
+ jenkins = jenkins.model.Jenkins.instance
2
+
3
+ if(this.args.length != 2) {
4
+ println("build_details.groovy needs 1 parameter (i.e. job, build number)")
5
+ return
6
+ }
7
+
8
+ jobName = this.args[0]
9
+ buildNumber = Integer.parseInt(this.args[1])
10
+
11
+ println(jobName + " #" + buildNumber)
12
+
13
+ jenkins.items.each {
14
+ job ->
15
+ if( job.isBuildable() && job.name.equals( jobName ) ) {
16
+ def build = job.getBuildByNumber( buildNumber )
17
+ // Start date
18
+ println(" Built " + build.getTimestampString() + " ago")
19
+ // Duration
20
+ println(" Duration: " + build.getDurationString())
21
+ // Committers
22
+ println(" Potential Culprits:")
23
+ def culprits = build.getCulprits()
24
+ for(String c : culprits) {
25
+ println(" + " + c)
26
+ }
27
+ // SCM changes
28
+ println(" Changeset: ")
29
+ def changeSet = build.getChangeSet()
30
+ def items = changeSet.getItems()
31
+ for(int i = 0 ; i < items.length; i++) {
32
+ gitChangeSet = items[i]
33
+ author = gitChangeSet.getAuthorName()
34
+ comment = gitChangeSet.getComment().replaceAll("\\n", " ")
35
+ rev = gitChangeSet.getRevision()
36
+ paths = gitChangeSet.getPaths()
37
+ println(" " + (i+1) + ". " + comment)
38
+ println(" Commit: " + rev + " by (" + author + ")")
39
+ for(hudson.plugins.git.GitChangeSet.Path path : paths) {
40
+ editType = path.getEditType()
41
+ if(editType == hudson.scm.EditType.ADD) {
42
+ println(" + " + path.getPath())
43
+ } else if(editType == hudson.scm.EditType.DELETE) {
44
+ println(" - " + path.getPath())
45
+ } else if(editType == hudson.scm.EditType.EDIT) {
46
+ println(" E " + path.getPath())
47
+ }
48
+ }
49
+ }
50
+
51
+ return
52
+ }
53
+ }
@@ -0,0 +1,29 @@
1
+ jenkins = jenkins.model.Jenkins.instance
2
+
3
+ if(this.args.length < 1) {
4
+ println("build_history.groovy needs at least 1 parameter (i.e. job, optional is limit)")
5
+ return
6
+ }
7
+
8
+ jobName = this.args[0]
9
+ numRunsToShow = 10
10
+ if(this.args.length == 2) {
11
+ numRunsToShow = Integer.parseInt(this.args[1])
12
+ }
13
+
14
+ println(jobName)
15
+
16
+ jenkins.items.each {
17
+ job ->
18
+ if( job.isBuildable() && job.name.equals( jobName ) ) {
19
+ def builds = job.getBuildsAsMap().values()
20
+ int i = 0
21
+ for(hudson.model.Run build : builds) {
22
+ println(" + " + build.number + " => " + build.getResult())
23
+ i++
24
+ if(i == numRunsToShow) {
25
+ break
26
+ }
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,27 @@
1
+ jenkins = jenkins.model.Jenkins.instance
2
+
3
+ allItems = jenkins.items
4
+
5
+ def toRemove = new HashSet()
6
+
7
+ for(int i = 0 ; i < this.args.length; i++) {
8
+ toRemove.add(this.args[i].toLowerCase())
9
+ }
10
+
11
+ allItems.each {
12
+ run ->
13
+ list = run.getPublishersList()
14
+ list.each {
15
+ publisher ->
16
+ if(publisher.class == hudson.plugins.emailext.ExtendedEmailPublisher) {
17
+ if(toRemove.contains(run.name.toLowerCase())) {
18
+ println("Disabled email for " + run.name)
19
+ list.remove(publisher)
20
+ return
21
+ }
22
+ }
23
+ }
24
+ }
25
+
26
+
27
+
@@ -0,0 +1,29 @@
1
+ jenkins = jenkins.model.Jenkins.instance
2
+
3
+ def jobs = jenkins.items
4
+
5
+ def building = new ArrayList()
6
+ def queued = new ArrayList()
7
+
8
+ def queue = jenkins.getQueue()
9
+ def itemsInQueue = queue.getItems()
10
+
11
+ for(int i = 0 ; i < jobs.size() ; i++) {
12
+ if(jobs[i].isBuildable() && jobs[i].isBuilding()) {
13
+ building.add(jobs[i].name)
14
+ } else if(jobs[i].isBuildable() && jobs[i].isInQueue()) {
15
+ queued.add(jobs[i].name)
16
+ }
17
+ }
18
+
19
+ println("Items currently building:")
20
+ for(int i = 0 ; i < building.size(); i++) {
21
+ println(" + " + building[i])
22
+ }
23
+ println()
24
+ println("Items in the build queue:")
25
+ for(int i = itemsInQueue.length - 1 ; i >= 0; i--) {
26
+ println(" + " + itemsInQueue[i].task.getName())
27
+ }
28
+
29
+
@@ -0,0 +1,36 @@
1
+ import hudson.plugins.emailext.*
2
+
3
+ jenkins = jenkins.model.Jenkins.instance
4
+
5
+ allItems = jenkins.items
6
+
7
+ allItems.each {
8
+ run ->
9
+ list = run.getPublishersList()
10
+ list.each {
11
+ publisher ->
12
+ if(publisher.class == hudson.plugins.emailext.ExtendedEmailPublisher) {
13
+ println(publisher)
14
+
15
+ emailType = new hudson.plugins.emailext.EmailType()
16
+ emailType.setSendToDevelopers(true)
17
+ emailType.setSendToRecipientList(true)
18
+
19
+ unstableTrigger = new hudson.plugins.emailext.plugins.trigger.UnstableTrigger()
20
+ unstableTrigger.setEmail(emailType)
21
+
22
+ publisher.getConfiguredTriggers().add( unstableTrigger )
23
+
24
+ triggers = publisher.getConfiguredTriggers()
25
+ triggers.each {
26
+ trigger ->
27
+ email = trigger.getEmail()
28
+ println("Send to Developers: " + email.getSendToDevelopers())
29
+
30
+ }
31
+ }
32
+ }
33
+ }
34
+
35
+
36
+
@@ -0,0 +1,72 @@
1
+ import hudson.plugins.emailext.*
2
+
3
+ jenkins = jenkins.model.Jenkins.instance
4
+
5
+ allItems = jenkins.items
6
+
7
+ if(this.args.length != 2) {
8
+ println("enable_email.groovy requires exactly 2 paramters: <projects> <emails>")
9
+ return
10
+ }
11
+
12
+ def projects = this.args[0].split(" ")
13
+ def emails = this.args[1]
14
+ def toAdd = new HashSet()
15
+
16
+ for(int i = 0 ; i < projects.length ; i++) {
17
+ toAdd.add(projects[i].toLowerCase())
18
+ }
19
+
20
+ allItems.each {
21
+ run ->
22
+ if(toAdd.contains(run.name.toLowerCase())) {
23
+ def alreadyEnabled = false
24
+ list = run.getPublishersList()
25
+ list.each {
26
+ publisher ->
27
+ if(publisher.class == hudson.plugins.emailext.ExtendedEmailPublisher) {
28
+ publisher.recipientList = emails
29
+ alreadyEnabled = true
30
+ println(run.name.toLowerCase() + " was updated with new email recipients.")
31
+ }
32
+ }
33
+ if( !alreadyEnabled ) {
34
+ // Set up the email publisher
35
+ emailPublisher = new hudson.plugins.emailext.ExtendedEmailPublisher()
36
+ emailPublisher.defaultSubject = '$DEFAULT_SUBJECT'
37
+ emailPublisher.defaultContent = '$DEFAULT_CONTENT'
38
+ emailPublisher.recipientList = emails
39
+
40
+ triggers = emailPublisher.getEmailTriggers().clear()
41
+ emailType = new hudson.plugins.emailext.EmailType()
42
+ emailType.setSendToDevelopers(true)
43
+ emailType.setSendToRecipientList(true)
44
+ emailType.setSubject(hudson.plugins.emailext.ExtendedEmailPublisher.PROJECT_DEFAULT_SUBJECT_TEXT)
45
+ emailType.setBody(hudson.plugins.emailext.ExtendedEmailPublisher.PROJECT_DEFAULT_BODY_TEXT)
46
+
47
+ failureTrigger = new hudson.plugins.emailext.plugins.trigger.FailureTrigger()
48
+ failureTrigger.setEmail(emailType)
49
+
50
+ unstableTrigger = new hudson.plugins.emailext.plugins.trigger.UnstableTrigger()
51
+ unstableTrigger.setEmail(emailType)
52
+
53
+ fixedTrigger = new hudson.plugins.emailext.plugins.trigger.FixedTrigger()
54
+ fixedTrigger.setEmail(emailType)
55
+
56
+ emailPublisher.addEmailTriggerType( failureTrigger.getDescriptor() )
57
+ emailPublisher.addEmailTriggerType( unstableTrigger.getDescriptor() )
58
+ emailPublisher.addEmailTriggerType( fixedTrigger.getDescriptor() )
59
+ emailPublisher.getConfiguredTriggers().add( failureTrigger )
60
+ emailPublisher.getConfiguredTriggers().add( unstableTrigger )
61
+ emailPublisher.getConfiguredTriggers().add( fixedTrigger )
62
+
63
+ // Add the email publisher
64
+ list.add(emailPublisher)
65
+
66
+ println("Enabled emails for " + run.name.toLowerCase())
67
+ }
68
+ }
69
+ }
70
+
71
+
72
+
@@ -0,0 +1,4 @@
1
+ jenkins = jenkins.model.Jenkins.instance
2
+
3
+ println("Functionality not implemented.")
4
+
@@ -0,0 +1,57 @@
1
+ jenkins = jenkins.model.Jenkins.instance
2
+
3
+ if(this.args.length != 1) {
4
+ println("job_details.groovy needs exactly 1 parameter (i.e. job)")
5
+ return
6
+ }
7
+
8
+ targetJobName = this.args[0]
9
+
10
+ allItems = jenkins.items
11
+ activeJobs = allItems.each {
12
+ job ->
13
+ if(job.isBuildable() && job.name.equals( targetJobName )) {
14
+ def isQueued = job.isInQueue()
15
+ def isBuilding = job.isBuilding()
16
+ def status = "UNKNOWN"
17
+ if( !isQueued && !isBuilding && job.lastBuild != null) {
18
+ status = job.lastBuild.result
19
+ } else if( isQueued ) {
20
+ status = "Queued"
21
+ } else if( isBuilding ) {
22
+ status = "In Progress"
23
+ }
24
+
25
+ def lastSuccess = "N/A"
26
+ now = System.currentTimeMillis()
27
+ if(job.lastSuccessfulBuild != null) {
28
+ jobStartTime = job.lastSuccessfulBuild.timestamp.time.getTime()
29
+ lastSuccess = (now - jobStartTime) / 1000 / 60 // time difference in minutes
30
+ }
31
+
32
+ def lastFailed = "N/A"
33
+ if(job.lastFailedBuild != null) {
34
+ jobStartTime = job.lastFailedBuild.timestamp.time.getTime()
35
+ lastFailed = (now - jobStartTime) / 1000 / 60 // time difference in minutes
36
+ }
37
+
38
+ def recipients = ""
39
+ publisherList = job.getPublishersList()
40
+ publisherList.each {
41
+ publisher ->
42
+ if(publisher.class == hudson.plugins.emailext.ExtendedEmailPublisher) {
43
+ recipients = publisher.recipientList
44
+ }
45
+ }
46
+
47
+ println("Job -> " + job.name)
48
+ println(" Status: " + status)
49
+ println(" Last Successful Build: " + (int)lastSuccess + " minutes ago")
50
+ println(" Last Failed Build: " + (int)lastFailed + " minutes ago")
51
+ println(" Label Expression: " + job.getAssignedLabelString())
52
+ println(" Email Recipients: " + recipients)
53
+ }
54
+ }
55
+
56
+
57
+
@@ -0,0 +1,20 @@
1
+ jenkins = jenkins.model.Jenkins.instance
2
+
3
+ allItems = jenkins.items
4
+ activeJobs = allItems.findAll {
5
+ job ->
6
+ job.isBuildable()
7
+ }
8
+
9
+ failedRuns = activeJobs.findAll {
10
+ job ->
11
+ job.lastBuild != null && (job.lastBuild.result == hudson.model.Result.FAILURE || job.lastBuild.result == hudson.model.Result.UNSTABLE)
12
+ }
13
+
14
+ println("\nJobs:")
15
+ failedRuns.each {
16
+ run ->
17
+ println(" + " + run.name)
18
+ }
19
+
20
+ println("\n" + failedRuns.size + " failed Jenkins jobs")
@@ -0,0 +1,12 @@
1
+ jenkins = jenkins.model.Jenkins.instance
2
+
3
+ allItems = jenkins.items
4
+
5
+ println("Available Jenkins jobs:")
6
+
7
+ allItems.each {
8
+ run ->
9
+ println(" + " + run.name)
10
+ }
11
+
12
+
@@ -0,0 +1,24 @@
1
+ jenkins = jenkins.model.Jenkins.instance
2
+
3
+ if(this.args.length != 2) {
4
+ println("modify_labels.groovy needs exactly 2 parameter (i.e. <job> <label_string>)")
5
+ return
6
+ }
7
+
8
+ targetJobName = this.args[0]
9
+ labelStr = this.args[1]
10
+
11
+ allItems = jenkins.items
12
+ activeJobs = allItems.each {
13
+ job ->
14
+ if(job.isBuildable() && job.name.equals( targetJobName )) {
15
+ def labelAtom = new hudson.model.labels.LabelAtom(labelStr)
16
+ job.setAssignedLabel( labelAtom )
17
+ println("Raw Input: " + labelStr)
18
+ println("Input: " + labelAtom.getExpression())
19
+ println("Assigned label string is " + job.getAssignedLabelString())
20
+ }
21
+ }
22
+
23
+
24
+
@@ -0,0 +1,10 @@
1
+ import hudson.plugins.sshslaves.SSHLauncher
2
+
3
+ jenkins = jenkins.model.Jenkins.instance
4
+
5
+ def nodes = jenkins.getNodes()
6
+
7
+ nodes.each {
8
+ node ->
9
+ println(node.getLauncher())
10
+ }
@@ -0,0 +1,33 @@
1
+ jenkins = jenkins.model.Jenkins.instance
2
+
3
+ allItems = jenkins.items
4
+
5
+ if(this.args.length != 1) {
6
+ println("job_details.groovy needs exactly 1 parameter (i.e. job)")
7
+ return
8
+ }
9
+
10
+ targetJobName = this.args[0]
11
+
12
+ allItems.each {
13
+ job ->
14
+ if(job.isBuildable() && job.name.equals( targetJobName )) {
15
+ inputStream = job.getLastBuild().getLogInputStream()
16
+ println(inputStream)
17
+ def c = ' '
18
+ def firstTime = true
19
+ while( firstTime || job.isBuilding() ) {
20
+ firstTime = false
21
+ while( (c = inputStream.read()) != -1 ) {
22
+ print((char)c)
23
+ }
24
+ Thread.sleep(1000)
25
+ }
26
+ }
27
+ }
28
+
29
+ println()
30
+ println("*** END OF LOG ***")
31
+
32
+
33
+
Binary file
@@ -0,0 +1,3 @@
1
+ module JenkinsCLI
2
+ VERSION = "1.0.3"
3
+ end
@@ -0,0 +1,110 @@
1
+ class JenkinsController
2
+ def self.build_history(jenkins_url, user, password, job, limit)
3
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
4
+ user = "--user #{user}" unless user.nil?
5
+ password = "--password #{password}" unless password.nil?
6
+ job = "--job #{job}" unless job.nil?
7
+ limit = "--limit #{limit}" unless limit.nil?
8
+ system "#{File.dirname(__FILE__)}/build_history.rb #{jenkins_url} #{user} #{password} #{job} #{limit}"
9
+ end
10
+
11
+ def self.build_details(jenkins_url, user, password, job, num)
12
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
13
+ user = "--user #{user}" unless user.nil?
14
+ password = "--password #{password}" unless password.nil?
15
+ job = "--job #{job}" unless job.nil?
16
+ build_number = "--build-number #{num}" unless num.nil?
17
+ system "#{File.dirname(__FILE__)}/build_details.rb #{jenkins_url} #{user} #{password} #{job} #{build_number}"
18
+ end
19
+
20
+ def self.log(jenkins_url, user, password, job)
21
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
22
+ user = "--user #{user}" unless user.nil?
23
+ password = "--password #{password}" unless password.nil?
24
+ job = "--job #{job}" unless job.nil?
25
+ system "#{File.dirname(__FILE__)}/stream_log.rb #{jenkins_url} #{user} #{password} #{job}"
26
+ end
27
+
28
+ def self.grant_access(jenkins_url, user, password, grant_user)
29
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
30
+ user = "--user #{user}" unless user.nil?
31
+ password = "--password #{password}" unless password.nil?
32
+ grant_user = "--grant-user #{grant_user}" unless grant_user.nil?
33
+ system "#{File.dirname(__FILE__)}/grant_user.rb #{jenkins_url} #{user} #{password} #{grant_user}"
34
+ end
35
+
36
+ def self.job_labels(jenkins_url, user, password, job, labels)
37
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
38
+ user = "--user #{user}" unless user.nil?
39
+ password = "--password #{password}" unless password.nil?
40
+ job = "--job #{job}" unless job.nil?
41
+ labels = "--labels '#{labels}'" unless labels.nil?
42
+ system "#{File.dirname(__FILE__)}/job_labels.rb #{jenkins_url} #{user} #{password} #{job} #{labels}"
43
+ end
44
+
45
+ def self.queue(jenkins_url, user, password)
46
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
47
+ user = "--user #{user}" unless user.nil?
48
+ password = "--password #{password}" unless password.nil?
49
+ system "#{File.dirname(__FILE__)}/display_queue.rb #{jenkins_url} #{user} #{password}"
50
+ end
51
+
52
+ def self.job_details(jenkins_url, user, password, job)
53
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
54
+ user = "--user #{user}" unless user.nil?
55
+ password = "--password #{password}" unless password.nil?
56
+ job = "--job #{job}" unless job.nil?
57
+ system "#{File.dirname(__FILE__)}/job_details.rb #{jenkins_url} #{user} #{password} #{job}"
58
+ end
59
+
60
+ def self.list_failures(jenkins_url, user, password)
61
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
62
+ user = "--user #{user}" unless user.nil?
63
+ password = "--password #{password}" unless password.nil?
64
+ system "#{File.dirname(__FILE__)}/list_failing_jobs.rb #{jenkins_url} #{user} #{password}"
65
+ end
66
+
67
+ def self.start_job(jenkins_url, user, password, job)
68
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
69
+ user = "--user #{user}" unless user.nil?
70
+ password = "--password #{password}" unless password.nil?
71
+ job = "--job #{job}" unless job.nil?
72
+ system "#{File.dirname(__FILE__)}/start_job.rb #{jenkins_url} #{user} #{password} #{job}"
73
+ end
74
+
75
+ def self.list_jobs(jenkins_url, user, password)
76
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
77
+ user = "--user #{user}" unless user.nil?
78
+ password = "--password #{password}" unless password.nil?
79
+ system "#{File.dirname(__FILE__)}/list_jobs.rb #{jenkins_url} #{user} #{password}"
80
+ end
81
+
82
+ def self.disable_email(jenkins_url, user, password, projects)
83
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
84
+ user = "--user #{user}" unless user.nil?
85
+ password = "--password #{password}" unless password.nil?
86
+ projects = "--projects '#{projects}'" unless projects.nil?
87
+ system "#{File.dirname(__FILE__)}/disable_emails.rb #{jenkins_url} #{user} #{password} #{projects}"
88
+ end
89
+
90
+ def self.enable_email(jenkins_url, user, password, projects, emails)
91
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
92
+ user = "--user #{user}" unless user.nil?
93
+ password = "--password #{password}" unless password.nil?
94
+ projects = "--projects '#{projects}'" unless projects.nil?
95
+ emails = "--emails '#{emails}'" unless emails.nil?
96
+ system "#{File.dirname(__FILE__)}/enable_emails.rb #{jenkins_url} #{user} #{password} #{projects} #{emails}"
97
+ end
98
+
99
+ def self.add_node(jenkins_url, user, password, name, ssh_user, mode, slave_url, v)
100
+ jenkins_url = "--jenkins-url #{jenkins_url}" unless jenkins_url.nil?
101
+ user = "--user #{user}" unless user.nil?
102
+ password = "--password #{password}" unless password.nil?
103
+ name = "--name #{name}" unless name.nil?
104
+ ssh_user = "--ssh-user #{ssh_user}" unless ssh_user.nil?
105
+ mode = "--mode #{mode}" unless mode.nil?
106
+ slave_url = "--slave-url #{slave_url}" unless slave_url.nil?
107
+ v = "--v #{v}" unless v.nil?
108
+ system "#{File.dirname(__FILE__)}/add_executor.rb #{jenkins_url} #{user} #{password} #{name} #{ssh_user} #{mode} #{slave_url} #{v}"
109
+ end
110
+ end
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ OPTIONS = Trollop::options do
8
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
9
+ opt :user, "Jenkins username", :default => nil, :type => String
10
+ opt :password, "Jenkins password", :default => nil, :type => String
11
+ opt :job, "Jenkins job to view the detail of", :default => nil, :type => String
12
+ end
13
+
14
+ Trollop::die :job, "Must specify a Jenkins job to view the details" if OPTIONS[:job].nil?
15
+
16
+ jenkins_username = "--username #{OPTIONS[:user]}"
17
+ jenkins_username = "" if OPTIONS[:user].nil?
18
+ jenkins_password = "--password #{OPTIONS[:password]}"
19
+ jenkins_password = "" if OPTIONS[:password].nil?
20
+
21
+ base_dir = File.dirname(__FILE__)
22
+
23
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/job_details.groovy #{OPTIONS[:job]}"
24
+
25
+ system( cmd )
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ OPTIONS = Trollop::options do
8
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
9
+ opt :user, "Jenkins username", :default => nil, :type => String
10
+ opt :password, "Jenkins password", :default => nil, :type => String
11
+ opt :job, "Jenkins job to view the detail of", :default => nil, :type => String
12
+ opt :labels, "A Jenkins label expression", :default => nil, :type => String
13
+ end
14
+
15
+ Trollop::die :job, "Must specify a Jenkins job to view the details" if OPTIONS[:job].nil?
16
+ Trollop::die :labels, "Must specify a label" if OPTIONS[:labels].nil?
17
+
18
+ jenkins_username = "--username #{OPTIONS[:user]}"
19
+ jenkins_username = "" if OPTIONS[:user].nil?
20
+ jenkins_password = "--password #{OPTIONS[:password]}"
21
+ jenkins_password = "" if OPTIONS[:password].nil?
22
+
23
+ base_dir = File.dirname(__FILE__)
24
+
25
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/modify_labels.groovy #{OPTIONS[:job]} '#{OPTIONS[:labels]}'"
26
+
27
+ system( cmd )
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ # TODO(viet): Add the ability to search jobs with prefixes.
8
+ # TODO(viet): Add the ability to show more detail of specific jobs (e.g. labels, repos, lastSuccess, jobStatus)
9
+
10
+ OPTIONS = Trollop::options do
11
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
12
+ opt :user, "Jenkins username", :default => nil, :type => String
13
+ opt :password, "Jenkins password", :default => nil, :type => String
14
+ end
15
+
16
+ jenkins_username = "--username #{OPTIONS[:user]}"
17
+ jenkins_username = "" if OPTIONS[:user].nil?
18
+ jenkins_password = "--password #{OPTIONS[:password]}"
19
+ jenkins_password = "" if OPTIONS[:password].nil?
20
+
21
+ base_dir = File.dirname(__FILE__)
22
+
23
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/list_failing_jobs.groovy"
24
+
25
+ system( cmd )
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ # TODO(viet): Add the ability to search jobs with prefixes.
8
+ # TODO(viet): Add the ability to show more detail of specific jobs (e.g. labels, repos, lastSuccess, jobStatus)
9
+
10
+ OPTIONS = Trollop::options do
11
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
12
+ opt :user, "Jenkins username", :default => nil, :type => String
13
+ opt :password, "Jenkins password", :default => nil, :type => String
14
+ end
15
+
16
+ jenkins_username = "--username #{OPTIONS[:user]}"
17
+ jenkins_username = "" if OPTIONS[:user].nil?
18
+ jenkins_password = "--password #{OPTIONS[:password]}"
19
+ jenkins_password = "" if OPTIONS[:password].nil?
20
+
21
+ base_dir = File.dirname(__FILE__)
22
+
23
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/list_nodes.groovy"
24
+
25
+ system( cmd )
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ # TODO(viet): Add the ability to search jobs with prefixes.
8
+ # TODO(viet): Add the ability to show more detail of specific jobs (e.g. labels, repos, lastSuccess, jobStatus)
9
+
10
+ OPTIONS = Trollop::options do
11
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
12
+ opt :user, "Jenkins username", :default => nil, :type => String
13
+ opt :password, "Jenkins password", :default => nil, :type => String
14
+ opt :job, "Jenkins job to start", :default => nil, :type => String
15
+ end
16
+
17
+ Trollop::die :job, "Must define a job to start" if OPTIONS[:job].nil?
18
+
19
+ jenkins_username = "--username #{OPTIONS[:user]}"
20
+ jenkins_username = "" if OPTIONS[:user].nil?
21
+ jenkins_password = "--password #{OPTIONS[:password]}"
22
+ jenkins_password = "" if OPTIONS[:password].nil?
23
+
24
+ base_dir = File.dirname(__FILE__)
25
+
26
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} build #{OPTIONS[:job]} #{jenkins_username} #{jenkins_password}"
27
+
28
+ system( cmd )
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "trollop"
4
+
5
+ DEFAULT_JENKINS_URL = "http://localhost:8080"
6
+
7
+ OPTIONS = Trollop::options do
8
+ opt :jenkins_url, "Jenkins main URL", :default => DEFAULT_JENKINS_URL
9
+ opt :user, "Jenkins username", :default => nil, :type => String
10
+ opt :password, "Jenkins password", :default => nil, :type => String
11
+ opt :job, "Jenkins job to view the detail of", :default => nil, :type => String
12
+ end
13
+
14
+ Trollop::die :job, "Must specify a Jenkins job to view the details" if OPTIONS[:job].nil?
15
+
16
+ jenkins_username = "--username #{OPTIONS[:user]}"
17
+ jenkins_username = "" if OPTIONS[:user].nil?
18
+ jenkins_password = "--password #{OPTIONS[:password]}"
19
+ jenkins_password = "" if OPTIONS[:password].nil?
20
+
21
+ base_dir = File.dirname(__FILE__)
22
+
23
+ cmd = "java -jar #{base_dir}/jenkins-cli.jar -s #{OPTIONS[:jenkins_url]} groovy #{jenkins_username} #{jenkins_password} #{base_dir}/groovy/stream_log.groovy #{OPTIONS[:job]}"
24
+
25
+ system( cmd )
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jenkins-cli
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.0.3
6
+ platform: ruby
7
+ authors:
8
+ - Viet Nguyen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2012-01-01 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: trollop
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ description: Jenkins gem
27
+ email:
28
+ - viet@ooyala.com
29
+ executables:
30
+ - jenkins-cli
31
+ extensions: []
32
+
33
+ extra_rdoc_files: []
34
+
35
+ files:
36
+ - Gemfile
37
+ - README
38
+ - Rakefile
39
+ - TODO
40
+ - bin/jenkins-cli
41
+ - jenkins-cli.gemspec
42
+ - lib/add_executor.rb
43
+ - lib/build_details.rb
44
+ - lib/build_history.rb
45
+ - lib/disable_emails.rb
46
+ - lib/display_queue.rb
47
+ - lib/enable_emails.rb
48
+ - lib/grant_user.rb
49
+ - lib/groovy/add_slave.groovy
50
+ - lib/groovy/build_details.groovy
51
+ - lib/groovy/build_history.groovy
52
+ - lib/groovy/disable_email.groovy
53
+ - lib/groovy/display_queue.groovy
54
+ - lib/groovy/email_details.groovy
55
+ - lib/groovy/enable_email.groovy
56
+ - lib/groovy/grant_user.groovy
57
+ - lib/groovy/job_details.groovy
58
+ - lib/groovy/list_failing_jobs.groovy
59
+ - lib/groovy/list_nodes.groovy
60
+ - lib/groovy/modify_labels.groovy
61
+ - lib/groovy/nodes.groovy
62
+ - lib/groovy/stream_log.groovy
63
+ - lib/jenkins-cli.jar
64
+ - lib/jenkins-cli/version.rb
65
+ - lib/jenkins_controller.rb
66
+ - lib/job_details.rb
67
+ - lib/job_labels.rb
68
+ - lib/list_failing_jobs.rb
69
+ - lib/list_jobs.rb
70
+ - lib/start_job.rb
71
+ - lib/stream_log.rb
72
+ homepage: http://www.ooyala.com
73
+ licenses: []
74
+
75
+ post_install_message:
76
+ rdoc_options: []
77
+
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: "0"
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: "0"
92
+ requirements: []
93
+
94
+ rubyforge_project: jenkins-cli
95
+ rubygems_version: 1.8.11
96
+ signing_key:
97
+ specification_version: 3
98
+ summary: This jenkins-cli gem is an internal tool to Ooyala for managing a Jenkins instance from the command
99
+ test_files: []
100
+