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é.
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' } } } } }
4 Réponses :
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
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)
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
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)
Ajoutez cette ligne avant d'exécuter l'une des commandes comme scp etc.
PATH=/sbin:/usr/sbin:/usr/bin:/usr/local/bin
Définir ceci dans Jenkinsfile? J'utilise Windows OS, j'essaierai donc l'équivalent Windows de la commande ci-dessus
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.
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 estWindows 10
. J'ai mis à jour ma question d'origine avec une capture d'écran qui montre que je peux copier manuellement leJAR
versEC2
en utilisantSCP
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