web-dev-qa-db-fra.com

Comment utiliser SSH dans un pipeline Jenkins?

Certains travaux Jenkins ont été définis à l'aide d'une définition de modèle de pipeline Jenkins, qui permet de créer des projets NPM. J'utilise des conteneurs Docker pour construire ces projets (en utilisant une image commune avec Just Node.js + npm + yarn).

Les résultats des générations sont contenus dans le dossier dist/ que j'ai compressé à l'aide d'une commande Zip pipeline.

Je souhaite copier ce fichier Zip sur un autre serveur à l'aide de SSH/SCP (avec authentification par clé privée). Ma clé privée est ajoutée à l'environnement Jenkins (gestionnaire d'informations d'identification), mais lorsque j'utilise des conteneurs Docker, une connexion SSH ne peut pas être établie.

J'ai essayé d'ajouter agent { label 'master' } pour utiliser le nœud maître Jenkins pour le transfert de fichiers, mais il semble créer un espace de travail propre avec une nouvelle extraction Git et sans mes fichiers construits.

Après avoir essayé le plugin d'agent SSH, j'ai cette sortie:

Identity added: /srv/jenkins3/workspace/myjob-TFD@tmp/private_key_370451445598243031.key (rsa w/o comment)
[ssh-agent] Started.
[myjob-TFD] Running Shell script
+ scp -r dist test@myremotehost:/var/www/xxx
$ docker exec bfda17664965b14281eef8670b34f83e0ff60218b04cfa56ba3c0ab23d94d035 env SSH_AGENT_PID=1424 SSH_AUTH_SOCK=/tmp/ssh-k658r0O76Yqb/agent.1419 ssh-agent -k
unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 1424 killed;
[ssh-agent] Stopped.
Host key verification failed.
lost connection

Comment ajouter un hôte distant comme autorisé?

6
lbar

J'ai eu un problème similaire. Je n'ai pas utilisé le libellé 'maître' et j'ai constaté que le transfert de fichiers fonctionnait sur plusieurs esclaves lorsque je procédais comme suit:

Étape 1 - créer des clés SSH dans le serveur hôte distant, inclure la clé de allowed_keys

Étape 2 - Créer les informations d'identification à l'aide de clés SSH dans Jenkins, utilisez la clé privée de l'hôte distant.

L'étape ci-dessous est ajoutée au pipeline:

stage ('Deploy') {
    steps{
        sshagent(credentials : ['use-the-id-from-credential-generated-by-jenkins']) {
            sh 'ssh -o StrictHostKeyChecking=no [email protected] uptime'
            sh 'ssh -v [email protected]'
            sh 'scp ./source/filename [email protected]:/remotehost/target'
        }
    }
}
6
user9948238

Utilisez le plugin d'agent SSH:

Lorsque vous utilisez ce plugin, vous pouvez utiliser les informations d'identification globales.

3
haschibaschi

Comme @haschibaschi le recommande, j'utilise également le plug-in ssh-agent. J'ai besoin d'utiliser mes informations d'identification UID personnelles sur la machine distante, car elle ne possède pas de compte UID Jenkins. Le code ressemble à ceci (en utilisant, par exemple, mon UID personnel = "myuid" et mon serveur distant hostname = "non_jenkins_svr":

sshagent(['e4fbd939-914a-41ed-92d9-8eededfb9243']) {
    // 'myuid@' required for scp (this is from UID jenkins to UID myuid)
    sh "scp $WORKSPACE/example.txt myuid@non_jenkins_svr:${dest_dir}"
}

L'ID e4fbd939-914a-41ed-92d9-8eededfb9243 a été généré par le gestionnaire des informations d'identification Jenkins après la création d'une entrée d'informations d'identification de domaine globales.

Après avoir créé l'entrée d'informations d'identification, l'ID se trouve dans la colonne "ID" de la page d'informations d'identification. Lors de la création de l'entrée, j'ai sélectionné le type 'Nom d'utilisateur SSH avec clé privée' (champ 'Type') et copié la clé privée RSA créée à cet effet sous le compte myuid sur l'hôte non_jenkins_svr sans phrase secrète.

0

Pour ajouter un hôte distant à des hôtes connus et, espérons-le, faire face à votre erreur, essayez de passer manuellement de l'hôte Jenkins à SSH vers l'hôte cible en tant qu'utilisateur Jenkins.

Obtenez l'hôte où Jenkins est installé. Type

Sudo su jenkins

Maintenant, utilisez ssh ou scp comme

ssh username@server

Vous devriez être invité comme ceci:

L'authenticité de l'hôte 'serveur (ip)' ne peut pas être établie. L'empreinte de la clé ECDSA est SHA256: chaîne un peu bizarre. Êtes-vous sûr de vouloir continuer à vous connecter (oui/non)?

Tapez oui. Le serveur sera ajouté de manière permanente en tant qu'hôte connu. Ne même pas la peine de passer un mot de passe, juste Ctrl + C et essayez d'exécuter un travail Jenkins.

0
Patryk Wlaź