web-dev-qa-db-fra.com

Comment copier un fichier d'un hôte distant SSH sur un serveur Jenkins

Nous utilisons le serveur Jenkins pour notre processus de construction quotidien et exécutons des scripts bash sur des hôtes distants via SSH. Ces scripts génèrent des fichiers journaux HTML sur des hôtes distants.

Nous utilisons Copy to slave plugin pour copier des fichiers sur des machines esclaves et Publish over ssh plugin pour gérer les sessions SSH dans le processus de construction.

Maintenant, la question est la suivante: nous voulons copier certains fichiers (fichiers journaux des scripts) de l’hôte ssh distant vers le serveur Jenkins . Quelle option possible et meilleure pour les mêmes (le plugin sera meilleur, le cas échéant).

MODIFIER :

sshpass est une option, mais vous recherchez un plugin ou une meilleure façon de faire le travail.

15
Not a bug

utilisez sshpass command pour envoyer le fichier 

Environnement de construction -> Exécuter le script Shell sur l'hôte distant à l'aide de ssh -> Script post-construction

exemple de commande:

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

Ceci ignorera l'invite du mot de passe pour la commande scp et donnera le mot de passe à scp.

8
Not a bug

Je pense que vous pouvez générer une paire de clés ssh et la transmettre à l'esclave en tant que paramètre avec, par exemple, Plugin de fournisseur de fichier de configuration

Ensuite, utilisez simplement scp pour récupérer des fichiers en utilisant cette paire de clés pour le processus d'authentification.

1
ScayTrase

Évidemment beaucoup trop tard, mais si vous utilisez déjà publish-over-ssh, si vous souhaitez éviter de dupliquer les informations d'identification et disposer d'une bibliothèque partagée, vous pouvez utiliser ce morceau de groovy pour obtenir la configuration de l'hôte:

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
}

Comme mentionné, cela nécessite soit une bibliothèque partagée globale (pour que votre code soit approuvé), soit (probablement) un certain nombre d'approbations de l'administrateur, désolé pour cela.

Ceci retourne un BapSshHostConfiguration .

Pour une connexion par mot de passe, vous pouvez faire: 

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

Cela copie le fichier dans votre répertoire de travail local . Ce n’est probablement pas le meilleur code de tous les temps, mais je ne suis pas un grand spécialiste. Cela fonctionne et cela me suffit. (le set +x évite que la commande dans le journal ne renvoie le mot de passe). Se débarrasser de tout ce qui n'est pas CPS (sshHost = null) avant d'effectuer un appel CPS vous évite bien des maux de tête :)

Comme il m'a fallu un bon bout de temps pour comprendre, je voulais partager cela avec ceux qui viendraient après. 

0
Blizz