为什么 protoc 可执行文件无法 运行 from Gradle on GitHub Action?
Why protoc executable fails to run from Gradle on GitHub Action?
我有一个 ubuntu-latest
GitHub 操作,它使用 Gradle.
构建项目
Gradle 任务之一是运行代码生成器的 JavaExec
任务:
task("generateCode", JavaExec::class) {
mainClass.set("code.generator.Main")
classpath = generateCodeClasspath
}
最近Java应用程序被修改为下载二进制文件(protoc
),将其复制到文件系统并执行。 “它在我的机器上工作”,但在 GitHub 操作上失败,我找不到原因。
protoc
二进制文件下载到 /home/runner/work/project/project/submodule/build/protoc/bin
。
在 JVM 尝试生成 protoc
进程之前,文件存在并且可执行:
stat protoc
File: protoc
Size: 4539800 Blocks: 8872 IO Block: 4096 regular file
Device: 811h/2065d Inode: 1822895 Links: 1
Access: (0744/-rwxr--r--) Uid: ( 1001/ runner) Gid: ( 121/ docker)
Access: 2022-03-14 14:51:45.943750443 +0000
Modify: 2022-03-14 14:51:45.979750853 +0000
Change: 2022-03-14 14:51:45.979750853 +0000
Birth: -
ldd protoc
linux-vdso.so.1 (0x00007ffd43ba6000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc367fd3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc367fb0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc367dbe000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc368133000)
程序使用这些参数通过 ProcessBuilder 启动:
ProcessBuilder(
"protoc",
"--proto_path",
intermediateProtoDir.absolutePath,
"--plugin",
binDir.resolve("proto-gen-rust").absolutePath,
)
然而,运行 protoc
失败:
Exception in thread "main" java.io.IOException: Cannot run program "protoc" (in directory "/home/runner/work/project/project/submodule/build/protoc/bin"): error=2, No such file or directory
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
我错过了什么?
我接受了,你在尝试执行之前切换到特定目录(/home/runner/work/project/project/submodule/build/protoc/bin
)?然后我相信找不到该程序,因为当前工作目录不在您的 $PATH
中,并且您没有在调用中指定绝对路径。
尝试将 /home/runner/work/project/project/submodule/build/protoc/bin
添加到您的 $PATH
或在您的通话中将 "protoc"
更改为 "./protoc"
:
ProcessBuilder(
"./protoc",
"--proto_path",
intermediateProtoDir.absolutePath,
"--plugin",
binDir.resolve("proto-gen-rust").absolutePath,
)
我有一个 ubuntu-latest
GitHub 操作,它使用 Gradle.
Gradle 任务之一是运行代码生成器的 JavaExec
任务:
task("generateCode", JavaExec::class) {
mainClass.set("code.generator.Main")
classpath = generateCodeClasspath
}
最近Java应用程序被修改为下载二进制文件(protoc
),将其复制到文件系统并执行。 “它在我的机器上工作”,但在 GitHub 操作上失败,我找不到原因。
protoc
二进制文件下载到 /home/runner/work/project/project/submodule/build/protoc/bin
。
在 JVM 尝试生成 protoc
进程之前,文件存在并且可执行:
stat protoc
File: protoc
Size: 4539800 Blocks: 8872 IO Block: 4096 regular file
Device: 811h/2065d Inode: 1822895 Links: 1
Access: (0744/-rwxr--r--) Uid: ( 1001/ runner) Gid: ( 121/ docker)
Access: 2022-03-14 14:51:45.943750443 +0000
Modify: 2022-03-14 14:51:45.979750853 +0000
Change: 2022-03-14 14:51:45.979750853 +0000
Birth: -
ldd protoc
linux-vdso.so.1 (0x00007ffd43ba6000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc367fd3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc367fb0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc367dbe000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc368133000)
程序使用这些参数通过 ProcessBuilder 启动:
ProcessBuilder(
"protoc",
"--proto_path",
intermediateProtoDir.absolutePath,
"--plugin",
binDir.resolve("proto-gen-rust").absolutePath,
)
然而,运行 protoc
失败:
Exception in thread "main" java.io.IOException: Cannot run program "protoc" (in directory "/home/runner/work/project/project/submodule/build/protoc/bin"): error=2, No such file or directory
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
我错过了什么?
我接受了,你在尝试执行之前切换到特定目录(/home/runner/work/project/project/submodule/build/protoc/bin
)?然后我相信找不到该程序,因为当前工作目录不在您的 $PATH
中,并且您没有在调用中指定绝对路径。
尝试将 /home/runner/work/project/project/submodule/build/protoc/bin
添加到您的 $PATH
或在您的通话中将 "protoc"
更改为 "./protoc"
:
ProcessBuilder(
"./protoc",
"--proto_path",
intermediateProtoDir.absolutePath,
"--plugin",
binDir.resolve("proto-gen-rust").absolutePath,
)