web-dev-qa-db-fra.com

Exécuter des scripts de commandes sur un serveur distant (Windows) à partir de Jenkins

J'ai un serveur d'intégration continue (Jenkins) qui construit mon code (vérifie les erreurs de compilation) et exécute des tests puis déploie les fichiers sur un serveur distant (pas un fichier war, mais la structure de fichier réelle) Je le fais avec un Plugin Jenkins qui me permet de transférer des fichiers via samba, il le fait tous les soirs.

Maintenant, ce que je dois faire, c'est exécuter une commande ant sur le serveur distant. Et après cela, je dois démarrer le serveur d'applications sur le serveur distant, le serveur d'applications est démarré en exécutant un fichier .bat à partir de la ligne de commande.

Je ne sais pas du tout comment y parvenir, je sais que Jenkins est capable d'exécuter des commandes batch, mais comment les faire fonctionner dans le contexte du serveur et non dans le contexte du serveur de build?

19
Øyvind B

Si Jenkins sur Windows, à distance sur * nix, utilisez plink.exe (qui est essentiellement la ligne de commande PuTTY)

Si Jenkins sous Windows, distant sur Windows, utilisez psexec.exe

Si Jenkins sur * nix, à distance sur * nix, utilisez ssh

Si Jenkins sur * nix, distant sur Windows, (mise à jour 2015-01) Ansible http://docs.ansible.com/intro_windows.html prend en charge l'appel de commandes Windows, par exemple powershell, depuis unix/machine Linux, https://github.com/ansible/ansible-examples/blob/master/windows/run-powershell.yml

Dites-moi quels systèmes d'exploitation sont impliqués (à la fois sur Jenkins et à distance), et je flasherai plus loin.

Modifier:
La page de téléchargement de psexec.exe répertorie toutes les options de ligne de commande. Vous voudrez quelque chose comme:

psexec \\remotecomputername -u remoteusername -p remotepassword cmd /c <your commands here>
Remplacer <your commands here> avec les commandes réelles comme vous les exécuteriez à partir de l'invite de commandes.

Notez que psexec doit d'abord installer un service et que les informations d'identification à distance d'invite de commande/administrateur requises pour le faire sont requises.
Vous devez également exécuter psexec -accepteula une fois pour accepter l'invite du CLUF.

26
Slav

Suite à la réponse de Slav ci-dessus, voici une solution plus simple pour Jenkins (* nix) à distance (windows):

  1. Installez un serveur SSH sur vos fenêtres distantes ( MobaSSH home edition a bien fonctionné pour moi)
  2. Assurez-vous que votre utilisateur Jenkins, sur votre machine Jenkins, possède la certification requise pour ouvrir une connexion SSH avec votre télécommande (vous pouvez simplement ouvrir un terminal et ssh sur votre télécommande une fois, puis accepter la certification. Assurez-vous qu'elle est enregistrée pour le Jenkins utilisateur).
  3. Vous pouvez maintenant ajouter une phase d'exécution de construction Shell dans votre travail Jenkins qui peut SSH sur votre machine Windows distante.

Remarques :

  1. La connexion établie peut nécessiter un travail supplémentaire - vous devrez peut-être définir des variables d'environnement Windows ou mapper des pilotes réseau pour que vos commandes exécutées ou vos fichiers de commandes fonctionnent correctement sur vos machines Windows.
  2. Si vous souhaitez exécuter des opérations liées à l'interface graphique, cette solution peut ne pas être pertinente (suite à mon travail sur l'exécution de tests d'automatisation qui nécessitent une manipulation de l'interface graphique).
  3. L'utilisation du plugin Jenkins SSH est un problème, comme vu ici .
2
Rann Lifshitz

J'ai fini par adopter une approche différente après avoir essayé psexec.exe pendant un certain temps.

Psexec.exe et la copie de fichiers sur le réseau étaient un peu lents et instables, d'autant plus que le domaine sur lequel je travaille a une politique de changement de mot de passe tous les mois (ce qui a cassé la construction).

Au final, j'ai opté pour l'approche maître/esclave, qui est plus rapide et plus stable. Étant donné que je n'ai pas à utiliser psexec.exe et que je n'ai pas à copier de fichiers sur le réseau.

0
Øyvind B