webentwicklung-frage-antwort-db.com.de

So kopieren Sie eine Datei vom SSH-Remote-Host auf den Jenkins Server

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.

15
Not a bug

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.

8
Not a bug

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.

1
ScayTrase

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. 

0
Blizz