1
votes

'scp' n'est pas reconnu comme une commande interne ou externe lors de l'exécution du fichier Jenkins

J'ai un pipeline Jenkins très basique qui construit un projet Java et déploie l'artefact sur une instance EC2 .

La construction une partie fonctionne bien mais le déploiement ne fonctionne pas et donne une erreur liée à scp.

J'ai copié-collé toute la commande scp présente dans mon Jenkinsfile sur l'invite de commande Windows pour voir si cela fonctionne et copie le fichier jar vers l'instance ec2 avec succès, et cela a fonctionné.

 entrez la description de l'image ici

Je ne sais pas pourquoi cela ne fonctionne pas via Jenkins.

Jenkinsfile

[INFO] Installing C:\Program Files (x86)\Jenkins\workspace\helloworld-rest-app-build\pom.xml to C:\Windows\system32\config\systemprofile\.m2\repository\com\example\helloworld-rest-app\0.0.1-SNAPSHOT\helloworld-rest-app-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.991 s
[INFO] Finished at: 2019-01-25T00:11:10-05:00
[INFO] ------------------------------------------------------------------------
[Pipeline] bat

C:\Program Files (x86)\Jenkins\workspace\helloworld-rest-app-build>scp -i C:\Users\Nital\.ssh\LightsailDefaultKey-us-east-1.pem target\hellworld-rest-app.jar ec2-user@35.175.125.176:/home/ec2-user/app-deploys 
'scp' is not recognized as an internal or external command,
operable program or batch file.
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE

Invite de commandes Windows:

C:\Users\Nital>scp
usage: scp [-346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program] source ... target

Journal des erreurs Jenkins:

pipeline {
        agent any
        tools {
            maven "Maven3"
        }
        stages {
            stage('Build and Deploy') {
                steps {
                    script {
                        def os = System.properties['os.name'].toLowerCase()
                        echo "OS: ${os}"                
                        if (os.contains("linux")) {
                          sh "mvn clean install -DskipTests" 
                        } else {
                          bat "mvn clean install -DskipTests"
                          bat "scp -i C:\\Users\\Nital\\.ssh\\LightsailDefaultKey-us-east-1.pem target\\helloworld-rest-app.jar ec2-user@35.175.125.176:/home/ec2-user/app-deploys"
                        }
                    }
                }
                post {
                    success {
                        echo 'Build and Deploy - SUCCESS'
                    }
                } 
            }
        }
    }


7 commentaires

On dirait que scp n'est pas dans le chemin de l'utilisateur qui exécute Jenkins


Jenkins est sur la même machine locale qui est Windows 10 . J'ai mis à jour ma question d'origine avec une capture d'écran qui montre que je peux copier manuellement le JAR vers EC2 en utilisant SCP


Jenkins fonctionne-t-il avec votre ID utilisateur? Comment scp a-t-il été ajouté à l'environnement PATH de votre shell?


Je viens de voir que scp était sélectionné à partir de `C: \ Windows \ System32 \ OpenSSH 'qui, je pense, aurait pu être installé avec un autre programme. J'ai également ajouté ce dossier à la variable PATH, puis j'ai à nouveau exécuté le travail de construction, mais pas de chance. Pourquoi Jenkins n'est-il pas en mesure de choisir ce scp.exe alors que l'invite de commande Windows le peut? Y a-t-il une configuration dans Jenkins qui doit également être effectuée?


Oui, Jenkins fonctionne avec le même ID utilisateur et il est installé sur la même machine Windows 10.


Pouvez-vous s'il vous plaît faire écho au chemin dans votre script de construction Jenkins et voir si le chemin OpenSSL est là


Sous Windows 10, j'ai essayé d'utiliser un chemin absolu comme celui-ci: c: \ Windows \ System32 \ OpenSSH \ scp.exe -r styleguide www@192.168.XZ: / srv / folder mais ne fonctionne pas, cependant , cela fonctionne bien sur PowerShell CLI


4 Réponses :


0
votes

Si vous avez besoin de scp quelque chose à partir de Windows, alors pourquoi ne pas simplement utiliser pscp pour y parvenir?

installez PuTTY, qui comprend également PSCP (SCP pour Windows).

http://www.chiark.greenend.org. uk / ~ sgtatham / putty / download.html

veuillez sélectionner la dernière version de MSI («Windows Installer») pour votre ordinateur (32 bits ou 64 bits)

Si vous souhaitez l'utiliser dans un programme Java, voici un exemple: http://www.jcraft.com/jsch/examples/ScpFrom.java.html


5 commentaires

Je peux certainement essayer cela si la question ci-dessus n'a pas de solution. Il est juste au-delà de ma compréhension de la raison pour laquelle cette chose fonctionne via l'invite de commande et non via Jenkins qui est également installé sur la même machine.


@ user2325154 Pouvez-vous essayer avec le chemin complet de scp comme C: \ Program Files \ PuTTY \ scp -i C: \ Users \ Nital \ .ssh \ LightsailDefaultKey-us-east-1 .pem target \ hellworld-rest-app.jar ec2-user@35.175.125.176: / home / ec2-user / app-deploys


Je ne vois aucun scp.exe dans le dossier C: \ Program Files \ PuTTY \, donc je pense que la commande ci-dessus échouera.


scp.exe est présent dans le dossier C: \ Windows \ System32 \ OpenSSH. J'ai essayé d'ajouter le chemin complet et d'exécuter à nouveau le travail de construction mais pas de chance


J'ai reçu ce message d'erreur après avoir essayé d'installer pscp. # pscp -i C: \ Users \ Nital \ .ssh \ LightsailDefaultKey-us-east-1.pem target \ helloworld-rest-app.jar ec2-user@35.175.125.176: / home / ec2-user / app-deploys Impossible d'utiliser le fichier de clé "C: \ Users \ Nital \ .ssh \ LightsailDefaultKey-us-east-1.pem" (clé privée OpenSSH SSH-2 (ancien format PEM)) Fatal: déconnecté: aucune méthode d'authentification prise en charge disponible (serveur envoyé: publickey)



-1
votes

Commande Scp utilisée pour transférer en toute sécurité des fichiers entre deux systèmes d'ordinateurs Linux / Unix

La syntaxe de la commande scp est:

pscp c:\documents\info.txt userid@server.example.com:/tmp/foo/info.txt

et pour utiliser la commande scp dans Windows, utilisez pscp:

scp [options] username1@source_host:directory1/filename1 username2@destination_host:directory2/filename2

Veuillez parcourir l'articulaire p >

https://it.cornell.edu/managed- serveurs / transfert-de-fichiers-utilisant-du mastic


1 commentaires

J'ai reçu ce message d'erreur après l'installation de pscp. # pscp -i C: \ Users \ Nital \ .ssh \ LightsailDefaultKey-us-east-1.pem target \ helloworld-rest-app.jar ec2-user@35.175.125.176: / home / ec2-user / app-deploys Impossible d'utiliser le fichier de clé "C: \ Users \ Nital \ .ssh \ LightsailDefaultKey-us-east-1.pem" (clé privée OpenSSH SSH-2 (ancien format PEM)) Fatal: déconnecté: aucune méthode d'authentification prise en charge disponible (serveur envoyé: publickey)



0
votes

Ajoutez cette ligne avant d'exécuter l'une des commandes comme scp etc.

PATH=/sbin:/usr/sbin:/usr/bin:/usr/local/bin


1 commentaires

Définir ceci dans Jenkinsfile? J'utilise Windows OS, j'essaierai donc l'équivalent Windows de la commande ci-dessus



0
votes

C'est parce que l'exécutable est dans le répertoire Windows System32 et pour des raisons de sécurité, il n'est pas accessible à partir des scripts. Si vous copiez les exécutables ssh et scp hors du répertoire Windows et mettez le nouveau répertoire dans votre chemin, cela devrait fonctionner.


0 commentaires