使用Groovy配置Jenkins EC2插件

4
我正在尝试通过Groovy配置Jenkins EC2-Plugin。 插件代码:https://github.com/jenkinsci/ec2-plugin 我正在尝试设置一个名字来开始云端设置。
import hudson.model.*
import jenkins.model.*
import hudson.plugins.ec2.*
import com.amazonaws.services.ec2.model.*

SlaveTemplate awsTemplate = new SlaveTemplate(
  'ami-1234567',
  '',
  '',
  'sg-1234567',
  't2.micro',
  true,
  'foo',
  '',
  'stuff',
  'run code',
  '/var/tmp',
  'more code',
  '4',
  '',
  '',
  '',
  false,
  'subnet-1234567',
  '',
  '60',
  false,
  '',
  'iam-profile',
  false,
  false,
  '',
  false,
  '',
  true,
  false
)

def slaveTemplates = [awsTemplate]

def ec2Cloud = new AmazonEC2Cloud(
  'foo',
  true,
  '',
  'us-west-2',
  '',
  '10',
  slaveTemplates
)

def cloudList = Jenkins.instance.clouds
cloudList.add(ec2Cloud)

有什么想法吗?

这些是错误消息

Error: Could not find matching constructor for: hudson.plugins.ec2.SlaveTemplate

或者
Error: Could not find matching constructor for: hudson.plugins.ec2.AmazonEC2Cloud

请查看下面的Gist列表以获取最佳答案。 - jsmickey
4个回答

5
您对SlaveTemplate的调用没有匹配到任何构造函数: https://github.com/jenkinsci/ec2-plugin/blob/master/src/main/java/hudson/plugins/ec2/SlaveTemplate.java 例如,第三个参数(spotConfig)需要一个SpotConfiguration对象。您当前在那里定义了一个空字符串。(您可以将其替换为null。)
此外,instance-type参数应该是InstanceType,而不是字符串。要纠正这一点,您需要在groovy脚本顶部添加import com.amazonaws.services.ec2.model.InstanceType,并将't2.micro'替换为InstanceType.fromValue('t2.micro')
有关完整示例,请参见https://gist.github.com/vrivellino/97954495938e38421ba4504049fd44ea

谢谢您提供这个,不确定为什么我找了这么长时间才发现它。在我开始使用之前有一个问题,运行这个会覆盖那里的配置吗? - timmyonline
1
我不相信它会这样做 - 我相信它会添加一个新的云配置。 - Vince Riv
我不想创建一个新的云,只想在现有的云中工作。你知道是否可以使用Groovy脚本在运行时添加新模板吗?我尝试过"cloud.templates.add(new_template)",但是得到了一个UnsupportedOperationException异常,提示无法修改UnmodifiableCollection。我一直在查找插件源代码,但没有发现任何公开的功能来添加/删除/更新模板。 - timmyonline

2
这是我如何修改现有的云配置并添加新的SlaveTemplate的方法:
Jenkins.instance.clouds.each {
    if (it.displayName == "SOME_NAME") {
        SlaveTemplate slaveTemplate = new SlaveTemplate(...)
        Field field = hudson.plugins.ec2.EC2Cloud.class.getDeclaredField("templates")
        field.setAccessible(true);
        List templates = (List) field.get(it)
        templates.add(slaveTemplate)
    }
}

我尝试使用您的建议修改现有模板,但是出现错误Script1.groovy: 23: unable to resolve class Field @ line 23, column 15. Field field = hudson.plugins.ec2.EC2Cloud.class.getDeclaredField("templates") - user2280769

1

根据您的问题,似乎您想要使用Groovy在Jenkins中以编程方式配置ec2实例。

例如:为了在我的移动应用上运行自动化测试,我想创建一个ec2实例,该实例构建apk/ipa,克隆项目,使用appium/selenium框架进行测试并在我的拉取请求上运行测试。 ec2将使用特定AMI(其中包含环境和几个框架),类型为M-Xlarge。

解决方案:SlaveTemplate对象是表示ec2实例的“pojo”对象。您可以使用代码文档,该文档介绍了您可以使用哪些构造函数、属性和公共方法,链接在这里

您可以编辑ec2实例配置(使用set方法),或者您可以创建新的ec2实例(使用构造函数),我将附上一个示例:

为了编辑您的实例:

def instance = Jenkins.getInstance()
def ec2_instances = instance.clouds[0].getTemplates().each{
  if(it.labels == 'myInstanceLabelNameThatShouldBeChanged'){
    it.setAmi('ami-xxx')
    it.maxTotalUses=3
    it.launchTimeout=60000
  }
}

为了从头开始创建实例:
请使用SlaveTemplate构造函数并将其添加到您的云数组中:
    public SlaveTemplate(String ami, String zone, SpotConfiguration spotConfig, String securityGroups, String remoteFS,
        InstanceType type, boolean ebsOptimized, String labelString, Node.Mode mode, String description, String initScript,
        String tmpDir, String userData, String numExecutors, String remoteAdmin, AMITypeData amiType, String jvmopts,
        boolean stopOnTerminate, String subnetId, List<EC2Tag> tags, String idleTerminationMinutes, int minimumNumberOfInstances,
        String instanceCapStr, String iamInstanceProfile, boolean deleteRootOnTermination,
        boolean useEphemeralDevices, boolean useDedicatedTenancy, String launchTimeoutStr, boolean associatePublicIp,
        String customDeviceMapping, boolean connectBySSHProcess, boolean monitoring,
        boolean t2Unlimited, ConnectionStrategy connectionStrategy, int maxTotalUses) {

一个例子,使用这个很棒的参考资料

import hudson.model.*
import jenkins.model.*
import hudson.plugins.ec2.*
import com.amazonaws.services.ec2.model.InstanceType

def instance = Jenkins.getInstance()

def ec2_cloud_name = 'exampleCloud'
def ec2_instance_cap = 5
def worker_description = 'jenkins-worker'
def worker_label_string = 'worker'
def ami_id = 'ami-xxx'
def security_groups = 'sg-123,sg-456'
def subnet_id = 'subnet-someSUbnet'
def instance_type = 'm2.xlarge'
def instance_profile_arn = 'arn:aws:iam::123:instance-profile/JenkinsInstanceProfile'
def number_of_executors = 5

def ec2_tags = [
  new EC2Tag('Name', 'jenkins-worker')
]

def priv_key_txt = ''''''

def worker_ami = new SlaveTemplate(
  // String ami
  ami_id,
  // String zone
  '',
  // SpotConfiguration spotConfig
  null,
  // String securityGroups
  security_groups,
  // String remoteFS
  '',
  // InstanceType type
  InstanceType.fromValue(instance_type),
  // boolean ebsOptimized
  false,
  // String labelString
  worker_label_string,
  // Node.Mode mode
  Node.Mode.NORMAL,
  // String description
  worker_description,
  // String initScript
  '',
  // String tmpDir
  '',
  // String userData
  '',
  // String numExecutors
  "${number_of_executors}",
  // String remoteAdmin
  '',
  // AMITypeData amiType
  new UnixData(null, null),
  // String jvmopts
  '',
  // boolean stopOnTerminate
  false,
  // String subnetId
  subnet_id,
  // List<EC2Tag> tags
  ec2_tags,
  // String idleTerminationMinutes
  '30',
  // boolean usePrivateDnsName
  true,
  // String instanceCapStr
  '50',
  // String iamInstanceProfile
  instance_profile_arn,
  // boolean useEphemeralDevices
  true,
  // boolean useDedicatedTenancy
  false,
  // String launchTimeoutStr
  '1800',
  // boolean associatePublicIp
  false,
  // String customDeviceMapping
  '',
  // boolean connectBySSHProcess
  false,
  // boolean connectUsingPublicIp
  false
)

def new_cloud = new AmazonEC2Cloud(
  // String cloudName
  ec2_cloud_name,
  // boolean useInstanceProfileForCredentials
  true,
  // String credentialsId
  '',
  // String region
  'us-east-1',
  // String privateKey
  priv_key_txt,
  // String instanceCapStr
  "${ec2_instance_cap}",
  // List<? extends SlaveTemplate> templates
  [worker_ami]
)

instance.clouds.add(new_cloud)

0

首先,这个类只有一个构造函数,其签名如下:

public AmazonEC2Cloud(
  String cloudName, 
  boolean useInstanceProfileForCredentials, 
  String credentialsId, 
  String region, 
  String privateKey, 
  String instanceCapStr, 
  List<? extends SlaveTemplate> templates
)

我在使用云课堂时遇到了问题。你有什么配置建议吗? - jsmickey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接