自定义buildbot步骤类 - 如何使用remoteCommand/remoteShellCommand创建自己的步骤

1 投票
1 回答
1336 浏览
提问于 2025-04-18 03:34

我正在尝试写一个自定义步骤,这个步骤会运行几个命令,并根据特定条件返回成功或失败的结果。

到目前为止,我已经能够继承ShellCommand类,这样我就可以在从属机器上执行一个shell命令。接下来的步骤是写一个可以执行多个shell命令的东西,并分析这些命令的结果,然后根据结果采取相应的行动。

不过,我在这个过程中并没有成功。目前我只能继承ShellCommand类,但这只能让我运行一个命令。我发现ShellCommand使用了buildstep.remoteCommand和remoteShellCommand;但是我尝试继承buildstep.BuildStep却没有成功。

我想实现的目标是运行有限数量的python或shell命令(不想写一个shell脚本然后从python中调用;我已经能做到这一点),并分析这些操作的结果,这样我就可以判断一个步骤是通过还是失败,以及记录什么内容。

到目前为止,我有的代码是这样的:

class myclass(build step.BuildStep)

    def __init__(self, **kwargs):
        buildstep.BuildStep.__init__(self, **kwargs)


    def start(self):

    cmd=buildstep.RemoteShellCommand({'command':"ls -la"})
    self.setupEnvironment(cmd)
    d=self.runCommand(cmd)
    return d

这段代码会运行,但在remoteShellCommand那一行我会收到一个错误,提示

exceptions.TypeError: __init__() takes at least 3 arguments (2 given)

我尝试过remoteCommand和remoteShellCommand,结果都是一样的。检查这两个的init方法,我只看到一个命令,而不是三个参数,所以我不太确定哪里出了问题。我甚至尝试使用**kwargs,但得到的错误是说kwarg没有定义(我看到一个博客的例子是用kwargs的,所以我试了试,但也没成功)。

这是remoteShellCommand的原始文档:
[原始Buildbot API文档][1]

你知道哪里可以找到一个实际的例子,告诉我如何完成这个,或者至少如何使用remoteCommand/remoteShellCommand吗?原始文档很混乱,连谷歌搜索的结果也比原始文档更模糊。

任何建议都很欢迎;我这三天一直在绕圈子,完全不知道接下来该去哪里找。

1 个回答

2

有一种方法可以让一个命令执行多个操作,那就是传递一个脚本,而不是单个命令,下面这个例子就说明了这一点:

class CoverageReport(ShellCommand):
    def __init__(self):
        self.coverage_path = '/var/www/coverage'
        command = '''rm -rf htmlcov
coverage html
cp htmlcov/* %s/''' % self.coverage_path
        description = 'Generating coverage report'
        workdir = 'build/python'
        self.url = "https://XXXXXXXX/coverage"
        ShellCommand.__init__(self, command=command, description=description, workdir=workdir)

这个Shell命令做了三件事情:

  1. 删除旧的报告
  2. 生成新的报告
  3. 把报告复制到www文件夹

返回的结果就相当于一个bash脚本的结果,你可以尝试用bash来返回你想要的任何东西

另一种选择是给你的构建过程添加多个步骤

撰写回答