2011-10-03 14 views
22

Tengo bastantes trabajos libres en Jenkins que me gustaría convertir a trabajos de configuración múltiple para que pueda construir en múltiples plataformas en un solo trabajo. Estos trabajos especifican bastantes parámetros de compilación y me gustaría no tener que configurarlos manualmente de nuevo creando nuevos trabajos de configuración múltiple. Cada trabajo actualmente está limitando sus construcciones a la plataforma en la que hemos estado desarrollando y la única otra opción que veo es clonar el trabajo existente y cambiar la restricción a la nueva plataforma. Esto no es ideal ya que necesitaré mantener 2 trabajos donde la única diferencia es la plataforma de destino.¿Es posible convertir un trabajo libre de Jenkins a un trabajo de configuración múltiple?

No veo una manera de hacer esto a través de la interfaz de usuario, pero me pregunto si hay otra manera.

Respuesta

22

Hasta donde yo sé, no hay forma de convertir el tipo de trabajo en la IU. Deberá editar el config.xml del trabajo, o copiar y editar el archivo de configuración y crear un nuevo trabajo en función de la configuración editada.

Deberá verificar las diferencias entre un trabajo de configuración múltiple libre y con las diversas configuraciones que utiliza. Puede ser tan simple como como cambiar el elemento de nivel superior en config.xml de project a matrix-project.

Si modifica la configuración del trabajo existente, tendrá que o bien hacerlo mientras Jenkins está desconectado, o decirle a Jenkins para recargar su configuración a través de Manejo Jenkins -> Configuración Volver a cargar en el disco.

Si decide crear nuevos trabajos, this previous question podría ser útil una vez que determine qué modificaciones se deben realizar. Específicamente this answer describe cómo para cargar un archivo de configuración para crear un nuevo trabajo.

+0

Aunque en realidad no probé esto, parece que el proceso que ha descrito funcionaría.Decidí seguir adelante y hacerlas a través de la interfaz de usuario. Sentí que este enfoque era un poco arriesgado y que podría terminar con problemas sutiles en el camino. Gracias por la respuesta. –

+0

Y con la nueva característica "Administrar datos antiguos", debería mostrar cosas que fueron obsoletas por el cambio de tipo de trabajo. – reechard

+1

Funciona bien. También se agregó el elemento deseado y se eliminó el para ahorrar tener que hacer cualquier edición de UI. Sin embargo, pierde el historial de compilación para el trabajo. – OrangeDog

4

Solo una nota para aquellos que deseen cambiar de maven a trabajo de estilo libre.

  1. Cambia maven2-moduleset etiqueta a project.
  2. Quitar etiquetas: rootModule, goals, mavenValidationLevel (deben estar cerca uno del otro).
  3. Fusionar prebuilders y postbuilders en builders.
+0

Hrm, después de hacer esto - "manage jenkins" informa datos no utilizados, de los cuales una limpieza se bloquea con un error que dice "no parent found", me pregunto si hay otro elemento/atributo para ajustar? –

+1

Es posible que tenga algunos complementos que se estropean (y debe eliminar sus etiquetas manualmente). O tal vez necesite usar la opción "volver a cargar la configuración desde el disco" si no lo hizo. – Nux

1

Acabo de escribir un script para convertir unos 10000 trabajos de Jenkins de Maven Job Type a Freestyle. Por favor no lo uses a ciegas. Puede perder las opciones de configuración o terminar en una configuración de Jenkins rota. Python Part toma un config xml como argumento y sobrescribe el mismo archivo con los datos convertidos. Me encontré con este vivo en el sistema de archivos Jenkins con el siguiente comando:

cd /path/to/jenkins/jobs

find * -maxdepth 2 -name config.xml -exec /path/to/maven2freestyle.py {} \;

de advertencia. ¡Esto podría romper tu Jenkins! Por favor, mantenga una copia de seguridad!

#!/usr/bin/env python2 

import copy 
import sys 
from lxml import etree 
from lxml.etree import fromstring, tostring 
from StringIO import StringIO 

def parseXML(xmlFile): 
    print(xmlFile) 
    f = open(xmlFile) 
    xml = f.read() 
    f.close() 

    e = etree.parse(xmlFile) 
    root = e.getroot() 

    if root.tag != 'maven2-moduleset': 
     #print("WARNING: Skipping non Maven Project") 
     return 

    #change project type 
    root.tag = "project" 
    if 'plugin' in root.attrib: 
     del root.attrib["plugin"] 

    #get maven data 
    rootModule = root.find('./rootModule') 
    rootPOM = root.find('./rootPOM') 
    goals = root.find('./goals') 
    mavenName = root.find('./mavenName') 
    mavenOpts = root.find('./mavenOpts') 

    # merge prebuilders into builders 
    prebuilders = root.findall("./prebuilders/*") 
    builders = etree.Element("builders") 
    root.insert(99, builders) 
    if len(prebuilders) > 0: 
     builders.append(copy.deepcopy(prebuilders[0])) 

    #create maven builder 
    maven = etree.Element("hudson.tasks.Maven") 

    if not goals is None: 
     etree.SubElement(maven, "targets").text = goals.text 
    if not mavenName is None: 
     etree.SubElement(maven, "mavenName").text = mavenName.text 
    if not rootPOM is None: 
     etree.SubElement(maven, "pom").text = rootPOM.text 
    if not mavenOpts is None: 
     etree.SubElement(maven, "javaOpts").text = mavenOpts.text 

    builders.append(maven) 

    #cleanup 
    prebuilder = root.findall("./prebuilders") 
    if len(prebuilder) > 0: 
     root.remove(prebuilder[0]) 
    if not rootModule is None: 
     root.remove(rootModule) 
    if not rootPOM is None: 
     root.remove(rootPOM) 
    if not goals is None: 
     root.remove(goals) 
    if not mavenName is None: 
     root.remove(mavenName) 
    if not mavenOpts is None: 
     root.remove(mavenOpts) 

    e.write(sys.argv[1], xml_declaration=True, pretty_print=True, encoding='utf-8', method="xml") 

if __name__ == "__main__": 
    parseXML(sys.argv[1]) 
Cuestiones relacionadas