The ssh agents use secure shell to connect.  The secure shell uses private
key / public key pairs to perform the connection.  Your example is trying
to use a username / password credential when it needs to use a private key
credential.

We use a technique like below from a system groovy script to add a Jenkins
agent at startup:

import jenkins.model.*
import hudson.model.*
import hudson.slaves.*
import hudson.plugins.sshslaves.*
import hudson.slaves.EnvironmentVariablesNodeProperty.Entry
import hudson.plugins.sshslaves.verifiers.*

import com.cloudbees.plugins.credentials.*
import com.cloudbees.plugins.credentials.common.*
import com.cloudbees.plugins.credentials.domains.*
import com.cloudbees.jenkins.plugins.sshcredentials.impl.*

// SET THE INITIAL SSH CREDENTIALS
global_domain = Domain.global()

credentials_store = Jenkins.instance.getExtensionList(
  'com.cloudbees.plugins.credentials.SystemCredentialsProvider'
)[0].getStore()

credentials = new BasicSSHUserPrivateKey(
  CredentialsScope.SYSTEM,
  "ssh-agent-key",
  "jenkins",
  new BasicSSHUserPrivateKey.FileOnMasterPrivateKeySource(
    '/home/butler/.ssh/id_rsa'
  ),
  '',
  "SSH Key for the Agent"
)

credentials_store.addCredentials(global_domain, credentials)

SshHostKeyVerificationStrategy doNotVerifyHostKey = new
NonVerifyingKeyVerificationStrategy()

// CREATE THE JDK8 AGENT
SSHLauncher jdk8Launcher = new SSHLauncher("jdk8-ssh-agent", 22,
"ssh-agent-key", "", "", "", "", 33, 2, 5, doNotVerifyHostKey)
Slave jdk8SSHAgent = new DumbSlave("jdk8-node", "/home/jenkins",
jdk8Launcher)
jdk8SSHAgent.setLabelString("docker maven jdk8 jdk-8 java8 java-8
maven-jdk8 java")
jdk8SSHAgent.setNodeDescription("Agent node for JDK8")
jdk8SSHAgent.setNumExecutors(2)

List<Entry> jdk8SSHAgentEnv = new ArrayList<Entry>();
jdk8SSHAgentEnv.add(new Entry("JAVA_HOME","/usr/lib/jvm/java-1.8-openjdk"))
EnvironmentVariablesNodeProperty jdk8SSHAgentEnvPro = new
EnvironmentVariablesNodeProperty(jdk8SSHAgentEnv);
jdk8SSHAgent.getNodeProperties().add(jdk8SSHAgentEnvPro)

Jenkins.instance.addNode(jdk8SSHAgent)


You can find this script in the Jenkins server that is provided as part of
the lab environment for the free Jenkins Pipeline Fundamentals course from
https://standard.cbu.cloudbees.com/cloudbees-university-jenkins-pipeline-fundamentals
.  Other free courses are available from https://standard.cbu.cloudbees.com/
.  The script is not part of the course, but it is used in the lab
environment to configure the agents that are used in the labs.

The 'doNotVerifyHostKey' is a risky setting that works in the lab
environment because the lab environment is "disposable".  In your
environment you will probably want to use a different setting that assures
the connecting agent has the correct host key.  You don't want to risk
connecting to the wrong agent.

Mark Waite

On Fri, Mar 1, 2019 at 5:46 AM 田欧 <thinke...@gmail.com> wrote:

> I'm using `ssh-slaves-plugin` and write some codes, like the below:
>
> @RequestMapping(value = "/test", method = RequestMethod.GET)
> public Map<String, Boolean> test() {
>     Map<String, Boolean> result = new HashMap<>();
>
>     // username is my jenkins user
>
>     // password is my jenkins password
>
>     UsernamePasswordCredentialsImpl credentials = new 
> UsernamePasswordCredentialsImpl(CredentialsScope.SYSTEM, "dummyCredentialId", 
> "perf", "myname", "mysceret");
>     
> SystemCredentialsProvider.getInstance().getDomainCredentialsMap().put(Domain.global(),
>             Collections.singletonList(
>                     credentials
>             )
>     );
>
>     // ip is my slave ip
>     SSHLauncher launcher = new SSHLauncher("10.10.10.10", 22, 
> "dummyCredentialId", null, null, null,
>             null, 3, 1, 1, new KnownHostsFileKeyVerificationStrategy());
>
>     DumbSlave dumb = null;
>     try {
>         dumb = new DumbSlave("slave-test", "", launcher);
>         dumb.setNodeDescription("dummy-description");
>         dumb.setNumExecutors(1);
>         dumb.setMode(Node.Mode.NORMAL);
>         dumb.setRetentionStrategy(RetentionStrategy.NOOP);
>     } catch (IOException e) {
>         e.printStackTrace();
>     } catch (Descriptor.FormException e) {
>         e.printStackTrace();
>     }
>
>
>     // I see 
> https://github.com/jenkinsci/ssh-slaves-plugin/blob/master/src/test/java/hudson/plugins/sshslaves/SSHLauncherTest.java#L181
>
>     // use JenkinsRule, so I use Jenkins.getInstanceOrNull
>     try {
>         Jenkins.getInstanceOrNull().addNode(dumb);
>     } catch (IOException e) {
>         e.printStackTrace();
>     }
>     result.put("success", true);
>     return result;
> }
>
>
> when I run it, return error, stack:
>
> java.lang.NullPointerException: null
> at jenkins.security.ConfidentialStore.get(ConfidentialStore.java:68)
> ~[jenkins-core-2.166.jar!/:na]
> at jenkins.security.ConfidentialKey.load(ConfidentialKey.java:47)
> ~[jenkins-core-2.166.jar!/:na]
> at
> jenkins.security.CryptoConfidentialKey.getKey(CryptoConfidentialKey.java:41)
> ~[jenkins-core-2.166.jar!/:na]
> at
> jenkins.security.CryptoConfidentialKey.decrypt(CryptoConfidentialKey.java:134)
> ~[jenkins-core-2.166.jar!/:na]
> at hudson.util.HistoricalSecrets.decrypt(HistoricalSecrets.java:55)
> ~[jenkins-core-2.166.jar!/:na]
> at hudson.util.Secret.decrypt(Secret.java:212)
> ~[jenkins-core-2.166.jar!/:na]
> at hudson.util.Secret.fromString(Secret.java:254)
> ~[jenkins-core-2.166.jar!/:na]
> at
> com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl.<init>(UsernamePasswordCredentialsImpl.java:72)
> ~[credentials-2.1.18.jar!/:2.1.18]
> at com.kk.perf.controller.SlaveController.test(SlaveController.java:48)
> ~[classes!/:0.0.1-SNAPSHOT]
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> ~[na:1.8.0_102]
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> ~[na:1.8.0_102]
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> ~[na:1.8.0_102]
> at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
> at
> org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
> ~[spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
> ~[spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
> ~[spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
> ~[spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
> ~[spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
> ~[spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
> ~[spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
> ~[spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
> ~[spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
> ~[spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
> ~[spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
> ~[tomcat-embed-websocket-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
> ~[spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> ~[spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
> ~[spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> ~[spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
> ~[spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> ~[spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
> ~[spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> ~[spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
> ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> [na:1.8.0_102]
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> [na:1.8.0_102]
> at
> org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
> [tomcat-embed-core-9.0.16.jar!/:9.0.16]
> at java.lang.Thread.run(Thread.java:745) [na:1.8.0_102]
>
> So, why?
>
> And I want to know, how start it? because I don't set any info about
> jenkins master.
>
> Thanks!
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Jenkins Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to jenkinsci-users+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/jenkinsci-users/6cd46b89-519b-4557-8a41-67656b3fa2b2%40googlegroups.com
> <https://groups.google.com/d/msgid/jenkinsci-users/6cd46b89-519b-4557-8a41-67656b3fa2b2%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>


-- 
Thanks!
Mark Waite

-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jenkinsci-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-users/CAO49JtEgjSecWnV%3Dhpn4SfD5%2B3grmBO84Vno%2BYHW%2BHX5uhQM5w%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to