[项目分享]玲珑杀手:玲珑应用自助打包系统分享

本文内容转自社区用户 System233 的项目 linglong-killer-self-service原文链接>>>


Linglong Killer Self-Service (ll-killer 玲珑杀手)

这几天研究了下如何突破玲珑限制,根除玲珑打包问题。相信任何一个尝试过打包玲珑应用的人都曾被玲珑容器的路径限制和依赖库问题弄得焦头烂额,相当令人抓狂。这些问题是玲珑生态的发展的巨大阻碍,为了解决这些困难,ll-killer就此诞生。

ll-killer是一个新工具,旨在解决容器环境下构建应用时的常见问题。它不需要 root 权限,能够绕过容器内的路径限制,完全重塑容器路径。在构建时支持将容器文件系统挂载为可写,再通过apt安装和收集依赖;在运行时支持恢复构建时的文件系统,并支持环境的重入(重入环境尚不会继承重入时的环境变量)。

为了进一步降低使用成本,我将其编写为了一个Github Action工作流,用户只需在issue区按照模板格式发帖,系统即会自动根据帖子内容开始打包,并回复打包结果和下载链接,最简情况下只需提供deb包名。

特点

  • 一键打包:突破容器限制,直接apt安装依赖,并自动提取文件系统差异,无需再手动处理依赖。
  • 自动规范图标:自动更正desktop内的绝对路径图标。
  • 自动构建:只需要根据模板提交 GitHub Issue,系统会自动进行构建。
  • 灵活配置:支持自定义构建参数,如APT源和依赖包。

使用方法

  1. 提交构建请求
  2. 自动构建: 提交后,构建会自动开始,构建完成后提供下载链接。

示例:

提交以下内容即可构建 GIMP:

Package: gimp
Version: 2.10.38-1deepin2
Depends: librsvg2-common
APT-Sources:
  deb [trusted=yes] https://mirrors.tuna.tsinghua.edu.cn/deepin/beige beige main commercial community
Description: GNU Image Manipulation Program

构建成功后,会返回下载链接,方便你获取构建好的包。

除了Package和APT-Sources字段比较重要,其他字段都是可选的,不填写的情况下由系统自动从apt仓库提取。

构建效果

  • GIMP 图像处理软件

[self-build] GIMP · Issue #1 · System233/linglong-killer-self-service

  • WPS Office

[self-build] cn.wps.wps-office · Issue #2 · System233/linglong-killer-self-service

  • WPS Office Prc(V20系统)

[self-build] cn.wps.wps-office-pro · Issue #3 · System233/linglong-killer-self-service

如何获取包的构建参数

在正常的Deepin或UOS系统中使用命令 apt show "deb包名",如获取curl包的信息

$ `apt show "curl"
Package: curl
Version: 8.11.0-0deepin1
Priority: optional
Section: web
Maintainer: Debian Curl Maintainers <team+curl@tracker.debian.org>
Installed-Size: 482 kB
Depends: libc6 (>= 2.38), libcurl3-gnutls (= 8.11.0-0deepin1), zlib1g (>= 1:1.1.4)
Homepage: https://curl.se/
Download-Size: 255 kB
APT-Sources: https://mirrors.tuna.tsinghua.edu.cn/deepin/beige beige/main amd64 Packages
Description: command line tool for transferring data with URL syntax
 curl is a command line tool for transferring data with URL syntax, supporting
 DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3,
 POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP.
 .
 curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form
 based upload, proxies, cookies, user+password authentication (Basic, Digest,
 NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a
 busload of other useful tricks.

可以看到包来自 APT-Sources: https://mirrors.tuna.tsinghua.edu.cn/deepin/beige beige/main amd64 Packages 以及Version等信息。

构建参数与此APT输出基本相同,看起来是普通的 KEY: VAL键值对形式,唯一要注意的是多行字段中,行首必须是空格。

此外,在声明APT源时请指定[trusted=yes]参数忽略签名,避免因仓库签名引起的构建失败。

使用指南

1. 提交构建请求

在 GitHub 的 Issue 区发起新 Issue,选择自助构建模板,按照以下格式填写内容:

Package: 软件包名称
Name: 应用显示名称(可选)
Version: 软件版本号(可选,默认最新)
Base: 构建基础环境(可选)
Runtime: 构建 Runtime 环境(可选,不建议使用)
Depends: 依赖包列表(可选)
APT-Sources: sources.list 格式的 APT 仓库定义,请使用 [trusted=yes] 忽略签名,支持多个源(可选,支持多行)
Description: 软件描述信息(可选,支持多行)
  • 只需提供 Package 和 APT-Sources,其他字段将由系统自动生成。
  • 多行内容需确保行首有普通空格。
  • 可以通过运行 apt-cache show "deb包名" 来查看软件包的详细信息。
  • 如需调整构建参数,请直接编辑issue并保存.

2. 构建参数说明

以下是模板中各字段的详细说明:

字段是否必须说明
Packagedeb 包名,必须存在于 APT 仓库中。
Name应用的显示名称,默认为软件包名称。
Versiondeb 包版本号,默认为最新版本。
Base玲珑容器 Base,默认为 org.deepin.base/23.1.0
Runtime玲珑容器 Runtime,通常不建议使用此选项。
Depends软件包可选依赖列表,以逗号或空格分隔,包含可选插件的依赖。
APT-Sources构建过程中使用的 APT 软件源地址,支持多个源,请使用 [trusted=yes] 忽略签名。
Description软件包描述信息,支持多行内容,行首需有普通空格。

2.1 已知的 Base 示例

Base名称目标应用环境
org.deepin.base/23.1.0Deepin V23
org.deepin.foundation/20.0.0Deepin V20
org.deepin.foundation/23.0.0Deepin V23
com.uniontech.foundation/20.0.1UOS

2.2 已知的 APT源 示例

  • Deepin V23
    deb [trusted=yes] https://mirrors.tuna.tsinghua.edu.cn/deepin/beige beige main commercial community
  • Deepin V23 商店
    deb [trusted=yes] https://com-store-packages.uniontech.com/appstorev23 beige appstore
  • Deepin V20
    deb [trusted=yes] https://mirrors.tuna.tsinghua.edu.cn/deepin/apricot apricot main contrib non-free
  • UOS 商店
    deb [trusted=yes] https://pro-store-packages.uniontech.com/appstore eagle-pro appstore

2.3 示例应用配置:

3. 构建流程

  • 提交 Issue 后,系统会自动触发构建流程。
  • 构建完成后,系统会在对应 Issue 中回复软件包的下载链接和构建日志。

4. 注意事项

  • Package 字段必须提供: 请确保 Package 是有效的 deb 包名,且存在于指定的 APT 仓库中。
  • 二进制兼容性: 请确保 Base 与指定的 deb 软件包兼容,特别是 libc,如果不兼容,请调整 Base 为合适的版本。
  • 遵循模板格式: 所有字段需按模板格式填写,否则可能导致构建失败。
  • 依赖性字段: 如果 Depends 字段未填写,系统会尽可能自动检测,但某些情况下可能需要用户手动补充。

5. 安全限制

出于安全考虑,不能在构建服务器上运行自定义的构建脚本,请在本地运行自定义构建脚本[TODO: 教程尚未编写]。

本地运行

ll-killer可以在本地运行,但目前仅测试了在项目根目录下工作,尚未测试其他工作目录。

运行步骤

  1. 在工作目录新建一个package.info文件,填入上述项目构建参数。
  2. 运行./ll-killer generate package.info命令,生成linglong.yaml
  3. 运行./ll-killer build-and-check命令,过程中自动构建项目一到两次,并自动补全缺失依赖

项目调试

通过ll-builder run命令进入容器,自动执行linglong.yaml内配置的entrypoint.sh入口命令,并进入重塑文件系统后的容器环境,$PREFIX中的内容将无视玲珑容器限制,直接叠加到玲珑容器根目录。 此时可以通过shell命令检查容器内映射后的文件布局。

使用自定义构建脚本

可以创建新的shell脚本,并在linglong.yaml中的build指令替换如下

./ll-killer -- <你的构建脚本>   #你可以在脚本中以root身份写入任意目录
./ll-killer install             #复制收集到的文件更改到$PREFIX
./ll-killer setup              #修复share中的符号链接、快捷方式和桌面图标

ll-killer命令说明

用法: ll-killer mode [...args]

模式说明:
  build-and-check                       构建并自动补全依赖
  ldd-check <output>                    检查动态库依赖并记录日志
                                        运行前必须至少使用ll-builder build构建一次项目
  ldd-search <input> [found] [missing] 搜索动态库依赖
                                        主机上必须安装apt-file
                                        输出到 ldd-missing.log 和 ldd-found.log。
  local  [...args]                      切换到隔离的APT环境。
  generate <package.info>               生成linglong.yaml脚本。
  shell                                 执行交互式 shell。
  *                                     显示本帮助信息。

ll-builder build 构建模式容器内模式:
  root            切换到 root 模式,全局可写。
  build           执行安装和构建脚本。
  dpkg-install    使用 dpkg 安装模式安装sources目录下的deb。
  extract         使用 dpkg 解压模式安装sources目录下的deb。
  clean           清理搜集的依赖文件和目录。
  copy            拷贝收集的依赖到$PREFIX。
  install         清理并拷贝文件(clean + copy)。
  setup           配置应用的快捷方式和图标文件。
  dev             切换到隔离环境。
  --              切换到默认的 root 模式。

ll-killer 内部模式,除非你知道是什么,否则不要使用:
  mount           挂载 FUSE 和根文件系统,准备合并目录。
  pivot_root      切换根文件系统到合并目录,并执行 shell。
  local-env       配置本地 APT 环境,绑定相关目录,更新包信息。
  dev-host        配置开发主机环境,并切换根文件系统。

示例:
  ll-killer generate package.info       通过package.info生成linglong.yaml
  ll-killer build-and-check             构建并自动补全依赖
  ll-killer ldd-check ldd-check.log     检查容器内是否有缺失依赖,输出缺失文件名到ldd-check.log
  ll-killer ldd-search ldd-check.log ldd-found.log ldd-missing.log 
                                        搜索ldd-check.log中的依赖
  ll-killer -- bash                     在容器内切换到root模式                
                       

贡献指南

欢迎为项目贡献代码或建议!您可以通过以下方式参与:

  • 提交 Pull Request 修复 Bug 或添加新功能。
  • 提交 Issue 提出您的改进建议。
  • 提供更多模板样例,提升系统的兼容性。

技术栈

  • GitHub Actions: 用于实现自动化工作流。
  • BASH: 实现构建时的核心逻辑和脚本处理。
  • Go: 实现运行时的核心逻辑和脚本处理。
  • YAML: 配置 GitHub Actions 的工作流文件。

特别感谢 ChatGPT 在项目文档编写中的帮助,提供了简洁明了的说明和技术支持,使得文档的内容更加完善。


感兴趣的朋友可以到 本文原贴项目GitHub仓库 与项目作者交流讨论。


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注