2012-10-02 73 views
6

Necesito crear la nube de agentes Jenkins que se ejecuta en Windows VM en Amazon EC2.nube de agentes Jenkins Amazon EC2 - esclavos de Windows

Mi punto de vista de este escenario es simple:

tengo pocos de pre-configura las AMI, cada uno de VM tienen entorno específico que coincide con uno de mis proyectos. Tengo pocos proyectos para construir con la frecuencia suficiente para mantener la VM en funcionamiento. Sin embargo, algunas compilaciones se ejecutarán semanalmente, otras en forma tridimensional ... Jenkins debería poder iniciar VM automáticamente cuando se debe construir el proyecto y finalizar VM cuando se completa la compilación. Tengo varios proyectos de BCB y muchos proyectos de .NET, Windows como sistema operativo de VM esclavo es absolutamente necesario.

No es un problema preparar una AMI preconfigurada donde se instala y configura el esclavo Jenkins. Pero no tengo ni idea de cómo gestionar tales máquinas virtuales esclavas desde el maestro (ejecutar/terminarlas)

Encontré el complemento Amazon EC2 que se puede usar para ejecutar y finalizar máquinas virtuales. Pero también intenta instalar y ejecutar esclavos allí. Desafortunadamente, los esclavos de Windows aún no son compatibles. ¿Hay alguna manera de utilizar AMI preconfigurados o dejar que el plugin de Amazon EC2 instale el agente en Windows VM?

Traté de usar TeamCity también - puede ejecutar Windows AM preconfigurado y construir proyectos allí (mi escenario exacto). Pero necesito demasiadas máquinas virtuales y mi jefe no está listo para pagar las licencias (3 licencias gratuitas no son suficientes)

¿Es posible usar Jenkins para mi escenario? ¿Hay alguna otra alternativa?

+0

¿Con qué solución terminaste? – Zac

+0

Usamos el complemento de la secuencia de comandos [enlace] (https://wiki.jenkins-ci.org/display/JENKINS/Scripted+Cloud+plugin) –

Respuesta

0

boto.ec2 se puede utilizar perfectamente para iniciar/detener/terminar instancias sobre la marcha.

Uso un script para eso. Aquí hay una parte que puedo compartir. No puedo compartir algunas partes. Gracias por entender.

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