2012-10-02 7 views
6

Ich muss Jenkins Agent Cloud erstellen, die unter Windows VMs auf Amazon EC2 läuft.Jenkins Amazon EC2 Agent Wolke - Windows-Sklaven

Meine Ansicht ist dies einfaches Szenario:

Ich habe einig vorkonfiguriert Ami, die jeweils VM spezifische Umgebung hat, die einen meiner Projekte entsprechen. Ich habe ein paar Projekte, die ich oft genug erstellen muss, um die VM am Laufen zu halten. Aber einige Builds laufen wöchentlich, andere mounthly ... Jenkins sollte in der Lage sein, die VM automatisch zu starten, wenn das Projekt erstellt werden sollte, und die VM zu beenden, wenn der Build abgeschlossen ist. Ich habe mehrere BCB-Projekte und viele .NET-Projekte, Windows als Slave VM OS ist absolut notwendig.

Es ist kein Problem, vorkonfigurierte AMIs vorzubereiten, in denen Jenkins-Slave installiert und konfiguriert ist. Aber ich habe keine Ahnung, wie man solche Slave-VMs vom Master verwaltet (run/terminate)

Ich fand Amazon EC2 Plugin, das zum Ausführen und Beenden von VMs verwendet werden kann. Aber es versucht auch, Slave dort zu installieren und auszuführen. Leider werden Windows-Slaves noch nicht unterstützt. Gibt es eine Möglichkeit, vorkonfigurierte AMIs zu verwenden oder das Amazon EC2-Plugin auf Windows VM installieren zu lassen?

Ich habe versucht, TeamCity auch zu verwenden - es kann vorkonfigurierte Windows AMI ausführen und Projekte dort erstellen (genau mein Szenario). Aber ich brauche zu viele VMs und mein Chef ist nicht bereit, für Lizenzen zu zahlen (3 kostenlose Lizenzen sind nicht genug)

Ist es möglich, Jenkins für mein Szenario zu verwenden? Gibt es andere Alternativen?

+0

Mit welcher Lösung sind Sie am Ende? – Zac

+0

Wir verwenden Scripted Cloud Plugin [link] (https://wiki.jenkins-ci.org/display/JENKINS/Scripted+Cloud+plugin) –

Antwort

0

boto.ec2 kann perfekt zum Starten/Stoppen/Beenden von Instanzen auf dem Sprung verwendet werden.

Ich benutze ein Skript dafür. Hier ist ein Stück davon, das ich teilen kann. Ich kann einige Teile nicht teilen. Danke für dein Verständnis.

#!/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()