为什么 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,
      )