¿Existe alguna herramienta que permita validar Jenkinsfiles en línea?

13

En este momento estoy editando un archivo Jenkins y luego lo dejo correr a menos que Jenkins informe un problema. Este enfoque cuesta mucho tiempo. Prefiero validar la sintaxis antes de confirmar el archivo Jenkins. ¿Existe alguna herramienta que resuelva este problema?

En gitlab hay un URI, es decir, /ci/lintque hace posible enviar un archivo gitlab, haga clic en el botón de verificación y luego la interfaz de usuario le indicará si la sintaxis es correcta o no.

030
fuente

Respuestas:

13

Aquí hay documentación sobre el linter de la tubería de Jenkins y sus comandos. ¿Necesita validar antes de una confirmación? De lo contrario, sería realmente trivial ejecutar el comando de linting antes de que se ejecute su canalización, y simplemente fallar si no se aprueba.

Desde la línea de comandos Pipeline Linter :

Jenkins puede validar, o " pelusa ", una canalización declarativa desde la línea de comandos antes de ejecutarla realmente. Esto se puede hacer usando un comando Jenkins CLI o haciendo una solicitud HTTP POST con los parámetros apropiados. Recomendamos usar la interfaz SSH para ejecutar el linter. Consulte la documentación de la CLI de Jenkins para obtener detalles sobre cómo configurar adecuadamente Jenkins para un acceso seguro a la línea de comandos.

Linting a través de la CLI con SSH

# ssh (Jenkins CLI)
# JENKINS_SSHD_PORT=[sshd port on master]
# JENKINS_HOSTNAME=[Jenkins master hostname]
ssh -p $JENKINS_SSHD_PORT $JENKINS_HOSTNAME declarative-linter < Jenkinsfile

Linting a través de HTTP POST usando curl

# curl (REST API)
# Assuming "anonymous read access" has been enabled on your Jenkins instance.
# JENKINS_URL=[root URL of Jenkins master]
# JENKINS_CRUMB is needed if your Jenkins master has CRSF protection enabled as it should
JENKINS_CRUMB=`curl "$JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)"`
curl -X POST -H $JENKINS_CRUMB -F "jenkinsfile=<Jenkinsfile" $JENKINS_URL/pipeline-model-converter/validate

Ejemplos

A continuación se muestran dos ejemplos de Pipeline Linter en acción. Este primer ejemplo muestra la salida del linter cuando se pasa un inválido Jenkinsfile, uno al que le falta parte de la agentdeclaración.

Jenkinsfile

pipeline {
  agent
  stages {
    stage ('Initialize') {
      steps {
        echo 'Placeholder.'
      }
    }
  }
}

Salida de Linter para un archivo Jenkins no válido

# pass a Jenkinsfile that does not contain an "agent" section
ssh -p 8675 localhost declarative-linter < ./Jenkinsfile
Errors encountered validating Jenkinsfile:
WorkflowScript: 2: Not a valid section definition: "agent". Some extra configuration is required. @ line 2, column 3.
     agent
     ^

WorkflowScript: 1: Missing required section "agent" @ line 1, column 1.
   pipeline &#125;
   ^

En este segundo ejemplo, el Jenkinsfileha sido actualizado para incluir la falta anyde agent. El linter ahora informa que la canalización es válida.

Jenkinsfile

pipeline {
  agent any
  stages {
    stage ('Initialize') {
      steps {
        echo 'Placeholder.'
      }
    }
  }
}

Salida de Linter para un archivo Jenkins válido

ssh -p 8675 localhost declarative-linter < ./Jenkinsfile
Jenkinsfile successfully validated.
PrestonM
fuente
¿Podría explicar cómo usar el cliente localmente? java -jar jenkins-cli.jar [-s JENKINS_URL] [global options...] command [command options...] [arguments...]
030
Gracias por publicar una respuesta. ¿Existe una herramienta en línea también? Sería genial si uno pudiera navegar a una interfaz de usuario, publicar un archivo jenkins y verificar si hay problemas de sintaxis. He actualizado la pregunta.
030
@ 030 Dudo que haya una herramienta de interfaz en línea, pero parece un proyecto divertido para llevar :) Para usar la interfaz localmente, debe iniciar sesión en su servidor Jenkins con sus credenciales, luego "pedir" a Jenkins que le permita jenkinsfile. pierre-beitz.eu/2017/01/17/…
PrestonM
¿Podría agregar algunos fragmentos de ese enlace a esta respuesta? Si el enlace está en desuso, la información desaparecería.
030