Se Br
Se Br

Reputation: 101

Git clone via ssh inside Docker not working

I'm trying to clone git repository via ssh from Java (that runs in Docker), but cloning fails. If I try to run with docker exec inside container it works pretty fine. So I don't understand why git clone not works. I've tried to put breakpoint before the command start by process builder and check that all files are exists. P.S. I need to pass ssh key only once when git clone exec, I don't need to store it for a long time, because this app can clone from different vcs with different ssh keys.

Java output:

backend-server-1    | 2022-06-29 08:17:53,186 INFO c.s.i.g.s.RepoInfo [pool-4-thread-1] Directory for files from repository and extra created.
backend-server-1    | Path to files = /opt/backend/files/b/145/.src
backend-server-1    | Path to extra = /usr/local/tomcat/temp/git5370745586107281269/repo {}
backend-server-1    | 2022-06-29 08:17:53,191 INFO c.s.i.g.u.v.GitCommandRunner [pool-4-thread-1] Trying to get sources from git repository via branch with '.git' suffix {}
backend-server-1    | 2022-06-29 08:17:53,194 INFO c.s.i.g.u.v.GitCommandRunner [pool-4-thread-1] Trying to clone via link: '[email protected]:BrezhnevSA/launch_in_netns.git' {}
backend-server-1    | 2022-06-29 08:17:53,216 INFO c.s.i.g.u.v.GitCommandRunner [pool-4-thread-1] tempFile.getAbsolutePath() {}
backend-server-1    | 2022-06-29 08:17:53,217 INFO c.s.i.g.u.v.GitCommandRunner [pool-4-thread-1] /usr/local/tomcat/temp/ssh_key_17036759532395112843.pub {}
backend-server-1    | 2022-06-29 08:17:53,229 INFO c.s.i.g.u.v.GitCommandRunner [pool-4-thread-1] ssh-agent bash -c 'chmod 600 "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub"; ssh-add "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub";  /usr/bin/git clone --recurse-submodules --separate-git-dir="/usr/local/tomcat/temp/git5370745586107281269/repo" [email protected]:BrezhnevSA/launch_in_netns.git /opt/backend/files/b/145/.src' {}
backend-server-1    | 2022-06-29 08:17:53,231 INFO c.s.i.u.c.CmdRunner [pool-4-thread-1] Starting ssh-agent... {}
backend-server-1    | 2022-06-29 08:17:53,250 ERROR c.s.i.g.s.Analysis [pool-4-thread-1] Failed to save task to FS {}
backend-server-1    | java.lang.RuntimeException: Couldn't execute git command 'Cmd [ssh-agent bash -c 'chmod 600 "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub"; ssh-add "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub";  /usr/bin/git clone --recurse-submodules --separate-git-dir="/usr/local/tomcat/temp/git5370745586107281269/repo" [email protected]:BrezhnevSA/launch_in_netns.git /opt/backend/files/b/145/.src']'
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.getProcessResult(GitCommandRunner.java:398) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.clone(GitCommandRunner.java:338) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.cloneRepositoryViaBranch(GitCommandRunner.java:188) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.cloneRepositoryViaBranch(GitCommandRunner.java:138) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.cloneRepositoryViaBranch(GitCommandRunner.java:89) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.start.RepoInfo.saveToFs(RepoInfo.java:57) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.start.RepoSource.saveToFs(RepoSource.java:40) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.start.Analysis.prepareSources(Analysis.java:102) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.start.Analysis.run(Analysis.java:84) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.utils.PreservingStackExecutorService.lambda$runnableWithStack$2(PreservingStackExecutorService.java:123) ~[utils-3.12.0-SNAPSHOT.jar:?]
backend-server-1    |   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
backend-server-1    |   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
backend-server-1    |   at java.lang.Thread.run(Thread.java:834) ~[?:?]
backend-server-1    | Caused by: java.io.IOException: Cannot run program "ssh-agent bash -c 'chmod 600 "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub"; ssh-add "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub"; ": error=2, No such file or directory
backend-server-1    |   at java.lang.ProcessBuilder.start(ProcessBuilder.java:1128) ~[?:?]
backend-server-1    |   at java.lang.ProcessBuilder.start(ProcessBuilder.java:1071) ~[?:?]
backend-server-1    |   at com.smartdec.incode.utils.cmd.CmdRunner.start(CmdRunner.java:244) ~[utils-3.12.0-SNAPSHOT.jar:?]
backend-server-1    |   at com.smartdec.incode.utils.cmd.CmdRunner.runWithTimeout(CmdRunner.java:96) ~[utils-3.12.0-SNAPSHOT.jar:?]
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.getProcessResult(GitCommandRunner.java:375) ~[classes/:?]
backend-server-1    |   ... 12 more
backend-server-1    | Caused by: java.io.IOException: error=2, No such file or directory
backend-server-1    |   at java.lang.ProcessImpl.forkAndExec(Native Method) ~[?:?]
backend-server-1    |   at java.lang.ProcessImpl.<init>(ProcessImpl.java:340) ~[?:?]
backend-server-1    |   at java.lang.ProcessImpl.start(ProcessImpl.java:271) ~[?:?]
backend-server-1    |   at java.lang.ProcessBuilder.start(ProcessBuilder.java:1107) ~[?:?]
backend-server-1    |   at java.lang.ProcessBuilder.start(ProcessBuilder.java:1071) ~[?:?]
backend-server-1    |   at com.smartdec.incode.utils.cmd.CmdRunner.start(CmdRunner.java:244) ~[utils-3.12.0-SNAPSHOT.jar:?]
backend-server-1    |   at com.smartdec.incode.utils.cmd.CmdRunner.runWithTimeout(CmdRunner.java:96) ~[utils-3.12.0-SNAPSHOT.jar:?]
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.getProcessResult(GitCommandRunner.java:375) ~[classes/:?]
backend-server-1    |   ... 12 more

Java git builder:

   if (isSsh(link) && filePath != null) {
        stub.add("ssh-agent bash -c 'chmod 600 \""
                + filePath + "\"; ssh-add \"" + filePath + "\"; ");
    }
    stub.add(getGitPath());
    stub.add("clone");
    stub.add("--recurse-submodules");
    if (StringUtils.isNotBlank(branch)) {
        stub.add("--single-branch");
        stub.add("--branch");
        stub.add(branch);
    }
    stub.add("--separate-git-dir=\"" + gitDir.toString() + "\"");
    if (depth > 0) {
        stub.add("--depth");
        stub.add(Integer.toString(depth));
    }
    stub.add(addOrRemoveSuffix(link, withGitSuffix));
    stub.add(out.toString() + (isSsh(link) && filePath != null ?  "'" : ""));

How I run with docker exec:

docker exec backend-server-1 bash -c "ssh-agent bash -c 'chmod 600 "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub"; ssh-add "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub";  /usr/bin/git clone --recurse-submodules --separate-git-dir="/usr/local/tomcat/temp/git5370745586107281269/repo" [email protected]:BrezhnevSA/launch_in_netns.git /opt/backend/files/b/145/.src'"

UPD:

I've changed git builder. Previous error solved, but still command not runs properly

Java git builder:

if (isSsh(link) && filePath != null) {
    stub.add("ssh-agent");
    stub.add("bash");
    stub.add("-c");
    stub.add("'chmod 600 \""
            + filePath + "\"; ssh-add \"" + filePath + "\"; "
            + getGitPath() + " clone --recurse-submodules "
            + (StringUtils.isNotBlank(branch)
                ? "--single-branch --branch " + branch + " "
                : " "
              )
            + "--separate-git-dir=\"" + gitDir.toString() + "\" "
            + (depth > 0 ? "--depth" + depth + " " : " ")
            + addOrRemoveSuffix(link, withGitSuffix) + " "
            + out.toString() + "'"
    );
} else {
    stub.add(getGitPath());
    stub.add("clone");
    stub.add("--recurse-submodules");
    if (StringUtils.isNotBlank(branch)) {
        stub.add("--single-branch");
        stub.add("--branch");
        stub.add(branch);
    }
    stub.add("--separate-git-dir=" + gitDir.toString());
    if (depth > 0) {
        stub.add("--depth");
        stub.add(Integer.toString(depth));
    }
    stub.add(addOrRemoveSuffix(link, withGitSuffix));
    stub.add(out.toString());
}

Java output:

backend-server-1    | 2022-06-29 09:20:54,856 INFO c.s.i.g.s.RepoInfo [pool-4-thread-1] Directory for files from repository and extra created.
backend-server-1    | Path to files = /opt/backend/files/b/151/.src
backend-server-1    | Path to extra = /usr/local/tomcat/temp/git890193757531557497/repo {}
backend-server-1    | 2022-06-29 09:20:54,858 INFO c.s.i.g.u.v.GitCommandRunner [pool-4-thread-1] Trying to get sources from git repository via branch with '.git' suffix {}
backend-server-1    | 2022-06-29 09:20:54,863 INFO c.s.i.g.u.v.GitCommandRunner [pool-4-thread-1] Trying to clone via link: '[email protected]:BrezhnevSA/launch_in_netns.git' {}
backend-server-1    | 2022-06-29 09:20:54,866 INFO c.s.i.g.u.v.GitCommandRunner [pool-4-thread-1] tempFile.getAbsolutePath() {}
backend-server-1    | 2022-06-29 09:20:54,867 INFO c.s.i.g.u.v.GitCommandRunner [pool-4-thread-1] /usr/local/tomcat/temp/ssh_key_6005337260985981392.pub {}
backend-server-1    | 2022-06-29 09:20:54,898 INFO c.s.i.g.u.v.GitCommandRunner [pool-4-thread-1] ssh-agent bash -c 'chmod 600 "/usr/local/tomcat/temp/ssh_key_6005337260985981392.pub"; ssh-add "/usr/local/tomcat/temp/ssh_key_6005337260985981392.pub"; /usr/bin/git clone --recurse-submodules  --separate-git-dir="/usr/local/tomcat/temp/git890193757531557497/repo"  [email protected]:BrezhnevSA/launch_in_netns.git /opt/backend/files/b/151/.src' {}
backend-server-1    | 2022-06-29 09:20:54,899 INFO c.s.i.u.c.CmdRunner [pool-4-thread-1] Starting ssh-agent... {}
backend-server-1    | 2022-06-29 09:20:54,936 INFO c.s.i.u.c.CmdRunner [pool-4-thread-1] Waiting for result of process 'ssh-agent' for 'ssh-agent bash -c 'chmod 600 "/usr/local/tomcat/temp/ssh_key_6005337260985981392.pub"; ssh-add "/usr/local/tomcat/temp/ssh_key_6005337260985981392.pub"; /usr/bin/git clone --recurse-submodules  --separate-git-dir="/usr/local/tomcat/temp/git890193757531557497/repo"  [email protected]:BrezhnevSA/launch_in_netns.git /opt/backend/files/b/151/.src'' {}
backend-server-1    | 2022-06-29 09:20:54,936 INFO c.s.i.u.c.CmdRunner [pool-4-thread-1] Process for 'ssh-agent' executed unsuccessfully, standard output: '', error output: '' {}
backend-server-1    | 2022-06-29 09:20:54,960 ERROR c.s.i.g.s.Analysis [pool-4-thread-1] Failed to save task to FS {}
backend-server-1    | java.lang.RuntimeException: Couldn't parse git error output. Result: 'CmdResult{type=ERROR, output='', error=''}'
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.getProcessResult(GitCommandRunner.java:393) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.clone(GitCommandRunner.java:337) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.cloneRepositoryViaBranch(GitCommandRunner.java:188) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.cloneRepositoryViaBranch(GitCommandRunner.java:138) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.utils.vcs.GitCommandRunner.cloneRepositoryViaBranch(GitCommandRunner.java:89) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.start.RepoInfo.saveToFs(RepoInfo.java:57) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.start.RepoSource.saveToFs(RepoSource.java:40) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.start.Analysis.prepareSources(Analysis.java:102) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.gui.start.Analysis.run(Analysis.java:84) ~[classes/:?]
backend-server-1    |   at com.smartdec.incode.utils.PreservingStackExecutorService.lambda$runnableWithStack$2(PreservingStackExecutorService.java:123) ~[utils-3.12.0-SNAPSHOT.jar:?]
backend-server-1    |   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
backend-server-1    |   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
backend-server-1    |   at java.lang.Thread.run(Thread.java:834) ~[?:?]

Upvotes: 0

Views: 173

Answers (1)

kutschkem
kutschkem

Reputation: 8163

I don't know git builder and so can't provide the solution, but what I can is tell you what the problem is. I hope this gets you halfway to solve your problem.

Caused by: java.io.IOException: Cannot run program "ssh-agent bash -c 'chmod 600 "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub"; ssh-add "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub"; ": error=2, No such file or directory

This indicates it is trying to run "ssh-agent bash -c 'chmod 600 "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub"; ssh-add "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub"; " without separating the arguments. It literally looks for the path "ssh-agent bash -c 'chmod 600 "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub"; ssh-add "/usr/local/tomcat/temp/ssh_key_17036759532395112843.pub"; "

So, you probably either just need to add

stub.add("bash");
stub.add("-c");

or separate the arguments into their own stub.add calls. Experiment to get it right. I hope this helps understanding this error message and similar ones in the future.

Upvotes: 2

Related Questions