[spring-projects/spring-boot]installBootDist 创建具有错误权限的可执行文件

2024-04-17 276 views
9

使用 Gradleapplication插件,installBootDist可以执行安装分发文件的任务。

执行时installBootDist,我观察到安装的可执行文件具有错误的权限:

$ ./gradlew clean installBootDist

BUILD SUCCESSFUL in 1s
5 actionable tasks: 5 executed
$ ls -l build/install/initial-boot/bin/
total 24
-r-x-wSr-t  1 (xxx)  (xxx)  5207  8 21 19:19 initial
-r-x-wSr-t  1 (xxx)  (xxx)  2178  8 21 19:19 initial.bat
$ gstat -c "%a %n" ./build/install/initial-boot/bin/initial*
3525 ./build/install/initial-boot/bin/initial
3525 ./build/install/initial-boot/bin/initial.bat

在mac上测试过。

文件权限设置为-r-x-wSr-t(十六进制的 0x755 是八进制的 3525)。它应该像-rwxr-xr-x(0755,八进制)。

https://github.com/spring-projects/spring-boot/blob/v2.0.4.RELEASE/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/ org/springframework/boot/gradle/plugin/ApplicationPluginAction.java#L83

示例项目

https://github.com/occho/gs-spring-boot/tree/filemode-bug-with-application-plugin/initial

已测试版本

spring-boot-gradle-插件:2.0.4.RELEASE

回答

8

感谢您的详细分析

7

@philwebb 这个问题仅与更改此行有关

binCopySpec.setFileMode(0x755);

binCopySpec.setFileMode(0755);

6

@ivange94 差不多了。如果可以的话,我们还尝试添加一个测试。

3

@ivange94 感谢您有兴趣解决这个问题。我应该将此问题分配给自己,因为我已经在进行修复。对不起。我正在进行的工作就在这里

8

@wilkinsona不用担心。我再找找别的东西?

3

@wilkinsona 在我的机器上测试失败并显示org.junit.ComparisonFailure: expected:<4[20]> but was:<4[36]>.该文件的文件权限是664而不是644。这可能是什么原因?

6

@julmuell 你使用什么操作系统?我想知道这是否是所使用的底层文件系统的问题。

4

@philwebb 听起来就是这样,是的。我使用的是 Ubuntu 18:

➜  ~ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:   bionic
➜  ~ uname -a
Linux ... 4.18.8-041808-generic #201809150431 SMP Sat Sep 15 08:33:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
1

@julmuell ext4 文件系统我假设?

3

@philwebb 是的,没错

9

很奇怪,我们的 CI 使用类似的设置。 ?‍♀️

6

只是猜测,但由于 umask 设置?

2

@occho 猜得好,这是有道理的。但通过我的 umask 设置,权限应该符合预期。 Maven 构建可以使用不同的 umask 运行吗?

➜  ~ umask
022
0

AFAIK,Maven 不会对 umask 执行任何操作。让事情变得有点复杂的是,它是从 Maven 触发的 Gradle 构建,并且相关文件正在从 Gradle 的缓存复制到 tar 存档中。这是 tar 中正在执行权限检查的条目。它们是使用null文件模式复制的,这意味着它们应该使用与 Gradle 缓存中磁盘上相同的权限进行压缩。

我们可能可以对存档的 lib 目录中的文件的权限有更强烈的看法。我将重新打开此问题以明确将权限设置为 0644,如果没有其他情况,这应该会使测试更加稳健。