-
Type:
Bug
-
Resolution: Unresolved
-
Priority:
Major
-
Component/s: awseb-deployment-plugin
-
None
Running a deployment on a remote Jenkins node fails as the credentials can not be obtained.
java.lang.RuntimeException: Missing Jenkins Instance at br.com.ingenieux.jenkins.plugins.awsebdeployment.AWSClientFactory.lookupNamedCredential(AWSClientFactory.java:96) at br.com.ingenieux.jenkins.plugins.awsebdeployment.AWSClientFactory.getClientFactory(AWSClientFactory.java:85) at br.com.ingenieux.jenkins.plugins.awsebdeployment.cmd.DeployerCommand$InitAWS.perform(DeployerCommand.java:143) at br.com.ingenieux.jenkins.plugins.awsebdeployment.cmd.DeployerChain.perform(DeployerChain.java:54) at br.com.ingenieux.jenkins.plugins.awsebdeployment.SlaveDeployerCallable.call(SlaveDeployerCallable.java:42) at br.com.ingenieux.jenkins.plugins.awsebdeployment.SlaveDeployerCallable.call(SlaveDeployerCallable.java:27) at hudson.remoting.UserRequest.perform(UserRequest.java:211) at hudson.remoting.UserRequest.perform(UserRequest.java:54) at hudson.remoting.Request$2.run(Request.java:376) at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:78) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) Caused: java.util.concurrent.ExecutionException at hudson.remoting.Channel$2.adapt(Channel.java:1036) at hudson.remoting.Channel$2.adapt(Channel.java:1030) at hudson.remoting.FutureAdapter.get(FutureAdapter.java:61) at br.com.ingenieux.jenkins.plugins.awsebdeployment.DeployerRunner.perform(DeployerRunner.java:64) at br.com.ingenieux.jenkins.plugins.awsebdeployment.AWSEBDeploymentBuilder.perform(AWSEBDeploymentBuilder.java:243) Caused: java.io.IOException: Deployment Failure at br.com.ingenieux.jenkins.plugins.awsebdeployment.AWSEBDeploymentBuilder.perform(AWSEBDeploymentBuilder.java:245) at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:123) at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:79) at br.com.ingenieux.jenkins.plugins.awsebdeployment.AWSEBDeploymentBuilder.perform(AWSEBDeploymentBuilder.java:79) at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20) at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:816) at hudson.model.Build$BuildExecution.build(Build.java:199) at hudson.model.Build$BuildExecution.doRun(Build.java:164) at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:524) at hudson.model.Run.execute(Run.java:1897) at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:44) at hudson.model.ResourceController.execute(ResourceController.java:101) at hudson.model.Executor.run(Executor.java:442)
The problem is probably caused by:
private static AmazonWebServicesCredentials lookupNamedCredential(String credentialsId) throws CredentialNotFoundException { final Jenkins jenkins = Jenkins.getInstanceOrNull();
The docs also explain that this method can not be used if it is not running on the Jenkins master node:
Â
  /**
   * Gets the {@link Jenkins} singleton.
   * {@link #get} is what you normally want.
   * <p>In certain rare cases you may have code that is intended to run before Jenkins starts or while Jenkins is being shut down.
   * For those rare cases use this method.
   * <p>In other cases you may have code that might end up running on a remote JVM and not on the Jenkins controller or built-in node.
   * For those cases you really should rewrite your code so that when the {@link Callable} is sent over the remoting channel
   * it can do whatever it needs without ever referring to {@link Jenkins};
   * for example, gather any information you need on the controller side before constructing the callable.
   * If you must do a runtime check whether you are in the controller or agent, use {@link JenkinsJVM} rather than this method,
   * as merely loading the {@link Jenkins} class file into an agent JVM can cause linkage errors under some conditions.
   * @return The instance. Null if the {@link Jenkins} service has not been started, or was already shut down,
   *     or we are running on an unrelated JVM, typically an agent.
   * @since 1.653
   */
  @CLIResolver
  @CheckForNull
  public static Jenkins getInstanceOrNull() {
    return HOLDER.getInstance();
  }
Steps to reproduce the issue:
- create a Jenkins node that is accessed via SSH
- create AWS credentials in credential management
- create job with awseb-deployment-plugin step that uses the AWS credentials
- run job on remote node
Â