Ecrire son premier Jenkinsfile
Dans un précédent billet, je vous ai expliqué comment installer rapidement jenkins sur un cluster kubernetes en utilisant un chart helm. Voyons maintenant comment écrire le code d’un pipeline jenkins dans son mode déclaratif.
Structure d’un Jenkinsfile
Un fichier Jenkinsfile
utilise une syntaxe appelée Jenkins Job DSL
qui est
fourni avec le plugin
Pipeline ↗.
Voici un exemple de Jenkinsfile
:
Voyons comment est construit ce Jenkinsfile
.
Le bloc pipeline
Tous les pipelines possèdent un premier bloc de type pipeline :
C’est ce bloc qui va contenir des directives, qui sont pour les principales de
type agent
, tools
, options
, environment
, post
et stages
. Nous verrons dans
un autre billet le reste des directives.
La directive Agent (requis)
Dans le bloc agent
où nous définissons sur quel agent va tourner notre
pipeline. On peut ainsi indiquer n’importe quel agent avec la balise any
, ou
des spécifiques en indiquant un node portant un label.
Ou :
Pour ajouter un label, étiquettes en français, à un node. Cela se fait dans la section configuration des nœuds de la partie administrations Jenkins. Ici, nous utilisons le nœud statique portant le label ansible
.
Il est également possible d’utiliser des agents dynamiques de type docker
, avec des images ou dockerfile
ou encore kubernetes
en installant les plugins au préalable.
La directive stages (requise)
Cette section va permettre de définir tous les stages d’un pipeline. Il en faut au minimum un.
Chaque stage va contenir des steps qui doit contenir au minimum un step.
Le code des steps
Composantes des stages, les steps permettent de lancer des fonctions, appelés step. Ces steps sont composés de celles fournies nativement avec Jenkins, appelés basic steps ↗
Parmi les principales, on retrouve :
- Les basiques ↗ dont echo, error, dir, archive, …
La directive post (optionnel)
Cette directive permet de définir un ou plusieurs steps qui sont exécutés à la
fin de l’exécution d’un pipeline. Post peut prendre des post-condition
permettent l’exécution des steps à l’intérieur de chaque condition en fonction
de l’état d’exécution du pipeline : always, changed, fixed; regression, aborted, …
La liste complète des conditions ↗
La directive tools (optionnel)
Ce bloc permet d’indiquer quels outils utiliser. Ces outils doivent être installés et configurés au préalable. L’installation se fait à travers des plugins. Par exemple le plugin Ansible.
Il existe d’autres méthodes pour installer ces outils, dans le pipeline, préinstallé sur le nœud (via le label ansible par exemple) ou en utilisant des images Docker.
La directive options (optionnel)
Il contient toutes les options requises par le job. Certaines de ces options sont natives et d’autres apportées par les plugins. Ces options ont une portée sur l’ensemble du pipeline. Nous verrons par la suite que ces options peuvent aussi être définies au niveau des stages.
Toutes les options natives sont décrites ici ↗
La directive environnement (optionnel)
Cette directive permet de définir des variables d’environnement utilisé dans tout le pipeline. Cette directive peut également être définie au niveau de chaque stage.
Écrire facilement son premier pipeline
Pour écrire mes pipelines, j’utilise vscode
sur lequel j’ai activé deux extensions :
- JenkinsFile Support ↗ qui apporte la coloration syntaxique, l’autocomplétion et des snippets
- Jenkins Pipeline Linter Connector ↗ qui permet de valider la syntaxe de son jenkinsfile avant de l’exécuter. Pour que cela fonctionne, il suffit de rentrer dans ses paramètres l’url, le user et le mot de passe.
Si on reprend ce qui a été dit ci-dessus, nous avons en premier un bloc
pipeline, dans lequel nous ajoutons des directives agent
, stages
et post
:
Exemple de snippet apporté par le plugin JenkinsFile Support, appréciable pour démarrer.
Pousser ce Jenkinsfile
dans un projet et exécuté le comme décris dans le
précédent billet.
Plus loin
Comme je l’ai dit au début de ce billet, je découvre Jenkins. Donc pour le moment le billet permet de familiariser avec l’écriture de simples pipelines Jenkins en utilisant les blocs de base. Je vais enrichir ce billet comme j’ai pu le faire avec Ansible, au fil de mes découvertes. Donc revenez de temps en temps !