web-dev-qa-db-fra.com

Quelle est la différence entre un nœud, une étape et une étape dans les pipelines Jenkins?

J'essaie de comprendre comment structurer mon script groovy du pipeline 2.7 de Jenkins. J'ai lu le tutoriel sur les pipelines , mais j'ai le sentiment qu'il pourrait s'étendre davantage sur ces sujets.

Je peux comprendre qu’un pipeline peut avoir beaucoup de stages et que chaque stage peut avoir beaucoup de steps. Mais quelle est la différence entre un step(); et un appel de méthode à l'intérieur d'un stage, disons sh([script: "echo hello"]);. Est-ce que nodes devrait être à l'intérieur ou à l'extérieur de stages? Les propriétés globales d'un travail doivent-elles être à l'intérieur ou à l'extérieur d'un node?

Voici ma structure actuelle sur un nœud maître Ubuntu:

#!/usr/bin/env groovy

node('master') {
    properties([
        [$class: 'BuildDiscarderProperty', strategy: [$class: 'LogRotator', numToKeepStr: '10']]
    ]);

    stage 'Checkout'
        checkout scm

    stage 'Build'
        sh([script: "make build"]);

    archive("bin/*");
}
37
tarabyte

Les concepts de node, stage et step sont différents:

  • node spécifie quelque chose doit se passer. Vous donnez un nom ou une étiquette et Jenkins exécute le bloc à cet endroit.

  • stage structure votre script en une séquence de haut niveau. Les étapes s'affichent sous forme de colonnes dans la vue Etape du pipeline, avec les durées moyennes et les couleurs du résultat de l'étape.

  • step est un moyen de spécifier quoi doit arriver. sh est d'une qualité similaire, c'est un type d'action différent. (Vous pouvez également utiliser build pour des éléments déjà spécifiés en tant que projets.)

Donc steps peut résider dans nodes (sinon, ils sont exécutés sur le maître), et nodes et steps peuvent être structurés en une séquence globale avec stages.

34
chris_f

Ça dépend. Toute déclaration node alloue un exécuteur (maître ou esclave Jenkins). Cela nécessite que stash et unstash l'espace de travail, car un autre exécuteur n'a pas les sources extraites.

Plusieurs étapes du Pipeline DSL s’exécutent dans un exécuteur flyweight et n’ont donc pas besoin d’être dans un bloc node. Cela peut être utile pour un exemple tel que le suivant, dans lequel vous devez quand même allouer plusieurs nœuds:

stage("Checkout") {
  checkout scm
}

stage("Build") {
  node('linux') {
    sh "make"
  }
  node('windows') {
    bat "whatever"
  }
}

stage("Upload") {
  ...

Un autre exemple (peut-être plus réaliste) consisterait à allouer plusieurs nœuds dans parallel. Ensuite, il n'est pas nécessaire de laisser l'appel stage s'exécuter dans un autre exécuteur alloué (également dans node).

Votre exemple me semble bien. Il n'est pas nécessaire d'allouer plusieurs nodes au sein de l'unique stages, car il ne s'agirait que d'une surcharge supplémentaire.

6
StephenKing