Jenkins能处理图形/非图形交互的Python或Java程序吗?
我想创建一个构建流程,开发者需要在一个属性文件里设置一些内容,这个文件会通过一个前端的图形界面来填充。
我试着用Python运行一个示例的命令行交互脚本,这个脚本只问了一个名字,然后把它打印出来。但是Jenkins等了很久,最后卡住了。我看到它在请求输入,但用户却没有办法输入数据。
补充说明: 目前Jenkins是作为一个服务在运行的……有没有推荐的好插件,或者是我写的Python脚本有问题?
偏好: 我更倾向于使用Python,因为它比较轻量,但如果其他语言有成功的案例,我也可以考虑。
如果能用图形界面的菜单来填充数据就更好了,这样我可以使用选项框、下拉菜单,让界面看起来更好看,但这不是必须的,命令行的方式比我们现在的部署方式要好很多。
顺便说一下,所有这些都是在一台运行Windows 7的笔记本上,使用Python 2.7和Java 1.7。
抱歉写了这么多!希望大家能帮我!
1 个回答
抱歉,Jenkins 不是一个可以互动的应用程序。它是为了自动执行而设计的。
要给 Jenkins 任务输入信息,唯一可行的方法就是在任务开始之前设置好任务参数。虽然 Jenkins 的图形界面在输入参数方面不是很好,但它能完成这个工作。一旦 Jenkins 任务在开始时收集了参数,它就可以在任务执行的任何时候把这些参数传递给它执行的任何东西(比如 Python、shell 等)。要做到这一点,有两个条件:
- 你需要在任务开始之前收集好所有输入数据
- 你的任务调用的程序(Python、shell 等)需要能够通过命令行接收输入,而不是通过互动方式。
如何将输入传递给程序
一个设计良好的脚本应该能够简单地在命令行接受参数:
./goodscript.sh MyName
是最简单的方式,其中值 MyName
会被存储在脚本的第一个参数 $1
中。后续的命令行参数会分别存储在 $2
、$3
等变量中。
./goodscript.sh -name MyName -age 30
是更好的方式,脚本可以通过在参数值前指定参数名称来接受多个参数,而不管它们的顺序。你可以了解一下如何使用 getopt 来实现这种参数传递方式。
以上两个例子假设 goodscript.sh
编写得足够好,能够处理这些命令行参数。如果脚本没有明确处理命令行参数,那么这样做就没什么用。
你可以将一些输出“管道”到一个不设计为处理命令行参数的互动脚本中:
echo MyName | ./interactivescript.sh
会把值 MyName
传递给 interactivescript.sh
提供给用户的第一个互动提示。问题是,你只能把值传递给第一个互动提示。
Jenkins 任务参数图形界面
正如我之前所说,你可以使用 Jenkins 的图形界面来收集各种任务参数(下拉列表、复选框、文本输入)。我假设你知道如何设置带参数的 Jenkins 任务。如果不知道,在任务配置中勾选 "This build is parameterized" 这个选项。如果你不知道怎么设置,这就是另一个问题,需要单独解释。
不过,一旦你的 Jenkins 任务在开始时收集了所有参数,你就可以在你的 "execute shell" 步骤中引用它们。如果你使用的是 Windows,你会用 %PARAM_NAME%
来引用它们,而在 Linux 中则用 $PARAM_NAME
。
请说明你需要帮助的内容:是让你的脚本接受命令行参数,还是从 Jenkins 任务图形界面传递这些命令行参数,我会进一步扩展这个回答。