我如何以编程方式检测我的启动板构建过程是否完成?

我如何以编程方式检测我的启动板构建过程是否完成?

我正在研究Snap!C++ 项目它管理具有一组复杂依赖关系的许多包(见下图)。

因此,我需要先完成包 A 的构建,然后才能运行包 B 的构建。我希望至少半自动化构建过程,为此,我需要以编程方式知道包 A 已完成构建。然后,我可以验证构建是否成功(我知道如何操作),如果成功,我可以发送包 B 的源代码并开始构建。

我发现关于启动板 API我下载了他们提供的用于访问服务器的 Python 脚本。但是,我不太擅长 Python,也不太确定需要使用什么 API 调用。我发现这个巨大的页面我假设所有调用都可用,但我找不到如何获取特定项目当前构建状态的简单示例。也许吧getBuildQueueSizes?但查看launchpadlibPython 项目文件,我在代码中找不到任何这样的名称。所以我不太确定它是如何工作的。

您有至少能实现这么多功能的示例代码可以与我们分享吗?或者在 Launchpad.net 网站上有示例吗?

此时,我的脚本已连接...我下一步该做什么?

# See API here
# https://launchpad.net/+apidoc/devel.html

from launchpadlib.launchpad import Launchpad
from os.path import expanduser

home = expanduser('~')
cachedir = home + '/.launchpadlib/cache/'
launchpad = Launchpad.login_anonymously('snapcpp', 'production', cachedir, version='devel')

如果可能的话,只要一个 URI 就好了。从我在这里和那里看到的情况来看,可以简单地GET向 URI 发出一个 HTTP 并返回一个包含所有必要信息的 JSON。我不明白那个 URI 是什么。我尝试了文档中看到的几种方法(有大量示例...不是):

https://api.launchpad.net/devel/snapcpp?ws.op=getBuildRecords&source_name=libtld

这个告诉我这getBuildRecords不是一个命令。不过,在大多数情况下,我得到的是 400 或 404。项目 URL 有效,但 JSON 中显示的所有链接都无济于事:

https://api.launchpad.net/devel/snapcpp

经过更多测试,我发现我可以使用以下方法搜索一些构建:

https://api.launchpad.net/devel/ubuntu/bionic?ws.op=getBuildRecords&source_name=lib

但是,如果我尝试使用我的项目名称作为source_name=...参数(又名“libtld”或“snapcpp”),它会返回一个空列表。最后一个 URL 也适用于 just/ubuntu?...或 with an architecture /ubuntu/bionic/amd64?...。但这没有帮助。

我认为这可能是我在 Launchpad 上报告了一个错误

在此处输入图片描述


更新

现已实施¹。如果您对具体实施感兴趣,请查看snapbuilder 工具

在这里我想提出一个重要的观点:

在软件包可用之前,构建过程被标记为“完成”。因此,仅依靠 API 来了解构建是否完成是不够的。因此,我实际上在 snapbuilder 工具中添加了一个新阶段:“打包”。当包被标记为成功构建并且尝试下载新包(我使用 HEAD 而不是 GET 来避免从工具实际下载)时,此状态处于活动状态。一旦这两个标志都为真,我就会将我的项目标记为“已构建”。

代码向您展示了我如何做到这一点。或多或少,我重复使用相同的 URL 并使用 + 版本 + 架构对其进行调整。没什么太复杂的。只要返回HEAD404 或类似错误,则该包尚不可用。

如果您想要菊花链式构建,这一点非常重要,因为如果软件包尚不可用(或使用我们不想要的旧版本),下一个项目将构建失败。

¹ 实际上,在撰写本文时,我还有一个 bug。包的名称是猜到了与项目名称相同。相反,我们需要查看控制文件中的名称。这是下一步,也是(希望)最后一步。

答案1

launchpadlib是底层 Launchpad API 上的一个相对较薄的层,实际操作是在发射台。因此,您通常不会通过查看launchpadlib源代码找到对单个 API 方法的任何提及。

您的问题在于,您向 Launchpad 询问的是/snapcpp(一个项目,就 Launchpad 而言,该项目与您的 PPA 没有正式关系)或/ubuntu/bionic(一个 Ubuntu 系列,它只会告诉您有关官方操作系统的版本)的问题,而不是有关您的 PPA 的问题。正确的 URL 应该是:

https://api.launchpad.net/devel/~snapcpp/+archive/ubuntu/ppa?ws.op=getBuildRecords&source_name=libtld

或者在launchpadlib基于的代码中,如下所示:

archive = launchpad.load('/~snapcpp/+archive/ubuntu/ppa')
for build in archive.getBuildRecords(source_name='libtld'):
    # do something with each build in turn

相关内容