Skip to content

Commit 4bba0ad

Browse files
committed
Run gradle daemon quietly in background
1 parent 155aea2 commit 4bba0ad

File tree

4 files changed

+42
-23
lines changed

4 files changed

+42
-23
lines changed

Cargo.lock

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

buildpacks/gradle/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ libcnb = "=0.26.0"
1313
libherokubuildpack = { version = "=0.26.0", default-features = false, features = ["command", "error", "log"] }
1414
nom = "7"
1515
serde = { version = "1", features = ["derive"] }
16+
tempfile = "3.15.0"
1617

1718
[dev-dependencies]
1819
buildpacks-jvm-shared-test.workspace = true

buildpacks/gradle/src/gradle_command/daemon.rs

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,51 @@
11
use crate::gradle_command::GradleCommandError;
22
use crate::GRADLE_TASK_NAME_HEROKU_START_DAEMON;
3+
use buildpacks_jvm_shared::output::{self, CmdError};
34
use libcnb::Env;
4-
use libherokubuildpack::command::CommandExt;
5-
use std::io::{stderr, stdout};
65
use std::path::Path;
7-
use std::process::Command;
6+
use std::process::{Command, Stdio};
7+
use tempfile::NamedTempFile;
8+
9+
pub(crate) struct GradleDaemonLog {
10+
file: NamedTempFile,
11+
}
812

913
pub(crate) fn start(
1014
gradle_wrapper_executable_path: &Path,
1115
gradle_env: &Env,
12-
) -> Result<(), GradleCommandError<()>> {
13-
let output = Command::new(gradle_wrapper_executable_path)
16+
) -> Result<GradleDaemonLog, GradleCommandError<()>> {
17+
let log = GradleDaemonLog {
18+
file: tempfile::NamedTempFile::new().map_err(GradleCommandError::Io)?,
19+
};
20+
std::fs::write(&log.file, "").map_err(GradleCommandError::Io)?;
21+
let mut command = Command::new(gradle_wrapper_executable_path);
22+
command
1423
.args([
1524
// Fixes an issue when running under Apple Rosetta emulation
1625
"-Djdk.lang.Process.launchMechanism=vfork",
1726
"--daemon",
1827
GRADLE_TASK_NAME_HEROKU_START_DAEMON,
1928
])
20-
.envs(gradle_env)
21-
.output_and_write_streams(stdout(), stderr())
22-
.map_err(GradleCommandError::Io)?;
29+
.envs(gradle_env);
30+
let file = log.file.reopen().map_err(GradleCommandError::Io)?;
31+
32+
command.stdout(Stdio::from(
33+
file.try_clone().map_err(GradleCommandError::Io)?,
34+
));
35+
command.stderr(Stdio::from(file));
2336

24-
if output.status.success() {
25-
Ok(())
26-
} else {
27-
Err(GradleCommandError::UnexpectedExitStatus {
28-
status: output.status,
29-
stdout: String::from_utf8_lossy(&output.stdout).into_owned(),
30-
stderr: String::from_utf8_lossy(&output.stderr).into_owned(),
31-
})
32-
}
37+
let _ = output::run_command(command, true).map_err(|error| match error {
38+
CmdError::SystemError(_, error) => GradleCommandError::Io(error),
39+
CmdError::NonZeroExitNotStreamed(named_output)
40+
| CmdError::NonZeroExitAlreadyStreamed(named_output) => {
41+
GradleCommandError::UnexpectedExitStatus {
42+
status: *named_output.status(),
43+
stdout: named_output.stdout_lossy(),
44+
stderr: named_output.stderr_lossy(),
45+
}
46+
}
47+
})?;
48+
Ok(log)
3349
}
3450

3551
pub(crate) fn stop(

buildpacks/gradle/src/main.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,9 @@ impl Buildpack for GradleBuildpack {
9292

9393
print_section("Running Gradle build");
9494

95-
track_timing_subsection("Starting Gradle daemon", || {
96-
gradle_command::start_daemon(&gradle_wrapper_executable_path, &gradle_env)
97-
.map_err(GradleBuildpackError::StartGradleDaemonError)
98-
})?;
95+
print_subsection("Starting Gradle daemon");
96+
let daemon_log = gradle_command::start_daemon(&gradle_wrapper_executable_path, &gradle_env)
97+
.map_err(GradleBuildpackError::StartGradleDaemonError)?;
9998

10099
let project_tasks = track_timing_subsection("Querying tasks", || {
101100
gradle_command::tasks(&context.app_dir, &gradle_env)
@@ -142,6 +141,7 @@ impl Buildpack for GradleBuildpack {
142141
let process = default_app_process(&dependency_report, &context.app_dir)
143142
.map_err(GradleBuildpackError::CannotDetermineDefaultAppProcess)?;
144143

144+
drop(daemon_log);
145145
output::print_all_done(build_timer);
146146
process
147147
.map_or(BuildResultBuilder::new(), |process| {

0 commit comments

Comments
 (0)