I'm using nginx in a proxy setup. One public/ingress with a single upstream Jenkins instance. The attached docker-compose file can be used to recreate the exact environment. My test docker is running on Windows 10. The domain "ingress" was added hosts file as "127.0.0.1 ingress" for convenience.
Agent is connecting via JNPL with WebSocket option enabled. The following error message is reported:
C:\workdir\jenkins\http\agent-1>java -jar agent.jar -jnlpUrl http://ingress/jenkins/computer/agent-1/slave-agent.jnlp -secret 4068cc653d7d0ca16f72404ac6ad62d5fe19f5798f5b3f0807c6ecf50fba4353 -workDir "c:\workdir\jenkins\http\agent-1"Jul 08, 2020 8:33:25 PM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
INFO: Using c:\workdir\jenkins\http\agent-1\remoting as a remoting work directory
Jul 08, 2020 8:33:26 PM org.jenkinsci.remoting.engine.WorkDirManager setupLogging
INFO: Both error and output logs will be printed to c:\workdir\jenkins\http\agent-1\remoting
JNLP file http://ingress/jenkins/computer/agent-1/slave-agent.jnlp?encrypt=true has invalid arguments: [4068cc653d7d0ca16f72404ac6ad62d5fe19f5798f5b3f0807c6ecf50fba4353, agent-1, -webSocket, -workDir, c:\workdir\jenkins\http\agent-1, -internalDir, remoting, -url, http://ingress/jenkins/, -url, http://jenkins:8080/jenkins/, -headless, -workDir, c:\workdir\jenkins\http\agent-1, -internalDir, remoting]
Most likely a configuration error in the master
-webSocket supports only a single -url
There are 2 URLs in the parameter list which is rejected.
I cannot rule out the possibility of nginx configuration issue, but I followed all the guidelines.
I tested the change, it works. I also agree with not passing passing extra urls, only the configured one.
However without having to configure the wsagents URIs, Jenkins still thinks there is proxy issue aka "It appears that your reverse proxy set up is broken". But it's likely to be an nginx issue or something websocket proxy implementation specific. I'm not nginx expert either.
Balazs Varnai
added a comment - I tested the change, it works. I also agree with not passing passing extra urls, only the configured one.
However without having to configure the wsagents URIs, Jenkins still thinks there is proxy issue aka "It appears that your reverse proxy set up is broken". But it's likely to be an nginx issue or something websocket proxy implementation specific. I'm not nginx expert either.
Jenkins still thinks there is proxy issue aka "It appears that your reverse proxy set up is broken".
This is a good sign: it means the ReverseProxySetupMonitor is doing its job. It also helps confirm that the root problem was the nginx configuration, not anything about WebSocket per se.
FWIW I do deal with nginx reverse proxies to Jenkins all the time (in fact this was a key motivation for JEP-222), but only via the Kubernetes ingress controller, which normally does all the tricky work for you.
Jesse Glick
added a comment - Jenkins still thinks there is proxy issue aka "It appears that your reverse proxy set up is broken".
This is a good sign: it means the ReverseProxySetupMonitor is doing its job. It also helps confirm that the root problem was the nginx configuration, not anything about WebSocket per se.
FWIW I do deal with nginx reverse proxies to Jenkins all the time (in fact this was a key motivation for JEP-222), but only via the Kubernetes ingress controller, which normally does all the tricky work for you.
Marking as lts-candidate even though there is a workaround which is really a fix for underlying issues rather than a workaround, because I keep on hearing of people running into this and being confused (I suppose after dismissing or ignoring the warning about the broken reverse proxy).
Jesse Glick
added a comment - Marking as lts-candidate even though there is a workaround which is really a fix for underlying issues rather than a workaround, because I keep on hearing of people running into this and being confused (I suppose after dismissing or ignoring the warning about the broken reverse proxy).
We released it in Jenkins 2.248. https://github.com/jenkinsci/jenkins/pull/4839 basically removes the (unused?)feature from the Jenkins core, so I am not sure it can be easily backported. Up for a discussion in the case of 2.235.3 backporting
Oleg Nenashev
added a comment - - edited We released it in Jenkins 2.248. https://github.com/jenkinsci/jenkins/pull/4839 basically removes the (unused?)feature from the Jenkins core, so I am not sure it can be easily backported. Up for a discussion in the case of 2.235.3 backporting
The non-trivial-lts-backporting label is misleading: the patch merely removes a couple of lines, so it should certainly be trivial to backport. Whether it should be backported is of course up for discussion, as would be true for any patch.
I would not say that the deleted code was unused. If your reverse proxy configuration was wrong, or you were otherwise accessing Jenkins via a nonstandard URL for some reason, it would allow inbound TCP agents to connect using the nonstandard URL in case the standard URL were broken. The point is that this was a dubious decision when written, and became even less advisable after subsequent improvements in Jenkins to: guide you to define the root URL in the setup wizard; show an administrative monitor if you had not; and display an administrative monitor if it could be detected that the root URL was configured yet incorrect.
Jesse Glick
added a comment - The non-trivial-lts-backporting label is misleading: the patch merely removes a couple of lines, so it should certainly be trivial to backport. Whether it should be backported is of course up for discussion, as would be true for any patch.
I would not say that the deleted code was unused. If your reverse proxy configuration was wrong, or you were otherwise accessing Jenkins via a nonstandard URL for some reason, it would allow inbound TCP agents to connect using the nonstandard URL in case the standard URL were broken. The point is that this was a dubious decision when written, and became even less advisable after subsequent improvements in Jenkins to: guide you to define the root URL in the setup wizard; show an administrative monitor if you had not; and display an administrative monitor if it could be detected that the root URL was configured yet incorrect.
I think this fix introduced a regression in our setup and I'm not sure how to properly solve that.
Our Jenkins master is currently exposed via 2 URLs:
One is "public", where our users connect on and authenticate against an authentication proxy before reaching Jenkins itself.
The other one is "internal", where only a subset of URLs are authorized, for our dynamically created Jenkins agents to connect back on the master using JNLP.
In both cases, Jenkins is behind an nginx proxy is not reachable directly.
Up until 2.248, the agents were receiving the 2 URLs to connect back on the master:
Picked up _JAVA_OPTIONS: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main createEngine
INFO: Setting up agent: jenkins-ops-docs-bpxmmgsmkz
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener <init>
INFO: Jenkins agent is running in headless mode.
Jul 26, 2020 1:03:39 PM hudson.remoting.Engine startEngine
INFO: Using Remoting version: 4.3
Jul 26, 2020 1:03:39 PM hudson.remoting.Engine startEngine
WARNING: No Working Directory. Using the legacy JAR Cache location: /home/jenkins/.jenkins/cache/jars
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Locating server among [https://EXTERNAL/jenkins/, http://INTERNAL/jenkins/]
Jul 26, 2020 1:03:39 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver resolve
INFO: Remoting server accepts the following protocols: [JNLP4-connect, Ping]
Jul 26, 2020 1:03:39 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver isPortVisible
WARNING: Connection refused (Connection refused)
Jul 26, 2020 1:03:39 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver resolve
INFO: Remoting server accepts the following protocols: [JNLP4-connect, Ping]
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Agent discovery successful
Agent address: INTERNAL
Agent port: 36921
Identity: 58:e8:9a:bd:ce:d2:c3:7f:d4:33:e3:cc:35:7d:15:a4
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Handshaking
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connecting to INTERNAL:36921
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Trying protocol: JNLP4-connect
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Remote identity confirmed: 58:e8:9a:bd:ce:d2:c3:7f:d4:33:e3:cc:35:7d:15:a4
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connected
The first URL (EXTERNAL) fails with WARNING: Connection refused (Connection refused) but the agent can then fallback on the second URL, which works.
I believe the first one (EXTERNAL) doesn't work because the domain name resolve on an IP address where the firewall doesn't open random port. The INTERNAL domain is a different address which doesn't have the same settings.
After upgrading to 2.248, only the first address (EXTERNAL) is sent to the agent, and the connection always fails and there's no fallback anymore.
I'd be happy to update our configuration for the new behavior introduced with this change, but I'm not sure how I should proceed:
AFAIK, the "root URL" which is sent to the agent is the "Jenkins URL" has configured in the main configuration panel. I think it's also used for other purpose, such as building URLs which are sent externally (such a build results on GitHub for example?), so we don't really want to change this one and we would like to keep the "official" URL used by our users to be EXTERNAL.
BUT, we would like our agents (only) to connect using this INTERNAL URL, but then I'm not sure how (if?) to configure that.
In any case, I'm not sure this should be backported as it in a LTS version, as it may break some setups.
Jonathan Ballet
added a comment - I think this fix introduced a regression in our setup and I'm not sure how to properly solve that.
Our Jenkins master is currently exposed via 2 URLs:
One is "public", where our users connect on and authenticate against an authentication proxy before reaching Jenkins itself.
The other one is "internal", where only a subset of URLs are authorized, for our dynamically created Jenkins agents to connect back on the master using JNLP.
In both cases, Jenkins is behind an nginx proxy is not reachable directly.
Up until 2.248, the agents were receiving the 2 URLs to connect back on the master:
Picked up _JAVA_OPTIONS: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main createEngine
INFO: Setting up agent: jenkins-ops-docs-bpxmmgsmkz
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener <init>
INFO: Jenkins agent is running in headless mode.
Jul 26, 2020 1:03:39 PM hudson.remoting.Engine startEngine
INFO: Using Remoting version: 4.3
Jul 26, 2020 1:03:39 PM hudson.remoting.Engine startEngine
WARNING: No Working Directory. Using the legacy JAR Cache location: /home/jenkins/.jenkins/cache/jars
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Locating server among [https: //EXTERNAL/jenkins/, http://INTERNAL/jenkins/]
Jul 26, 2020 1:03:39 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver resolve
INFO: Remoting server accepts the following protocols: [JNLP4-connect, Ping]
Jul 26, 2020 1:03:39 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver isPortVisible
WARNING: Connection refused (Connection refused)
Jul 26, 2020 1:03:39 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver resolve
INFO: Remoting server accepts the following protocols: [JNLP4-connect, Ping]
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Agent discovery successful
Agent address: INTERNAL
Agent port: 36921
Identity: 58:e8:9a:bd:ce:d2:c3:7f:d4:33:e3:cc:35:7d:15:a4
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Handshaking
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connecting to INTERNAL:36921
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Trying protocol: JNLP4-connect
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Remote identity confirmed: 58:e8:9a:bd:ce:d2:c3:7f:d4:33:e3:cc:35:7d:15:a4
Jul 26, 2020 1:03:39 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connected
The first URL ( EXTERNAL ) fails with WARNING: Connection refused (Connection refused) but the agent can then fallback on the second URL, which works.
I believe the first one ( EXTERNAL ) doesn't work because the domain name resolve on an IP address where the firewall doesn't open random port. The INTERNAL domain is a different address which doesn't have the same settings.
After upgrading to 2.248, only the first address ( EXTERNAL ) is sent to the agent, and the connection always fails and there's no fallback anymore.
I'd be happy to update our configuration for the new behavior introduced with this change, but I'm not sure how I should proceed:
AFAIK, the "root URL" which is sent to the agent is the "Jenkins URL" has configured in the main configuration panel. I think it's also used for other purpose, such as building URLs which are sent externally (such a build results on GitHub for example?), so we don't really want to change this one and we would like to keep the "official" URL used by our users to be EXTERNAL .
BUT, we would like our agents (only) to connect using this INTERNAL URL, but then I'm not sure how (if?) to configure that.
In any case, I'm not sure this should be backported as it in a LTS version, as it may break some setups.
Having multiple urls is one of the things needed for HA scenario, even if master is a singleton. Once first failure the second could be run on the same JENKINS_HOME (hello CBE features?) and slaves should have ability to re-connect to master directly (no need to proxy via nginx etc internal isolated infrastructure). In general unability to control what urls as sent is a problem, but once "first external" is usually filtered on firewall with fast tcp reject it's wasn't a problem.
Kanstantsin Shautsou
added a comment - - edited Having multiple urls is one of the things needed for HA scenario, even if master is a singleton. Once first failure the second could be run on the same JENKINS_HOME (hello CBE features?) and slaves should have ability to re-connect to master directly (no need to proxy via nginx etc internal isolated infrastructure). In general unability to control what urls as sent is a problem, but once "first external" is usually filtered on firewall with fast tcp reject it's wasn't a problem.
Kubernetes handles failover automatically (and CloudBees CI uses that ability), but there is no need for multiple URLs—the Service routes requests to the active pod. You can set up the same manually. You can use an alternate cluster-internal URL to bypass ingress, but this does not mean multiple -url arguments, just a different one, as described in JENKINS-63222 w.r.t. the kubernetes plugin.
Again, if your architecture specifically requires multiple URLs with dynamic fallback, you can still do that with TCP agents, using the lower-level and more explicit launch mode. This change (JENKINS-63014) merely removes a heuristic from the higher-level *.jnlp launch mode. Many Jenkins web features will not work correctly if you actually access them via nonstandard URLs, but TCP agents are a special case in that the HTTP request is used solely to grab a host name and port from response headers.
Jesse Glick
added a comment - Kubernetes handles failover automatically (and CloudBees CI uses that ability), but there is no need for multiple URLs—the Service routes requests to the active pod. You can set up the same manually. You can use an alternate cluster-internal URL to bypass ingress, but this does not mean multiple -url arguments, just a different one, as described in JENKINS-63222 w.r.t. the kubernetes plugin.
Again, if your architecture specifically requires multiple URLs with dynamic fallback, you can still do that with TCP agents, using the lower-level and more explicit launch mode. This change ( JENKINS-63014 ) merely removes a heuristic from the higher-level *.jnlp launch mode. Many Jenkins web features will not work correctly if you actually access them via nonstandard URLs, but TCP agents are a special case in that the HTTP request is used solely to grab a host name and port from response headers.
Jesse Glick
Balazs Varnai
Votes:
0Vote for this issue
Watchers:
5Start watching this issue
Created:
Updated:
Resolved:
{"searchers":{"groups":[{"searchers":[{"name":"Project","id":"project","key":"issue.field.project","isShown":true,"lastViewed":1740219386089},{"name":"Summary","id":"summary","key":"issue.field.summary","isShown":true},{"name":"Type","id":"issuetype","key":"issue.field.issuetype","isShown":true,"lastViewed":1740219386090},{"name":"Status","id":"status","key":"issue.field.status","isShown":true,"lastViewed":1740219386101},{"name":"Priority","id":"priority","key":"issue.field.priority","isShown":true},{"name":"Resolution","id":"resolution","key":"issue.field.resolution","isShown":true},{"name":"Creator","id":"creator","key":"issue.field.creator","isShown":true},{"name":"Component","id":"component","key":"issue.field.components","isShown":true},{"name":"% Limits","id":"workratio","key":"issue.field.workratio","isShown":true},{"name":"Link types","id":"issue_link_type","key":"issue.field.issuelinks","isShown":true},{"name":"Environment","id":"environment","key":"issue.field.environment","isShown":true},{"name":"Description","id":"description","key":"issue.field.description","isShown":true},{"name":"Comment","id":"comment","key":"issue.field.comment","isShown":true},{"name":"Label","id":"labels","key":"issue.field.labels","isShown":true,"lastViewed":1740219386107},{"name":"Query","id":"text","key":"text","isShown":true},{"name":"Bonfire Browser","id":"customfield_10229","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"Bonfire Operating System","id":"customfield_10231","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"Bonfire Screen Resolution","id":"customfield_10244","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"Bonfire URL","id":"customfield_10237","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"Bonfire User Agent","id":"customfield_10226","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"Bonfire jQuery Version","id":"customfield_10252","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"Business Value","id":"customfield_10333","key":"com.atlassian.jira.plugin.system.customfieldtypes:float","isShown":false},{"name":"Development","id":"customfield_10720","key":"com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary","isShown":true},{"name":"Epic Color","id":"customfield_10328","key":"com.pyxis.greenhopper.jira:gh-epic-color","isShown":false},{"name":"Epic Link","id":"customfield_10325","key":"com.pyxis.greenhopper.jira:gh-epic-link","isShown":true},{"name":"Epic Name","id":"customfield_10327","key":"com.pyxis.greenhopper.jira:gh-epic-label","isShown":true},{"name":"Epic Status","id":"customfield_10326","key":"com.pyxis.greenhopper.jira:gh-epic-status","isShown":false},{"name":"Epic/Theme","id":"customfield_10331","key":"com.atlassian.jira.plugin.system.customfieldtypes:labels","isShown":true},{"name":"Flagged","id":"customfield_10330","key":"com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes","isShown":true},{"name":"GitHub Users to Authorize as Committers","id":"customfield_10323","key":"com.atlassian.jira.plugin.system.customfieldtypes:textarea","isShown":true},{"name":"Issue Tracker","id":"customfield_11320","key":"com.atlassian.jira.plugin.system.customfieldtypes:select","isShown":true},{"name":"JIRA Capture Browser","id":"customfield_10228","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Browser","id":"customfield_10230","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Document Mode","id":"customfield_10258","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Operating System","id":"customfield_10232","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Operating System","id":"customfield_10233","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Operating System","id":"customfield_10234","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Operating System","id":"customfield_10236","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Operating System","id":"customfield_10238","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Operating System","id":"customfield_10239","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Screen Resolution","id":"customfield_10245","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Screen Resolution","id":"customfield_10246","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Screen Resolution","id":"customfield_10247","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Screen Resolution","id":"customfield_10248","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Screen Resolution","id":"customfield_10249","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture Screen Resolution","id":"customfield_10250","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture URL","id":"customfield_10240","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture URL","id":"customfield_10241","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture URL","id":"customfield_10242","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture URL","id":"customfield_10243","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture User Agent","id":"customfield_10225","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture User Agent","id":"customfield_10227","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture jQuery Version","id":"customfield_10251","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture jQuery Version","id":"customfield_10253","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture jQuery Version","id":"customfield_10254","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture jQuery Version","id":"customfield_10255","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture jQuery Version","id":"customfield_10256","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"JIRA Capture jQuery Version","id":"customfield_10257","key":"com.atlassian.bonfire.plugin:bonfire-text","isShown":true},{"name":"Meeting minutes URL","id":"customfield_10020","key":"com.atlassian.jira.plugin.system.customfieldtypes:url","isShown":false},{"name":"New Repository Name","id":"customfield_10321","key":"com.atlassian.jira.plugin.system.customfieldtypes:textfield","isShown":true},{"name":"Original story points","id":"customfield_11423","key":"com.atlassian.jpo:jpo-custom-field-original-story-points","isShown":true},{"name":"Parent Link","id":"customfield_11420","key":"com.atlassian.jpo:jpo-custom-field-parent","isShown":false},{"name":"Plugin Description","id":"customfield_10322","key":"com.atlassian.jira.plugin.system.customfieldtypes:textarea","isShown":true},{"name":"Raised During","id":"customfield_10220","key":"com.atlassian.bonfire.plugin:bonfire-session-cft","isShown":false},{"name":"Raised During","id":"customfield_10221","key":"com.atlassian.bonfire.plugin:bonfire-session-cft","isShown":false},{"name":"Rank","id":"customfield_10324","key":"com.pyxis.greenhopper.jira:gh-lexo-rank","isShown":true},{"name":"Released As","id":"customfield_10620","key":"com.atlassian.jira.plugin.system.customfieldtypes:textfield","isShown":true},{"name":"Repository URL","id":"customfield_10320","key":"com.atlassian.jira.plugin.system.customfieldtypes:url","isShown":true},{"name":"Similar Issues","id":"customfield_10520","key":"com.suggestimate:similar-issues-custom-field","isShown":true},{"name":"Sprint","id":"customfield_10329","key":"com.pyxis.greenhopper.jira:gh-sprint","isShown":true},{"name":"Story Points","id":"customfield_10332","key":"com.atlassian.jira.plugin.system.customfieldtypes:float","isShown":false},{"name":"Team","id":"customfield_11424","key":"com.atlassian.teams:rm-teams-custom-field-team","isShown":true},{"name":"Test Sessions","id":"customfield_10222","key":"com.atlassian.bonfire.plugin:bonfire-multi-session-cft","isShown":false},{"name":"Test Sessions","id":"customfield_10223","key":"com.atlassian.bonfire.plugin:bonfire-multi-session-cft","isShown":false},{"name":"Test Sessions","id":"customfield_10224","key":"com.atlassian.bonfire.plugin:bonfire-multi-session-cft","isShown":false},{"name":"Testing Status","id":"customfield_10259","key":"com.atlassian.bonfire.plugin:bonfire-testing-status-cft","isShown":false},{"name":"URL","id":"customfield_10000","key":"com.atlassian.jira.plugin.system.customfieldtypes:url","isShown":true}],"type":"DETAILS","title":"Details"},{"searchers":[{"name":"Created Date","id":"created","key":"issue.field.created","isShown":true},{"name":"Updated Date","id":"updated","key":"issue.field.updated","isShown":true},{"name":"Resolution Date","id":"resolutiondate","key":"issue.field.resolution.date","isShown":true},{"name":"Target end","id":"customfield_11422","key":"com.atlassian.jpo:jpo-custom-field-baseline-end","isShown":true},{"name":"Target start","id":"customfield_11421","key":"com.atlassian.jpo:jpo-custom-field-baseline-start","isShown":true}],"type":"DATES","title":"Dates"},{"searchers":[{"name":"Assignee","id":"assignee","key":"issue.field.assignee","isShown":true,"lastViewed":1740219386102},{"name":"Reporter","id":"reporter","key":"issue.field.reporter","isShown":true}],"type":"PEOPLE","title":"People"}]},"values":{"issuetype":{"name":"Type","editHtml":"\n\n\n\n <div class=\"field-group aui-field-issuetype\" >\n <label for=\"searcher-type\">Type</label> <select class=\"select js-default-checkboxmultiselect\"\n id=\"searcher-type\"\n multiple=\"multiple\"\n name=\"type\"\n data-max-inline-results-displayed=\"100\"\n data-placeholder-text=\"Find Issue Types...\">\n <optgroup>\n \n <option class=\" \"\n id=\"type_-2\"\n title=\"All Standard Issue Types\"\n value=\"-2\">All Standard Issue Types</option>\n </optgroup>\n\n <optgroup label=\"Standard Issue Types\">\n \n <option class=\" imagebacked 10730 \"\n data-icon=\"/secure/viewavatar?size=xsmall&avatarId=14673&avatarType=issuetype\"\n data-fallback-icon=\"/images/icons/issuetypes/blank.png\"\n id=\"type_1\"\n title=\"Bug\"\n value=\"1\">Bug</option>\n \n <option class=\" imagebacked 10730 \"\n data-icon=\"/images/icons/issuetypes/epic.png\"\n data-fallback-icon=\"/images/icons/issuetypes/blank.png\"\n id=\"type_10001\"\n title=\"Epic\"\n value=\"10001\">Epic</option>\n \n <option class=\" imagebacked 10730 \"\n data-icon=\"/secure/viewavatar?size=xsmall&avatarId=14680&avatarType=issuetype\"\n data-fallback-icon=\"/images/icons/issuetypes/blank.png\"\n id=\"type_4\"\n title=\"Improvement\"\n value=\"4\">Improvement</option>\n \n <option class=\" imagebacked 10730 \"\n data-icon=\"/secure/viewavatar?size=xsmall&avatarId=14681&avatarType=issuetype\"\n data-fallback-icon=\"/images/icons/issuetypes/blank.png\"\n id=\"type_2\"\n title=\"New Feature\"\n value=\"2\">New Feature</option>\n \n <option class=\" imagebacked 10730 \"\n data-icon=\"/secure/viewavatar?size=xsmall&avatarId=14670&avatarType=issuetype\"\n data-fallback-icon=\"/images/icons/issuetypes/blank.png\"\n id=\"type_5\"\n title=\"Patch\"\n value=\"5\">Patch</option>\n \n <option class=\" imagebacked 10730 \"\n data-icon=\"/secure/viewavatar?size=xsmall&avatarId=14685&avatarType=issuetype\"\n data-fallback-icon=\"/images/icons/issuetypes/blank.png\"\n id=\"type_10002\"\n title=\"Story\"\n value=\"10002\">Story</option>\n \n <option class=\" imagebacked 10730 \"\n data-icon=\"/secure/viewavatar?size=xsmall&avatarId=14688&avatarType=issuetype\"\n data-fallback-icon=\"/images/icons/issuetypes/blank.png\"\n id=\"type_3\"\n title=\"Task\"\n value=\"3\">Task</option>\n </optgroup>\n\n <optgroup label=\"Sub-Task Issue Types\">\n </optgroup>\n </select>\n </div>\n ","validSearcher":true,"isShown":true},"project":{"name":"Project","editHtml":" \n <div class=\"field-group aui-field-project\" >\n <label for=\"searcher-pid\">Project</label> <select class=\"js-project-checkboxmultiselect\"\n data-placeholder-text=\"Find Projects...\"\n id=\"searcher-pid\"\n multiple=\"multiple\"\n name=\"pid\">\n <optgroup label=\"Recent Projects\">\n </optgroup>\n <optgroup label=\"All Projects\" >\n \n <option data-icon=\"/secure/projectavatar?pid=10172&size=small\"\n title=\"Jenkins\"\n value=\"10172\">\n Jenkins (JENKINS)\n </option>\n <option data-icon=\"/secure/projectavatar?pid=10050&size=small\"\n title=\"test\"\n value=\"10050\">\n test (TEST)\n </option>\n </optgroup>\n </select>\n </div>\n \n\n","validSearcher":true,"isShown":true},"assignee":{"name":"Assignee","editHtml":"\n \n <div class=\"field-group aui-field-userlist\" >\n <label for=\"searcher-assigneeSelect\">Assignee</label> <fieldset rel=\"assignee\" class=\"hidden user-group-searcher-params\">\n </fieldset>\n <select class=\"js-usergroup-checkboxmultiselect\" multiple=\"multiple\" id=\"assignee\" name=\"assignee\" data-placeholder-text=\"Enter username or group\">\n <optgroup>\n <option class=\"headerOption\" data-icon=\"https://issues.jenkins.io/secure/useravatar?size=xsmall&avatarId=10293\" value=\"empty\" title=\"Unassigned\">Unassigned</option>\n </optgroup>\n <optgroup>\n </optgroup>\n </select>\n <input type=\"hidden\" name=\"check_prev_assignee\" value=\"true\">\n </div>\n \n","validSearcher":true,"isShown":true},"status":{"name":"Status","editHtml":"\n <div class=\"field-group aui-field-constants\" >\n <label for=\"searcher-status\">Status</label> <select class=\"select js-default-checkboxmultiselectstatuslozenge\"\n data-placeholder-text=\"Find Statuses...\"\n id=\"searcher-status\"\n multiple=\"multiple\"\n name=\"status\"\n data-max-inline-results-displayed=\"100\"\n data-footer-text=\"-88 more options. Continue typing to refine further.\" data-status-lozenge=\"true\">\n <optgroup >\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/needinfo.png\" value=\"10001\" title=\"Untriaged\" data-simple-status=\"{"id":"10001","name":"Untriaged","description":"New issue sits in this state until a developer agrees that this is a security issue","iconUrl":"/images/icons/statuses/needinfo.png","statusCategory":{"id":2,"key":"new","colorName":"default"}}\">Untriaged</option>\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/open.png\" value=\"1\" title=\"Open\" data-simple-status=\"{"id":"1","name":"Open","description":"The issue is open and ready for the assignee to start work on it.","iconUrl":"/images/icons/statuses/open.png","statusCategory":{"id":2,"key":"new","colorName":"default"}}\">Open</option>\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/inprogress.png\" value=\"3\" title=\"In Progress\" data-simple-status=\"{"id":"3","name":"In Progress","description":"This issue is being actively worked on at the moment by the assignee.","iconUrl":"/images/icons/statuses/inprogress.png","statusCategory":{"id":4,"key":"indeterminate","colorName":"inprogress"}}\">In Progress</option>\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/reopened.png\" value=\"4\" title=\"Reopened\" data-simple-status=\"{"id":"4","name":"Reopened","description":"This issue was once resolved, but the resolution was deemed incorrect. From here issues are either marked assigned or resolved.","iconUrl":"/images/icons/statuses/reopened.png","statusCategory":{"id":4,"key":"indeterminate","colorName":"inprogress"}}\">Reopened</option>\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/information.png\" value=\"10005\" title=\"In Review\" data-simple-status=\"{"id":"10005","name":"In Review","description":"","iconUrl":"/images/icons/statuses/information.png","statusCategory":{"id":4,"key":"indeterminate","colorName":"inprogress"}}\">In Review</option>\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/resolved.png\" value=\"10002\" title=\"Fix Prepared\" data-simple-status=\"{"id":"10002","name":"Fix Prepared","description":"A fix is implemented and is waiting for the next security release","iconUrl":"/images/icons/statuses/resolved.png","statusCategory":{"id":4,"key":"indeterminate","colorName":"inprogress"}}\">Fix Prepared</option>\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/generic.png\" value=\"10000\" title=\"Verified\" data-simple-status=\"{"id":"10000","name":"Verified","description":"Verified","iconUrl":"/images/icons/statuses/generic.png","statusCategory":{"id":4,"key":"indeterminate","colorName":"inprogress"}}\">Verified</option>\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/generic.png\" value=\"10203\" title=\"Fixed but Unreleased\" data-simple-status=\"{"id":"10203","name":"Fixed but Unreleased","description":"This change has been implemented and merged, but not yet released.","iconUrl":"/images/icons/statuses/generic.png","statusCategory":{"id":3,"key":"done","colorName":"success"}}\">Fixed but Unreleased</option>\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/resolved.png\" value=\"5\" title=\"Resolved\" data-simple-status=\"{"id":"5","name":"Resolved","description":"A developer had implemented a fix and is waiting for a feedback from the reporter.","iconUrl":"/images/icons/statuses/resolved.png","statusCategory":{"id":3,"key":"done","colorName":"success"}}\">Resolved</option>\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/closed.png\" value=\"6\" title=\"Closed\" data-simple-status=\"{"id":"6","name":"Closed","description":"The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.","iconUrl":"/images/icons/statuses/closed.png","statusCategory":{"id":3,"key":"done","colorName":"success"}}\">Closed</option>\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/open.png\" value=\"10003\" title=\"To Do\" data-simple-status=\"{"id":"10003","name":"To Do","description":"","iconUrl":"/images/icons/statuses/open.png","statusCategory":{"id":2,"key":"new","colorName":"default"}}\">To Do</option>\n <option class=\"imagebacked\" data-icon=\"/images/icons/statuses/closed.png\" value=\"10004\" title=\"Done\" data-simple-status=\"{"id":"10004","name":"Done","description":"","iconUrl":"/images/icons/statuses/closed.png","statusCategory":{"id":3,"key":"done","colorName":"success"}}\">Done</option>\n </optgroup>\n</select>\n </div>\n \n","validSearcher":true,"isShown":true},"labels":{"name":"Label","viewHtml":" <div class=\"searcherValue\">\n \n <label class=\"fieldLabel\" for=\"fieldlabels\">Label:</label><span id=\"fieldlabels\" class=\"fieldValue\">\n \n 2.235.4-fixed\n</span></div>\n","editHtml":"\n <div class=\"field-group aui-field-labels\" >\n <label for=\"searcher-labels\">Labels</label> <select class=\"js-label-checkboxmultiselect\" multiple=\"multiple\" id=\"searcher-labels\" name=\"labels\" data-placeholder-text=\"Find Labels...\">\n <option value=\"2.235.4-fixed\" title=\"2.235.4-fixed\" selected=\"selected\">2.235.4-fixed</option>\n </select>\n </div>\n \n","jql":"labels = 2.235.4-fixed","validSearcher":true,"isShown":true}}}
[{"id":-1,"name":"My open issues","jql":"assignee = currentUser() AND resolution = Unresolved order by updated DESC","isSystem":true,"sharePermissions":[],"requiresLogin":true},{"id":-2,"name":"Reported by me","jql":"reporter = currentUser() order by created DESC","isSystem":true,"sharePermissions":[],"requiresLogin":true},{"id":-4,"name":"All issues","jql":"order by created DESC","isSystem":true,"sharePermissions":[],"requiresLogin":false},{"id":-5,"name":"Open issues","jql":"resolution = Unresolved order by priority DESC,updated DESC","isSystem":true,"sharePermissions":[],"requiresLogin":false},{"id":-9,"name":"Done issues","jql":"statusCategory = Done order by updated DESC","isSystem":true,"sharePermissions":[],"requiresLogin":false},{"id":-3,"name":"Viewed recently","jql":"issuekey in issueHistory() order by lastViewed DESC","isSystem":true,"sharePermissions":[],"requiresLogin":false},{"id":-6,"name":"Created recently","jql":"created >= -1w order by created DESC","isSystem":true,"sharePermissions":[],"requiresLogin":false},{"id":-7,"name":"Resolved recently","jql":"resolutiondate >= -1w order by updated DESC","isSystem":true,"sharePermissions":[],"requiresLogin":false},{"id":-8,"name":"Updated recently","jql":"updated >= -1w order by updated DESC","isSystem":true,"sharePermissions":[],"requiresLogin":false}]
However without having to configure the wsagents URIs, Jenkins still thinks there is proxy issue aka "It appears that your reverse proxy set up is broken". But it's likely to be an nginx issue or something websocket proxy implementation specific. I'm not nginx expert either.