Skip to content

Feat/add https support - #1017

Open
panicking wants to merge 18 commits into
jenkinsci:masterfrom
panicking:feat/add-https-support
Open

Feat/add https support#1017
panicking wants to merge 18 commits into
jenkinsci:masterfrom
panicking:feat/add-https-support

Conversation

@panicking

@panicking panicking commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Pull Request: Gerrit Pipeline Steps, HTTPS Polling, and Webhook Support

Needs sonyxperiadev/gerrit-events#128

Overview

This pull request introduces significant feature enhancements to the Jenkins Gerrit Trigger plugin. It adds three new pipeline steps for deeper Gerrit integration (checks and reviews), implements an alternative HTTPS polling mechanism (reducing reliance on SSH), and introduces a new webhook endpoint for receiving Gerrit events directly over HTTP.

Key Features

1. HTTPS Polling and REST Integration

To remove the strict dependency on SSH for event polling and querying, HTTPS/REST alternatives have been fully integrated:

  • HTTPS Poller & Config: Added useHttpsPoller, interval settings, and max changes configuration to the server UI.
  • REST Handlers: Wired up GerritRestPoller and GerritRestQueryHandler to route queries and polling through the Gerrit REST API instead of SSH commands.
  • Project List Loading: Fetches the project list for auto-completion via GET /a/projects/?d when HTTPS polling is enabled.
  • Refactoring: Updated GerritServer to use the generalized GerritEventSource interface.

2. Webhook Support

  • Added a webhook endpoint at POST /gerrit-trigger/webhook?server={name} that accepts stream-events JSON payloads from Gerrit's webhook or events-log plugin.
  • Bypasses standard Jenkins crumbs via GerritWebhookCrumbExclusion since webhook callers cannot provide CSRF tokens.

3. UI and Quality-of-Life Improvements

  • GERRIT_GIT_URL Parameter: Injects a computed HTTPS git clone URL (format: {frontend_url}/a/{project}.git) for pipeline scripts and freestyle jobs.
  • Dynamic UI Toggling: Added client-side JavaScript to hide/show SSH configuration fields dynamically based on the "Use HTTPS Polling for Events" checkbox, eliminating page reloads.
  • Snapshot Warning: Added a cosmetic UI warning/documentation for instances where Gerrit servers run development/snapshot builds causing version discrepancies via REST.

4. Documentation and Tests

  • Expanded the README with comprehensive usage documentation for the new pipeline steps, webhook configuration, HTTPS polling setup, and GERRIT_GIT_URL.

Authors

Testing done

Deploy on real infrastructure, before this rebase. Tested almost all the interface except webhook and gerrit check post. Require the gerrit-events

Submitter checklist

  • Make sure you are opening from a topic/feature/bugfix branch (right side) and not your main branch!
  • Ensure that the pull request title represents the desired changelog entry
  • Please describe what you did
  • Link to relevant issues in GitHub or Jira
  • Link to relevant pull requests, esp. upstream and downstream changes
  • Ensure you have provided tests that demonstrate the feature works or the issue is fixed

@panicking

Copy link
Copy Markdown
Contributor Author

@rsandell is possible to have fast-forward merge for the patches. Allow to bisect faster any regression. This patch depends on last gerrit-events so will not compile

@rsandell

Copy link
Copy Markdown
Member

is possible to have fast-forward merge for the patches

I'm not sure what you mean by that?

@rsandell

Copy link
Copy Markdown
Member

This is quite a big PR, would it be possible to divide it up a bit in chunks that can be merged separatrely?

For example the new pipeline steps could be separate from the rest.

@rsandell

Copy link
Copy Markdown
Member

Without looking at your implementation yet, could it be possible to integrate with https://plugins.jenkins.io/checks-api/ for the checks? or maybe that would be a separate plugin all together?

@panicking

Copy link
Copy Markdown
Contributor Author

Without looking at your implementation yet, could it be possible to integrate with https://plugins.jenkins.io/checks-api/ for the checks? or maybe that would be a separate plugin all together?

Check api is already working, I have forked it. The problem was to support old check api here.
https://github.com/amarula/checks-jenkins

I'm closing the circle to have complete ecosystem

@panicking

Copy link
Copy Markdown
Contributor Author

is possible to have fast-forward merge for the patches

I'm not sure what you mean by that?

I mean preserve the history so we can bisect in the feature

@panicking
panicking force-pushed the feat/add-https-support branch from 97539e0 to 7f73e8c Compare June 28, 2026 19:52
@neonman63

Copy link
Copy Markdown

Will it support topic-based builds where a single build is triggered that includes multiple reviews?

@panicking

Copy link
Copy Markdown
Contributor Author

Will it support topic-based builds where a single build is triggered that includes multiple reviews?

You mean mulpitle commits. Unless topic is not part of the information I get yes. I can give a try to it

@jglick jglick mentioned this pull request Jul 6, 2026
6 tasks
@panicking
panicking force-pushed the feat/add-https-support branch from 7f73e8c to c98dd3a Compare July 12, 2026 20:24
@panicking panicking changed the title RFC: Feat/add https support Feat/add https support Jul 12, 2026
@panicking

Copy link
Copy Markdown
Contributor Author

@rsandell I need to check why it fails in jenkins CI

@panicking
panicking force-pushed the feat/add-https-support branch 2 times, most recently from 8a0e0c8 to a9fcf13 Compare July 13, 2026 06:14
public Object getTarget() {
Jenkins jenkins = Jenkins.get();
// Allow unauthenticated access to webhook endpoint
String requestURI = Stapler.getCurrentRequest().getRequestURI();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This should use Stapler.getCurrentRequest2

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

That file should not be here I think. Accidently included in the commit?

</div>
</f:section>
<script>
<![CDATA[

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Inline Javascript is a violation of stricter CSP rules that are available in since 2.541. This must be moved into a dedicated js file

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

</j:choose>
</f:entry>
<!-- SSH-only fields: hidden/shown client-side when HTTPS polling toggled -->
<div class="ssh-only-section" style="${it.config.useHttpsPoller ? 'display:none' : ''}">

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please use the class jenkins-hidden to hide something

Suggested change
<div class="ssh-only-section" style="${it.config.useHttpsPoller ? 'display:none' : ''}">
<div class="ssh-only-section ${it.config.useHttpsPoller ? 'jenkins-hidden' : ''}">

In javascript then just toggle the class to show/hide it

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

checked="${it.config.voteSameTopic}"
default="false"/>
</f:entry>
<div class="ssh-only-test-button" style="${it.config.useHttpsPoller ? 'display:none' : ''}">

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

dito

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done

@panicking
panicking force-pushed the feat/add-https-support branch from a9fcf13 to ed68685 Compare July 14, 2026 04:56
@panicking

Copy link
Copy Markdown
Contributor Author

@rsandell I will repush without webhook, they require more testing

@panicking
panicking requested a review from mawinter69 July 15, 2026 21:19
Comment thread docs/README.adoc Outdated
version warning (orange settings icon) under HTTPS polling that does not
appear under SSH. This is cosmetic and does not affect functionality.

=== Webhooks (New)

@rsandell rsandell Jul 16, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

If you aren't including it in this PR perhaps this should be removed too?

Comment thread docs/README.adoc Outdated
* SSH key configured for the Jenkins user in Gerrit
* `+Stream Events+` capability granted to the user

=== HTTPS Polling (New)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
=== HTTPS Polling (New)
=== HTTPS Polling

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done

Comment thread docs/README.adoc Outdated

The plugin supports three transport mechanisms for receiving Gerrit events.
Choose the one that best fits your network environment and Gerrit setup.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

There is technically a fourth option that has been in the plugin for a long time, I can't remeember the exact option, but it's "do not connect" it is to my knowlage only used together with the rabbitmq plugin somehow, where it adds tthe events to the queue.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

noConnectionOnStartup is the name of the variable controlling that "mode".

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done

Comment thread docs/README.adoc Outdated
Comment on lines +534 to +535
See also the link:#connection-transport-options[Connection Transport Options] for information
about the new HTTPS polling and webhook transports.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems redundant?

Suggested change
See also the link:#connection-transport-options[Connection Transport Options] for information
about the new HTTPS polling and webhook transports.

private boolean restVerified;
private boolean useHttpsPoller;
private int httpsPollInterval;
private int httpsPollMaxChanges;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This confifguration class has been bloating up for a long time and I've been meaning to re-structure it for a long time, especially around the various connection modes. And now with one and a half more it is in dire need of it.

Itt is a bit tricky though of how to actually structure it.

There are various ways the trigger can receive events: ssh, http polling, and "no connection" for rabbitmq and web-hooks I guess.

Then there are at least two ways that it can deliver responses back: ssh commands and http-rest.

So it would be natural to divide the config up like that, but the two divisions uses configuration from eachother so it's not an even split like that.

If that work should be done, it should be done before we add even more fields to this class that would need to be readResolved when the restucture is made.
So any ideas are welcome. :)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

These new values could be grouped into one object and the check for if httppoll should be used it if that object is not null.

} else if (!change.optString("number", "").isEmpty()) {
if (getServerConfig(serverName) != null) {
return getServerConfig(serverName).getGerritFrontEndUrlFor(
IGerritHudsonTriggerConfig config = getServerConfig(serverName);

@rsandell rsandell Jul 16, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this should be extracted into something like getServerConfigOrFirst(String serverName)

serverName = name;
}
}
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

getServerConfigOrFirst(String serverName) might be reusable here?

/*
* The MIT License
*
* Copyright 2024 Sony Mobile Communications Inc. All rights reserved.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Weird choice of year, also wrong attribution.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done

/*
* The MIT License
*
* Copyright 2024 Sony Mobile Communications Inc. All rights reserved.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

dito

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@rsandell I will repush tonight with all the fixes, and I need to test it again

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done

Jenkins jenkins = Jenkins.get();
// Allow unauthenticated access to webhook endpoint
String requestURI = Stapler.getCurrentRequest2().getRequestURI();
if (requestURI != null && requestURI.endsWith("/webhook")) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't know but you might be circumventing more than intended. For example a post to gerrit-trigger/webhook/configSubmit or a get gerrit-trigger/webhook/serverNames

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Perhaps it would be safer/easier to just have the webhook as a separate root action. For example jenkins/gerrit-trigger-webhook/.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@rsandell removed , I need more test

*/
public static String makeGerritGitUrl(String frontEndUrl, String project) {
StringBuilder url = new StringBuilder(frontEndUrl);
if (!frontEndUrl.endsWith("/")) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

hudson.Functions#joinPath does this for you.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Done

panicking and others added 6 commits July 24, 2026 22:55
Add a computed environment parameter GERRIT_GIT_URL that provides the
git-over-HTTPS clone URL for the Gerrit project being built.
Format: {frontend_url}/a/{project}.git

This enables users to configure their git SCM step in Jenkins pipelines
to use HTTPS instead of SSH:
  Repository URL:
  Branch Specifier:

Changes:
- Add GERRIT_GIT_URL enum to GerritTriggerParameters
- Add StringUtil.makeGerritGitUrl(frontEndUrl, project) utility
- Add getGitURL() helper method (models the existing getURL() pattern)
- Set the parameter value during ChangeBasedEvent parameter creation

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
Replace server-side <j:if> conditions with CSS classes and JavaScript
so that toggling 'Use HTTPS Polling for Events' immediately shows/hides
SSH-specific fields without requiring a page save and reload.

- Wrap SSH fields in <div class='ssh-only-section'> with initial state
  set via inline style based on the saved config value
- Wrap Test Connection button in <div class='ssh-only-test-button'>
- Add CDATA-wrapped JavaScript that listens on the useHttpsPoller
  checkbox change event and toggles display:none on both sections
- Fields that toggle: SSH Port, Proxy, Username, SSH Keyfile,
  SSH Keyfile Password, Test Connection button

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
The Gerrit REST API /a/config/server/version returns the full
git-describe version (e.g. '3.13.3-877-g4b89419c9d'), while the
SSH 'gerrit version' command returns only the base release tag
(e.g. '3.13.3'). If the Gerrit server runs a development/snapshot
build, the plugin may show a snapshot version warning (orange
settings icon) under HTTPS polling that does not appear under SSH.

Document this behavior in the help text so users know it's cosmetic
and does not affect functionality.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
… serverName guard

- GerritServer.setConfig(): set gerritQueryHnadler to null instead of
  eagerly creating it, so getQueryHandler() can lazily create a fresh
  handler with the correct type (GerritRestQueryHandler vs
  GerritQueryHandler) and fully-configured authentication.
- ManualTriggerAction.getGerritUrl(): add fallback to first enabled
  server when serverName is null or config not found, matching the
  established pattern in getFrontEndUrl().
- ManualTriggerActionTest: pass concrete server name to match the mock
  setup, since getServerConfig(null) now correctly returns null after
  the null guard added in dad9686.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
The new implementation requires GerritRestPoller, GerritRestQueryHandler, and
GerritEventSource which only exist in 2.23.0.

Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
Decompose the monolithic Config.java by extracting 12 vote value fields
into GerritVoteValues and 6 command template fields into
GerritCommandTemplates. Config becomes a facade that delegates to these
sub-objects while maintaining full XStream serialization backward
compatibility.

- GerritVoteValues: holds verified+code-review vote values for all 6
  build outcomes with defaults, JSON parsing, copy, and readResolve()
- GerritCommandTemplates: holds the 6 gerrit review command templates
  with defaults, JSON parsing, copy, and readResolve()
- Old flat fields marked transient in Config; readResolve() migrates
  them into the new sub-objects on deserialization
- IGerritHudsonTriggerConfig interface unchanged — all callers work
  without modification
- JCasC binding intact via delegation setters on Config

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
@panicking
panicking force-pushed the feat/add-https-support branch from ed68685 to 7fe43ae Compare July 24, 2026 22:10
@panicking

Copy link
Copy Markdown
Contributor Author

Also, it is deemed a security risk to have webhooks that triggers builds without some form of protection like an auth token.

See for example https://www.jenkins.io/security/advisory/2022-11-15/ and https://github.com/jenkinsci/dockerhub-notification-plugin/pull/35/changes

@rsandell yes I have added a token, to webhook, I will post after this series get merged. The problem is on gerrit itself that seems does not support HMAC.

@rsandell

Copy link
Copy Markdown
Member

@panicking please stop force pushing, it makes it very hard to see what I have already reviewed and I need to restart the review from the beginning every time you push fixes.

public Config(IGerritHudsonTriggerConfig config) {
gerritHostName = config.getGerritHostName();
gerritSshPort = config.getGerritSshPort();
gerritProxy = config.getGerritProxy();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

specific ssh related and http related config could maybe be grouped into classes as well?

@@ -896,7 +845,7 @@

@Override
public String getGerritCmdBuildSuccessful() {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
public String getGerritCmdBuildSuccessful() {
@Deprecated
public String getGerritCmdBuildSuccessful() {

with javadoc pointing to the replacement.

*
* @return the vote values sub-object, never null.
*/
private GerritVoteValues getVoteValuesInternal() {

@rsandell rsandell Jul 25, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
private GerritVoteValues getVoteValuesInternal() {
private synchronized GerritVoteValues getVoteValuesInternal() {

could also be

Suggested change
private GerritVoteValues getVoteValuesInternal() {
public synchronized GerritVoteValues getVoteValues() {

so that the old deprecated methods can point to something? But I guess that would require changes to the interface as well which is probably ok now that we can do default methods :)

*
* @return the command templates sub-object, never null.
*/
private GerritCommandTemplates getCommandTemplatesInternal() {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

needs to be synchronized and perhaps public as well?

// Migrate old flat vote-value fields into the sub-object
if (this.voteValues == null) {
this.voteValues = new GerritVoteValues();
if (this.gerritBuildStartedVerifiedValue != null) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

good catch! I guess this is to guard against first time configuration vs migration of old/changed values?

/*
* The MIT License
*
* Copyright 2026 Amarula Solutions. All rights reserved.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

most of the code in this class looks copied, so I think you need to keep the original attribution as well as adding your own.

These things are tricky :)

*
* @param formData the JSON object with form data.
*/
public void setValues(JSONObject formData) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

If the form is correctly structured this should not be needed any more and using @DataboundSetter and @DataboundContructor can be used instead of this antequated manual json stuff :).

*
* @return the resolved instance.
*/
Object readResolve() {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think this is needed, old versions didn't have this class at all so there is nothing to resolve from.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@rsandell we need to agree on the approach

@panicking

Copy link
Copy Markdown
Contributor Author

@panicking please stop force pushing, it makes it very hard to see what I have already reviewed and I need to restart the review from the beginning every time you push fixes.

Sorry, I'm working with gerrit and usually I don't like to create fix on top of pull request, so I usually rebase the changes and fix your comment on each commit where this code was added. What you suggest? I mean I can create fixes and the rebase and squash on commits. Is that ok?

@rsandell

Copy link
Copy Markdown
Member

Yea, I know, It also felt very weird for me comming from Gerrit's way of handling it to GitHub's PR model :)
Just add new commits on top of the existing without rebasing or squashing. If you need to get master into your branch do a merge instead. When we have finished the review we can squash it if you want.
But during PR review, the history of what changed since my last comment is lost if the commit is lost from the branch history. GitHub just isn't as good as Gerrit is on that part ;)

panicking and others added 7 commits August 2, 2026 09:35
GerritVoteValues is a new class introduced in this PR, so no old
serialized data exists for XStream to resolve. The backward
compatibility for aborted vote values is already handled in
Config.readResolve() before values are migrated into the sub-object.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
GerritVoteValues and GerritCommandTemplates were extracted from
Config.java. The original Config.java copyright (2010 Sony Mobile
Communications Inc.) must be retained alongside the new attribution
since most of the code was copied.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
…lues/getCommandTemplates

Make these accessors public synchronized so callers can use the
sub-objects directly instead of going through deprecated Config methods.
The old Internal() suffixes suggested private usage only.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
Add @deprecated to getGerritCmdBuildSuccessful(), getGerritCmdBuildUnstable(),
getGerritCmdBuildFailed(), getGerritCmdBuildStarted(), getGerritCmdBuildNotBuilt(),
and getGerritCmdBuildAborted(). Each includes javadoc pointing to the
replacement on GerritCommandTemplates accessed via getCommandTemplates().

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
Add @deprecated to all 6 setGerritCmdBuild* methods and update javadoc
on all 12 command setters (setGerritVerifiedCmdBuild* and setGerritCmdBuild*)
to point to GerritCommandTemplates.setCmdBuild*() replacements.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
Add getServerConfigOrFirst(serverName) to ManualTriggerAction to
eliminate duplicate fallback-to-first-server pattern used in both
getFrontEndUrl() and getGerritUrl().

Add getServerOrFirst_(name) to PluginImpl to eliminate the same
pattern in GerritTriggerParameters.getGitURL().

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
…jectsViaRest

Replaces StringBuilder-based URL construction with the standard
hudson.Functions.joinPath utility method.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
@panicking
panicking force-pushed the feat/add-https-support branch from ed55850 to 1e19e8a Compare August 2, 2026 08:13
@panicking

Copy link
Copy Markdown
Contributor Author

@rsandell Is ok this way? I need to retest again the plugin now, but working on incrementatl changes

@rsandell

rsandell commented Aug 8, 2026

Copy link
Copy Markdown
Member

yes it's ok to continue! Thanks!. And sorry again for the late reply.

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.

4 participants