openSUSE:Build Service Concept SourceService
示例包括::
- 下载服务 - 从给定的 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
构建脚本需要一种服务模式,该模式需要
- 根据配置的服务仓库和软件包列表(目前可能只是 BSConfig.pm)构建系统。
- 无休止的循环来处理 _service 文件,对于每个文件
- 运行启用网络的 XEN/kvm
- 将所有 _service:*:$name 文件重命名为 $name
- 通过调用 /opt/obs/lib/service/$name 中指定的工具来处理所有 <service 项目
- XEN/kvm 会话结束
- 将带有前缀的生成文件复制到源服务器 (_service:$tool:$filename)
- 检查服务实例是否收到 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
- 软件包:https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-cpanspec
- GitHub:
- 描述:cpanspec 脚本的包装器。
cargo
- 软件包:https://build.opensuse.org/package/show/devel:languages:rust/obs-service-cargo
- GitHub:https://github.com/openSUSE-Rust/obs-service-cargo
- 描述:此服务有助于打包 Rust 程序时 vendoring Rust 依赖项。
go_modules
- 软件包:https://build.opensuse.org/package/show/devel:languages:go/obs-service-go_modules
- GitHub:https://github.com/openSUSE/obs-service-go_modules
- 描述:此服务有助于打包 Go 程序时 vendoring Go 依赖项。
download_files
- 软件包:https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-download_files
- GitHub:https://github.com/openSUSE/obs-service-download_files
- 描述:此服务解析所有 spec 文件并下载通过 http、https 或 ftp url 指定的所有源文件。
download_src_package
- 软件包:https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-download_src_package
- GitHub:
- 描述:它支持下载 src.rpms 并提取。
download_url
- 软件包:https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-download_url
- GitHub:https://github.com/openSUSE/obs-service-download_url
- 描述:它支持通过 curl 从给定的 URL 下载文件。
extract_file
- 软件包:https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-extract_file
- GitHub:https://github.com/openSUSE/obs-service-extract_file
- 描述:它支持从存档中提取文件,例如从 tar 中提取 spec 文件。
format_spec_file
- 软件包:https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-format_spec_file
- GitHub:https://github.com/openSUSE/obs-service-format_spec_file
- 描述:此源服务将 spec 文件格式化为 SUSE 标准。背后的原因是使审查来自未知打包者的 spec 文件更容易。这应该在“trylocal”模式下使用,以便 osc 调整现有的 spec 文件而不是创建新的文件。
generator_driver_update_disk
- 软件包:https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-generator_driver_update_disk
- GitHub:
- 描述:创建 kiwiw 文件以创建用于将更新的硬件驱动程序传递到安装旧版本 suse 的较新硬件的驱动程序更新磁盘。
generator_pom
- 软件包:https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-generator_pom
- GitHub:
- 描述:它支持从 Maven Central 下载 Java 源并创建构建描述。
git_tarballs
- 软件包:https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-git_tarballs
- GitHub:https://github.com/openSUSE/obs-service-git_tarballs
- 描述:它下载上游的 tarball 并更新 spec 文件版本和 changes 文件。
github_tarballs
- 软件包:https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-github_tarballs
- GitHub: https://github.com/openSUSE/obs-service-github_tarballs
- 描述: 它从上游下载 tarball,并使用 github 仓库中的信息更新 spec 文件版本和更改文件。
kiwi_import
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-kiwi_import
- GitHub: https://github.com/openSUSE/obs-service-kiwi_import
- 描述: 它支持导入通用的 kiwi 归档文件。
node_modules
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-node_modules
- GitHub: https://github.com/openSUSE/obs-service-node_modules
- 描述: 它支持解析 package-lock.json,然后在打包期间准备所有外部下载的 npm 源代码。
part2pkg
- 软件包:
- GitHub: https://github.com/openSUSE/obs-service-part2pkg
- 描述: snapcraft part 重新打包服务,用于 OBS
python_requires
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-python_requires
- GitHub: https://github.com/openSUSE/obs-service-python_requires
- 描述: 它从 pypi 源代码 tarball 刷新 Python Requires。
product_converter
- 软件包:
- GitHub: https://github.com/openSUSE/obs-service-product_converter
- 描述: 新的产品转换器,作为 OBS 源代码服务,而不是 OBS 内置的。
python_sdist
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-python_sdist
- GitHub: https://github.com/openSUSE/obs-service-python_sdist
- 描述: 它生成 Python 源代码分发 (sdist) tarball。
rearchive
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-rearchive
- GitHub:
- 描述: 它将非 tar 归档文件解压到临时目录,并生成压缩的 tar 归档文件 (tar.gz)。支持的格式:.zip
recompress
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-recompress
- GitHub: https://github.com/openSUSE/obs-service-recompress
- 描述: 它支持从或到压缩、解压缩或重新压缩文件。
- none : 无压缩
- gz : Gzip 压缩
- bz2 : Bzip2 压缩
- xz : XZ 压缩
- zstd : Zstd 压缩
refresh_patches
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-refresh_patches
- GitHub: https://github.com/openSUSE/obs-service-refresh_patches
- 描述: 它使用 quilt 刷新本地补丁。
regex_replace
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-regex_replace
- GitHub:
- 描述: 一个非常简单的脚本,用于使用正则表达式更改文件内容。
renderspec
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-renderspec
- GitHub: https://github.com/openSUSE/obs-service-renderspec
- 描述: 它支持通过 renderspec 渲染 .spec.j2 模板。
set_version
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-set_version
- GitHub: https://github.com/openSUSE/obs-service-set_version
- 描述: 一个非常简单的脚本,用于根据给定的版本或现有文件更新 .spec 或 .dsc 文件中的版本。
set_version.sle_11
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-set_version.sle_11
- GitHub:
- 描述: 一个非常简单的脚本,用于根据给定的版本或现有文件更新 .spec 或 .dsc 文件中的版本。
source_validator
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-source_validator
- GitHub: https://github.com/openSUSE/obs-service-source_validator
- 描述: 此服务运行 openSUSE:Factory 项目所需的所有检查。这可用于保证服务侧的所有检查也都成功。此插件可以通过项目定义的全局服务使用。
tar_scm
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-tar_scm
- GitHub: https://github.com/openSUSE/obs-service-tar_scm
- 描述: 它支持从 svn、git、hg 和 bzr 仓库下载。
verify_file
- Package: https://build.opensuse.org/package/show/openSUSE:Tools/obs-service-verify_file
- GitHub:
- 描述: 这是 openSUSE 构建服务的源代码服务。它允许使用给定的 sha256sum 验证文件。