Jenkins Amazon EC2 Cloud Agent - Windows slaves

I need to create a Jenkins agent cloud that runs under Windows virtual machines on Amazon EC2.

My look at this is a simple scenario:

I have few AMI presets, each VM has a specific environment that corresponds to one of my projects. I have few projects to create often enough to support the VM. But some builds will be performed weekly, others -... Jenkins should be able to automatically start the virtual machine when the project needs to be built, and shutdown the VM when the build is complete. I have several BCB projects and many .NET projects, Windows as a slave VM OS is absolutely necessary.

There is no problem preparing a preconfigured AMI where the Jenkins slave is installed and configured. But I have no idea how to manage such subordinate virtual machines from master (start / end them)

I found an Amazon EC2 plugin that can be used to start and shut down virtual machines. But he is also trying to install and run a slave there. Unfortunately, Windows slaves are not yet supported. Is there a way to use pre-configured AMI or enable the Amazon EC2 plug-in installation agent in Windows VM?

I also tried to use TeamCity - it can launch preconfigured AMI windows and build projects there (exactly my scenario). But I need too many virtual machines, and my boss is not ready to pay for licenses (3 free licenses are not enough)

Can I use Jenkins for my script? Are there any other alternatives?

+6
source share
1 answer

boto.ec2 can be perfectly used to start / stop / end instances on the go.

I use a script for this. Here is the part I can share. I can not share some parts. Thank you for understanding.

#!/usr/bin/python import boto.ec2 import sys import time # specify AWS keys auth = {"aws_access_key_id": "YOUR_KEY", "aws_secret_access_key": "YOUR_SECRET_KEY"} def main(): # read arguments from the command line and # check whether at least two elements were entered if len(sys.argv) < 2: print "Usage: python aws.py {start|stop}\n" sys.exit(0) else: action = sys.argv[1] if action == "start": startInstance() elif action == "stop": stopInstance() else: print "Usage: python aws.py {start|stop}\n" def startInstance(): print "Starting the instance..." # change "eu-west-1" region if different try: ec2 = boto.ec2.connect_to_region("eu-west-1", **auth) except Exception, e1: error1 = "Error1: %s" % str(e1) print(error1) sys.exit(0) # change instance ID appropriately try: instances = ec2.start_instances(instance_ids="ID_INSTANCE TO START") instances[0].update() while instances[0].state != "running": print instances[0].state time.sleep(5) instances[0].update() #this part manage the association of Elastic IP ec2.associate_address("ID_INSTANCE","ELASTIC IP") except Exception, e2: error2 = "Error2: %s" % str(e2) print(error2) sys.exit(0) def stopInstance(): print "Stopping the instance..." try: ec2 = boto.ec2.connect_to_region("eu-west-1", **auth) except Exception, e1: error1 = "Error1: %s" % str(e1) print(error1) sys.exit(0) try: ec2.stop_instances(instance_ids="INSTANCE_ID") instances[0].update() while instances[0].state != "stopped": print instances[0], instances[0].state time.sleep(5) instance.update() print "Instance stopped : " except Exception, e2: error2 = "Error2: %s" % str(e2) print(error2) sys.exit(0) if __name__ == '__main__': main() 
0
source

Source: https://habr.com/ru/post/926761/


All Articles