Configuration-as-code-plugin: Does not work with Jenkins version 2.235.1

Created on 23 Jun 2020  路  20Comments  路  Source: jenkinsci/configuration-as-code-plugin

  • [ 2.235.1 ] Jenkins version

  • [ 1.41 ] Plugin version

  • [ Mac ] OS

Description

Currently starting with Jenkins version 2.235.1 fails with below error. How can we fix this?

2020-06-23 08:39:17.977+0000 [id=21]    SEVERE  hudson.util.BootFailure#publish: Failed to initialize Jenkins
java.lang.IllegalArgumentException: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible value. Expected the discarded bits to be zero.
    at org.apache.commons.codec.binary.Base64.validateCharacter(Base64.java:803)
    at org.apache.commons.codec.binary.Base64.decode(Base64.java:482)
    at org.apache.commons.codec.binary.BaseNCodec.decode(BaseNCodec.java:481)
    at org.apache.commons.codec.binary.BaseNCodec.decode(BaseNCodec.java:465)
    at org.apache.commons.codec.binary.Base64.decodeBase64(Base64.java:699)
    at com.cloudbees.plugins.credentials.SecretBytes.fromString(SecretBytes.java:283)
    at com.cloudbees.plugins.credentials.SecretBytes$StaplerConverterImpl.convert(SecretBytes.java:365)
    at com.cloudbees.plugins.credentials.SecretBytes$StaplerConverterImpl.convert(SecretBytes.java:359)
    at io.jenkins.plugins.casc.impl.configurators.PrimitiveConfigurator.configure(PrimitiveConfigurator.java:45)
    at io.jenkins.plugins.casc.impl.configurators.DataBoundConfigurator.tryConstructor(DataBoundConfigurator.java:160)
    at io.jenkins.plugins.casc.impl.configurators.DataBoundConfigurator.instance(DataBoundConfigurator.java:77)
    at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:267)
    at io.jenkins.plugins.casc.impl.configurators.DataBoundConfigurator.configure(DataBoundConfigurator.java:83)
    at io.jenkins.plugins.casc.impl.configurators.HeteroDescribableConfigurator.lambda$doConfigure$16668e2$1(HeteroDescribableConfigurator.java:277)
    at io.vavr.CheckedFunction0.lambda$unchecked$52349c75$1(CheckedFunction0.java:247)
    at io.jenkins.plugins.casc.impl.configurators.HeteroDescribableConfigurator.doConfigure(HeteroDescribableConfigurator.java:277)
    at io.jenkins.plugins.casc.impl.configurators.HeteroDescribableConfigurator.lambda$null$2(HeteroDescribableConfigurator.java:86)
    at io.vavr.control.Option.map(Option.java:392)
    at io.jenkins.plugins.casc.impl.configurators.HeteroDescribableConfigurator.lambda$configure$3(HeteroDescribableConfigurator.java:86)
    at io.vavr.Tuple2.apply(Tuple2.java:238)
    at io.jenkins.plugins.casc.impl.configurators.HeteroDescribableConfigurator.configure(HeteroDescribableConfigurator.java:83)
    at io.jenkins.plugins.casc.impl.configurators.HeteroDescribableConfigurator.configure(HeteroDescribableConfigurator.java:55)
    at io.jenkins.plugins.casc.impl.configurators.DataBoundConfigurator.tryConstructor(DataBoundConfigurator.java:152)
    at io.jenkins.plugins.casc.impl.configurators.DataBoundConfigurator.instance(DataBoundConfigurator.java:77)
    at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:267)
    at io.jenkins.plugins.casc.impl.configurators.DataBoundConfigurator.check(DataBoundConfigurator.java:101)
    at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:344)
    at io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:287)
    at io.jenkins.plugins.casc.BaseConfigurator.configure(BaseConfigurator.java:351)
    at io.jenkins.plugins.casc.BaseConfigurator.check(BaseConfigurator.java:287)
    at io.jenkins.plugins.casc.ConfigurationAsCode.lambda$checkWith$8(ConfigurationAsCode.java:755)
    at io.jenkins.plugins.casc.ConfigurationAsCode.invokeWith(ConfigurationAsCode.java:691)
    at io.jenkins.plugins.casc.ConfigurationAsCode.checkWith(ConfigurationAsCode.java:755)
    at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:740)
    at io.jenkins.plugins.casc.ConfigurationAsCode.configureWith(ConfigurationAsCode.java:616)
    at io.jenkins.plugins.casc.ConfigurationAsCode.configure(ConfigurationAsCode.java:298)
    at io.jenkins.plugins.casc.ConfigurationAsCode.init(ConfigurationAsCode.java:290)
Caused: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:104)
Caused: java.lang.Error
    at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:110)
    at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:175)
    at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296)
    at jenkins.model.Jenkins$5.runTask(Jenkins.java:1131)
    at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214)
    at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
    at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
    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:834)
Caused: org.jvnet.hudson.reactor.ReactorException
    at org.jvnet.hudson.reactor.Reactor.execute(Reactor.java:282)
    at jenkins.InitReactorRunner.run(InitReactorRunner.java:50)
    at jenkins.model.Jenkins.executeReactor(Jenkins.java:1164)
    at jenkins.model.Jenkins.<init>(Jenkins.java:964)
    at hudson.model.Hudson.<init>(Hudson.java:85)
    at hudson.model.Hudson.<init>(Hudson.java:81)
    at hudson.WebAppMain$3.run(WebAppMain.java:262)
Caused: hudson.util.HudsonFailedToLoad
    at hudson.WebAppMain$3.run(WebAppMain.java:279)
2020-06-23 08:39:18.006+0000 [id=21]    INFO    jenkins.model.Jenkins#cleanUp: Stopping Jenkins
2020-06-23 08:39:18.061+0000 [id=21]    INFO    jenkins.model.Jenkins$18#onAttained: Started termination
2020-06-23 08:39:18.092+0000 [id=21]    INFO    jenkins.model.Jenkins$18#onAttained: Completed termination
2020-06-23 08:39:18.092+0000 [id=21]    INFO    jenkins.model.Jenkins#_cleanUpDisconnectComputers: Starting node disconnection
2020-06-23 08:39:18.098+0000 [id=21]    INFO    jenkins.model.Jenkins#_cleanUpShutdownPluginManager: Stopping plugin manager
2020-06-23 08:39:18.126+0000 [id=21]    INFO    jenkins.model.Jenkins#_cleanUpPersistQueue: Persisting build queue
2020-06-23 08:39:18.141+0000 [id=21]    INFO    jenkins.model.Jenkins#_cleanUpAwaitDisconnects: Waiting for node disconnection completion
2020-06-23 08:39:18.142+0000 [id=21]    INFO    jenkins.model.Jenkins#cleanUp: Jenkins stopped
bug

Most helpful comment

Note that if you hit this IllegalArgumentException, AFAIK, it meant you were passing an invalid value to a parameter which expected either an secret encrypted against a Jenkins key (format {鈥) or Base64-encoded plaintext. The bug was that this mistake threw an unchecked exception which crashed startup. The fix is for it to behave as it did in earlier Jenkins versions: the invalid input is silently treated like an empty string. So I suspect that waiting for this plugin release was beside the point; you need to fix your JCasC YAML instead. From the stack trace, it seems that the input was neither encrypted, nor well-formed Base64; perhaps you were attempting to pass _unencoded_ plaintext, which is not supported.

All 20 comments

This is an issue with the apache commons-codec library, the credentials plugin put in a workaround here:

https://github.com/jenkinsci/credentials-plugin/pull/152

released in 2.3.8 https://github.com/jenkinsci/credentials-plugin/releases

I'm using credentials:2.3.8 this only happens when I upgrade Jenkins version from 2.222.4 to 2.235.1

Try and reduce your config down, it'll be some character that isn't properly encoded most likely

I didn't change any config and as soon as move back to version 2.222.4 it works. It's only when I switch to 2.235.1 it doesn't work with above error

This is a config specific issue, and most likely not related to this plugin.

I'm running Jenkins 2.241, with the latest credentials version and using credentials and it works for me

Same issue (same behavior as @hybmg57 described above) with:
But creds plugin version is: 2.3.10
I think it's related only this latest LTS version of Jenkins.

Need your actual configuration to reproduce this, it's a config specific issue

I think it only happens when we are trying to use with casc ssm plugin

any update here?

@hybmg57 I'm not using ssm plugin in my config. But I can't share my config for debug...

@jvz any thoughts on the above issue ^^

Well, that stack trace is from commons-codec for base64 which is included in Java, so perhaps that code should be refactored to use the Java 8 class instead.

It relates to these PRs:

https://github.com/jenkinsci/credentials-plugin/pull/152
https://github.com/jenkinsci/jenkins/pull/4636

not actually related to configuration-as-code at all afaik.

also cc @jglick

I have no idea. The commons-codec update addresses a CVE or VULNDB finding which is unrelated.

I am on it.

Same thing, can confirm that fix working for me!
Thanks a lot @jglick @timja @jvz @hybmg57

Same thing, can confirm that fix working for me!
Thanks a lot @jglick @timja @jvz @hybmg57

don't thank me I just raised my issue. thanks again to @timja @jvz and especially @jglick as he fixed the issue 馃

Note that if you hit this IllegalArgumentException, AFAIK, it meant you were passing an invalid value to a parameter which expected either an secret encrypted against a Jenkins key (format {鈥) or Base64-encoded plaintext. The bug was that this mistake threw an unchecked exception which crashed startup. The fix is for it to behave as it did in earlier Jenkins versions: the invalid input is silently treated like an empty string. So I suspect that waiting for this plugin release was beside the point; you need to fix your JCasC YAML instead. From the stack trace, it seems that the input was neither encrypted, nor well-formed Base64; perhaps you were attempting to pass _unencoded_ plaintext, which is not supported.

Was this page helpful?
0 / 5 - 0 ratings