build - ¿Es posible convertir un trabajo libre de Jenkins a un trabajo de configuración múltiple?
hudson multi-configuration (3)
Acabo de escribir un guión 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. Ejecuté este en 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 {} /;
ADVERTENCIA otra vez. ¡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])
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.
No veo una manera de hacer esto a través de la interfaz de usuario, pero me pregunto si hay otra manera.
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 estilo libre y de configuración múltiple con las diversas configuraciones que usa. Puede ser tan simple como cambiar el elemento de nivel superior en config.xml de project
a matrix-project
.
Si edita la configuración de trabajo existente, tendrá que hacerlo mientras Jenkins está desconectado, o decirle a Jenkins que vuelva a cargar su configuración a través de Administrar Jenkins -> Volver a cargar la configuración desde el disco .
Si decides crear nuevos trabajos, esta pregunta previa podría ser útil una vez que averigües qué ediciones se deben realizar. Específicamente, esta respuesta describe cómo cargar un archivo de configuración para crear un nuevo trabajo.
Solo una nota para aquellos que deseen cambiar de maven a trabajo de estilo libre.
- Cambie la etiqueta
maven2-moduleset
alproject
. - Eliminar etiquetas:
rootModule
,goals
,mavenValidationLevel
(deben estar cerca el uno del otro). - Fusiona a los
prebuilders
ypostbuilders
enbuilders
.