Je suis nouveau à Jenkins, je souhaite récemment planifier un travail pour exécuter un script python local. Je n'ai pas encore de contrôle de code source et j'ai donc sélectionné "Aucun" dans la gestion du code source lors de la création du travail dans l'interface utilisateur de Jenkins.
J'ai effectué des recherches sur la manière d'exécuter des scripts python dans l'interface utilisateur de Jenkins et j'ai essayé d'utiliser le plug-in Python pour exécuter des scripts python en tant qu'étapes de construction. Mais ça a échoué. (Mais en réalité, je ne veux pas utiliser ce plugin car mon script prend des arguments d'entrée, alors je pense que je dois sélectionner quelque chose comme "execute shell" dans le champ BUILD - j'ai essayé mais aussi échoué) exécuter/appeler correctement un script python local?
PS: Je ne suis pas non plus au courant de l’espace de travail Jenkins et de son fonctionnement. Sera approprié si quelqu'un pourrait clarifier pour moi.
Voici la sortie de la console que j'ai obtenue après la construction en échec:
Started by user Yiming Chen
[EnvInject] - Loading node environment variables.
Building in workspace D:\Application\Jenkins\workspace\downloader
[downloader] $ sh -xe C:\windows\TEMP\hudson3430410121213277597.sh
The system cannot find the file specified
FATAL: command execution failed
Java.io.IOException: Cannot run program "sh" (in directory "D:\Application\Jenkins\workspace\downloader"): CreateProcess error=2, The system cannot find the file specified
at Java.lang.ProcessBuilder.start(Unknown Source)
at hudson.Proc$LocalProc.<init>(Proc.Java:245)
at hudson.Proc$LocalProc.<init>(Proc.Java:214)
at hudson.Launcher$LocalLauncher.launch(Launcher.Java:846)
at hudson.Launcher$ProcStarter.start(Launcher.Java:384)
at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.Java:108)
at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.Java:65)
at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.Java:20)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.Java:779)
at hudson.model.Build$BuildExecution.build(Build.Java:205)
at hudson.model.Build$BuildExecution.doRun(Build.Java:162)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.Java:534)
at hudson.model.Run.execute(Run.Java:1728)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.Java:43)
at hudson.model.ResourceController.execute(ResourceController.Java:98)
at hudson.model.Executor.run(Executor.Java:404)
Caused by: Java.io.IOException: CreateProcess error=2, The system cannot find the file specified
at Java.lang.ProcessImpl.create(Native Method)
at Java.lang.ProcessImpl.<init>(Unknown Source)
at Java.lang.ProcessImpl.start(Unknown Source)
... 16 more
Build step 'Execute Shell' marked build as failure
Finished: FAILURE
Créez un travail Jenkins et exécutez vos scripts en tant que script Shell à partir du travail jenkins .
#!/bin/sh
python <absolute_path_of_python_script>.py
au lieu de gérer le fichier de script local sur chaque serveur, vous pouvez réellement copier tout le script python dans le "shell d'exécution" de la section Construction . Il doit commencer par le Shebang python approprié. Par exemple:
#!/usr/bin/env python
your script...
vous pouvez également ajouter des paramètres dans le travail et utiliser des variables d'environnement dans votre script python. par exemple
parameter1 = os.environ['parameter1']
Une autre méthode consiste à créer pipeline
et à exécuter la commande sh
, qui pointe vers votre script python. Vous pouvez également transmettre des paramètres via l'interface utilisateur de Jenkins en tant que dsaydon mentionné dans sa réponse.
La commande sh
peut être la suivante (c'est comme si vous exécutiez en ligne de commande):
sh 'python.exe myscript.py'
Exemple d'étape de pipeline avec la création d'un nouvel environnement virtuel et l'exécution d'un script après l'installation de toutes les exigences
stage('Running python script'){
sh '''
echo "executing python script"
"'''+python_exec_path+'''" -m venv "'''+venv+'''" && "'''+venv+'''\\Scripts\\python.exe" -m pip install --upgrade pip && "'''+venv+'''\\Scripts\\pip" install -r "'''+pathToScript+'''\\requirements.txt" && "'''+venv+'''\\Scripts\\python.exe" "'''+pathToScript+'''\\my_script.py" --path "'''+PathFromJenkinsUI+'''"
'''
}
où
sh '''
your command here
'''
signifie une commande multiligne Shell (si vous en avez vraiment besoin)
Vous pouvez également transmettre des variables de votre pipeline (groovy-script) à la commande sh
et, par conséquent, à votre script python sous forme d'arguments. Utilisez cette méthode '''+argument_value+'''
(avec trois guillemets et plus autour du nom de la variable)
Exemple: votre script python accepte l'argument optionnel path
et vous souhaitez l'exécuter avec une valeur spécifique que vous souhaitez entrer dans votre interface utilisateur Jenkins. Ensuite, votre commande Shell dans un script groovy devrait être la suivante:
// getting parameter from UI into `pathValue` variable of pipeline script
// and executing Shell command with passed `pathValue` variable into it.
pathValue = getProperty('pathValue')
sh '"\\pathTo\\python.exe" "my\\script.py" --path "'''+pathValue+'''"'