Last active
September 15, 2023 05:03
-
-
Save ivan-pinatti/97a5d3b352b035cddaabf25630c365e4 to your computer and use it in GitHub Desktop.
Jenkins - Set AWS EC2 remote slaves plugin parameters via groovy script - #jenkins #groovy #aws #ec2 #jenkins-aws #jenkins-ec2 #jenkins-slave #jenkins-slaves #jenkins-ec2-slaves
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!groovy | |
// imports | |
import com.amazonaws.services.ec2.model.InstanceType | |
import com.cloudbees.jenkins.plugins.awscredentials.AWSCredentialsImpl | |
import com.cloudbees.plugins.credentials.* | |
import com.cloudbees.plugins.credentials.domains.Domain | |
import hudson.model.* | |
import hudson.plugins.ec2.AmazonEC2Cloud | |
import hudson.plugins.ec2.AMITypeData | |
import hudson.plugins.ec2.EC2Tag | |
import hudson.plugins.ec2.SlaveTemplate | |
import hudson.plugins.ec2.SpotConfiguration | |
import hudson.plugins.ec2.UnixData | |
import jenkins.model.Jenkins | |
// parameters | |
def SlaveTemplateUsEast1Parameters = [ | |
ami: 'ami-AAAAAAAA', | |
associatePublicIp: false, | |
connectBySSHProcess: true, | |
connectUsingPublicIp: false, | |
customDeviceMapping: '', | |
deleteRootOnTermination: true, | |
description: 'Jenkins slave EC2 US East 1', | |
ebsOptimized: false, | |
iamInstanceProfile: '', | |
idleTerminationMinutes: '5', | |
initScript: '', | |
instanceCapStr: '2', | |
jvmopts: '', | |
labelString: 'aws.ec2.us.east.jenkins.slave', | |
launchTimeoutStr: '', | |
numExecutors: '1', | |
remoteAdmin: 'ec2-user', | |
remoteFS: '', | |
securityGroups: 'sg-11111111', | |
stopOnTerminate: false, | |
subnetId: 'subnet-SSSSSSSS', | |
tags: new EC2Tag('Name', 'jenkins-slave'), | |
tmpDir: '', | |
type: 't2.medium', | |
useDedicatedTenancy: false, | |
useEphemeralDevices: true, | |
usePrivateDnsName: true, | |
userData: '', | |
zone: 'us-east-1a,us-east-1b' | |
] | |
def SlaveTemplateCaCentral1Parameters = [ | |
ami: 'ami-AAAAAAAA', | |
associatePublicIp: false, | |
connectBySSHProcess: true, | |
connectUsingPublicIp: false, | |
customDeviceMapping: '', | |
deleteRootOnTermination: true, | |
description: 'Jenkins slave EC2 CA Central 1', | |
ebsOptimized: false, | |
iamInstanceProfile: '', | |
idleTerminationMinutes: '5', | |
initScript: '', | |
instanceCapStr: '2', | |
jvmopts: '', | |
labelString: 'aws.ec2.ca.central.jenkins.slave', | |
launchTimeoutStr: '', | |
numExecutors: '1', | |
remoteAdmin: 'ec2-user', | |
remoteFS: '', | |
securityGroups: 'sg-11111111', | |
stopOnTerminate: false, | |
subnetId: 'subnet-SSSSSSSS', | |
tags: new EC2Tag('Name', 'jenkins-slave'), | |
tmpDir: '', | |
type: 't2.medium', | |
useDedicatedTenancy: false, | |
useEphemeralDevices: true, | |
usePrivateDnsName: true, | |
userData: '', | |
zone: 'ca-central-1a,ca-central-1b' | |
] | |
def AmazonEC2CloudParameters = [ | |
cloudName: 'MyCompany', | |
credentialsId: 'jenkins-aws-key', | |
instanceCapStr: '2', | |
privateKey: '''-----BEGIN RSA PRIVATE KEY----- | |
MIIEogIBAAKCAQEAkjaolzS/3wlfDfQkaXyuBQ5VaodY9/0tm8BUdcfGmv7MQLUg | |
G12MNC5MLcR0Oj4NIOJZEZvH3afPmk5UZ1hZWRWupokSXDM3alNFoWzt0SKDTsig | |
nHrqouojRbTqZG8dlmAOHom3mTzj3OFG7PyLdsAEOcrVXwnqgBn7mDriXz+dLkFY | |
QctsJHXpm3XBNVaZ/Rmx7vAwFSg3XO0DkjRjR2mXadyh4yQX/bMqr1VEAYBBjGtZ | |
ri9OXAnoBMduNndeRTQ6i4xA2mBW7zcg4qksHUd+0jKN5t8cVxqOSOcCCztgwaXh | |
xEa9/SMIS+FR6NOrUQ+w0MxWsspHogWNWif9IQIDAQABAoIBAGLt9r5wY46OsbEo | |
SubRBJHJNAQjVhBdTtm+lacnp/rBggQaSYIalr3LwaGJ9jZeO9XPMQLYC7CvVamL | |
bFKMlc/P+t8VicW2pb0cYNWrdXH2zy+kUf/urwnSMFF+6sVP5Y4UqhkBh6d4apjO | |
GIZLDjYoD/PmiN6IQBGzAufql7ZntgUohYYkHM/ovskZSR6fSKXn91sirlmisfhE | |
/74kGfJF2+S/+HYtpcCgYkSYs/c0Ibzw8wEnNaCK+I0zn4Ppp53ip3hOiI3+0EVY | |
qnNisqL5yj8wjj1QFfwkVyWCtr7p0U4A4aDza35rxDKpZW/PcZNRK5pbLQzriqo5 | |
J9DOQJ0CgYEA2HGwf+GjRMoJCcONjHKP8NJ3KoSBFj0ujJAxhIOyxJveMMS5agCH | |
94yNReZEppV7C/1fpcPb9GL38tfAb6VdGHOlFmq7djgkCKH+F7/PvDJ+u+1G871K | |
YtvEFlHT6IPUouEfSj+7/eRxZwNEuKkM2x4dOqPXbvKU63HJkxRFdz8CgYEArO89 | |
WARI2+o82V3ldPEZAIfri+4HD0nYW7UY4hbExdyuYTKL619Wt1nr91ubCnpR5/1s | |
xfesBGYHlqsAuHi4tXCaU9aDyK9j+MnWUkDMvG5RXWzLDmrrfmFlohHc6r7HuVuR | |
gtVayj8izcZpXew6Vo3ENRdvfxCzT2V7OPnG058CgYAOb465CMCN7vepWgyPyHhH | |
NJJUGKBPbmczYs6aqvn6WPb5w7UmF8D5xrsJZXFAtwmM5CpD8QszgoJNBQzFpX7P | |
Ca+CDj5QhTAKD1vWE6n0QF3phMrNqNtUOpoabvy2Lky5TFB88EFGjrzthO9JbaT4 | |
3EpQxeqxcKZ0CZPLJnf3mwKBgFu46IhufVZm/q8rpjBIUEJ/1Ob68LOjLyY0/2Wr | |
PeLUEYlsDdphTtUg1I71/12nUxoAyFiX7JzIoO3A9TjijtVtS+17sZoXrKagJxSp | |
We33dSBgO7MB8rWtYwJ7BvlbBwPBFYSXNPhgVE1gFzLBwI930cF3FKQIb5KE+L5X | |
fKVxAoGAcvNM9HpgtR3ngP7xWkeOWVkV6NDc2GbuYptbAMM7lY2DzG2Dbq1ru6iJ | |
n5CNoNomPrHA05Zx2e+DbmrDbJVowSlX5xJKbc3ttYsBZlqYdZmWllpG1np8snwd | |
I2vmggm6Uubt0s433SbMwgXonolPH0N7s8VdzVf0/moMUujYcE0= | |
-----END RSA PRIVATE KEY-----''', | |
region: 'us-east-1', | |
useInstanceProfileForCredentials: false | |
] | |
def AWSCredentialsImplParameters = [ | |
id: 'jenkins-aws-key', | |
description: 'Jenkins AWS IAM key', | |
accessKey: '01234567890123456789', | |
secretKey: '01345645657987987987987987987987987987' | |
] | |
// https://github.com/jenkinsci/aws-credentials-plugin/blob/aws-credentials-1.23/src/main/java/com/cloudbees/jenkins/plugins/awscredentials/AWSCredentialsImpl.java | |
AWSCredentialsImpl aWSCredentialsImpl = new AWSCredentialsImpl( | |
CredentialsScope.GLOBAL, | |
AWSCredentialsImplParameters.id, | |
AWSCredentialsImplParameters.accessKey, | |
AWSCredentialsImplParameters.secretKey, | |
AWSCredentialsImplParameters.description | |
) | |
// https://github.com/jenkinsci/ec2-plugin/blob/ec2-1.38/src/main/java/hudson/plugins/ec2/SlaveTemplate.java | |
SlaveTemplate slaveTemplateUsEast1 = new SlaveTemplate( | |
SlaveTemplateUsEast1Parameters.ami, | |
SlaveTemplateUsEast1Parameters.zone, | |
null, | |
SlaveTemplateUsEast1Parameters.securityGroups, | |
SlaveTemplateUsEast1Parameters.remoteFS, | |
InstanceType.fromValue(SlaveTemplateUsEast1Parameters.type), | |
SlaveTemplateUsEast1Parameters.ebsOptimized, | |
SlaveTemplateUsEast1Parameters.labelString, | |
Node.Mode.NORMAL, | |
SlaveTemplateUsEast1Parameters.description, | |
SlaveTemplateUsEast1Parameters.initScript, | |
SlaveTemplateUsEast1Parameters.tmpDir, | |
SlaveTemplateUsEast1Parameters.userData, | |
SlaveTemplateUsEast1Parameters.numExecutors, | |
SlaveTemplateUsEast1Parameters.remoteAdmin, | |
new UnixData(null, null, null), | |
SlaveTemplateUsEast1Parameters.jvmopts, | |
SlaveTemplateUsEast1Parameters.stopOnTerminate, | |
SlaveTemplateUsEast1Parameters.subnetId, | |
[SlaveTemplateUsEast1Parameters.tags], | |
SlaveTemplateUsEast1Parameters.idleTerminationMinutes, | |
SlaveTemplateUsEast1Parameters.usePrivateDnsName, | |
SlaveTemplateUsEast1Parameters.instanceCapStr, | |
SlaveTemplateUsEast1Parameters.iamInstanceProfile, | |
SlaveTemplateUsEast1Parameters.deleteRootOnTermination, | |
SlaveTemplateUsEast1Parameters.useEphemeralDevices, | |
SlaveTemplateUsEast1Parameters.useDedicatedTenancy, | |
SlaveTemplateUsEast1Parameters.launchTimeoutStr, | |
SlaveTemplateUsEast1Parameters.associatePublicIp, | |
SlaveTemplateUsEast1Parameters.customDeviceMapping, | |
SlaveTemplateUsEast1Parameters.connectBySSHProcess, | |
SlaveTemplateUsEast1Parameters.connectUsingPublicIp | |
) | |
// https://github.com/jenkinsci/ec2-plugin/blob/ec2-1.38/src/main/java/hudson/plugins/ec2/SlaveTemplate.java | |
SlaveTemplate slaveTemplateCaCentral1 = new SlaveTemplate( | |
SlaveTemplateCaCentral1Parameters.ami, | |
SlaveTemplateCaCentral1Parameters.zone, | |
null, | |
SlaveTemplateCaCentral1Parameters.securityGroups, | |
SlaveTemplateCaCentral1Parameters.remoteFS, | |
InstanceType.fromValue(SlaveTemplateCaCentral1Parameters.type), | |
SlaveTemplateCaCentral1Parameters.ebsOptimized, | |
SlaveTemplateCaCentral1Parameters.labelString, | |
Node.Mode.NORMAL, | |
SlaveTemplateCaCentral1Parameters.description, | |
SlaveTemplateCaCentral1Parameters.initScript, | |
SlaveTemplateCaCentral1Parameters.tmpDir, | |
SlaveTemplateCaCentral1Parameters.userData, | |
SlaveTemplateCaCentral1Parameters.numExecutors, | |
SlaveTemplateCaCentral1Parameters.remoteAdmin, | |
new UnixData(null, null, null), | |
SlaveTemplateCaCentral1Parameters.jvmopts, | |
SlaveTemplateCaCentral1Parameters.stopOnTerminate, | |
SlaveTemplateCaCentral1Parameters.subnetId, | |
[SlaveTemplateCaCentral1Parameters.tags], | |
SlaveTemplateCaCentral1Parameters.idleTerminationMinutes, | |
SlaveTemplateCaCentral1Parameters.usePrivateDnsName, | |
SlaveTemplateCaCentral1Parameters.instanceCapStr, | |
SlaveTemplateCaCentral1Parameters.iamInstanceProfile, | |
SlaveTemplateCaCentral1Parameters.deleteRootOnTermination, | |
SlaveTemplateCaCentral1Parameters.useEphemeralDevices, | |
SlaveTemplateCaCentral1Parameters.useDedicatedTenancy, | |
SlaveTemplateCaCentral1Parameters.launchTimeoutStr, | |
SlaveTemplateCaCentral1Parameters.associatePublicIp, | |
SlaveTemplateCaCentral1Parameters.customDeviceMapping, | |
SlaveTemplateCaCentral1Parameters.connectBySSHProcess, | |
SlaveTemplateCaCentral1Parameters.connectUsingPublicIp | |
) | |
// https://github.com/jenkinsci/ec2-plugin/blob/ec2-1.38/src/main/java/hudson/plugins/ec2/AmazonEC2Cloud.java | |
AmazonEC2Cloud amazonEC2Cloud = new AmazonEC2Cloud( | |
AmazonEC2CloudParameters.cloudName, | |
AmazonEC2CloudParameters.useInstanceProfileForCredentials, | |
AmazonEC2CloudParameters.credentialsId, | |
AmazonEC2CloudParameters.region, | |
AmazonEC2CloudParameters.privateKey, | |
AmazonEC2CloudParameters.instanceCapStr, | |
[slaveTemplateUsEast1,slaveTemplateCaCentral1] | |
) | |
// get Jenkins instance | |
Jenkins jenkins = Jenkins.getInstance() | |
// get credentials domain | |
def domain = Domain.global() | |
// get credentials store | |
def store = jenkins.getExtensionList('com.cloudbees.plugins.credentials.SystemCredentialsProvider')[0].getStore() | |
// add credential to store | |
store.addCredentials(domain, aWSCredentialsImpl) | |
// add cloud configuration to Jenkins | |
jenkins.clouds.add(amazonEC2Cloud) | |
// save current Jenkins state to disk | |
jenkins.save() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment