it-swarm.com.de

Wie verwende ich SSH in einer Jenkins-Pipeline?

Ich habe einige Jenkins-Jobs, die mithilfe einer Jenkins-Pipeline-Modelldefinition definiert wurden, die NPM-Projekte erstellt. Ich verwende Docker-Container, um diese Projekte zu erstellen (unter Verwendung eines allgemeinen Images mit Nur Node.js + npm + garne).

Die Ergebnisse der Builds befinden sich im dist/-Ordner, den ich mit einem Zip-Pipeline-Befehl gepackt habe.

Ich möchte diese Zip-Datei mit SSH/SCP (mit Authentifizierung mit privatem Schlüssel) auf einen anderen Server kopieren. Mein privater Schlüssel wird der Jenkins-Umgebung (Anmeldeinformations-Manager) hinzugefügt. Wenn ich jedoch Docker-Container verwende, kann keine SSH-Verbindung hergestellt werden.

Ich habe versucht, agent { label 'master' } hinzuzufügen, um den Master-Jenkins-Knoten für die Dateiübertragung zu verwenden, aber es scheint ein sauberer Arbeitsbereich mit neuem Git-Abruf und ohne meine erstellten Dateien zu erstellen.

Nachdem ich das SSH-Agent-Plugin ausprobiert habe, habe ich folgende Ausgabe:

Identity added: /srv/jenkins3/workspace/[email protected]/private_key_370451445598243031.key (rsa w/o comment)
[ssh-agent] Started.
[myjob-TFD] Running Shell script
+ scp -r dist [email protected]:/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

Wie füge ich einen Remote-Host als autorisiert hinzu?

6
lbar

Ich hatte ein ähnliches Problem. Ich habe das Label 'master' nicht verwendet, und ich habe festgestellt, dass der Dateitransfer über mehrere Slaves hinweg funktioniert, wenn ich das folgendermaßen mache:

Schritt 1 - Erstellen Sie SSH-Schlüssel auf dem Remote-Host-Server, und geben Sie den Schlüssel für authorized_keys an

Schritt 2 - Erstellen Sie die Berechtigungsnachweise mithilfe von SSH-Schlüsseln in Jenkins. Verwenden Sie den privaten Schlüssel vom Remote-Host

Der folgende Schritt wird der Pipeline hinzugefügt:

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

Verwenden Sie das SSH-Agenten-Plugin:

Bei Verwendung dieses Plugins können Sie die globalen Anmeldeinformationen verwenden.

3
haschibaschi

Wie @haschibaschi empfiehlt, benutze ich auch das ssh-agent plugin. Ich muss meine persönlichen UID-Anmeldeinformationen auf dem Remote-Computer verwenden, da er kein UID-Jenkins-Konto hat. Der Code sieht folgendermaßen aus (z. B. mit meiner persönlichen UID = "myuid" und dem Remoteserver hostname = "non_jenkins_svr"):

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

Die ID e4fbd939-914a-41ed-92d9-8eededfb9243 wurde vom Jenkins-Berechtigungsmanager generiert, nachdem ich einen globalen Domänenanmeldeinformationen-Eintrag erstellt hatte.

Nach dem Erstellen des Anmeldeinformationseintrags wird die ID in der Spalte "ID" auf der Seite "Anmeldeinformationen" angezeigt. Beim Erstellen des Eintrags habe ich den Typ 'SSH-Benutzername mit privatem Schlüssel' (Feld 'Kind') ausgewählt und den privaten RSA-Schlüssel kopiert, den ich zu diesem Zweck unter dem Konto myuid auf Host non_jenkins_svr ohne Passphrase erstellt hatte.

0

Um einen Remote-Host zu bekannten Hosts hinzuzufügen und Ihren Fehler hoffentlich zu beheben, versuchen Sie, manuell ssh vom Jenkins-Host zum Ziel-Host als Jenkins-Benutzer zu senden.

Rufen Sie den Host auf, auf dem Jenkins installiert ist. Art

Sudo su jenkins

Verwenden Sie jetzt ssh oder scp like

ssh [email protected]

Sie sollten folgendermaßen aufgefordert werden:

Die Authentizität des Hosts 'server (ip)' kann nicht festgestellt werden. Der Fingerabdruck des ECDSA-Schlüssels ist SHA256: eine seltsame Zeichenfolge. Möchten Sie die Verbindung wirklich fortsetzen (Ja/Nein)?

Geben Sie yes ein. Der Server wird dauerhaft als bekannter Host hinzugefügt. Mach dir nicht einmal die Mühe, ein Passwort zu übergeben, nur Ctrl + C und versuchen Sie, einen Jenkins-Job auszuführen.

0
Patryk Wlaź