In the Jenkins Ansible Tower plugin I had a checkbox for importing logs. In
order to satisfy a new requirement I would like to change this into a select
menu. So I modified my code to switch from a true/false checkbox into a select
menu which has values of true, false, full and vars as options.
My plugin supported both Freestyle and Pipeline Jenkins jobs.
After changing my code all existing freestyle jobs made the conversion
seamlessly an old boolean true or false values mapped into the string values
“true” and “false” without any issues.
However, groovy scripts using the pipeline portion of the plugin are throwing
stack exceptions because the grooy scripts specify boolean values like :
importTowerLogs = true,
These values are not mapping to strings and Jenkins is putting out an exception
when running the pipeline:
java.lang.ClassCastException:
org.jenkinsci.plugins.ansible_tower.AnsibleTowerStep.importTowerLogs expects
class java.lang.String but received class java.lang.Boolean
at
org.jenkinsci.plugins.structs.describable.DescribableModel.coerce(DescribableModel.java:492)
at
org.jenkinsci.plugins.structs.describable.DescribableModel.buildArguments(DescribableModel.java:409)
at
org.jenkinsci.plugins.structs.describable.DescribableModel.buildArguments(DescribableModel.java:409)
at
org.jenkinsci.plugins.structs.describable.DescribableModel.coerce(DescribableModel.java:492)
My old @DataBoundConstructor looked like:
@DataBoundConstructor
public AnsibleTowerStep(@Nonnull String towerServer, Boolean importTowerLogs,
Boolean param2, ...) {
My new constructor needs to be:
@DataBoundConstructor
public AnsibleTowerStep(
@Nonnull String towerServer, String importTowerLogs, Boolean param2,
...) {
I tried having two @DataBoundConstructors, one for the old Boolean and one for
the String, but this caused an exception when compiling the plugin:
[ERROR] Failed to execute goal
org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile)
on project ansible-tower: Compilation failure
[ERROR] javax.annotation.processing.FilerException: Attempt to reopen a file
for path
/Users/jowestco/IdeaProjects/ansible-tower-plugin/target/classes/org/jenkinsci/plugins/ansible_tower/AnsibleTowerStep.stapler
[ERROR] at
com.sun.tools.javac.processing.JavacFiler.checkFileReopening(JavacFiler.java:535)
[ERROR] at
com.sun.tools.javac.processing.JavacFiler.createResource(JavacFiler.java:431)
[ERROR] at
org.kohsuke.stapler.jsr269.AbstractProcessorImpl.createResource(AbstractProcessorImpl.java:81)
After that I tried to have a constructor (not decorated with
@DataBoundConstructor) that would take a Boolean instead of a String and would
call my DataBoundConstructor like:
public AnsibleTowerStep(@Nonnull String towerServer, Boolean importTowerLogs,
Boolean param2, ...) { this(towerServer, importTowerLogs.toString(), param2…); }
But the pipelines were unable to find and use this constructor and threw the
same stack trace as above.
As another solution, I also tried to change the constructor to just an Object
like:
@DataBoundConstructor
public AnsibleTowerStep(@Nonnull String towerServer, Object importTowerLogs,
Boolean param2, ...) {
With this the groovy scripts worked and I was able to use
importTowerLogs.toString() to get a string for either a boolean or string
object. Unfortunately, with this solution, the pipeline syntax generator would
raise an exception that it couldn’t convert a string param into an object..
Does anyone have any other ideas on how I may be able to achieve what I am
trying to do seamlessly (change a boolean field to a string)? Or do I need to
tell my users that the new version of my plugin requires changing groovy
scripts from 'importTowerLogs = true’ to ‘importTowerLogs = ‘true”’?
If making users update groovy scripts is my only solution, what are the
recommend way(s) to warn users about this change? Obviously I will put it in
the release nodes and spike it out somewhere in my README.md file as well; but
is there anything else I can/should do? i.e. can I mark the new version of the
plugin as using an incomparable syntax with the old version?
Thanks in advance,
-John
--
You received this message because you are subscribed to the Google Groups
"Jenkins Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jenkinsci-dev/DDE53530-48EF-4910-A085-2A8F695BB525%40redhat.com.