From c423d0d5ce9384ecb30cc7e4f55d7e4b546bf7b0 Mon Sep 17 00:00:00 2001 From: Borja Lorente Date: Tue, 19 Dec 2023 16:33:47 +0000 Subject: [PATCH 1/8] feat: Allow environment variables in run configurations Allow users to set their own env vars per run-configuration. It is not respected everywhere (see the list below), but it works on our example projects. Main features: - Env vars should work when **run**ing and **debug**ging any binary. - Env vars should work when **run**ning any test. - Env vars should work when **debug**ging Go and Java tests. Env vars for C++ test debugging are implemented internally, but they're part of a larger patch and I'll need some more work to untangle that. --- .../idea/blaze/base/command/BlazeCommand.java | 2 ++ .../base/command/BlazeCommandRunner.java | 15 +++++---- .../CommandLineBlazeCommandRunner.java | 24 +++++++++----- .../base/qsync/BazelAppInspectorBuilder.java | 3 +- .../base/qsync/BazelDependencyBuilder.java | 3 +- .../base/qsync/BazelRenderJarBuilder.java | 3 +- ...eCommandGenericRunConfigurationRunner.java | 31 ++++++++++++++----- .../ScopedBlazeProcessHandler.java | 1 - ...azeCommandRunConfigurationCommonState.java | 9 +++++- .../run/state/EnvironmentVariablesState.java | 13 ++++++++ .../aspects/BlazeIdeInterfaceAspectsImpl.java | 2 +- .../base/bazel/FakeBlazeCommandRunner.java | 19 +++++++----- .../hi/src/com/example/HiGreeter.java | 3 +- .../run/BlazeGoRunConfigurationRunner.java | 2 +- .../java/run/BlazeJavaRunConfigState.java | 2 +- .../java/run/BlazeJavaRunProfileState.java | 10 +++++- .../run/BuildPluginBeforeRunTaskProvider.java | 3 +- 17 files changed, 104 insertions(+), 41 deletions(-) diff --git a/base/src/com/google/idea/blaze/base/command/BlazeCommand.java b/base/src/com/google/idea/blaze/base/command/BlazeCommand.java index de9138ae1ea..57051305547 100644 --- a/base/src/com/google/idea/blaze/base/command/BlazeCommand.java +++ b/base/src/com/google/idea/blaze/base/command/BlazeCommand.java @@ -17,6 +17,7 @@ import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.idea.blaze.base.bazel.BuildSystem.BuildInvoker; import com.google.idea.blaze.base.model.primitives.TargetExpression; @@ -101,6 +102,7 @@ public static class Builder { private final ImmutableList.Builder targets = ImmutableList.builder(); private final ImmutableList.Builder blazeCmdlineFlags = ImmutableList.builder(); private final ImmutableList.Builder exeFlags = ImmutableList.builder(); + private final ImmutableMap.Builder envVars = ImmutableMap.builder(); public Builder(String binaryPath, BlazeCommandName name) { this.binaryPath = binaryPath; diff --git a/base/src/com/google/idea/blaze/base/command/BlazeCommandRunner.java b/base/src/com/google/idea/blaze/base/command/BlazeCommandRunner.java index 1c1b02c0b7c..3122e52bc3c 100644 --- a/base/src/com/google/idea/blaze/base/command/BlazeCommandRunner.java +++ b/base/src/com/google/idea/blaze/base/command/BlazeCommandRunner.java @@ -25,6 +25,7 @@ import com.intellij.openapi.project.Project; import java.io.InputStream; import java.util.List; +import java.util.Map; import java.util.Optional; /** Runs a blaze command. */ @@ -38,7 +39,8 @@ BlazeBuildOutputs run( Project project, BlazeCommand.Builder blazeCommandBuilder, BuildResultHelper buildResultHelper, - BlazeContext context) + BlazeContext context, + Map envVars) throws BuildException; /** @@ -46,11 +48,12 @@ BlazeBuildOutputs run( * the given {@link BuildResultHelper}. */ BlazeTestResults runTest( - Project project, - BlazeCommand.Builder blazeCommandBuilder, - BuildResultHelper buildResultHelper, - BlazeContext context) - throws BuildException; + Project project, + BlazeCommand.Builder blazeCommandBuilder, + BuildResultHelper buildResultHelper, + BlazeContext context, + Map envVars) + throws BuildException; /** * Runs a blaze query command. diff --git a/base/src/com/google/idea/blaze/base/command/CommandLineBlazeCommandRunner.java b/base/src/com/google/idea/blaze/base/command/CommandLineBlazeCommandRunner.java index e28b1a79dc7..204ea8b64bb 100644 --- a/base/src/com/google/idea/blaze/base/command/CommandLineBlazeCommandRunner.java +++ b/base/src/com/google/idea/blaze/base/command/CommandLineBlazeCommandRunner.java @@ -52,6 +52,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; +import java.util.Map; import java.util.Optional; import java.util.function.Function; @@ -60,13 +61,14 @@ public class CommandLineBlazeCommandRunner implements BlazeCommandRunner { @Override public BlazeBuildOutputs run( - Project project, - BlazeCommand.Builder blazeCommandBuilder, - BuildResultHelper buildResultHelper, - BlazeContext context) { + Project project, + BlazeCommand.Builder blazeCommandBuilder, + BuildResultHelper buildResultHelper, + BlazeContext context, + Map envVars) { BuildResult buildResult = - issueBuild(blazeCommandBuilder, WorkspaceRoot.fromProject(project), context); + issueBuild(blazeCommandBuilder, WorkspaceRoot.fromProject(project), envVars, context); BuildDepsStatsScope.fromContext(context) .ifPresent(stats -> stats.setBazelExitCode(buildResult.exitCode)); if (buildResult.status == Status.FATAL_ERROR) { @@ -100,9 +102,14 @@ public BlazeTestResults runTest( Project project, BlazeCommand.Builder blazeCommandBuilder, BuildResultHelper buildResultHelper, - BlazeContext context) { + BlazeContext context, + Map envVars) { + // For tests, we have to pass the environment variables as `--test_env`, otherwise they don't get forwarded + for (Map.Entry env: envVars.entrySet()) { + blazeCommandBuilder.addBlazeFlags(BlazeFlags.TEST_ENV, String.format("%s=%s", env.getKey(), env.getValue())); + } BuildResult buildResult = - issueBuild(blazeCommandBuilder, WorkspaceRoot.fromProject(project), context); + issueBuild(blazeCommandBuilder, WorkspaceRoot.fromProject(project), envVars, context); if (buildResult.status == Status.FATAL_ERROR) { return BlazeTestResults.NO_RESULTS; } @@ -194,11 +201,12 @@ public InputStream runBlazeInfo( } private BuildResult issueBuild( - BlazeCommand.Builder blazeCommandBuilder, WorkspaceRoot workspaceRoot, BlazeContext context) { + BlazeCommand.Builder blazeCommandBuilder, WorkspaceRoot workspaceRoot, Map envVars, BlazeContext context) { blazeCommandBuilder.addBlazeFlags(getExtraBuildFlags(blazeCommandBuilder)); int retVal = ExternalTask.builder(workspaceRoot) .addBlazeCommand(blazeCommandBuilder.build()) + .environmentVars(envVars) .context(context) .stderr( LineProcessingOutputStream.of( diff --git a/base/src/com/google/idea/blaze/base/qsync/BazelAppInspectorBuilder.java b/base/src/com/google/idea/blaze/base/qsync/BazelAppInspectorBuilder.java index ce33f13c54f..4428cc214cb 100644 --- a/base/src/com/google/idea/blaze/base/qsync/BazelAppInspectorBuilder.java +++ b/base/src/com/google/idea/blaze/base/qsync/BazelAppInspectorBuilder.java @@ -18,6 +18,7 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.idea.blaze.base.bazel.BazelExitCodeException; import com.google.idea.blaze.base.bazel.BuildSystem; import com.google.idea.blaze.base.bazel.BuildSystem.BuildInvoker; @@ -70,7 +71,7 @@ public AppInspectorInfo buildAppInspector(BlazeContext context, Set