openSUSE:Build Service Concept SourceService

跳转到:导航搜索


本页面描述了源服务如何在 OBS 中实现和使用。源服务是处理源文件,在实际调度或构建发生之前的应用程序。

示例包括::

  • 下载服务 - 从给定的 URL 下载文件(例如 tarball)并存储它。
  • 检出服务 - 从 SVC 系统(svn、git 等)检出并创建 tarball。
  • 验证服务 - 使用给定的校验和(md5sum、gpg 密钥)验证文件。
  • 代码生成器 - 分析 tarball 并创建适当的 rpm 和 debian 构建描述(基于 cmake、automake/conf、qmake 或类似文件)。
  • 通过服务运行 pre_checkin.sh 脚本


工具方面

  • 所有给定的示例都需要并非 100% 可信的工具,这意味着它们应该在安全的环境中运行。
  • 这些工具应该能够在服务器和客户端上运行。
  • 这些工具可能非常具体,例如,基于 cmake 文件的代码生成器。此代码不应成为构建服务本身的一部分,但它应该位于一个易于维护的软件包中。这允许贡献者通过常规打包方法修复、扩展或添加服务。
  • 这些工具应该保存在一个项目中,为所有发行版构建,以便在开发人员的工作站上执行。但是,服务器端只需要一个实例。
  • 尽可能多的内容应该在软件包中完成,以便在 OBS 代码中尽可能薄的一层。
  • 工具可以通过公共软件包共享功能。


工作流方面

作为软件包源的一部分的元文件(_service 文件)应该触发服务。它可以在给定的顺序中运行多个服务。此元文件的更改不应直接触发构建,而应等待生成器结果。

服务的输出应成为源软件包和历史记录的一部分。但是,不应能够直接更改这些文件,以避免在服务生成新文件时丢失工作。

服务器端服务实例

服务器应该有一个永久运行的服务实例。这基本上是一个常规的构建实例,但除了部署新的服务工具(或构建)之外,一直运行。此实例需要互联网连接才能提供其服务,但我们需要防止随机连接到我们的内部接口。

相同的实例应该持续运行,并且不会为每次调用重新启动/重建,但当出现新的服务软件包时需要更新。

所需实现

工具

  • 创建文件的工具集。
  • 将所有这些工具存储在一个项目中

源服务器

  • 在源提交包含 _service 文件时,服务器需要触发一个事件来更新软件包中的源。

调度器

  • 验证是否正在运行服务实例,如果未运行,则根据规范启动一个。
  • 将服务事件发送到服务实例,如果它空闲(基本上是 _service 文件以及项目和软件包信息)。

调度器

  • 如果服务事件正在等待,则需要阻止一个软件包
  • 不要删除服务实例的计算 buildinfo 以使其保持运行。但是,如果服务工具软件包发生更改并且正在运行的实例需要像往常一样停止,则需要更新它。

构建脚本和 bs_worker

构建脚本需要一种服务模式,该模式需要

  1. 根据配置的服务仓库和软件包列表(目前可能只是 BSConfig.pm)构建系统。
  2. 无休止的循环来处理 _service 文件,对于每个文件
    1. 运行启用网络的 XEN/kvm
    2. 将所有 _service:*:$name 文件重命名为 $name
    3. 通过调用 /opt/obs/lib/service/$name 中指定的工具来处理所有 <service 项目
    4. XEN/kvm 会话结束
    5. 将带有前缀的生成文件复制到源服务器 (_service:$tool:$filename)
    6. 检查服务实例是否收到 kill 事件并退出,否则循环返回

可能的扩展

以后可以扩展此框架,以允许创建/删除完整的软件包。这将允许我们将其用于 productconverter 以及 cpan2OBS 生成器等。

这将废除 oscupstream 的需要。

示例

示例 1:输入文件提交

这是一个实际示例,存储为软件包源中的 _service。

<services>
 <service name="download_url">
   <param name="protocol">http</param>
   <param name="host">download.kde.org</param>
   <param name="path">pub/kde/stuff/krabber-1.0.tar.gz</param>
 </service>
 <service name="verify_file">
   <param name="file">_service:download_url:krabber-1.0.tar.gz</param>
   <param name="verifier">sha256</param>
   <param name="checksum">7f535a96a834b31ba2201a90c4d365990785dead92be02d4cf846713be938b78</param>
 </service>
 <!--
  <service name="generate_automake_kde" />
 -->
</services>

这将下载 krabber-1.0.tar.gz 并将其存储为 _service:download_url:krabber-1.0.tar.gz,通过给定的 sha256 校验和对其进行验证,并(注释掉)使用 generate_automake_kde 工具生成 spec 文件。

此 _service 文件例如由

   osc add http://download.kde.org/pub/kde/stuff/krabber-1.0.tar.gz

所需的软件包(最新的 osc、obs-service-download_url、build)可从 openSUSE:Tools 获取。


示例 2:GIT 集成

使用 OBS 源服务,您可以创建来自 Git 仓库的最新源代码的软件包。假设您知道如何创建/检出/提交软件包到 OBS 项目。

要求

您需要在 OBS 服务器上安装 4 个额外的软件包

  • obs-service-tar_scm:从源代码仓库创建存档
  • obs-service-extract_file:从存档中提取文件
  • obs-service-recompress:压缩/重新压缩存档
  • obs-service-set_version:更新 spec/dsc 文件中的软件包版本

您可以使用 osc 客户端检查有哪些服务可用

   osc api /service

逐步操作

  • 使用 Web 界面或命令行创建空软件包
  • 在该软件包中,创建一个名为 _service 的文件,根标签为 <services> </services>
  • 插入第一个服务定义以从 git 创建存档:(FIXME tar_scm 不鼓励使用,建议使用 obs_scm)
  <service name="tar_scm">
    <param name="scm">git</param>
    <param name="url">the URL of your Git repository (something like "git://gitorious.org/your-project.git")</param>
    <param name="subdir">the subdirectory of your repository you want to create an archive from</param>
    <param name="filename">the name of the file you want to create, without version</param>
    <param name="versionprefix">the first part of the version string (e.g. "0.4.git")</param>
    <param name="revision">optional: the commit hash, tag or branch you want to get</param>
  </service>

这将创建一个名为 <filename>-<versionprefix>.<commit_timestamp>.tar 的文件,其中 <commit_timestamp> 是从创建存档的提交到 1970 年 1 月 1 日之间的秒数。

  • 插入第二个服务定义以从存档中提取 .spec/.dsc 文件。如果您更喜欢手动将这些文件添加到 OBS 软件包中,请跳过此部分。
  <service name="extract_file">
    <param name="archive">*.tar</param>
    <param name="files">the files you want to extract from the previously created archive, separated by space
    (notice that there is a top directory with a name that you don't know, so file names should start with "*/"</param>
  </service>
  • 插入第三个服务定义以压缩存档(Debian 构建需要 .tar.gz 并且可以节省服务器上的空间)
  <service name="recompress">
    <param name="file">a pattern matching the archive name (e.g. "*git*.tar")</param>
    <param name="compression">the format in which you want to compress the archive: "gz", "bz2", "xz", "none"</param>
  </service>
  • 插入第四个服务定义以更新 spec 和 dsc 文件中的软件包版本,使用生成的存档的版本
  <service name="set_version"/>
  • 现在将 _service 文件上传/提交到 OBS
  • 每次在您的 Git 仓库中提供新的提交时,都会触发服务运行,可以使用 Web UI 或osc service run

完整的 _service 示例

FIXME tar_scm 不鼓励使用,建议使用 obs_scm

<services> <service name="tar_scm"> <param name="scm">git</param> <param name="subdir">src</param> <param name="url">git://gitorious.org/meego-developer-tools/obs-light.git</param> <param name="versionprefix">0.4.git</param> <param name="filename">obslight</param> </service> <service name="extract_file"> <param name="archive">*.tar</param> <param name="files">*/deb/* */rpm/obslight.changes */rpm/obslight.spec */rpm/obslight.yaml</param> </service> <service name="recompress"> <param name="file">*git*.tar</param> <param name="compression">gz</param> </service> <service name="set_version"/> </services> 


所有可用的 OBS 服务

注意:您可以使用 osc 客户端检查服务的参数

   osc api /service

或者您可以查看 https://paste.opensuse.org/45284231 上的输出

cpanspec


cargo


go_modules


download_files


download_src_package


download_url

extract_file


format_spec_file


generator_driver_update_disk


generator_pom


git_tarballs


github_tarballs


kiwi_import


node_modules


part2pkg


python_requires


product_converter


python_sdist


rearchive


recompress

  • none : 无压缩
  • gz  : Gzip 压缩
  • bz2  : Bzip2 压缩
  • xz  : XZ 压缩
  • zstd : Zstd 压缩

refresh_patches


regex_replace


renderspec


set_version


set_version.sle_11


source_validator


tar_scm


verify_file