forked from samrocketman/jenkins-script-console-scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ec2-agents-provision-max-capacity.groovy
71 lines (60 loc) · 2.99 KB
/
ec2-agents-provision-max-capacity.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
Copyright (c) 2015-2022 Sam Gleske - https://github.com/samrocketman/jenkins-script-console-scripts
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
When given an agent label associated with an EC2 plugin template, this
script will provision the EC2 template to max capacity.
WARNING this script was tested when provisioning limits were defined for the
EC2 plugin with only 1 template. Multiple templates and labels were not
tested. This was also not tested without EC2 limits set. This was tested
in a very simple environment where agent labels for EC2 instances did not
conflict with any other Jenkins agent labels.
WARNING THIS SCRIPT MAY COST YOU REAL MONEY BECAUSE YOUR AWS CAPACITY MAY
NOT BE FREE. I AM NOT RESPONSIBLE AND YOU HAVE BEEN WARNED.
ec2 plugin 1.41
*/
import hudson.model.Label
import hudson.model.Node
import hudson.model.labels.LabelAtom
import hudson.plugins.ec2.AmazonEC2Cloud
import hudson.plugins.ec2.EC2AbstractSlave
import hudson.plugins.ec2.SlaveTemplate
import jenkins.model.Jenkins
// provision max EC2 instances for agent label
String agent_label = 'aws-agent'
Label agent = (Jenkins.instance.getLabel(agent_label)) ?: (new LabelAtom(agent_label))
Jenkins.instance.clouds.findAll { cloud ->
int current_agents = agent.nodes.findAll { node ->
node in EC2AbstractSlave &&
node.cloud.is(cloud)
}.size()
(cloud in AmazonEC2Cloud) &&
cloud.canProvision(agent) &&
(cloud.getTemplate(agent).instanceCap - current_agents) > 0
}.each { AmazonEC2Cloud cloud ->
SlaveTemplate t = cloud.getTemplate(agent)
int desired_agents = t.instanceCap - agent.nodes.findAll {
it in EC2AbstractSlave &&
it.cloud.is(cloud)
}.size()
List<Node> nodes = t.provision(desired_agents, EnumSet.of(SlaveTemplate.ProvisionOptions.FORCE_CREATE))
nodes.each { node ->
Jenkins.instance.addNode(node)
}
println "Provisioned ${nodes.size()} new agents."
} ?: println('No agents provisioned.')
null