Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[JENKINS-46124] - support map with EnvStep #105

Open
wants to merge 9 commits into
base: master
Choose a base branch
from

Conversation

jetersen
Copy link
Member

@jetersen jetersen requested review from jglick and dwnusbaum January 27, 2020 20:29
Copy link

@MindaugasLaganeckas MindaugasLaganeckas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A nice feature and a nice set of tests! :)

@Override
public Map<String, Object> customInstantiate(@NonNull Map<String, Object> arguments) {
Map<String, Object> r = new HashMap<>(arguments);
Object overrides = r.get("overrides");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DRY for "overrides" :)

Copy link
Member

@jglick jglick left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you want to implement customUninstantiate to guide users of Pipeline Syntax to use the new form, or leave them with the List<String> syntax?

@@ -150,11 +153,37 @@
}
}
return b.toString();
} else if (overrides instanceof Map) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BTW I lobbied for ArgumentsAction[Impl] to persist only the internal, resolved form of arguments, but the design we went with persists the surface form, necessitating extra work like this.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jglick Okay, is there some action to be taken about that now?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not easily. Just noting some background.

@jetersen
Copy link
Member Author

jetersen commented Feb 3, 2020

please take another look @jglick I think I listen to your feedback, I honestly don't know what I was thinking about when I wrote that stream collector 🤯

@jglick jglick self-requested a review February 5, 2020 02:01
.collect(Collectors.toMap(e -> (String)e.getKey(), e -> e.getValue() == null ? "" : e.getValue().toString()))
.entrySet().stream()
.map(m -> m.getKey() + "=" + m.getValue())
.map(m -> m.getKey() + "=" + (m.getValue() == null ? "" : m.getValue().toString()))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
.map(m -> m.getKey() + "=" + (m.getValue() == null ? "" : m.getValue().toString()))
.map(m -> (String) m.getKey() + "=" + (m.getValue() == null ? "" : m.getValue().toString()))

since non-String keys would be bogus

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IDE consider this a redundant cast and wants to remove it.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then your IDE is wrong and you should ignore it. You should be able to have a test demonstrating a failure from some bogus thing like

withEnv([new Object(): 'x']) {}

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This case is not supported:

WorkflowScript: 2: illegal colon after argument expression;
  solution: a complex label expression before a colon must be parenthesized @ line 2, column 72.
  D: true, E: null, new Object(): 'x']) {

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe

withEnv([(new Object()): 'x']) {}

then, whatever the syntax is. At worst

def m = [:]
m.put(new Object(), 'x')
withEnv(m) {}

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd argue your asking for trouble

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK forget new Object(), just some arbitrary object key which is not a String. new URL('http://nowhere.net/') for example is whitelisted.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Than you get into java.lang.ClassCastException: java.net.URL cannot be cast to java.lang.String 🤔

Properly better to call toString instead of trying to cast the object

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then you get into java.lang.ClassCastException

Exactly what I was requesting with 8d385a2.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image

@jetersen
Copy link
Member Author

@bitwiseman @jglick 🙏 Would be a great addition to get merged.

Copy link
Member

@dwnusbaum dwnusbaum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR! The implementation looks good to me (thanks for adding tests!). I am a little hesitant to add complexity since we will have to support both syntaxes going forward, but I think the trade-off is worth it in this case.

Can you please update EnvStep/help-overrides.html (and maybe also EnvStep/help.html) to mention the new syntax and give an example? Once that is done I am happy to merge the PR.

@jetersen
Copy link
Member Author

jetersen commented Mar 2, 2020

I'll see what I can do :)
However somewhat busy in this week. Starting at a new workplace 😁

@mss
Copy link

mss commented Sep 3, 2024

@dwnusbaum I was looking for this exact feature for years and finally found this PR but it got stalled. I'd be happy to provide the requested documentation but since this code does not apply in the meantime I wondered who would have to adapt it to the changed codebase?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants