可复制且仅限最小来源的防水球

使用Libntlm 1.8版的发布发布tarball可以在多个发行版上复制。我们还发布了一个由git存档与使用的格式相同大草原Codeberg公司GitLab公司github和其他。测试了两种柏油球的再现性持续进行回归通过CI/CD管道在GitLab上运行。如果这还不足以让你兴奋Libntlm的Debian软件包现在是从可复制的最小源代码tarball构建的。生成的二进制文件是可复制的在多个架构上。

这意味着什么?你为什么要在乎?你如何能为你的项目做同样的事情?存在哪些未决问题?亲爱的读者,继续读下去…

本文描述了我对可复制发布工件的实际实验我早先的想法导致关于化石的讨论和aJanneke Nieuwenhuizen的补丁,使Guix tarball可复制这启发了我做一些实际工作。

让我们看看维护人员如何发布一些软件,以及用户如何从源代码中重现发布的工件。Libntlm提供了一个用C编写的共享库,并使用GNU品牌GNU自动控制可移植的源代码GNU库工具格努利布对于构建管理,但这些思想应适用于大多数项目和构建系统。以下说明了维护人员准备发布所需的步骤:

git克隆https://gitlab.com/gsasl/libntlm.git网站光盘libntlmgit校验v1.8./引导./配置进行分发检查gpg-b libntlm-1.8.tar.gz

生成的文件libntlm-1.8tar.gz银行libntlm-1.8.tar.gz.sig公司发布,用户下载并使用它们。这就是如何GNU项目自20世纪80年代末以来一直在发行。这证明了这种模式是多么成功!这些tarball包含源代码和一些生成的文件,通常是autoconf生成的shell脚本、automake生成的makefile模板、以下格式的文档信息、HTML或PDF格式。它们很少包含二进制目标代码,但历史上确实如此。

这个XZUtils事件说明包含git存档中未包含的文件的tarball提供了伪装恶意后门的机会。早些时候写过博客如何通过使用签名的最小源代码tarball来降低此风险。

隐藏恶意软件的风险并不是发布签名的最小源代码tarball的唯一动机。使用tarball中预先生成的内容,存在以下风险GNU/Linux发行版例如特里斯克尔吉他Debian公司/Ubuntu公司费多拉将从tarball生成的文件发送到二进制文件*.deb(代布)*.转/分程序包文件。通常,打包上游项目的人从未意识到,一些安装的工件并不是通过典型的autoconf-fi和&/配置并进行安装序列,并且从未编写代码来重建所有内容。如果构建规则被编写但有缺陷,并且运送了旧的工件,也会发生这种情况。当发现安全问题时,这可能会导致耗时的情况,因为修补相关源代码并重新构建包可能是不够的:从tarball生成的易受攻击的对象将被发送到二进制包中,而不是重新构建的工件中。对于特定于体系结构的二进制文件,这种情况很少发生,因为目标代码通常不包含在tarballs中,尽管十多年来我在GNU图书馆释放tarball,直到我停止发货对于解释语言,尤其是生成的内容,如HTML、PDF、shell脚本,这种情况发生得比您希望的要多。

发布最小的源代码tarball可以更容易地审核项目代码,从而避免需要通读所有生成的文件以查找恶意内容。我已经使用生成了源代码的最小tarballgit存档这与GitLab、GitHub等为git标签上的自动下载链接提供的格式相同。因此,仅限源代码的tarball可以作为审核GitLab和GitHub下载材料的一种方式!考虑GitLab或GitHub等托管站点是否/何时发生安全事件,导致生成的tarball包含git存储库中不存在的后门。如果人们依赖标签下载工件而没有使用验证维护者PGP签名保密性卫兵这可能会导致类似于XZUtils的后门场景,但最初是由宿主提供商而不是发布管理器创建的。这更令人担忧,因为此攻击可能针对某些选定的IP地址,而不是针对所有人,因此很难发现。

在所有这些讨论和基本原理都解决之后,让我们回到发布过程。我在这里添加了另一个步骤:

制作srcdistgpg-b库ntlm-1.8-src.tar.gz

现在发布准备就绪。我在Libntlm的Savannah下载区,但它们也可以上传到GitLab/GitHub发布区。这些是在我的计算机上构建tarball后得到的SHA256校验和Trisquel 11 aramo笔记本电脑:

91de864224913b9493c7a6cec2890e6eded3610d34c3d983132823de348ec2ca libntlm-1.8-src.tar.gzce6569a47a21173ba69c990965f73eb82d9a093eb871f935ab64ee13df47fda1 libntlm-1.8tar.gz

那么你如何重现我的作品呢?以下是如何在Ubuntu 22.04容器中复制它们:

播客运行它--rm ubuntu:22.04更新源apt-get安装-y--无安装-推荐autoconf automake libtool生成git ca证书git克隆https://gitlab.com/gsasl/libntlm.git网站光盘libntlmgit校验v1.8./引导./配置生成dist srcdist沙256sum libntlm-*.tar.gz

您应该会看到完全相同的SHA256校验和值。万岁!

这是因为Trisquel 11和Ubuntu 22.04使用了相同版本的git、autoconf、automake和libtool。这些工具并不能保证所有版本的输出内容相同GNU通用条款不会为所有版本生成相同的二进制输出。所以仍然需要一些微妙的版本配对。

理想情况下,工件应该可以从发布工件本身复制,而不仅仅是直接从git复制。可以在AlmaLinux公司8个容器–更换almalinux:8具有摇滚乐:8如果你愿意RockyLinux:

podman run-it--rm almalinux:8dnf更新-ydnf安装-y make wget gccwget公司https://download.savannah.nongu.org/releases/libntlm/libntlm-1.8tar.gz焦油xfa libntlm-1.8tar.gz光盘libntlm-1.8./配置制作dist沙256sum libntlm-1.8tar.gz

可以在上重新生成仅源的最小tarballDebian 11号机组:

播客运行--rm debian:11更新源apt-get安装-y--无安装-建议生成git ca证书git克隆https://gitlab.com/gsasl/libntlm.git网站光盘libntlmgit校验v1.8make-f cfg.mk srcdist沙256sum libntlm-1.8-src.tar.gz

作为Magnus Opus或chef-d'œuvre,让我们直接从Trisquel 11上的最小源代码tarball重新创建完整的tarball–replacedocker.io/kpengboy/trisquel:11.0具有乌班图:22.04如果你愿意的话。

播客运行它--rm docker.io/kpengboy/trisquel:11.0更新源apt-get安装-y--无安装-推荐autoconf automake libtool生成wget-git ca证书wget公司https://download.savannah.nongu.org/releases/libntlm/libntlm-1.8-src.tar.gztar xfa libntlm-1.8-src.tar.gz数据库光盘libntlm-v1.8./引导./配置制作dist沙256sum libntlm-1.8tar.gz

耶!现在,您应该非常确信,发布工件与版本控制中的内容以及维护者打算发布的内容相对应。剩下的工作是审核源代码中的漏洞,包括构建中使用的依赖项的源代码。您不再需要担心审核发布工件。

我觉得有点有趣的是,Libntlm的构建基础设施现在比代码本身要好得多。Libntlm是用旧C风格编写的,有大量的字符串操作,并使用了破解的加密算法,例如MD4公司单一DES记住各位:解决供应链安全问题与您最终运行的代码类型无关。一支干净的枪仍然可以射中你的脚。

关于命名的旁注:GitLab使用路径名导出tarballlibntlm-v1.8型/(即。。,项目标签/)我采用了相同的路径名,这意味着我的libntlm-1.8-src.tar.gz数据库tarball与GitLab的导出完全相同,您可以使用以下工具进行验证差速器GitLab命名tarballlibntlm-v1.8.tar.gz数据库(即。,项目-标签。档案文件)我发现它与libntlm-1.8tar.gz银行我们也发布了。GitHub使用相同的git存档样式,但不幸的是,它们的逻辑删除了路径名中的“v”,因此您将得到一个带有路径名的tarball伦敦银行-1.8/而不是libntlm-v1.8型/我和GitLab使用的。tarball的内容是逐位相同的,但路径名和存档不同。Codeberg(运行福吉乔)使用另一种方法:tarball被称为libntlm-v1.8.tar.gz数据库(在标记之后)就像GitLab一样,但归档文件中的路径名是利本特姆/,否则生成的存档将逐位相同,包括时间戳。萨凡纳的CGIT接口使用存档名称libntlm-1.8tar.gz银行具有路径名伦敦银行-1.8/,否则文件内容相同。萨凡纳的GitWeb接口提供以git提交命名的快照链接(例如。,libntlm-a812c2ca.tar.gz公司具有libntlm-a812c2ca公司/)我根本找不到任何基于标记的下载链接。总的来说,我们非常接近于使SHA256校验和匹配,但在存档中的路径名上失败。我选择与GitLab兼容tarball的内容,但不兼容存档命名。从简单的角度来看,如果每个人都使用项目-标签。档案文件对于存档文件名和项目标签/用于存档中的路径名。这方面可能需要更多讨论。

关于git存档输出的旁注:它似乎是不同版本的git存档为同一存储库生成不同的结果。Debian 11、Trisquel 11和Ubuntu 22.04中git的版本表现相同。Debian 12、AlmaLinux/RockyLinux 8/9、Alpine、ArchLinux、macOS自制软件和即将推出的Ubuntu 24.04中的git版本表现出了另一种方式。希望这不会经常发生变化,但这会使这些tarball在未来的再现性失效,迫使您使用旧的git发行版来重现源代码tarball。唉,GitLab和大多数其他网站似乎都在使用现代git,所以从他们那里下载的tarball与我的tarballs不匹配,即使内容会匹配。

ChangeLog上的旁注:ChangeLog文件传统上是手动整理的文件,具有包的版本历史记录。近年来,有几个项目开始从git历史动态生成它们(使用诸如吉特2clgitlog到changelog). 这会影响tarball的可再现性:您需要有完整的git历史记录!这个gitlog到changelog工具也输出不同的输出取决于时区这是一个可以修复的简单错误。然而,这整个方法与从最小的源tarball重建完整的tarball不兼容。看起来Libntlm的ChangeLog文件死于手术台在这里。

那么,发行版如何构建这些最小的纯源tarball呢?我碰巧在Debian中的libntlm包它历史上使用生成的tarball作为构建源代码。这意味着来自gnulib的代码将在tarball中出售。当在gnulib代码中发现安全问题时,安全团队需要修补包含该供应商代码的所有包并重新构建它们,而不仅仅是修补gnulib-包并重新生成依赖于该特定代码的所有程序包。为了改变这一点,Debian libntlm包需要Build-DependsDebian的gnulib包但有一个问题:与大多数使用gnulib的项目类似,Libntlm依赖于gnulib的特定git提交,而Debian只提供一个提交。对于要使用哪个提交,没有进行协调。已经采用了gnulib在Debian中,并添加git丛*_所有.deb二进制包,以便依赖gnulib的项目可以选择他们需要的任何提交。这允许无网络GNULIB_URLGNULIB_修订运行Libntlm时的方法./引导安装了Debian gnulib包。否则,libntlm将获取Debian在gnulib包中碰巧拥有的任何最新版本的gnuib,而这并不是libntlm维护者想要使用的,并且随着时间的推移,可能会导致各种版本不匹配(从而导致安全问题)。Debian中的Libntlm是在Salsa上开发和测试的而且有连续集成测试感谢萨尔萨CI团队.

关于git包的旁注:不幸的是,似乎没有可复制的方法将git存储库导出到一个或多个文件中。因此,所有这些工作的一个不幸后果是gnulib*.orig.tar.gz(原始目标.gz)Debian中的tarball不再可复制。我有尝试使Git包可复制,但我从未使其工作-请参阅中的注释gnulib的debian/README.source在这方面。当然,源tarball再现性与二进制无关gnulib在Debian中的再现性幸运的是,它本身。

一个悬而未决的问题是如何处理由这种方法触发的增加的构建依赖性。一些人们感到惊讶通过这一点,但我不知道如何绕过它:如果你依赖于另一个包中工具的源代码来构建你的包,那么隐藏这种依赖性是个坏主意。很长一段时间以来,我们都是通过非最小tarball中的供应商代码来实现的。从引导的角度来看,Libntlm不是最关键的项目,因此添加git和gnulib作为构建依赖项这样可能很好。然而,考虑一下此模式是否用于其他使用gnulib的包,例如coreutils公司gzip公司焦油野牛etc(都在使用gnulib),那么他们都会构建依赖项关于git和gnulib。因此,为新体系结构交叉构建这些包需要首先在该体系结构上使用git,这样可以快速循环。对gnulib的依赖是真实的,所以我认为这种依赖不会消失,而gnulib是架构:全部包裹。然而,对git的依赖仅仅是Debian-gnulib包如何选择使所有gnulib-git提交对项目可用的结果:通过git包。还有其他方法可以做到这一点,它不需要git工具来提取必要的文件,但我发现没有一种方法是可行的——欢迎提出想法!

最后是关于如何实现这一点的简要说明。通过gnulib实现可引导的源代码最小化tarball./引导通过使用GNULIB_修订机制,锁定使用的gnulib提交。我一直不喜欢git子模块,因为它们添加了额外的步骤,并且与CI/CD有复杂的交互放弃git子模块现在是因为要使用的特定提交没有记录在git存档使用git子模块时的输出。因此,必须在git存档tarball中的一些源代码中明确提到特定的gnulib提交。科林·沃森添加了GNULIB_REVISION接近./引导回到2018年,现在继续使用gnulib-git子模块已经没有意义了。一种替代方法是使用./引导具有--gnulib-srcdir--gnulib-refdir如果有一些实际问题GNULIB_URL朝向git捆绑包GNULIB_修订在里面引导程序.conf.

这个srcdist生成规则很简单:

git存档--前缀=libntlm-v1.8/-o libntlm-1.8-src.tar.gz HEAD

制作制作dist生成的可复制tarball可能更复杂,但对于Libntlm来说,这足以确保所有文件的修改时间都是确定的到git存储库中最后一次提交的时间戳。有趣的是,似乎有两种不同的方法可以实现这一点,Guix不支持最小源代码tarball,但依赖.tarball时间戳tarball中的文件。保罗·艾金特解释了TZDB正在使用的内容不久前。这个我现在使用的方法我建议的一个一年多以前。如果由于tarball中的所有文件现在使用相同的修改时间而出现问题布鲁诺·海布尔的解决方案这是可以实现的。

关于git标签的旁注:有些人可能想知道为什么不验证签名的git标签,而不是验证git存档的签名tarball。目前大多数git存储库使用SHA-1作为git提交标识,但是SHA-1不是安全哈希函数。虽然可以检测和缓解当前的SHA-1攻击,但人们基本上怀疑git SHA-1提交标识唯一地引用了预期的相同内容。验证git标记永远不会提供相同的保证,因为git标记可以随时移动或重新指定。验证git提交更好,但我们需要信任SHA-1。正在迁移git至SHA-256将解决此问题,但大多数托管站点(如GitLab和GitHub)尚不支持此功能。使用签名tarball代替签名git提交或git标记还有其他优点,例如。,tar.gz可以是一种可确定复制的持久稳定脱机存储格式,但.git(单位:吉特)子目录树或git捆绑包不要提供此属性。

对所有这些进行持续测试对于确保事情不会倒退至关重要。Libntlm的管道定义现在生成生成的libntlm-*.tar.gz数据库tarball和校验和作为构建工件。然后我添加了000可再生产性比较校验和并在不匹配时失败的作业。你可以阅读它v1.8工作中的精细输出释放。现在,我们坚持认为Trisquel 11上的构建与Ubuntu 22.04相匹配,PureOS 10构建与Debian 11构建相匹配,AlmaLinux 8构建与RockyLinux 8构建相匹配,AlmaLinux 9构建与RockyLinux 9构建相匹配。正如您可以在管道作业输出中看到的那样,并非所有平台都会导致相同的tarball,但希望这种状态可以随着时间的推移得到改善。还存在部分再现性,其中完整的tarball可以跨两个分布进行再现,但最小tarball不可以,反之亦然。

如果这种工作方式效果很好,我希望也能在其他项目中实施。

你怎么认为?快乐黑客!

Git-LFS中的Apt存档镜像

我继续努力提高公众档案的透明度和信心。我在“Apt存档透明度“我在其中提到债务分配项目正在进行中。债务发行人负责镜像一些公共apt存档的索引文件。我已经意识到,拥有一个可公开审计和保存的apt存储库镜像是实现apt透明工作的核心,因此debdistget项目对我的项目来说比我想象的更为重要。当前我跟踪特里斯克尔PureOS(纯操作系统)侏儒以及它们的上游Ubuntu公司Debian公司德文.

Debdistget下载发布/包/源文件并将其存储在上发布的git存储库中GitLab公司。由于大小限制,它使用两个存储库:一个用于发布/发布中文件(较小)和一个还包括包/源文件(较大)。请参见的存储库示例Trisquel发布文件Trisquel包/源文件。可以在中找到所有分发版的存储库debdistutils的存档GitLab子组.

之所以拆分为两个存储库,是因为合并文件的git存储库变得很大,而且我的一些用户只需要发布文件。目前,带有软件包的存储库(现在包含几个月的数据)为9GBUbuntu公司,2.5GB用于特里斯克尔/Debian公司/PureOS(纯操作系统),970MB用于德文和450MB用于侏儒。存储库大小与存档的大小(用于初始导入)以及更新的频率和大小相关。Ubuntu对Apt分阶段更新(这会引发更大的Packages文件修改波动)似乎是其更大的主要原因。

使用大型Git存储库效率很低,GitLab CI/CD作业会产生大量网络流量,反复下载Git存储库。用户最多的是债务差异下载所有发行版包存储库以对发行版之间的包列表执行差异操作的项目。日常工作需要处理80分钟要运行,大部分时间都花在下载档案上。是的,我知道我可以研究运行端缓存,但我不喜欢缓存带来的复杂性。

幸运的是,并非所有的use-case都需要包文件。这个债务清偿项目只需要发布/发布中文件,以便将签名提交给西格斯托尔Sigsum公司透明度日志。这些工作仍然运行得相当快,但看着存储库大小的增长让我担心Debian公司4.4亿,PureOS(纯操作系统)130MB,Ubuntu公司/德文90MB,特里斯克尔12MB,侏儒2MB。在这里,我认为主要的大小相关性是更新频率,而Debian很大,因为我跟踪的是不稳定的波动。

因此,我用第一种方法实现了可扩展性。几个月前,我通过丢弃和重置这些档案库来“解决”这个问题。GitLab CI/CD作业又恢复了速度,一切都很好。然而,这意味着放弃宝贵的历史信息。几天前,我再次达到实用性的极限,并开始探索解决此问题的方法。我喜欢将数据存储在git中(它允许轻松集成软件完整性工具,如保密性卫兵和Sigstore,以及git日志提供了一种数据的时间顺序),因此感觉像是放弃了良好的属性,转而使用传统的基于磁盘的数据库方法。所以我开始了解Git-LFS公司并了解到它能够处理多GB的数据这看起来很有希望。

很快,我编写了一个脚本GitLab CI/CD作业增量更新发布/包/源使用git-LFS存储所有文件的git存储库中的文件。存储库大小现在为Ubuntu 650kbDebian 300kbTrisquel 50kb德文250kb纯操作系统172kb侏儒鸟17kb正如所料,作业可以快速克隆git存档:debdistdiff管道运行时间从80分钟减少到10分钟这与存档大小和CPU运行时间之间的关系更为合理。

这些存储库的LFS存储大小为Ubuntu 15GBDebian 8GBTrisquel 1.7GB德福1.1GBPureOS(纯操作系统)/侏儒420MB。这是几天的数据。看起来原生Git比Git-LFS更擅长压缩/重复数据消除:Ubuntu的两天数据总大小已经是15GB,而纯Git的两个月数据总大小为8GB。这可能是GitLab中Git-LFS的次优实现,但我担心这种新方法也很难扩展。在某种程度上,差异是可以理解的,Git-LFS可能存储两个不同的包装文件(Trisquel的每个文件大约为90MB)作为两个90MB文件存储,但本机Git会将其存储为90MB文件的一个压缩版本和一个相对较小的补丁,以将旧文件转换为下一个文件。因此,Git-LFS方法在总体存储大小方面的扩展性出奇地差。不过,原始存储库要小得多,您通常不必提取所有LFS文件。所以这是净赢。

在这项工作中,我一直在思考我的方法与Debian的快照服务。我最终想要的是这两种服务的结合。为了有一个良好的基础来进行透明度工作,我想收集所有发布/包/源文件,以及最终的源代码和二进制文件。虽然从发行版的最新稳定版本开始是有意义的,但这项工作也应该在时间上向后扩展。为了从源代码中重新生成二进制文件,我需要能够安全地找到用于重建的二进制包的早期版本。所以我需要导入所有发布/包/源包从快照到我的存储库。从该服务器检索文件的延迟很慢,因此我无法找到一种高效/并行的方式来下载文件。如果我能完成这项工作,我相信我基于Git-LFS的存储这些文件的新方法将在未来多年内扩展。这还有待观察。也许存储库必须按发行版、体系结构或类似内容进行拆分。

另一个因素是存储成本。虽然基于git-LFS的存储库中包含几年来的文件的git存储库大小可能可以维持,但git-LFS的存储大小肯定不会维持。GitLab似乎对存储库和git-LF中的文件收取相同的费用,而且大约是每100GB 500美元每年。可以设置一个不在GitLab托管的独立Git-LFS后端来服务LFS文件。有人知道适合这种情况的服务器实现吗?我快速查看了一下Git-LFS实施列表看起来最合理的方法是设置Gitea-clone福吉乔作为自托管服务器。也许云存储方法a'la S3是未来的发展方向?在GitLab上托管此内容的成本将在以下时间内可控约1TB(5000美元/年)但将其扩展到存储500 TB数据的年费用为250万美元这似乎物有所值。

我意识到,最终我想要一个本地的git存储库,其中包含所有apt存档的全部内容,包括它们的二进制和源代码包,并且可以发布。像快照这样的服务(约300TB的数据?)的存储需求目前并不昂贵:20TB的磁盘是500美元一块,因此一个包含36个磁盘的存储机柜大约在500美元左右720TB需要18.000美元使用RAID1意味着360TB,这是一个良好的开端。虽然我听说了~TB大小的Git-LFS存储库,但Git-LFS会扩展到1PB吗?也许拥有数百万个git-LFS指针文件的git存储库的大小将变得无法管理?为了开始使用这种方法,我决定导入Debian的amd64书虫到Git-LFS存储库中。就在附近175GB即使是在GitLab上托管也非常便宜(200GB每年1000美元)。公开此存储库将使编写使用此方法的软件成为可能(例如,移植债务再生产),以确定这是否有用以及是否可以扩展。通过Git-LFS分发apt存储库还可以使用其他有趣的想法来保护数据。考虑配置apt以使用本地文件://指向此git存储库的URL,并使用类似于的方法验证git签出Guix信任git的方法内容或Sigstore的数字符号.

天真地推了一下175GB单个git提交中的存档遇到了包大小限制:

remote:致命:包超过允许的最大大小(4.88 GiB)

然而,将提交分解为针对部分存档的较小提交,使得推送整个存档成为可能。以下是创建此存储库的命令:

初始化
git-lfs安装
git lfs track“dists/**”“pool/**”
git添加.gitattributes
git commit-m“添加git-LFS跟踪属性”.gitattributes
time debmirror--method=rsync--host ftp.se.debian.org--root:debian--arch=amd64--source--dist=bookworm,bookworm-updates--section=main--verbose--diff=none--keyring/usr/share/keyrings/debian-archive-keyring.gpg--ignore.git。
git-add-dists项目
git提交-m“添加”-a
git远程添加源git@gitlab.com:debdistutils/archives/debian/mirror.git
git推送--设置上游源--全部
对于池中的d//;
echo$d;
时间git添加$d;
git commit-m“添加$d”-a
git推送
完成

这个结果存储库大小约为27MB,Git LFS对象存储约为174GB。我认为这种方法可以扩展到为一个版本处理所有架构,但为所有架构的所有版本使用单个git存储库可能会导致git存储库太大(>1GB)。那么,每个版本可能有一个存储库?这些存储库还可以拆分为水池/文件,或者每个体系结构或源的每个版本可能有一个存储库。

最后,我担心如何使用SHA1识别对象。Git和Debian的快照服务目前都在使用SHA1。Git有SHA-256过渡GitLab似乎正在致力于支持基于SHA256的存储库。对于这些概念的长期部署,最好直接使用SHA256标识符。Git-LFS已经使用SHA256,但Git内部使用SHA1,Debian快照服务也是如此。

你觉得怎么样?快乐黑客!

验证debian/版权:licenserecon

最近我注意到一个名为许可证持有人由彼得·布莱克曼撰写,我帮助将licenserecon转换为Debian.目的许可证持有人是协调来自debian/版权针对来自的输出许可证检查Jonas Smedegaard编写的工具。它假设环境保护部5版权文件。您可以在具有debian/子目录的目录中运行该工具,并在发现不匹配时输出(这是针对解析器):

#sudo apt安装licenserecon贾斯@kaka:~/dpkg/解析器$lrc正在分析源树。。。。正在运行licensecheck。。。。d/版权| licensecheckBSD-3-子句|BSD-3-语句src/resolv_wrapper.cBSD-3-条款|BSD-3-子句测试/dns_srv.cBSD-3-子句|BSD-3-语句测试/test_dns_fake.cBSD-3-子句|BSD-3-语句测试/test_res_query_search.cBSD-3条款|BSD-3测试/酷刑BSD-3-条款|BSD-3-子句测试/酷刑.h贾斯@kaka:~/dpkg/解析器$

注意到这样的一个字符拼写错误可能不会带来满足感,除非对我们当中最强迫症的人来说,但是这个工具有可能发现更严重的错误。

偶尔手动使用它可能会很有用,但我往往会忘记没有自动执行的QA步骤。我们能把这个加到萨尔萨CI/CD管道? 我最近提议合并请求以向Salsa CI/CD管道添加wrap-and-sort作业(默认为禁用),并学会了扩展它是多么容易。我认为许可证持有人还是有点粗糙在边缘,我还没有能够成功地将其用于除最简单的软件包之外的任何软件包。我不想建议将其添加到正常的Salsa CI/CD管道中,即使已禁用。如果您在Salsa上维护Debian包并希望添加许可证持有人我在信中写道licenserecon.yml许可证给你。

最简单的使用方法licenserecon.yml许可证是要更换食谱/debian.yml@salsa-ci团队/管道作为Salsa CI/CD配置文件设置debian公司/salsa-ci.yml@debian/许可证持有人。如果您使用debian/salsa-ci.yml公司你可以把这样的东西放进去:

---包括:- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml- https://salsa.debian.org/debian/licenserecon/raw/main/debian/plicenserecon.yml

一旦触发管道,就会产生一个新作业许可证持有人验证debian/版权反对许可证检查每个构建的输出!我已将此添加到libcpucycles系列Salsa上的包裹管道包含一个新的工作许可证持有人其输出当前结束于:

$cd${WORKING_DIR}/${SOURCE_DIR}美元lrc正在分析源树。。。。正在运行licensecheck。。。。未发现差异清理项目目录和基于文件的变量

如果上游发布的新版本的文件与我们的不匹配debian/版权文件,我们将在下一个Salsa构建作业中检测到这一点,而不是几个月后,当有人碰巧手动运行工具或存在一些许可证冲突时。

顺便提一下许可证持有人是用帕斯卡语写的带回了过去的记忆Turbo帕斯卡回到MS-DOS时代。谢谢Peter许可证持有人和乔纳斯许可证检查让这成为可能!

Trisquel是42%可复制的!

绝对数字可能并不令人印象深刻,但我希望至少有一个有用的贡献,那就是实际上有一个数字可以说明Trisquel有多少是可复制的。希望这将激励其他人帮助改进实际指标。

tl;医生:转到复制-危险.

当我开始了解Trisquel的工作原理,我确定了一些可以提高我对它的信心的事情。对我来说,最容易实现的是手动审核包存档,我编写了一个名为债务差异为我实现自动化。这让我思考apt存档透明度更一般化。我在这方面做了一些进一步的工作(提示:apt-验证)这最终值得发表自己的博客文章。如果我们不信任有意的归档文件中的包。一种可以衡量的增加一揽子计划信任的方法是可复制版本目前,这应该是一个既定的最佳实践。代码审查仍然很重要,但因为它永远不会提供积极的保证,所以我们需要其他能够自动识别次优情况的过程。我认为,可复制构建轻松识别负面结果的方式是推动其成功的主要因素:其结果是有形和可衡量软件工程领域需要更多这样的实践。

我建立Trisquel可复制设置的设计如下。

  • 项目债务分配负责下载Release/Packages文件(其中最相关的文件来自蒸馏器/)来自apt档案,并通过将其提交到GitLab公司-托管的吉特-存储库。我有几个这样的流行的apt档案库,包括特里斯克尔及其上游Ubuntu公司GitLab调用调度管道进行下载一些比赛条件在这里。
  • 项目债务差异用于生成添加和修改的包的列表,这些包是实际能够复制哪些包的输入。它发布几种分布差异的可读性总结,包括Trisquel与Ubuntu。早些时候,我决定重建所有上游Ubuntu包超出了我的范围:我个人对官方Debian/Ubuntu apt档案的信任大于我对Trisquel中添加/修改的包的信任。
  • 最终项目复制-危险将各个部分简单地放在一起,如下所示.gitlab-ci.yml公司文件。
    • 有一个(手动触发的)作业生成生成图像使用简单的Dockerfile文件.
    • 有一个(手动触发的)作业发电机组-列表它使用debdistdiff生成和存储包列表,并将其输出放入列表/。现在手动触发此操作的原因是比赛条件.
    • 有一个(计划的)作业执行两件事:从包列表中,脚本生成-ci-packages.sh构建GitLab CI/CD指令文件ci-packages.yml公司描述要生成的每个包的作业。第二部分是生成readme.sh基于git存储库中存储的构建日志和diffoscope输出重新生成项目的README.md。
    • 通过ci-packages.yml文件,有大量动态定义的作业,目前手动触发这些作业以避免构建服务器过载。脚本构建包.sh调用并尝试重新生成包,并将构建日志和diffoscope输出存储在git项目本身中。

我没想到能够使用GitLab共享的跑步者来进行构建,但结果它们运行得很好,我推迟了设置自己的跑步者。有一个手动管理的列表/禁用-aramo.txt有些包都需要太多的磁盘空间,或者需要两个多小时才能构建。今天我终于抽出时间使用运行Trisquel aramo的podman设置GitLab跑步者,我希望很快完成其余包的构建-我的一个带有256GB RAM和双2680v4 CPU的Dell R630服务器应提供足够的性能。

当前的局限性和对进一步工作的想法(大多数作为项目问题归档)包括:

  • 我们不支持*.内置信息文件夹。据我所知,Trisquel并没有为他们的构建发布它们。改进这一点将是向前迈出的第一步,有谁能帮忙吗?比较buildinfo.debian.net网站例如,许多软件包仅在其NT_GNU_BUILD标识ELF二进制文件中的符号,请参阅libgpg-error的diffoscope输出示例.通过戳入jenkins.trisquel.org网站我设法发现特里斯克建造了initramfs-utils在随机化中路径/build/initramfs-tools-bzRLUp对这条路进行硬编码允许我复制那个包裹。我希望其他许多包也能这样。不幸的是,这个失败变成了成功,这一包将指针从42%的重复性移动到43%,但我没有让它成为一个好的标题。
  • 从dists/下载Release/Package-files的机制并非万无一失:我们可能无法捕获所有已发布的此类文件。虽然这不太关心再现性,但更关心的是适当的透明度。不过,让Trisquel提供类似于快照.debian.org会有帮助的。
  • 至少有一个其他的CPU体系结构会很好。
  • 由于缺乏时间和精力,处理软件包新版本的增量更新尚不可行。这意味着我们只构建一个包的一个版本,而永远不会发现同一个包的任何新发布版本。既然Trisquel aramo公司发布时,新版本的预期速率应该很低,但由于安全性或后台端口的原因仍然会发生。
  • 移植这个进行测试FSDG公司-合规分布,例如PureOS(纯操作系统)侏儒应该比较容易。我也在看德文因为侏儒。
  • 房间里的大象首先是Ubuntu的可复制性。

复活节快乐黑客!

2023-04-17更新:原始项目“复制-危险“此处宣布的内容已存档,并替换为两个项目,一个通用”债务再生产“和一个Trisquel的结果:”复制/三色“.

关于语言绑定和重新启动Guile-GnuTLS

这个Guile公司的绑定GnuTLS公司自2007年春季以来一直是GnuTLS的一部分,当时Ludovic Courtès贡献了它在一些之后初步讨论。我一直在考虑回去做GnuTLS编码最近的GnuTLS会议其中一个主题是Guile绑定。它似乎是一个相当独立的项目,值得学习。当这项工作被包括在内时,重新阅读旧的线程是很有趣的:其中提出的一些关注点现在有跟踪记录需要评估。我认为,现在每种语言绑定引入一个新项目的成本小于维护语言的成本绑定作为核心项目的一部分。我相信在过去的15年里,成本效益比发生了变化:引入一个新项目过去会带来巨大的成本,但现在情况已经不同了,因为包装的工具和工艺已经得到了改进。我在Java、C#和Emacs Lisp绑定方面有类似的经验GNU图书馆此外,集中维护它们会降低更新速度。安德烈亚斯·梅茨勒指出到类似的Russ Allbery得出的结论.

有很多方法可以将一个项目分为两个项目;仅仅将文件复制到新的git存储库中是最简单的,也是我最初的计划。然而Ludo提到git-filter-branch在一封电子邮件中,我觉得保留一些相关文件的所有git历史记录的想法值得追求git-filter-repo过滤器这似乎是推荐的方法,通过试验,我找到了一种方法,可以将GnuTLS repo过滤到Guile-GnuTLS可以基于的小git存储库中。如果您想复制内容,我使用的命令如下。

$git克隆网址:https://gitlab.com/gnutls/gnutls.gitguile-gnutls公司$cd guile-gnutls/$git结账f5dcbdb46df52458e3756193c2a23bf558a3ecfd$git-filter-repo--路径guile/--路径m4/guile.m4--路径doc/gnutls-buile.texi--路径doc/extract-guilec-doc.scm--路径doc/cha-copying.texi--路径doc/fdl-1.3.texi

例如,我反复思考是否要包含一些文件,这些文件在新的存储库中命名相同,但几乎没有类似的行配置.ac生成文件.am更不用说了自述文件新闻。起初我认为保留进入新项目的所有线路的历史会很好,但这是一个主观判断。让我想到一个更简单的方法的是,对于新的存储库来说,贡献者历史记录和属性会非常奇怪:Guile-GnuTLS是否应该将数千次提交的工作归因于configure.ac,而这与Guile无关?应该提到写这篇文章的人是Guile-GnuTLS的贡献者吗?我认为不是。

下一步是获得合理的GitLab CI/CD管道以确保项目建立在免费GNU/Linux发行版喜欢特里斯克尔PureOS(纯操作系统)以及常见的非自由分布,如Debian公司费多拉以覆盖基于dpkg和rpm的分布。我包含的构建基于阿尔卑斯山ArchLinux此外,因为它们往往会引发其他可移植性问题。我希望有GNU吉他docker图像也可用于在该平台上进行简单测试。这个GitLab CI/CD规则对于这样的项目来说相当简单。

为了让事情顺利进行,我将结果标记为第3.7.9版并发布了Guile-GnuTLS的GitLab发布页面其中包括在我的笔记本电脑上手动上传的OpenPGP签名源代码tarball。这些tarball的URL不太好用,自动发现新版本似乎不可靠,但我不知道有更好的方法。

为了完成这个项目,我提出了一个GnuTLS合并请求从GnuTLS核心中删除所有与Guile相关的部件。

再次做一些与GnuTLS相关的工作感觉很好,这是很久以前的事了,所以感谢您给我这个机会。想法或评论?黑客攻击快乐!