Réponses:
Vous ne pouvez pas exécuter le script Pipeline localement, car son objectif est de scripter Jenkins. (C'est une des raisons pour lesquelles il est préférable de conserver votre Jenkinsfile
code court et limité au traitement des fonctionnalités de Jenkins; votre logique de génération réelle doit être gérée avec des processus externes ou des outils de génération que vous invoquez via une ligne sh
ou une bat
étape.)
Si vous voulez tester une modification pour la Jenkinsfile
vivre mais sans la valider , utilisez la fonction Replay ajoutée dans 1.14
JENKINS-33925 suit les souhaits pour un cadre de test automatisé.
J'ai une solution qui fonctionne bien pour moi. Il se compose d'un jenkins local exécuté dans docker et d'un hook web git pour déclencher le pipeline dans les jenkins locaux à chaque validation. Vous n'avez plus besoin de pousser vers votre dépôt github ou bitbucket pour tester le pipeline.
Cela n'a été testé que dans un environnement Linux.
Il est assez simple de faire ce travail bien que cette instruction soit un peu longue. La plupart des étapes sont là.
Créez un fichier appelé Dockerfile à la place de votre choix. Je le place en le /opt/docker/jenkins/Dockerfile
remplissant avec ceci:
FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins
Construisez l'image local_jenkins
Vous ne devrez le faire qu'une seule fois ou après avoir ajouté quelque chose au Dockerfile.
$ docker build -t local_jenkins /opt/docker/jenkins/
Démarrer et redémarrer local_jenkins
De temps en temps, vous souhaitez démarrer et redémarrer facilement jenkins. Par exemple, après un redémarrage de votre machine. Pour cela, j'ai créé un alias que j'ai mis .bash_aliases
dans mon dossier personnel.
$ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases
$ source .bash_aliases # To make it work
Assurez-vous que le /opt/docker/jenkins/jenkins_home
dossier existe et que vous disposez des droits de lecture et d'écriture de l'utilisateur.
Pour démarrer ou redémarrer votre jenkins, tapez simplement:
$ localjenkinsrestart
Tout ce que vous faites dans votre jenkins local sera stocké dans le dossier / opt / docker / jenkins / jenkins_home et conservé entre les redémarrages.
Créez une clé d'accès SSH dans votre Docker Jenkins
C'est une partie très importante pour que cela fonctionne. D'abord, nous démarrons le conteneur docker et créons un shell bash:
$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash
Vous êtes maintenant entré dans le conteneur Docker, ce que vous pouvez voir par quelque chose comme jenkins@e7b23bad10aa:/$
dans votre terminal. Le hachage après le @ sera certainement différent.
Créez la clé
jenkins@e7b23bad10aa:/$ ssh-keygen
Appuyez sur Entrée pour toutes les questions jusqu'à ce que vous receviez l'invite
Copiez la clé sur votre ordinateur. De l'intérieur du conteneur Docker, votre ordinateur est 172.17.0.1 si vous vous demandez.
jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1
user = votre nom d'utilisateur et 172.17.0.1 est l'adresse IP de votre ordinateur depuis le conteneur Docker.
Vous devrez saisir votre mot de passe à ce stade.
Essayons maintenant de terminer la boucle en effectuant une connexion ssh à votre ordinateur depuis le conteneur Docker.
jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1
Cette fois, vous ne devriez pas avoir à saisir votre mot de passe. Si vous le faites, quelque chose s'est mal passé et vous devez réessayer.
Vous serez maintenant dans le dossier de départ de votre ordinateur. Essayez ls
et regardez.
Ne vous arrêtez pas ici car nous avons une chaîne de coquilles ssh dont nous devons sortir.
$ exit
jenkins@e7b23bad10aa:/$ exit
Droite! Nous sommes maintenant de retour et prêts à continuer.
Installez votre Jenkins
Vous trouverez votre Jenkins local dans votre navigateur à http: // localhost: 8787 .
La première fois que vous pointez votre navigateur vers votre Jenkins local, vous serez doté d'un assistant d'installation. Les valeurs par défaut sont correctes, assurez-vous toutefois d'installer le plugin de pipeline pendant la configuration.
Configurez vos jenkins
Il est très important d'activer la sécurité basée sur la matrice sur http: // localhost: 8787 / configureSecurity et de vous accorder tous les droits en vous ajoutant à la matrice et en cochant toutes les cases. (Il y a une icône de coche à l'extrême droite)
Jenkins’ own user database
comme domaine de sécuritéMatrix-based security
dans la section AutorisationUser/group to add:
et cliquez sur le [ Add ]
boutonPrevent Cross Site Request Forgery exploits
n'est pas cochée. (Étant donné que ce Jenkins n'est accessible que depuis votre ordinateur, ce n'est pas si grave)[ Save ]
et déconnectez-vous de Jenkins et reconnectez-vous juste pour vous assurer que cela fonctionne.
Si ce n'est pas le cas, vous devez recommencer depuis le début et vider le /opt/docker/jenkins/jenkins_home
dossier avant de redémarrerAjouter l'utilisateur git
Nous devons autoriser notre hook git à se connecter à notre Jenkins local avec des droits minimaux. Il suffit de voir et de créer des emplois. Par conséquent, nous créons un utilisateur appelé git
avec mot de passe login
.
Dirigez votre navigateur vers http: // localhost: 8787 / securityRealm / addUser et ajoutez git
comme nom d'utilisateur et login
mot de passe. Cliquez sur [ Create User ]
.
Ajoutez les droits à l'utilisateur git
Accédez à la page http: // localhost: 8787 / configureSecurity dans votre navigateur. Ajoutez l'utilisateur git à la matrice:
git
dans le champ User/group to add:
et cliquez sur[ Add ]
Il est maintenant temps de cocher les cases pour les droits minimaux pour l'utilisateur git. Seuls ceux-ci sont nécessaires:
Assurez-vous que la Prevent Cross Site Request Forgery exploits
case n'est pas cochée et cliquez sur[ Save ]
Nous supposons que nous avons le nom d'utilisateur user
et que notre projet compatible avec git Jenkinsfile
est appelé project
et se trouve à/home/user/projects/project
Dans votre http: // localhost: 8787 Jenkins ajoutez un nouveau projet de pipeline. Je l'ai nommé hookpipeline pour référence.
New Item
dans le menu Jenkinshookpipeline
[ OK ]
Poll SCM
dans la section Build Triggers. Laissez le programme vide.Pipeline script from SCM
Repository URL
champ entrezuser@172.17.0.1:projects/project/.git
Script Path
champ entrezJenkinsfile
Accédez au /home/user/projects/project/.git/hooks
dossier et créez un fichier appelé post-commit
qui contient ceci:
#!/bin/sh
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD)
MASTERBRANCH='master'
curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build
echo "Build triggered successfully on branch: $BRANCHNAME"
Rendez ce fichier exécutable:
$ chmod +x /home/user/projects/project/.git/hooks/post-commit
Testez le hook post-commit:
$ /home/user/projects/project/.git/hooks/post-commit
Vérifiez dans Jenkins si votre projet de raccordement a été déclenché.
Enfin, apportez des modifications arbitraires à votre projet, ajoutez les modifications et effectuez une validation. Cela va maintenant déclencher le pipeline dans votre Jenkins local.
Jours heureux!
docker build -t local_jenkins /opt/docker/jenkins/Dockerfile
par docker build -t local_jenkins /opt/docker/jenkins
parce que Docker se plaignait de "incapable de préparer le contexte: le contexte doit être un répertoire".
$ docker inspect jenkins | grep Gateway
ssh user@docker.for.mac.localhost
au lieu d'utiliser l'adresse IP. Assurez-vous également que vous avez activé la fonction de connexion à distance dans les préférences système de macOs -> menu Dossier partagé
TL; DR
La version longue des
tests Jenkins Pipeline devient de plus en plus pénible. Contrairement à l' approche de configuration de travail déclarative classique où l'utilisateur était limité à ce que l'interface utilisateur a exposé, le nouveau pipeline Jenkins est un langage de programmation à part entière pour le processus de construction où vous mélangez la partie déclarative avec votre propre code. En tant que bons développeurs, nous voulons également avoir des tests unitaires pour ce type de code.
Vous devez suivre trois étapes lors du développement de Jenkins Pipelines. L' étape 1. devrait couvrir 80% des cas d'utilisation.
Exemples
Le dépôt pipelineUnit GitHub contient des exemples Spock sur la façon d'utiliser le framework de test Jenkins Pipeline Unit
Jenkins possède une fonction de «relecture», qui vous permet de rejouer rapidement un travail sans mettre à jour les sources:
Au moment de l'écriture (fin juillet 2017) avec le plugin Blue Ocean, vous pouvez vérifier la syntaxe d'un pipeline déclaratif directement dans l' éditeur de pipeline visuel . L'éditeur fonctionne à partir de l'interface utilisateur de Blue Ocean lorsque vous cliquez sur "configurer" uniquement pour les projets github (c'est un problème connu et ils travaillent pour le faire fonctionner également sur git, etc.).
Mais, comme expliqué dans cette question, vous pouvez ouvrir l'éditeur en parcourant:
[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/
Cliquez ensuite au milieu de la page et appuyez sur Ctrl+S
, cela ouvrira une zone de texte où vous pourrez coller un script déclaratif de pipeline. Lorsque vous cliquez sur Mettre à jour , s'il y a une erreur de syntaxe, l'éditeur vous indiquera où se trouve l'erreur de syntaxe. Comme dans cette capture d'écran:
S'il n'y a pas d'erreur de syntaxe, la zone de texte se fermera et la page visualisera votre pipeline. Ne vous inquiétez pas, cela ne sauvera rien (s'il s'agit d'un projet github, il validerait la modification du fichier Jenkins).
Je suis nouveau sur Jenkins et cela est très utile, sans cela, j'ai dû valider un fichier Jenkins plusieurs fois, jusqu'à ce qu'il fonctionne (très ennuyeux!). J'espère que cela t'aides. À votre santé.
Un peu tard pour la fête, mais c'est pourquoi j'ai écrit jenny
, une petite réimplémentation de quelques étapes clés du Jenkinsfile. ( https://github.com/bmustiata/jenny )
Autant que je sache, ce plugin de pipeline est le "moteur" des nouveaux mécanismes Jenkinsfile, donc je suis assez positif que vous puissiez l'utiliser pour tester localement vos scripts.
Je ne sais pas s'il y a des étapes supplémentaires nécessaires lorsque vous le copiez dans un fichier Jenkins, mais la syntaxe, etc. devrait être exactement la même.
Edit: Trouvé la référence sur le "moteur", vérifiez cette description de fonctionnalité, dernier paragraphe, première entrée.
Dans ma configuration de développement - sans un éditeur Groovy approprié - beaucoup de problèmes de Jenkinsfile proviennent d' erreurs de syntaxe simples . Pour résoudre ce problème, vous pouvez valider le fichier Jenkins par rapport à votre instance Jenkins (exécutée sur $JENKINS_HTTP_URL
):
curl -X POST -H $(curl '$JENKINS_HTTP_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') -F "jenkinsfile=<Jenkinsfile" $JENKINS_HTTP_URL/pipeline-model-converter/validate
La commande ci-dessus est une version légèrement modifiée de https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line
Mis à part la fonctionnalité de relecture que d'autres ont déjà mentionnée (idem sur son utilité!), J'ai trouvé les éléments suivants également utiles:
Mettez votre clé SSH dans votre profil Jenkins, puis utilisez le linter déclaratif comme suit:
ssh jenkins.hostname.here declarative-linter < Jenkinsfile
Cela fera une analyse statique sur votre fichier Jenkins. Dans l'éditeur de votre choix, définissez un raccourci clavier qui exécute cette commande automatiquement. Dans Visual Studio Code, qui est ce que j'utilise, accédez à Tâches> Configurer les tâches, puis utilisez le JSON suivant pour créer une commande Valider Jenkinsfile :
{
"version": "2.0.0",
"tasks": [
{
"label": "Validate Jenkinsfile",
"type": "shell",
"command": "ssh jenkins.hostname declarative-linter < ${file}"
}
]
}
j'utilise replay future, pour faire une mise à jour et courir rapidement.
Avec quelques limitations et pour les pipelines scriptés, j'utilise cette solution:
node('master') {
stage('Run!') {
def script = load('...you job file...')
}
}
def execute() {
... main job code here ...
}
execute()