我是Jenkins的新手,最近想安排一份工作来执行本地python脚本。我还没有源代码控制,所以我选择了#34;无"在Jenkins UI中创建作业时在源代码管理中。
我做了一些关于如何在Jenkins UI中执行python脚本的研究,我尝试使用Python插件来执行python脚本作为构建步骤。但它失败了。 (但实际上我不想使用这个插件,因为我的脚本需要输入参数,所以我认为我需要选择类似"执行shell"在BUILD字段中 - 我试过但也失败了)有谁帮我找到如何正确运行/调用本地python脚本?
PS:我也不清楚Jenkins工作区及其工作原理?如果有人可以为我澄清,那将是适当的。
这是我在构建失败后获得的控制台输出:
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
答案 0 :(得分:12)
创建一个Jenkins作业,并从jenkins作业中将脚本作为shell脚本运行。 喜欢这个
#!/bin/sh
python <absolute_path_of_python_script>.py
答案 1 :(得分:9)
而不是在每个服务器上处理本地脚本文件,您实际上可以将所有python脚本复制到Build部分下的“execute shell”中。 它必须从相关的python shebang开始。例如:
#!/usr/bin/env python
your script...
您还可以在作业中添加参数并在python脚本中使用环境变量。例如
parameter1 = os.environ['parameter1']
答案 2 :(得分:1)
另一种方法是创建pipeline
并执行sh
命令,该命令指向您的python脚本。您还可以按照他的答案中提到的dsaydon通过Jenkins UI传递参数。
sh
命令可以如下所示(就像您在命令行中运行一样):
sh 'python.exe myscript.py'
示例管道步骤,其中包含安装所有要求后创建新的虚拟环境并运行脚本
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+'''"
'''
}
其中
sh '''
your command here
'''
表示多行shell命令(如果确实需要)
您还可以将管道(groovy-script)中的变量传递到sh
命令中,然后作为参数传递给python脚本。使用这种方式'''+argument_value+'''
(带三个引号,并在变量名前后加上加号)
示例:您的python脚本接受可选参数path
,并且您想使用要在Jenkins UI中输入的特定值执行它。然后,您在groovy脚本中的shell命令应如下所示:
// 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+'''"'
答案 3 :(得分:1)
要在BUILD option
下执行Python脚本-选择“执行Windows批处理命令-键入这些cammand”。
我通过pythonpath是因为jenkins由于访问问题而无法访问环境变量。
set PYTHONPATH=%PYTHONPATH%;C:\Users\ksaha029\AppData\Local\Programs\Python\Python3
python C:\Users\ksaha029\Documents\Python_scripts\first.py
答案 4 :(得分:0)
在Mac上,我只是将script.py移至/Users/Shared/Jenkins/Home/workspace/your_project_name
,并且可以使用chmod 777 /Users/Shared/Jenkins/Home/workspace/your_project_name/script.py
来解决问题。
另外,我不需要使用:
#!/bin/sh
或#!/usr/bin/env python
。在我使用的jenkins内部版本中:
python3 /Users/Shared/Jenkins/Home/workspace/your_project_name/script.py
我应该提到,有一天我在尝试解决这个问题,而且我已经阅读了所有有关泡沫的问题。没有人真的可以帮助:/。
答案 5 :(得分:-1)
最简单的实现是将环境变量注入到构建过程框中。然后为Python定义两个变量,为脚本定义另一个变量。
例如PYTHONPATH = C:/python37/python.exe
TEST1SCRIPT = C:/USERS/USERNAME/Documents/test1.py
执行Windows批处理命令。
%PYTHONPATH% %TEST1SCRIPT%
这样,您可以在一个或多个执行Windows批处理命令段中运行许多脚本。还有自定义的方法。您可以创建一个包装程序,以在Jenkins下运行脚本,这样,如果通过电子邮件发送整个测试套件的结果,则可以格式化脚本结果输出。