我有一个脚本化的管道,可以使用该input功能请求用户的密码,并将其与用户保存的凭据密码短语进行比较。如果用户输入是一种类型,string则可以使用。但是,当我将输入类型更改为password(因此用户输入时在屏幕上看不到该输入类型)时,它将失败并显示断言错误。
input
string
password
我确保输入与凭证文件中的密码匹配的密码。
我正在将Jenkins 2.83与最新的Credentials插件和Credentials绑定插件一起使用。
脚本:
node { stage ("Collect User Input") { userInput = input( id: 'Input-username', message: 'Select username', ok: 'Continue', parameters: [choice(choices: 'user1\nuser2\nuser3', description: '', name: 'username'), password(defaultValue: '', description: 'Enter your private key passphrase ', name: 'password') ], submitterParameter: 'approver') println("User Input is: " + userInput) withCredentials(bindings: [sshUserPrivateKey(credentialsId: 'my-test-key', keyFileVariable: 'cred_keyfile', passphraseVariable: 'cred_passphrase', usernameVariable: 'cred_username' )]) { assert userInput.password==cred_passphrase } } }
我得到错误:
hudson.remoting.ProxyException: Assertion failed: assert userInput.password==cred_passphrase at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:404) at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(ScriptBytecodeAdapter.java:650) at com.cloudbees.groovy.cps.impl.AssertBlock$ContinuationImpl.fail(AssertBlock.java:47) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72) at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21) at com.cloudbees.groovy.cps.Next.step(Next.java:83) at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174) at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163) at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:122) at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:261) at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163) at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$101(SandboxContinuable.java:34) at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.lambda$run0$0(SandboxContinuable.java:59) at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108) at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:58) at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:332) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:83) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:244) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:232) at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112) at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) Finished: FAILURE
但是,如果我将password输入参数更改为string,则可以使用:
string(defaultValue: '', description: 'Enter your private key passphrase here', name: 'password')
所以我的问题是,我应该如何访问/处理输入的参数password变量/名称?
您的断言失败,因为输入类型password返回的不是字符串,而是hudson.util.Secret对象。如果要与输入密码进行比较,cred_passphrase请执行以下操作:
hudson.util.Secret
cred_passphrase
hudson.util.Secret.fromString(cred_passphrase) == userInput.password
它转换是非常重要的cred_passphrase与Secret.fromString(data)一个hudson.util.Secret对象,因为变量cred_passphrase握着你的密码是在纯文本String。
Secret.fromString(data)
String
您可以在下面找到完整的示例。
node { stage ("Collect User Input") { userInput = input( id: 'Input-username', message: 'Select username', ok: 'Continue', parameters: [choice(choices: 'user1\nuser2\nuser3', description: '', name: 'username'), password(defaultValue: '', description: 'Enter your private key passphrase ', name: 'password') ], submitterParameter: 'approver') println("User Input is: " + userInput) withCredentials(bindings: [sshUserPrivateKey(credentialsId: 'my-test-key', keyFileVariable: 'cred_keyfile', passphraseVariable: 'cred_passphrase', usernameVariable: 'cred_username' )]) { assert hudson.util.Secret.fromString(cred_passphrase) == userInput.password } } }