是否有某种工具可以管理和报告 Scons 生成的任务失败?
我知道这并不完全是 Scons 的预期用例,但在我的团队中,它用于执行诸如在 CI 中测试运行 Jupyter 笔记本之类的事情,如果有更好的方法在出现问题时分析输出,那就太好了。例如,我可以使用
-k
告诉 Scons 无论错误如何都继续前进,这让我可以运行所有笔记本测试,即使遇到一些故障,但随后挖掘日志并找出哪些笔记本是一件令人头痛的事情有什么问题。我真的希望最后有一些不错的报告,它至少可以快速告诉我哪些笔记本出现了故障,然后我可以挖掘完整的日志以获取更多详细信息。
我试图说服团队通过 pytest 运行这些“测试”,然后它会自动很好地完成这种事情(我们已经将其用于更正常的单元测试等),但他们有点顽固并且说“为什么我们需要 pytest?Scons 已经为我们运行笔记本了。”我可能会更努力地反对这一点,但通过改进 Scons 的功能,我可能会取得更好的成功。我认为我可以做一些事情来将 Scons 中的某些错误捕获到日志中,然后
cat
在 CI 运行结束时或其他什么地方,但我也只是想知道是否有一些预构建的工具可以做这样的事情,甚至可能已经集成到 Scons 中了吗?我不是 Scons 专家,也没有使用它很长时间,所以我不太确定这个生态系统中存在什么。但我猜 Scons 内部一定知道哪些计划任务失败了,所以也许可以说服它以某种方式输出这些信息?
非常感谢任何帮助!
所以我发现 scons 文档中的 GetBuildFailures 示例对此还不错:
https://scons.org/doc/2.0.1/HTML/scons-user/x2045.html
我正在那里运行“更完整”的示例(带有一些简单的 Python 2 -> 3 修复...)
def bf_to_str(bf):
"""Convert an element of GetBuildFailures() to a string
in a useful way."""
import SCons.Errors
if bf is None: # unknown targets product None in list
return '(unknown tgt)'
elif isinstance(bf, SCons.Errors.StopError):
return str(bf)
elif bf.node:
return str(bf.node) + ': ' + bf.errstr
elif bf.filename:
return bf.filename + ': ' + bf.errstr
return 'unknown failure: ' + bf.errstr
import atexit
def build_status():
"""Convert the build status to a 2-tuple, (status, msg)."""
from SCons.Script import GetBuildFailures
bf = GetBuildFailures()
if bf:
# bf is normally a list of build failures; if an element is None,
# it's because of a target that scons doesn't know anything about.
status = 'failed'
failures_message = "\n".join(["Failed building %s" % bf_to_str(x)
for x in bf if x is not None])
else:
# if bf is None, the build completed successfully.
status = 'ok'
failures_message = ''
return (status, failures_message)
def display_build_status():
"""Display the build status. Called by atexit.
Here you could do all kinds of complicated things."""
status, failures_message = build_status()
if status == 'failed':
print "FAILED!!!!" # could display alert, ring bell, etc.
elif status == 'ok':
print "Build succeeded."
print failures_message
atexit.register(display_build_status)
这让我在构建结束时得到某种合理的输出:
Failed building build/python/notebooks/<stuff>.log-nb: Error 1
Failed building build/python/notebooks/<stuff2>.log-nb: Error 1
Failed building build/python/notebooks/<stuff2>.log-nb: Error 1
...
etc.
可能有一些更奇特的东西可以像这样构建,也许可以更好地针对这些特定任务进行定制,但这是一个不错的开始。