Jenkins Pipeline 在 brp-mangle-shebangs 上中断?

Jenkins Pipeline breaks on brp-mangle-shebangs?

从 Fedora32 开始(Fedora 33 也是如此),我的 libreoffice RPM Build 不再 运行。当詹金斯调用 /usr/lib/rpm/redhat/brp-mangle-shebangs 时,它似乎中断了。我修改了 brp-mangle-shebangs 以获取破坏构建的特定文件。这就是输出:

+ read shebang_line
+ orig_shebang='Denne utvidelsen blir en del av Calc, og tilbyr nye metoder for løsing til bruk i optimering av ikke-lineære programmeringsmodeller.'
+ '[' 'Denne utvidelsen blir en del av Calc, og tilbyr nye metoder for løsing til bruk i optimering av ikke-lineære programmeringsmodeller.' = 'Denne utvidelsen blir en del av Calc, og tilbyr nye metoder for løsing til bruk i optimering av ikke-lineære programmeringsmodeller.' ']'
+ echo '*** WARNING: ./opt/loffice/libreoffice6.4/share/extensions/nlpsolver/description-nb.txt is executable but has no shebang, removing executable bit'
*** WARNING: ./opt/loffice/libreoffice6.4/share/extensions/nlpsolver/description-nb.txt is executable but has no shebang, removing executable bit
++ stat -c %y ./opt/loffice/libreoffice6.4/share/extensions/nlpsolver/description-nb.txt
+ ts='2021-01-28 16:22:30.267085614 +0100'
+ chmod -x ./opt/loffice/libreoffice6.4/share/extensions/nlpsolver/description-nb.txt
+ touch -d '2021-01-28 16:22:30.267085614 +0100' /opt/loffice/libreoffice6.4/share/extensions/nlpsolver/description-nb.txt
+ continue
+ IFS=
+ read -r line
+ f=./opt/loffice/libreoffice6.4/share/extensions/package.txt
+ path=/opt/loffice/libreoffice6.4/share/extensions/package.txt
+ '[' -n '' ']'
+ '[' -n '' ']'
+ read shebang_line
Fehler: Fehler-Status beim Beenden von /var/tmp/rpm-tmp.R2w2T5 (%install)

这个脚本似乎试图从文本文件中读取 shebang,然后中断?老实说,我不知道发生了什么,因为詹金斯不会告诉我错误发生的确切位置。所以我不知道我的假设是否正确。我只能说,这个确切的构建适用于 fedora31 构建服务器。

你们有什么提示可以解释为什么这个构建可能会停止或者如何进一步调试它吗?老实说,我现在很迷茫。

说来话长,但“根本原因”似乎是 GNU install 命令中的一个“特性”。

通常(在 linux/unix 上),当创建 file 时,会通过 umask 获取其文件 mode(权限)。 此外 执行 x 权限被额外剥夺。

但是当你“install”一个文件时,install命令不知道文件是数据还是脚本,并且拒绝剥离x。 (似乎 install 总是使用 mode = 0755 (a.k.a."-rwxr-xr-x")。

例子:

umask=0027

600 -rw------- mod_0700_data    # from: chmod go-rwx mod_0700_data
700 -rwx------ mod_0700_xowner  # from: chmod 0700 mod_0700_xowner
777 -rwxrwxrwx mod_0777_xscript # from: chmod a+rwx mod_0777_xscript

640 -rw-r----- mod_touch        # from: touch mod_touch

600 -rw------- mod_cp_data      # from: cp mod_0700_data mod_cp_data
600 -rw------- mod_cp_xowner    # from: cp mod_0700_xowner mod_cp_xowner
750 -rwxr-x--- mod_cp_xscript   # from: cp mod_0777_xscript mod_cp_xscript

600 -rw------- mod_cp_-p_data   # from: cp -p mod_0700_data mod_cp_-p_data
700 -rwx------ mod_cp_-p_xowner # from: cp -p mod_0700_xowner mod_cp_-p_xowner
777 -rwxrwxrwx mod_cp_-p_xscript    # from: cp -p mod_0777_xscript mod_cp_-p_xscript

755 -rwxr-xr-x mod_install_data     # from: install mod_0700_data mod_install_data
755 -rwxr-xr-x mod_install_xowner   # from: install mod_0700_xowner mod_install_xowner
755 -rwxr-xr-x mod_install_xscript  # from: install mod_0777_xscript mod_install_xscript

600 -rw------- mod_install_data+mode    # from: install --mode =600 mod_0700_data mod_install_data+mode
700 -rwx------ mod_install_xowner+mode  # from: install --mode =700 mod_0700_xowner mod_install_xowner+mode
777 -rwxrwxrwx mod_install_xscript+mode # from: install --mode =777 mod_0777_xscript mod_install_xscript+mode

即您需要 手动 在每个 install 上包含 --mode 选项,特别是如果您需要保留文件的 x 执行位状态(例如,在与关闭)。

评论:我怀疑 /usr/lib/rpm/redhat/brp-mangle-shebangs 被添加到 RHEL/Fedora 以减少 .RPMs 错误地“意外地”创建 x 执行模式文件的发生率. (提示:如果 install 只会 spread/set x 模式 其中 原始 文件有一个 x 最初 。但我不愿想象此更改会破坏多少安装!)

请注意 libreoffice 并不是唯一被 RHEL/Fedora“警告”的 .rpmZFS ...“这些警告是在我们(错误地) 在 the_SCRIPTS automake 行中包含数据和配置文件

再远一点,我很好奇automake is unaware of install's agnostic/indifferent default file mode behavior. Mainly because zfs source code also appears to have added numerous patches to repair their Makefile.ac的变量,尤其是:dist_pkgdata_SCRIPTSdist_pkgdata_DATA。例如

pkgdatadir = $(datadir)/@PACKAGE@/test-runner/include
dist_pkgdata_SCRIPTS = \
    logapi.shlib

dist_pkgdata_DATA = \
    stf.shlib

更新:

RHEL8 有一个二进制 /usr/bin/install,可能是这个 shell 脚本的“编译”版本:install-sh ... 有问题的行是 #444,其中 umask 被覆盖:

# 443: Copy the file name to the temp name.
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 

非常成熟的代码..."Copyright (C) 1994 X Consortium" ...所以我确信重写 umask.

奇怪的是 install 的二进制版本默认总是使用 eXecute-bit 集创建文件。