Wir verwenden den Jenkins-Server für den täglichen Build-Prozess und führen einige Bash-Skripts auf Remote-Hosts über SSH aus. Diese Skripts generieren HTML-Protokolldateien auf Remote-Hosts.
Wir verwenden Copy to slave plugin, um Dateien auf Slave-Maschinen zu kopieren und Publish over ssh plugin, um SSH-Sitzungen im Build-Prozess zu verwalten.
Nun ist die Frage: Wir möchten einige Dateien (Protokolldateien von Scripts) vom Remote-SSH-Host auf den Jenkins-Server kopieren. __ Welche Optionen sind möglich und eine bessere Option für dasselbe (Plugin ist besser, wenn überhaupt).
EDIT:
sshpass ist eine Option, sucht aber nach einem Plugin oder nach einer besseren Methode, um den Job zu erledigen.
verwenden Sie den Befehl sshpass
, um die Datei zu senden
Umgebung erstellen -> Shell-Skript auf Remote-Host mit ssh -> .__ ausführen. Post-Build-Skript
beispielbefehl:
sshpass -p "password" scp path/of/file <new_server_ip>:/path/of/file
Dadurch wird das Kennwort übersprungen. Die Eingabeaufforderung für den Befehl scp
wird angezeigt und das Kennwort wird an scp
übergeben.
Ich denke, Sie können das SSH-Schlüsselpaar generieren und als Parameter an den Slave übergeben, z. B. mit Config File Provider Plugin .
Verwenden Sie dann einfach scp, um Dateien mit diesem Schlüsselpaar für die Authentifizierung abzurufen.
Offensichtlich viel zu spät, aber falls Sie publish-over-ssh
bereits verwenden, keine doppelten Anmeldeinformationen verwenden möchten und über eine gemeinsam genutzte Bibliothek verfügen, können Sie diese Groovy-Komponente verwenden, um die Host-Konfiguration zu erhalten:
import jenkins.plugins.publish_over_ssh.*
@NonCPS
def getSSHHost(name) {
def found = null
Jenkins.instance.getDescriptorByType(BapSshPublisherPlugin.Descriptor.class).each{
it.hostConfigurations.each{Host ->
if (Host.name == name) {
found = Host
}
}
}
found
}
Wie bereits erwähnt, erfordert dies entweder eine Global Shared Library (damit Ihr Code vertrauenswürdig ist) oder (wahrscheinlich) eine Reihe von Administratorzulassungen, entschuldigen Sie dies.
Dies gibt eine BapSshHostConfiguration zurück.
Für eine Passwortverbindung können Sie Folgendes tun:
def sshHost = getSSHHost('Configuration Name')
def Host = [Host: sshHost.hostname, user: sshHost.username, password: sshHost.password]
sshHost = null
sh("""
set +x
sshpass -p "${Host.password}" scp -o StrictHostKeyChecking=no ${Host.user}@${Host.host}:filename.extension .
set -x
""")
Dies kopiert die Datei in Ihr lokales Arbeitsverzeichnis. Wahrscheinlich nicht der beste Code aller Zeiten, aber ich bin kein grooviger Spezialist. Es funktioniert und das reicht mir. (Der set +x
soll verhindern, dass der Befehl im Protokoll mit dem Kennwort angezeigt wird). Wenn Sie nicht CPS (sshHost = null
) entfernen, bevor Sie einen CPS-Anruf durchführen, ersparen Sie sich viele Kopfschmerzen :)
Da es eine Weile dauerte, bis ich herausgefunden hatte, wollte ich das für jeden, der als nächstes kommt, weitergeben.