Ich bin neu bei Jenkins und möchte vor kurzem einen Job einplanen, um ein lokales Python-Skript auszuführen. Ich habe noch keine Quellcodeverwaltung, also habe ich beim Erstellen des Jobs in der Jenkins-Benutzeroberfläche im Quellcode-Management "Keine" ausgewählt.
Ich recherchierte über die Ausführung von Python-Skripten in der Jenkins-Benutzeroberfläche und versuchte, Python-Plugin zu verwenden, um Python-Skripts als Erstellungsschritte auszuführen. Aber es ist fehlgeschlagen. (Aber ich möchte dieses Plugin eigentlich nicht verwenden, da mein Skript Eingabeargumente benötigt. Ich denke, ich muss etwas wie "Shell ausführen" im Feld BUILD auswählen - ich habe es versucht, aber auch gescheitert.) ein lokales Python-Skript ordnungsgemäß ausführen/aufrufen?
PS: Mir ist auch der Jenkins Workspace und seine Funktionsweise nicht klar. Ist angebracht, wenn jemand es für mich klären könnte.
Hier ist die Console-Ausgabe, die ich nach dem Fail-Build erhalten habe:
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
Erstellen Sie einen Jenkins-Job, und führen Sie Ihre Skripts als Shell-Skript von jenkins Job aus
#!/bin/sh
python <absolute_path_of_python_script>.py
anstatt die lokale Skriptdatei auf jedem Server zu behandeln, können Sie tatsächlich das gesamte Python-Skript in die "Execute-Shell" unter dem Abschnitt "Build" kopieren. Es muss mit dem entsprechenden Python-Shebang beginnen. Zum Beispiel:
#!/usr/bin/env python
your script...
sie können dem Job auch Parameter hinzufügen und Umgebungsvariablen in Ihrem Python-Skript verwenden. zum Beispiel
parameter1 = os.environ['parameter1']
Eine andere Möglichkeit besteht darin, pipeline
zu erstellen und den Befehl sh
auszuführen, der auf Ihr Python-Skript zeigt. Sie können Parameter auch über die Jenkins-Benutzeroberfläche übergeben, als dsaydon in seiner Antwort erwähnt.
Der Befehl sh
kann wie folgt aussehen (wird wie in der Befehlszeile ausgeführt):
sh 'python.exe myscript.py'
Beispiel-Pipeline-Schritt zum Erstellen einer neuen virtuellen Umgebung und Ausführen eines Skripts nach der Installation aller Anforderungen
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+'''"
'''
}
woher
sh '''
your command here
'''
bedeutet mehrzeiliger Shell-Befehl (wenn Sie es wirklich brauchen)
Sie können auch Variablen aus Ihrer Pipeline (groovy-script) an den Befehl sh
und folglich an Ihr Python-Skript als Argumente übergeben. Verwenden Sie diesen Weg '''+argument_value+'''
(mit drei Anführungszeichen und einem Pluszeichen um den Variablennamen)
Beispiel: Ihr Python-Skript akzeptiert das optionale Argument path
und Sie möchten es mit einem bestimmten Wert ausführen, den Sie in Ihre Jenkins-Benutzeroberfläche eingeben möchten. Dann sollte Ihr Shell-Befehl in groovigem Skript folgendermaßen lauten:
// 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+'''"'