Ability to disable use of GIT_SSH_COMMAND
authorDmitry Neverov <dmitry.neverov@gmail.com>
Sat, 16 Dec 2017 17:37:33 +0000 (18:37 +0100)
committerDmitry Neverov <dmitry.neverov@gmail.com>
Sat, 16 Dec 2017 17:37:33 +0000 (18:37 +0100)
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/AgentPluginConfig.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/GitCommandLine.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/GitFactoryImpl.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/NativeGitFacade.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/PluginConfigImpl.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/UpdaterImpl.java

index 19df7348b8287729c2de7f001ddffbe5fa0fc1f4..30c2bb8197b6f9bc6b427af0b9b629edec20e0b4 100644 (file)
@@ -27,6 +27,8 @@ public interface AgentPluginConfig extends PluginConfig {
 
   boolean isUseNativeSSH();
 
+  boolean isUseGitSshCommand();
+
   boolean isUseLocalMirrors(@NotNull GitVcsRoot root);
 
   boolean isUseAlternates(@NotNull GitVcsRoot root);
index dd7cde59ae428183c2ff7e8d651f758bbb0aa0b9..742ec1acfdee31d2ff3e82d0f0c455dce9bb4f1c 100644 (file)
@@ -57,6 +57,7 @@ public class GitCommandLine extends GeneralCommandLine {
   private boolean myRepeatOnEmptyOutput = false;
   private VcsRootSshKeyManager mySshKeyManager;
   private boolean myHasProgress = false;
+  private boolean myUseGitSshCommand = true;
 
   public GitCommandLine(@Nullable GitAgentSSHService ssh,
                         @NotNull ScriptGen scriptGen,
@@ -119,7 +120,7 @@ public class GitCommandLine extends GeneralCommandLine {
         }
       }
       if (settings.isUseNativeSsh()) {
-        if (!myGitVersion.isLessThan(UpdaterImpl.MIN_GIT_SSH_COMMAND) && authSettings.getAuthMethod() == AuthenticationMethod.TEAMCITY_SSH_KEY) {
+        if (!myGitVersion.isLessThan(UpdaterImpl.MIN_GIT_SSH_COMMAND) && authSettings.getAuthMethod() == AuthenticationMethod.TEAMCITY_SSH_KEY && myUseGitSshCommand) {
           configureGitSshCommand(authSettings);
         }
         return CommandUtil.runCommand(this, settings.getTimeout());
@@ -242,6 +243,10 @@ public class GitCommandLine extends GeneralCommandLine {
     mySshKeyManager = sshKeyManager;
   }
 
+  public void setUseGitSshCommand(boolean useGitSshCommand) {
+    myUseGitSshCommand = useGitSshCommand;
+  }
+
   public void addEnvParam(@NotNull String name, @NotNull String value) {
     Map<String, String> existing = getEnvParams();
     if (existing == null)
index db289a21693f17e739616c8d7d3474133adc799b..175a739d0f2cbca9ff6f1c17eb4cb90b5f480be7 100644 (file)
@@ -53,6 +53,7 @@ public class GitFactoryImpl implements GitFactory {
     NativeGitFacade git = new NativeGitFacade(mySsh, myPluginConfig.getPathToGit(), myPluginConfig.getGitVersion(), repositoryDir,
                                               myTmpDir, myPluginConfig.isDeleteTempFiles(), myLogger, myPluginConfig.getGitExec(), myEnv, myCtx);
     git.setSshKeyManager(mySsh.getSshKeyManager());
+    git.setUseGitSshCommand(myPluginConfig.isUseGitSshCommand());
     return git;
   }
 }
index 1c182cf1ba00b54611faa2f7927f97606e014089..7da1436d22e61a051bc00142307adc1e16c7f063 100644 (file)
@@ -52,6 +52,7 @@ public class NativeGitFacade implements GitFacade {
   private final Map<String, String> myEnv;
   private final Context myCtx;
   private VcsRootSshKeyManager mySshKeyManager;
+  private boolean myUseGitSshCommand = true;
 
   public NativeGitFacade(@NotNull GitAgentSSHService ssh,
                          @NotNull String gitPath,
@@ -256,6 +257,7 @@ public class NativeGitFacade implements GitFacade {
     cmd.setExePath(myGitPath);
     cmd.setWorkingDirectory(myRepositoryDir);
     cmd.setSshKeyManager(mySshKeyManager);
+    cmd.setUseGitSshCommand(myUseGitSshCommand);
     return cmd;
   }
 
@@ -263,6 +265,10 @@ public class NativeGitFacade implements GitFacade {
     mySshKeyManager = sshKeyManager;
   }
 
+  public void setUseGitSshCommand(boolean useGitSshCommand) {
+    myUseGitSshCommand = useGitSshCommand;
+  }
+
   @NotNull
   private ScriptGen makeScriptGen() {
     return SystemInfo.isUnix ? new UnixScriptGen(myTmpDir, new EscapeEchoArgumentUnix()) : new WinScriptGen(myTmpDir, new EscapeEchoArgumentWin());
index 281c5d6adea400ac78b1d4c88ed624690db54b20..7659eac5b0ae0a72a517dbaaa4448a13006df025 100644 (file)
@@ -37,6 +37,7 @@ public class PluginConfigImpl implements AgentPluginConfig {
 
   public static final String IDLE_TIMEOUT = "teamcity.git.idle.timeout.seconds";
   public static final String USE_NATIVE_SSH = "teamcity.git.use.native.ssh";
+  public static final String USE_GIT_SSH_COMMAND = "teamcity.git.useGitSshCommand";
   public static final String USE_MIRRORS = "teamcity.git.use.local.mirrors";
   public static final String USE_ALTERNATES = "teamcity.git.useAlternates";
   public static final String USE_SHALLOW_CLONE = "teamcity.git.use.shallow.clone";
@@ -93,6 +94,12 @@ public class PluginConfigImpl implements AgentPluginConfig {
   }
 
 
+  @Override
+  public boolean isUseGitSshCommand() {
+    String value = myBuild.getSharedConfigParameters().get(USE_GIT_SSH_COMMAND);
+    return !"false".equals(value);
+  }
+
   public boolean isUseLocalMirrors(@NotNull GitVcsRoot root) {
     String buildSetting = myBuild.getSharedConfigParameters().get(USE_MIRRORS);
     if (!StringUtil.isEmpty(buildSetting)) {
index 61ce6bd5ae5c9be7c7c2982292aa39cfd0991d4d..1d5417ae85ec4a2fa473de0b5e55978b0ee082c2 100644 (file)
@@ -132,9 +132,13 @@ public class UpdaterImpl implements Updater {
   private void logSshOptions(@NotNull GitVersion gitVersion) {
     if (myPluginConfig.isUseNativeSSH()) {
       logInfo("Will use native ssh (" + PluginConfigImpl.USE_NATIVE_SSH + "=true)");
-      if (myRoot.getAuthSettings().getAuthMethod() == AuthenticationMethod.TEAMCITY_SSH_KEY && gitVersion.isLessThan(UpdaterImpl.MIN_GIT_SSH_COMMAND)) {
-        logWarn("Git " + gitVersion + " doesn't support the GIT_SSH_COMMAND environment variable, uploaded SSH keys will not work. " +
-                 "Required git version is " + UpdaterImpl.MIN_GIT_SSH_COMMAND);
+      if (myRoot.getAuthSettings().getAuthMethod() == AuthenticationMethod.TEAMCITY_SSH_KEY) {
+        if (gitVersion.isLessThan(UpdaterImpl.MIN_GIT_SSH_COMMAND)) {
+          logWarn("Git " + gitVersion + " doesn't support the GIT_SSH_COMMAND environment variable, uploaded SSH keys will not work. " +
+                  "Required git version is " + UpdaterImpl.MIN_GIT_SSH_COMMAND);
+        } else if (!myPluginConfig.isUseGitSshCommand()) {
+          logWarn("Use of GIT_SSH_COMMAND is disabled (" + PluginConfigImpl.USE_GIT_SSH_COMMAND + "=false), uploaded SSH keys will not work.");
+        }
       }
     }
   }