it-swarm-eu.dev

Jak kopírovat soubor ze vzdáleného hostitele SSH na server Jenkins Server

Používáme server Jenkins pro náš každodenní proces sestavování a provádí některé bash skripty na vzdálených počítačích přes SSH. Tyto skripty generují html log soubory na vzdálených počítačích.

Používáme Copy to slave plugin pro kopírování souborů na slave strojích a Publikovat přes ssh plugin pro správu SSH relací v procesu sestavování.

Nyní je otázkou: Chceme kopírovat některé soubory (logové soubory skriptů) ze vzdáleného ssh hostitele na server Jenkins Server. Který bude možný a lepší volba pro stejný (plugin bude lepší, pokud existuje).

UPRAVIT :

sshpass je volba, ale hledat nějaký plugin nebo lepší způsob, jak to udělat.

15
Not a bug

použijte příkaz sshpass k odeslání souboru 

Vytvoření prostředí -> Spuštění skriptu Shell na vzdáleném počítači pomocí ssh -> Post build script

ukázkový příkaz:

sshpass -p "password" scp path/of/file <new_server_ip>:/path/of/file

Toto vynechá heslo Prompt for scp a poskytne heslo scp.

8
Not a bug

Myslím, že můžete vygenerovat ssh keypair a předat ji slave jako parametr, například Config File Provider Plugin

Pak stačí použít scp pro načtení souborů pomocí tohoto klíče pro autentizaci.

1
ScayTrase

Je zřejmé, že příliš pozdě, ale v případě, že již používáte publish-over-ssh, chcete zabránit duplikování pověření a mít sdílenou knihovnu, můžete tento kousek groovy použít k získání konfigurace hostitele:

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
}

Jak již bylo zmíněno, toto vyžaduje buď globální sdílenou knihovnu (aby byl váš kód důvěryhodný), nebo (pravděpodobně) několik schválení správcem, za to se omlouvám.

Vrátí BapSshHostConfiguration .

Pro připojení pomocí hesla můžete provést: 

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
""")

To zkopíruje soubor do místního pracovního adresáře. Pravděpodobně nejde o nejlepší kód vůbec, ale nejsem groovy specialista. Funguje to a to je pro mě dost. (set +x je vyhnout se tomu, aby odráželo příkaz v logu, zobrazující heslo). Jak se zbavit čehokoliv jiného než CPS (sshHost = null) před provedením CPS volání vám ušetří spoustu bolesti hlavy :)

Vzhledem k tomu, že mi trvalo nějakou dobu, než jsem zjistil, že se o to chci podělit pro každého, kdo přijde dál. 

0
Blizz