4 概念与参考

配置和使用 Toaster 需要理解一些概念,并了解基本命令。 本章介绍层来源、版本及 JSON 配置文件的概念,还简要介绍一些 Toaster 专用的 manage.py 命令。网上已有通用的 manage.py 文档, 本手册不打算提供完整的命令参考。

4 层来源

一般而言,“层来源”提供现有层的信息。这里关注的是可用于 Yocto 项目和 Toaster 的层。 本章介绍一种称为“层索引”的层来源。

层索引是一个 Web 应用,保存一组自定义层的信息。 OpenEmbedded 层索引就是一个例子,其公共实例位于 https://layers.openembedded.org/, Web 应用源码位于 https://git.yoctoproject.org/layerindex-web/。

将层来源接入 Toaster 后,Toaster 可以通过 REST API 查询它, 将层信息存入数据库,并展示给用户。用户可以直接在 Toaster 中查看信息和构建层, 不必手动克隆或编辑 BitBake 层配置文件 build/conf/bblayers.conf。

如果开发者社区需要经常构建许多自定义层,将层来源接入 Toaster 会很方便。 Toaster 实际上已经预配置了 OpenEmbedded 元数据索引。

备注

使用 Toaster 并不要求必须使用层来源;接入层来源是可选的。

4 配置和使用层来源

要使用自己的层来源,需要先搭建它,再接入 Toaster。 本节介绍与 Toaster 接入 OpenEmbedded 元数据索引类似的接入方式。

4 了解自己的层

使用层索引的第一步,是拥有开发者经常通过 Yocto 项目访问和构建的一组自定义层。 这些层必须已经存在,且你需要熟悉它们的位置。 配置用于接入这些层的 Web 应用时,需要使用这些信息。

层的一般介绍见 Yocto 项目概览与概念手册中的 Yocto Project 层模型。 创建层的方法见开发任务手册中的 理解和创建层。

4 配置 Toaster 以接入层索引

要让 Toaster 使用自己的层索引,必须将该 Web 应用托管在 Toaster 能连接的服务器上, 并向 Toaster 提供索引信息。本节介绍两种配置和使用自有层索引的方法。

前一节提到的 OpenEmbedded 元数据索引(https://layers.openembedded.org/)的代码位于 https://git.yoctoproject.org/layerindex-web/,可以用它作为创建自己层索引的基础。

4 使用管理界面

在浏览器中输入 Toaster 实例的 URL,并在末尾加上 /admin,即可访问管理界面。 例如,本地运行 Toaster 时使用::

http://127.0.0.1:8000/admin

管理界面的 "Layer sources" 部分有 "Add layer source" 按钮。 点击并填写所需信息,确保层来源类型选择 "layerindex"。

4 使用 fixture 功能

通过 Django fixture 指定自定义 URL,可以覆盖默认层服务器。 创建或编辑 bitbake/lib/toaster.orm/fixtures/custom.xml, 将以下 Toaster 设置改为自定义 URL:

<?xml version="1.0" ?>
<django-objects version="1.0">
   <object model="orm.toastersetting" pk="100">
      <field name="name" type="CharField">CUSTOM_LAYERINDEX_SERVER</field>
      <field name="value" type="CharField">https://layers.my_organization.org/layerindex/branch/master/layers/</field>
   </object>
<django-objects>

第一次启动 Toaster,或者删除 toaster.sqlite 后重新启动时, 会从该层索引服务器向空数据库填入数据。

信息更新后,通过 Toaster 网页界面确认新层信息是否可用。 进入项目中的 "All compatible layers" 页面,应能看到来自该来源的层。

如果层索引服务器中的信息发生变化,运行以下命令刷新 Toaster 数据库:

$ bitbake/lib/toaster/manage.py lsupdates

如果 Toaster 能访问 API URL,就会显示正在更新层来源信息的消息。

4 版本

通过网页界面创建 Toaster 项目时,需要选择一个 "Release"。 在 Toaster 中,它指 OpenEmbedded 构建系统使用的一组层及一个 BitBake 版本。 Toaster 预配置了与 Yocto 项目发布分支对应的版本, 也可以根据需要修改、删除和创建版本。本节介绍相关背景。

4 预配置版本

Toaster 随附一组预配置版本,但也可以配置为使用任意版本。 例如,项目可能需要基于某个内置版本的特定提交构建, 或采用不同修订的 OpenEmbedded 和 BitBake。

Toaster 预配置了以下版本:

4 配置 Toaster

使用 Toaster 前,必须用默认内容初始化数据库。 以下各节介绍配置的不同方面。

4 配置工作流

bldcontrol/management/commands/checksettings.py 控制工作流配置。 数据库初始化流程如下:

  1. 从 orm/fixtures/settings.xml 设置默认项目参数。

  2. 如果安装了 poky,从 orm/fixtures/poky.xml 添加默认发行版和层; 否则从 orm/fixtures/oe-core.xml 添加。

  3. 如果存在 orm/fixtures/custom.xml,加入其中的值。

  4. 扫描层索引,并将其加入数据库。

完成后,Toaster 即已准备就绪。

4 定制预设数据

Toaster 的预设数据很容易定制。 可以创建 orm/fixtures/custom.xml,定制写入数据库的值。 定制内容以追加方式加载,可以扩展或完全替换已有值。

通过该文件可以修改默认项目的机器、发行版、镜像文件和层设置。 创建新项目时,也可以用它定义可供选择的其他项目版本。 例如,增加包含自定义层集合、发行版或其他本地及专有内容的选项。

此外,在 settings.xml 中定义以下部分,可以完全禁用 oe-core.xml 和 poky.xml 的内容。 如果自定义配置的版本或层少于默认 fixture 文件,这一选项尤其有用。

以下示例将 "name" 设为 "CUSTOM_XML_ONLY",值设为 "True":

<object model="orm.toastersetting" pk="99">
   <field type="CharField" name="name">CUSTOM_XML_ONLY</field>
   <field type="CharField" name="value">True</field>
</object>

4 理解 fixture 文件格式

本节概述 oe-core.xml、poky.xml 和 custom.xml 使用的文件格式。

以下各小节介绍 fixture 文件的各部分,并给出 XML 示例, 帮助理解格式和创建本地 custom.xml。

4 定义默认发行版及其他值

此部分定义新项目的默认发行版值,默认保留 Toaster Setting 中的第一条记录 "1"。 以下示例设置项目默认的 DISTRO:

<!-- Set the project default value for DISTRO -->
<object model="orm.toastersetting" pk="1">
   <field type="CharField" name="name">DEFCONF_DISTRO</field>
   <field type="CharField" name="value">poky</field>
</object>

可以添加其他 Toaster Setting 部分,覆盖其他默认项目值, 例如 settings.xml 提供的设置。也可以添加会进入 BitBake 环境的自定义值。 "pk" 必须唯一。按照约定,设置项目默认值的条目使用 "DEFCONF" 前缀。

4 定义 BitBake 版本

以下内容定义后续版本选项使用的 BitBake 版本:

<!-- Bitbake versions which correspond to the metadata release -->
<object model="orm.bitbakeversion" pk="1">
   <field type="CharField" name="name">blacksail</field>
   <field type="CharField" name="giturl">https://git.yoctoproject.org/poky</field>
   <field type="CharField" name="branch">blacksail</field>
   <field type="CharField" name="dirpath">bitbake</field>
</object>

4 定义版本

以下内容定义创建新项目时的版本选项:

<!-- Releases available -->
<object model="orm.release" pk="1">
   <field type="CharField" name="name">blacksail</field>
   <field type="CharField" name="description">Yocto Project 6.1 "Blacksail"</field>
   <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">1</field>
   <field type="CharField" name="branch_name">blacksail</field>
   <field type="TextField" name="helptext">Toaster will run your builds using the tip of the <a href="https://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=blacksail">Yocto Project Blacksail branch</a>.</field>
</object>

"pk" 必须与上面对应的 BitBake 版本记录一致。

4 定义版本的默认层名称

以下内容定义每个版本的默认层:

<!-- Default project layers for each release -->
<object model="orm.releasedefaultlayer" pk="1">
   <field rel="ManyToOneRel" to="orm.release" name="release">1</field>
   <field type="CharField" name="layer_name">openembedded-core</field>
</object>

上例的 'pk' 应从 "1" 开始递增,并保持唯一。 不同版本可以使用同一个层名称。

4 定义层

层定义最复杂。下面先定义每个层,再定义各版本使用的确切层版本。 每个层必须有一条 orm.layer 记录,以及一组 orm.layer_version 记录, 将该层与包含它的各个版本关联。通常所有版本都会包含该层。

<object model="orm.layer" pk="1">
   <field type="CharField" name="name">openembedded-core</field>
   <field type="CharField" name="layer_index_url"></field>
   <field type="CharField" name="vcs_url">https://git.yoctoproject.org/poky</field>
   <field type="CharField" name="vcs_web_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky</field>
   <field type="CharField" name="vcs_web_tree_base_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field>
   <field type="CharField" name="vcs_web_file_base_url">https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%</field>
</object>
<object model="orm.layer_version" pk="1">
   <field rel="ManyToOneRel" to="orm.layer" name="layer">1</field>
   <field type="IntegerField" name="layer_source">0</field>
   <field rel="ManyToOneRel" to="orm.release" name="release">1</field>
   <field type="CharField" name="branch">blacksail</field>
   <field type="CharField" name="dirpath">meta</field>
</object> <object model="orm.layer_version" pk="2">
   <field rel="ManyToOneRel" to="orm.layer" name="layer">1</field>
   <field type="IntegerField" name="layer_source">0</field>
   <field rel="ManyToOneRel" to="orm.release" name="release">2</field>
   <field type="CharField" name="branch">HEAD</field>
   <field type="CharField" name="commit">HEAD</field>
   <field type="CharField" name="dirpath">meta</field>
</object>
<object model="orm.layer_version" pk="3">
   <field rel="ManyToOneRel" to="orm.layer" name="layer">1</field>
   <field type="IntegerField" name="layer_source">0</field>
   <field rel="ManyToOneRel" to="orm.release" name="release">3</field>
   <field type="CharField" name="branch">master</field>
   <field type="CharField" name="dirpath">meta</field>
</object>

层的 "pk" 必须唯一,通常从 "1" 开始。 层版本的 "pk" 也必须在所有层之间唯一,通常同样从 "1" 开始。

4 远程监控 Toaster

Toaster 提供 API,允许远程管理应用以机器间通信的方式, 直接查询 Toaster 服务器及其构建的状态。 该 API 使用 REST 接口传输 JSON。 例如,可以通过受支持的常见 HTTP 端口监控容器内的构建, 方便地访问容器中的 Toaster 服务器。 直接使用 JSON API,就无需解析面向用户的网页显示内容。

4 健康检查

使用远程监控前,应先进行健康检查。 通过以下调用探测 Toaster 服务器是否仍在运行::

http://host:port/health

请提供 host 和 port 的实际值。服务器正常时,会返回以下 HTML:

<!DOCTYPE html>
<html lang="en">
   <head><title>Toaster Health</title></head>
   <body>Ok</body>
</html>

4 查询正在进行的构建状态

有时需要了解正在进行的构建状态。 使用以下调用获取尚未完成的构建状态::

http://host:port/toastergui/api/building

请提供 host 和 port 的实际值。返回的 JSON 列出所有正在进行的构建, 包括各构建启动至今的秒数,以及克隆、解析和任务执行的进度。 示例输出如下:

{"count": 1,
 "building": [
   {"machine": "beaglebone",
     "seconds": "463.869",
     "task": "927:2384",
     "distro": "poky",
     "clone": "1:1",
     "id": 2,
     "start": "2017-09-22T09:31:44.887Z",
     "name": "20170922093200",
     "parse": "818:818",
     "project": "my_rocko",
     "target": "core-image-minimal"
   }]
}

实际返回的 JSON 为单行,此处为便于阅读手动换行。

4 查询已完成的构建状态

构建完成后,可以使用以下调用获取状态::

http://host:port/toastergui/api/builds

请提供 host 和 port 的实际值。返回的 JSON 列出所有已完成的构建及其摘要信息。 示例输出如下:

{"count": 1,
 "builds": [
   {"distro": "poky",
      "errors": 0,
      "machine": "beaglebone",
      "project": "my_rocko",
      "stop": "2017-09-22T09:26:36.017Z",
      "target": "quilt-native",
      "seconds": "78.193",
      "outcome": "Succeeded",
      "id": 1,
      "start": "2017-09-22T09:25:17.824Z",
      "warnings": 1,
      "name": "20170922092618"
   }]
}

实际返回的 JSON 为单行,此处为便于阅读手动换行。

4 查询指定构建的状态

要查询某次特定构建的状态,使用以下调用::

http://host:port/toastergui/api/build/ID

请提供 host、port 和 ID 的实际值。ID 可从已完成构建的查询结果中获得, 详见 查询已完成的构建状态。

返回的 JSON 列出该构建的详细信息及摘要,示例如下:

{"build":
   {"distro": "poky",
    "errors": 0,
    "machine": "beaglebone",
    "project": "my_rocko",
    "stop": "2017-09-22T09:26:36.017Z",
    "target": "quilt-native",
    "seconds": "78.193",
    "outcome": "Succeeded",
    "id": 1,
    "start": "2017-09-22T09:25:17.824Z",
    "warnings": 1,
    "name": "20170922092618",
    "cooker_log": "/opt/user/poky/build-toaster-2/tmp/log/cooker/beaglebone/build_20170922_022607.991.log"
   }
}

实际返回的 JSON 为单行,此处为便于阅读手动换行。

4 实用命令

除了网页界面和启停脚本,还可以通过 manage.py 管理脚本执行命令行操作。 通用文档见 Django 网站。 Toaster 还提供若干专用的 manage.py 命令,用于控制配置和后端任务。 这些命令位于 Source Directory (例如 poky)中的 bitbake/lib/manage.py。本节介绍这些命令。

备注

  • 使用默认配置时,执行 manage.py 命令必须将工作目录设为 Build Directory,这样 Toaster 才能找到其中的 toaster.sqlite。

  • 对于非默认数据库配置,可以从其他目录运行 manage.py, 前提是 toastermain/settings.py 已指向正确的数据库后端。

4.5.1 buildslist

buildslist 列出 Toaster 记录的全部构建。调用方式如下:

$ bitbake/lib/toaster/manage.py buildslist

命令返回当前数据库中的构建列表,包含数字形式的标识符。

使用 builddelete 之前, 需要先运行 buildslist,确定数据库中已有构建的 ID。 以下示例假设使用默认仓库名和 Build Directory 名称:

$ cd poky/build
$ python ../bitbake/lib/toaster/manage.py buildslist

如果数据库中只有一次构建,buildslist 会返回类似以下内容::

1: qemux86 poky core-image-minimal

4.5.2 builddelete

builddelete 删除与某次构建关联的数据。调用方式如下:

$ bitbake/lib/toaster/manage.py builddelete build_id

它会删除指定 build_id 的全部构建数据,适合清理数据库中的旧数据和无用数据。

执行之前,需要通过 buildslist 获取构建对应的 ID。

4.5.3 perf

perf 测量 Toaster 性能。调用方式如下:

$ bitbake/lib/toaster/manage.py perf

此命令执行基本检查并返回页面加载时间,帮助识别性能问题。

4.5.4 checksettings

checksettings 验证现有 Toaster 设置。调用方式如下:

$ bitbake/lib/toaster/manage.py checksettings

Toaster 根据数据库中的设置配置构建任务。 此命令验证数据库设置是否有效,即是否包含启动构建所需的最基本信息。

要让 checksettings 正常工作,数据库必须正确建立且没有已有数据。 可以运行以下命令确保数据库准备就绪:

$ bitbake/lib/toaster/manage.py syncdb
$ bitbake/lib/toaster/manage.py migrate orm
$ bitbake/lib/toaster/manage.py migrate bldcontrol

之后即可运行 checksettings。

4.5.5 runbuilds

runbuilds 启动已调度的构建。调用方式如下:

$ bitbake/lib/toaster/manage.py runbuilds

它检查数据库中是否存在已调度的构建,并按调度启动。 命令在构建启动后、完成前返回。构建完成时,Toaster 日志接口会记录并更新数据库。