From 2be434750d07a205f08bc6c23a1dcbc7e59d34e9 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Tue, 21 Jan 2025 10:10:24 +0100 Subject: [PATCH 01/56] Move existing web.xml to web-fragment.xml under core --- .../main/resources/META-INF/web-fragment.xml | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) rename war/src/main/webapp/WEB-INF/web.xml => core/src/main/resources/META-INF/web-fragment.xml (95%) diff --git a/war/src/main/webapp/WEB-INF/web.xml b/core/src/main/resources/META-INF/web-fragment.xml similarity index 95% rename from war/src/main/webapp/WEB-INF/web.xml rename to core/src/main/resources/META-INF/web-fragment.xml index 4ef6db9e3f..c9acb6e151 100644 --- a/war/src/main/webapp/WEB-INF/web.xml +++ b/core/src/main/resources/META-INF/web-fragment.xml @@ -23,13 +23,11 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> - - Jenkins v${project.version} - Build management system + + jenkins Stapler @@ -97,13 +95,13 @@ THE SOFTWARE. Cache-Control: no-cache for any files behind the security-constraint below. So if Hudson is on a public server, and you want to only allow authorized users to access it, you may want to pay attention to this. - + See: http://www.nabble.com/No-browser-caching-with-Hudson- -tf4601857.html - + change-headers-filter hudson.ResponseHeaderFilter - Cache-Control @@ -205,7 +203,7 @@ THE SOFTWARE. ** - + @@ -215,13 +213,13 @@ THE SOFTWARE. - + other /* - + @@ -278,4 +276,4 @@ THE SOFTWARE. - + From 0ce386f9269c99cb25d5bd4198a180f445bd3926 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Tue, 21 Jan 2025 10:10:51 +0100 Subject: [PATCH 02/56] Add the new web.xml --- war/src/main/webapp/WEB-INF/web.xml | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 war/src/main/webapp/WEB-INF/web.xml diff --git a/war/src/main/webapp/WEB-INF/web.xml b/war/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..5e86c73a22 --- /dev/null +++ b/war/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,32 @@ + + + + + Jenkins v${project.version} + Build management system + From dbb7435592542054f3da2ab147a12a2604d9e3f2 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Tue, 21 Jan 2025 10:17:23 +0100 Subject: [PATCH 03/56] Update JTH to a version supporting web fragments --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 50503ad6ca..675f1288dd 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -178,7 +178,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-test-harness - 2380.vc51ea_a_cf2711 + 2381.v52b_0b_d2e3763 test From ae34b386ceb2edd6527c90863910e5560bd85c84 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Tue, 21 Jan 2025 13:19:45 -0800 Subject: [PATCH 04/56] Remove `robust-http-client` --- bom/pom.xml | 5 ----- core/pom.xml | 4 ---- core/src/main/java/hudson/ProxyConfiguration.java | 5 ++--- 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index 6c6e5bed54..a93cfdca2e 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -297,11 +297,6 @@ THE SOFTWARE. localizer 1.31 - - org.jvnet.robust-http-client - robust-http-client - 1.2 - org.jvnet.winp winp diff --git a/core/pom.xml b/core/pom.xml index 5314c25f50..4104311504 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -333,10 +333,6 @@ THE SOFTWARE. org.jvnet.localizer localizer - - org.jvnet.robust-http-client - robust-http-client - org.jvnet.winp winp diff --git a/core/src/main/java/hudson/ProxyConfiguration.java b/core/src/main/java/hudson/ProxyConfiguration.java index cc5b30d956..885b68dec4 100644 --- a/core/src/main/java/hudson/ProxyConfiguration.java +++ b/core/src/main/java/hudson/ProxyConfiguration.java @@ -70,7 +70,6 @@ import jenkins.security.stapler.StaplerAccessibleType; import jenkins.util.JenkinsJVM; import jenkins.util.SystemProperties; import org.jenkinsci.Symbol; -import org.jvnet.robust_http_client.RetryableHttpStream; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.DataBoundConstructor; @@ -346,10 +345,10 @@ public final class ProxyConfiguration extends AbstractDescribableImpl Date: Wed, 22 Jan 2025 09:07:10 +0100 Subject: [PATCH 05/56] Pick up JTH release --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 675f1288dd..594caf1542 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -178,7 +178,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-test-harness - 2381.v52b_0b_d2e3763 + 2384.va_d3a_58a_4b_df5 test From aac1a1230fe0f6409871cf120c63f2cb8f7e54d6 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:14:13 +0000 Subject: [PATCH 06/56] Init --- src/main/js/widgets/add/addform.scss | 3 +- src/main/scss/abstracts/_mixins.scss | 25 ++- src/main/scss/abstracts/_theme.scss | 86 +++++++++-- src/main/scss/base/_style.scss | 17 +- src/main/scss/components/_alert.scss | 8 +- src/main/scss/components/_app-bar.scss | 2 +- src/main/scss/components/_breadcrumbs.scss | 3 +- src/main/scss/components/_buttons.scss | 145 ++++-------------- src/main/scss/components/_cards.scss | 16 +- .../scss/components/_command-palette.scss | 9 +- src/main/scss/components/_dropdowns.scss | 39 +++-- src/main/scss/components/_notice.scss | 1 + src/main/scss/components/_notifications.scss | 4 +- .../components/_row-selection-controller.scss | 12 +- src/main/scss/components/_section.scss | 5 +- .../scss/components/_side-panel-tasks.scss | 18 +-- src/main/scss/components/_spinner.scss | 3 +- src/main/scss/components/_table.scss | 60 +++----- src/main/scss/components/_tabs.scss | 63 ++++---- src/main/scss/components/_tooltips.scss | 6 +- src/main/scss/form/_checkbox.scss | 22 +-- src/main/scss/form/_codemirror.scss | 2 +- src/main/scss/form/_file-upload.scss | 8 +- src/main/scss/form/_input.scss | 22 ++- src/main/scss/form/_layout.scss | 52 +------ src/main/scss/form/_radio.scss | 9 +- src/main/scss/form/_search-bar.scss | 2 +- src/main/scss/form/_select.scss | 22 ++- src/main/scss/form/_textarea.scss | 3 +- src/main/scss/form/_toggle-switch.scss | 22 ++- src/main/scss/pages/_about.scss | 17 +- src/main/scss/pages/_dashboard.scss | 2 +- src/main/scss/pages/_job.scss | 2 +- 33 files changed, 346 insertions(+), 364 deletions(-) diff --git a/src/main/js/widgets/add/addform.scss b/src/main/js/widgets/add/addform.scss index 6270004b00..140657ec88 100644 --- a/src/main/js/widgets/add/addform.scss +++ b/src/main/js/widgets/add/addform.scss @@ -183,13 +183,12 @@ } li { - @include mixins.item; + @include mixins.item($border: false); -webkit-touch-callout: none; user-select: none; padding: 0.75rem 1rem; min-height: 68px; - cursor: pointer; display: grid; grid-template-columns: auto 1fr; gap: 0.25rem 1rem; diff --git a/src/main/scss/abstracts/_mixins.scss b/src/main/scss/abstracts/_mixins.scss index 7999284e1a..00e3ac00d7 100644 --- a/src/main/scss/abstracts/_mixins.scss +++ b/src/main/scss/abstracts/_mixins.scss @@ -56,11 +56,17 @@ } } -@mixin item { +@mixin item($border: true) { position: relative; + appearance: none; z-index: 0; text-decoration: none !important; - border-radius: 0.66rem; + font-weight: normal; + border-radius: var(--form-input-border-radius); + cursor: pointer; + background: transparent; + outline: none; + border: none; &::before, &::after { @@ -74,11 +80,12 @@ } &::before { - background-color: transparent; + background-color: var(--item-background); + border: var(--jenkins-border--subtle); } &::after { - box-shadow: 0 0 0 0.66rem transparent; + box-shadow: 0 0 0 0.5rem transparent; } &:focus-visible { @@ -102,7 +109,7 @@ } &::after { - box-shadow: 0 0 0 0.33rem var(--item-box-shadow--focus); + box-shadow: 0 0 0 0.25rem var(--item-box-shadow--focus); } } @@ -113,4 +120,12 @@ } } } + + @if $border == false { + &:not(:hover, &:active, &:focus) { + &::before { + border-color: transparent; + } + } + } } diff --git a/src/main/scss/abstracts/_theme.scss b/src/main/scss/abstracts/_theme.scss index 2aadb8c41b..cba11ac5c1 100644 --- a/src/main/scss/abstracts/_theme.scss +++ b/src/main/scss/abstracts/_theme.scss @@ -80,6 +80,13 @@ $semantics: ( from var(--text-color) 96.8% 0.005 h / 0.8 ); + // App bar + --bottom-app-bar-shadow: color-mix( + in sRGB, + var(--text-color-secondary) 7.5%, + transparent + ); + // Alert call outs --alert-success-text-color: var(--success-color); --alert-success-bg-color: color-mix( @@ -125,8 +132,41 @@ $semantics: ( // Typography --text-color-secondary: var(--secondary); + // Borders + --jenkins-border-width: 1.5px; + --jenkins-border-color: color-mix( + in sRGB, + var(--text-color-secondary) 12%, + var(--card-background) + ); + --jenkins-border-color--subtle: color-mix( + in sRGB, + currentColor 1.5%, + transparent + ); + + /* This is a harsher border - for dividers, content blocks and more */ + --jenkins-border: var(--jenkins-border-width) solid + var(--jenkins-border-color); + + /* This is a subtle border - for increasing contrast on elements, such as buttons, menu and more */ + --jenkins-border--subtle: var(--jenkins-border-width) solid + var(--jenkins-border-color--subtle); + --jenkins-border--subtle-shadow: 0 0 0 1.5px + var(--jenkins-border-color--subtle); + + @media (resolution <= 1x) { + --jenkins-border-width: 2px; + } + + @media (prefers-contrast: more) { + --focus-input-border: var(--text-color); + --jenkins-border-color: var(--text-color); + --jenkins-border-color--subtle: var(--text-color); + } + // Table - --table-background: oklch(from var(--text-color-secondary) l c h / 0.1); + --table-background: oklch(from var(--text-color-secondary) l c h / 0.075); --table-header-foreground: var(--text-color); --table-body-background: var(--background); --table-body-foreground: var(--text-color); @@ -158,7 +198,8 @@ $semantics: ( // Command Palette --command-palette-results-backdrop-filter: contrast(0.7) brightness(1.5) saturate(1.4) blur(20px); - --command-palette-inset-shadow: inset 0 0 2px 2px rgb(255 255 255 / 0.1); + --command-palette-inset-shadow: inset 0 0 2px 2px rgb(255 255 255 / 0.1), + var(--jenkins-border--subtle-shadow); ::backdrop { --command-palette-backdrop-background: radial-gradient( @@ -171,21 +212,23 @@ $semantics: ( // Tooltips --tooltip-backdrop-filter: saturate(2) blur(20px); --tooltip-color: var(--text-color); - --tooltip-box-shadow: 0 0 8px 2px rgb(0 0 30 / 0.05), - 0 0 1px 1px rgb(0 0 20 / 0.025), 0 10px 20px rgb(0 0 20 / 0.15); + --tooltip-box-shadow: 0 0 8px 2px rgb(0 0 50 / 0.05), + var(--jenkins-border--subtle-shadow), 0 10px 50px rgb(0 0 20 / 0.1); // Dropdowns --dropdown-backdrop-filter: saturate(1.5) blur(20px); - --dropdown-box-shadow: 0 10px 30px rgb(0 0 20 / 0.2), - 0 2px 10px rgb(0 0 20 / 0.05), inset 0 -1px 2px rgb(255 255 255 / 0.025); + --dropdown-box-shadow: var(--jenkins-border--subtle-shadow), + 0 10px 30px rgb(0 0 20 / 0.1), 0 2px 10px rgb(0 0 20 / 0.05), + inset 0 -1px 2px rgb(255 255 255 / 0.025); // Dialogs ::backdrop { --dialog-backdrop-background: hsl(240 10% 20% / 0.8); } - --dialog-box-shadow: 0 10px 40px rgb(0 0 20 / 0.15), - 0 2px 15px rgb(0 0 20 / 0.05), inset 0 0 2px 2px rgb(255 255 255 / 0.025); + --dialog-box-shadow: var(--jenkins-border--subtle-shadow), + 0 10px 40px rgb(0 0 20 / 0.15), 0 2px 15px rgb(0 0 20 / 0.05), + inset 0 0 2px 2px rgb(255 255 255 / 0.025); // Dark link --link-dark-color: var(--text-color); @@ -219,12 +262,20 @@ $semantics: ( --card-border-color--active: oklch( from var(--text-color-secondary) l c h / 0.5 ); - --card-border-width: 2px; + --card-border-width: var(--jenkins-border-width); + + @media (prefers-contrast: more) { + --card-border-color: var(--text-color); + } // Tab bar --tabs-background: oklch(from var(--text-color-secondary) l c h / 0.1); --tabs-item-background: transparent; - --tabs-item-foreground: var(--text-color); + --tabs-item-foreground: color-mix( + in sRGB, + var(--text-color-secondary), + var(--text-color) + ); --tabs-item-background--hover: rgb(0 0 0 / 0.05); --tabs-item-foreground--hover: var(--text-color); --tabs-item-background--active: rgb(0 0 0 / 0.1); @@ -268,14 +319,21 @@ $semantics: ( } --form-label-font-weight: var(--font-bold-weight); - --form-input-padding: 0.625rem; + --form-input-padding: 0.5rem 0.625rem; --form-input-border-radius: 0.625rem; - --form-input-glow: 0 0 0 10px transparent; - --form-input-glow--focus: 0 0 0 5px var(--focus-input-glow); - --pre-background: rgb(0 0 0 / 0.05); + --form-input-glow: 0 0 0 0.5rem transparent; + --form-input-glow--focus: 0 0 0 0.25rem var(--focus-input-glow); + --pre-background: var(--button-background); --pre-color: var(--text-color); --selection-color: oklch(from var(--accent-color) l c h / 0.2); + @media (prefers-contrast: more) { + --input-border: var(--text-color) !important; + --input-border-hover: var(--text-color) !important; + --form-input-glow--focus: 0 0 0 4px + color-mix(in sRGB, var(--text-color), transparent); + } + // Animations --standard-transition: 0.3s ease; --elastic-transition: 0.3s cubic-bezier(0, 0.68, 0.5, 1.5); diff --git a/src/main/scss/base/_style.scss b/src/main/scss/base/_style.scss index d0a8e42237..001a44c73c 100644 --- a/src/main/scss/base/_style.scss +++ b/src/main/scss/base/_style.scss @@ -152,6 +152,7 @@ pre { margin: 0 0 var(--section-padding); padding: 0.8rem 1rem; border-radius: var(--form-input-border-radius); + border: var(--jenkins-border--subtle); background-color: var(--pre-background); color: var(--pre-color); font-family: var(--font-family-mono); @@ -290,21 +291,13 @@ pre.console { padding: 1rem; margin: 1rem 0; word-break: break-word; - border-radius: 6px; + border-radius: var(--form-input-border-radius); + background-color: var(--button-background); + border: var(--jenkins-border--subtle); z-index: 0; --section-padding: 0.8rem; - &::before { - content: ""; - position: absolute; - inset: 0; - background: var(--text-color); - opacity: 0.05; - z-index: -1; - border-radius: inherit; - } - p:first-of-type { margin-top: 0; } @@ -536,7 +529,7 @@ table.fingerprint-in-build td { top: 0; left: 10px; bottom: 0; - width: 2px; + width: var(--jenkins-border-width); background: var(--input-border); border-radius: 2px; transition: var(--standard-transition); diff --git a/src/main/scss/components/_alert.scss b/src/main/scss/components/_alert.scss index 7ae9bbedd5..7380a43217 100644 --- a/src/main/scss/components/_alert.scss +++ b/src/main/scss/components/_alert.scss @@ -2,8 +2,8 @@ .jenkins-alert { font-size: var(--font-size-sm); padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; + margin-bottom: var(--section-padding); + border: var(--jenkins-border-width) solid transparent; border-radius: var(--form-input-border-radius); strong { @@ -52,4 +52,8 @@ color: var(--alert-danger-text-color); } } + + @media (prefers-contrast: more) { + border-color: var(--text-color); + } } diff --git a/src/main/scss/components/_app-bar.scss b/src/main/scss/components/_app-bar.scss index 6ccc36be80..8dbbf58eed 100644 --- a/src/main/scss/components/_app-bar.scss +++ b/src/main/scss/components/_app-bar.scss @@ -151,7 +151,7 @@ top: -30px; left: 0; right: 0; - background: linear-gradient(transparent, rgba(#556, 0.075) 110%); + background: linear-gradient(transparent, var(--bottom-app-bar-shadow) 110%); max-width: 100%; height: 30px; opacity: 0; diff --git a/src/main/scss/components/_breadcrumbs.scss b/src/main/scss/components/_breadcrumbs.scss index 609737acef..593b95c285 100644 --- a/src/main/scss/components/_breadcrumbs.scss +++ b/src/main/scss/components/_breadcrumbs.scss @@ -30,7 +30,7 @@ padding: 0.2rem 0.4rem; & > a { - @include mixins.item; + @include mixins.item($border: false); display: inline-flex; align-items: center; @@ -40,7 +40,6 @@ margin: 0; padding: 0; color: var(--text-color); - text-decoration: none; margin-right: 0 !important; transition: var(--standard-transition); diff --git a/src/main/scss/components/_buttons.scss b/src/main/scss/components/_buttons.scss index 0ffc8e65a6..113933bfd8 100644 --- a/src/main/scss/components/_buttons.scss +++ b/src/main/scss/components/_buttons.scss @@ -1,34 +1,24 @@ @use "../abstracts/mixins"; .jenkins-button { + --item-background: var(--button-background); --item-background--hover: var(--button-background--hover); --item-background--active: var(--button-background--active); --item-box-shadow--focus: var(--button-box-shadow--focus); @include mixins.item; - appearance: none; display: inline-flex; align-items: center; justify-content: center; - border: none; - outline: none; margin: 0; - padding: 0.5rem 0.9rem; + padding: 0.5rem 1rem; font-size: var(--font-size-sm); - font-weight: normal; - text-decoration: none !important; - background: transparent; color: var(--text-color) !important; - cursor: pointer; - min-height: 2.25rem; + min-height: 2.375rem; white-space: nowrap; gap: 1ch; - &::before { - background: var(--button-background); - } - svg { width: 1.125rem; height: 1.125rem; @@ -42,118 +32,41 @@ } .jenkins-button--primary { + --button-background: oklch(from var(--accent-color) l c h); + --button-background--hover: oklch(from var(--accent-color) l c h / 0.9); + --button-background--active: oklch(from var(--accent-color) l c h / 0.8); + --button-box-shadow--focus: oklch(from var(--accent-color) l c h / 0.4); + color: var(--button-color--primary) !important; - - &::before { - background: var(--accent-color) !important; - } - - &::after { - box-shadow: 0 0 0 0.66rem var(--accent-color); - opacity: 0; - } - - &:not(:disabled) { - &:hover { - &::before { - opacity: 0.9; - } - } - - &:active, - &:focus-visible { - &::before { - opacity: 0.8; - } - - &::after { - box-shadow: 0 0 0 0.33rem var(--accent-color); - opacity: 0.2; - } - } - } -} - -.jenkins-button--tertiary { - &::before { - background: transparent; - } } // Support for custom colors // Modifier classes must include 'color' in name to work .jenkins-button[class*="color"] { - background: transparent; + --button-background: oklch(from currentColor l c h / 0.1); + --button-background--hover: oklch(from currentColor l c h / 0.15); + --button-background--active: oklch(from currentColor l c h / 0.25); + --button-box-shadow--focus: oklch(from currentColor l c h / 0.125); + color: var(--color) !important; - - &::before { - background: currentColor !important; - opacity: 0.1; - } - - &::after { - box-shadow: 0 0 0 0.66rem currentColor; - opacity: 0; - } - - &:not(:disabled) { - &:hover { - &::before { - opacity: 0.15; - } - } - - &:active { - &::before { - opacity: 0.2; - } - - &::after { - box-shadow: 0 0 0 0.33rem currentColor; - opacity: 0.1; - } - } - } } .jenkins-button--primary[class*="color"] { - background: transparent; + --button-background: oklch(from var(--color) l c h); + --button-background--hover: oklch(from var(--color) l c h / 0.9); + --button-background--active: oklch(from var(--color) l c h / 0.8); + --button-box-shadow--focus: oklch(from var(--color) l c h / 0.4); + color: var(--background) !important; - - &::before { - background: var(--color) !important; - opacity: 1; - } - - &::after { - box-shadow: 0 0 0 0.66rem var(--color); - opacity: 0; - } - - &:not(:disabled) { - &:hover { - &::before { - opacity: 0.9; - } - } - - &:active, - &:focus-visible { - &::before { - opacity: 0.8; - } - - &::after { - box-shadow: 0 0 0 0.33rem var(--color); - opacity: 0.3; - } - } - } } -.jenkins-button--tertiary[class*="color"] { - &::before { - opacity: 0; +.jenkins-button--tertiary { + --button-background: transparent !important; + + &:not(:hover, &:active, &:focus) { + &::before { + border-color: transparent; + } } } @@ -249,7 +162,7 @@ in sRGB, var(--success-color) 10%, transparent - ); + ) !important; --button-background--hover: var(--button-background); --button-background--active: var(--button-background); @@ -352,13 +265,13 @@ $jenkins-split-button-border-radius: 0.2rem; } .stop-button-link { + --item-background: color-mix(in sRGB, var(--red) 15%, transparent); --item-background--hover: color-mix(in sRGB, var(--red) 20%, transparent); --item-background--active: color-mix(in sRGB, var(--red) 25%, transparent); --item-box-shadow--focus: transparent; @include mixins.item; - position: relative; display: inline-flex; align-items: center; justify-content: center; @@ -366,10 +279,6 @@ $jenkins-split-button-border-radius: 0.2rem; height: 1rem; border-radius: 0.25rem; - &::before { - background: color-mix(in sRGB, var(--red) 15%, transparent); - } - svg { width: 87.5%; height: 87.5%; diff --git a/src/main/scss/components/_cards.scss b/src/main/scss/components/_cards.scss index 9a73b4f5bb..4de565b1c2 100644 --- a/src/main/scss/components/_cards.scss +++ b/src/main/scss/components/_cards.scss @@ -27,14 +27,22 @@ $card-padding: 1rem; } &:not(:hover) { - .jenkins-card__unveil { - color: var(--text-color-secondary) !important; + .jenkins-card__unveil, + .jenkins-card__reveal { + color: var(--text-color-secondary); + } + } + + @media (prefers-contrast: more) { + .jenkins-card__unveil, + .jenkins-card__reveal { + color: var(--text-color) !important; } } &:hover { .jenkins-card__reveal { - color: var(--text-color) !important; + color: var(--text-color); } } @@ -42,7 +50,6 @@ $card-padding: 1rem; display: flex; flex-direction: column; padding: 0 $card-padding $card-padding; - color: var(--text-color-secondary); &:empty { display: none; @@ -69,7 +76,6 @@ $card-padding: 1rem; width: 26px; height: 26px; border-radius: 0.33rem; - color: var(--text-color-secondary) !important; transition: scale var(--standard-transition), opacity var(--standard-transition); diff --git a/src/main/scss/components/_command-palette.scss b/src/main/scss/components/_command-palette.scss index bc3aca71cd..1d487915e9 100644 --- a/src/main/scss/components/_command-palette.scss +++ b/src/main/scss/components/_command-palette.scss @@ -86,6 +86,7 @@ max-width: unset; input { + padding: 0 0.5rem 0 45px; background: transparent !important; --input-border: transparent; @@ -136,7 +137,7 @@ } &__item { - @include mixins.item; + @include mixins.item($border: false); --item-background--hover: color-mix( in sRGB, @@ -152,19 +153,15 @@ display: flex; align-items: center; justify-content: flex-start; - background: transparent; padding: 0.75rem; border-radius: 0.5rem; - cursor: pointer; color: var(--text-color) !important; transition: var(--standard-transition); - box-shadow: 0 0 0 10px transparent; - border: none; - outline: none; &--hover { &::before { background-color: var(--item-background--hover); + border: var(--jenkins-border--subtle) !important; } } diff --git a/src/main/scss/components/_dropdowns.scss b/src/main/scss/components/_dropdowns.scss index 6c0b230755..4e6a17cf7a 100644 --- a/src/main/scss/components/_dropdowns.scss +++ b/src/main/scss/components/_dropdowns.scss @@ -1,9 +1,10 @@ @use "../abstracts/mixins"; -$dropdown-padding: 0.4rem; +$dropdown-border-radius: 1rem; +$dropdown-padding: 0.375rem; .tippy-box[data-theme~="dropdown"] { - border-radius: 15px; + border-radius: $dropdown-border-radius; box-shadow: var(--dropdown-box-shadow); outline: none !important; background: color-mix(in sRGB, var(--background) 85%, transparent); @@ -76,22 +77,15 @@ $dropdown-padding: 0.4rem; &__separator { position: relative; - height: 0.125rem; + height: var(--jenkins-border-width); margin: $dropdown-padding calc($dropdown-padding * -1); border: none; - - &::before { - content: ""; - position: absolute; - inset: 0; - background-color: var(--text-color-secondary); - opacity: 0.1; - } + background-color: var(--jenkins-border-color); } &__heading { color: var(--text-color-secondary) !important; - margin: $dropdown-padding 0.55rem; + margin: $dropdown-padding 0.65rem; font-size: 0.8125rem; font-weight: var(--font-bold-weight); opacity: 0.8; @@ -123,7 +117,7 @@ $dropdown-padding: 0.4rem; --item-background--active: var(--button-background--active); --item-box-shadow--focus: var(--button-box-shadow--focus); - @include mixins.item; + @include mixins.item($border: false); appearance: none; display: inline-flex; @@ -138,7 +132,7 @@ $dropdown-padding: 0.4rem; text-decoration: none !important; background: transparent; color: var(--text-color) !important; - border-radius: 0.66rem; + border-radius: calc($dropdown-border-radius - $dropdown-padding); cursor: pointer; min-height: 36px; white-space: nowrap; @@ -223,14 +217,25 @@ $dropdown-padding: 0.4rem; &:hover { .jenkins-dropdown__item--selected { - background: transparent; + &::before { + opacity: 0; + } } } } .jenkins-dropdown__item--selected { - background: var(--item-background--hover); - animation: pulse 1s ease-in-out forwards; + &::before { + background: var(--item-background--hover); + border: var(--jenkins-border--subtle) !important; + animation: pulse 1s ease-in-out forwards; + } + + &:hover { + &::before { + opacity: 1 !important; + } + } @keyframes pulse { 50% { diff --git a/src/main/scss/components/_notice.scss b/src/main/scss/components/_notice.scss index 812e933f6c..aa58c1cb2a 100644 --- a/src/main/scss/components/_notice.scss +++ b/src/main/scss/components/_notice.scss @@ -6,6 +6,7 @@ gap: 1rem; min-height: 15rem; background: var(--button-background); + border: var(--jenkins-border--subtle); border-radius: var(--form-input-border-radius); font-size: var(--font-size-base); margin-bottom: var(--section-padding); diff --git a/src/main/scss/components/_notifications.scss b/src/main/scss/components/_notifications.scss index 1f474b1063..8e8ea554e2 100644 --- a/src/main/scss/components/_notifications.scss +++ b/src/main/scss/components/_notifications.scss @@ -36,8 +36,8 @@ inset: 0; border-radius: inherit; z-index: -1; - background: var(--background); - opacity: 0.3; + background: oklch(from var(--background) l c h / 0.3); + border: var(--jenkins-border--subtle); } @supports not (backdrop-filter: blur(15px)) { diff --git a/src/main/scss/components/_row-selection-controller.scss b/src/main/scss/components/_row-selection-controller.scss index 1eee5ab1b6..cd984bc29e 100644 --- a/src/main/scss/components/_row-selection-controller.scss +++ b/src/main/scss/components/_row-selection-controller.scss @@ -12,7 +12,7 @@ outline: none; border: none; box-shadow: - 0 0 0 10px transparent, + var(--form-input-glow), inset 0 0 0 0.125rem var(--input-border); border-radius: 6px; transition: var(--standard-transition); @@ -21,14 +21,14 @@ &:hover { box-shadow: - 0 0 0 10px transparent, + var(--form-input-glow), inset 0 0 0 0.3125rem var(--input-border-hover); } &:active, &:focus { box-shadow: - 0 0 0 5px var(--focus-input-glow), + 0 0 0 4px var(--focus-input-glow), inset 0 0 0 0.3125rem var(--focus-input-border); } @@ -61,19 +61,19 @@ &--all { box-shadow: - 0 0 0 10px transparent, + var(--form-input-glow), inset 0 0 0 0.6875rem var(--focus-input-border); &:hover { box-shadow: - 0 0 0 10px transparent, + var(--form-input-glow), inset 0 0 0 1.375rem var(--focus-input-border); } &:active, &:focus { box-shadow: - 0 0 0 5px var(--focus-input-glow), + 0 0 0 4px var(--focus-input-glow), inset 0 0 0 1.375rem var(--focus-input-border); } diff --git a/src/main/scss/components/_section.scss b/src/main/scss/components/_section.scss index 160655ed17..410fafb18c 100644 --- a/src/main/scss/components/_section.scss +++ b/src/main/scss/components/_section.scss @@ -1,7 +1,7 @@ @use "../abstracts/mixins"; .jenkins-section { - border-top: 2px solid var(--panel-border-color); + border-top: var(--jenkins-border); padding: var(--section-padding) 0 0 0; max-width: 1800px; @@ -55,7 +55,7 @@ } .jenkins-section__item a { - @include mixins.item; + @include mixins.item($border: false); display: flex; text-decoration: none; @@ -90,6 +90,7 @@ border-radius: 100%; pointer-events: none; background: var(--item-background--active); + border: var(--jenkins-border--subtle); } img, diff --git a/src/main/scss/components/_side-panel-tasks.scss b/src/main/scss/components/_side-panel-tasks.scss index 034c07822f..a267f25030 100644 --- a/src/main/scss/components/_side-panel-tasks.scss +++ b/src/main/scss/components/_side-panel-tasks.scss @@ -61,17 +61,11 @@ $background-outset: 0.7rem; display: flex; align-items: center; justify-content: flex-start; - padding: 0.55rem $background-outset; + padding: 0.5rem $background-outset; gap: 0.65rem; width: 100%; - cursor: pointer; - font-weight: normal !important; font-size: var(--font-size-sm); - color: var(--text-color) !important; - background: transparent; - outline: none; - border: none; - text-decoration: none; + color: var(--text-color); margin: 0; transition: opacity var(--standard-transition); @@ -100,7 +94,7 @@ $background-outset: 0.7rem; } &--active { - font-weight: 500 !important; + font-weight: 450; cursor: default; svg * { @@ -115,4 +109,10 @@ $background-outset: 0.7rem; box-shadow: none !important; } } + + &:not(:hover, &:active, &:focus, &--active) { + &::before { + border-color: transparent; + } + } } diff --git a/src/main/scss/components/_spinner.scss b/src/main/scss/components/_spinner.scss index 3454dc8d48..9654c18ce3 100644 --- a/src/main/scss/components/_spinner.scss +++ b/src/main/scss/components/_spinner.scss @@ -19,7 +19,8 @@ &::before { position: relative; margin-right: 0.5lh; - opacity: 0.2; + opacity: 0.3; + border-color: var(--text-color-secondary); } &::after { diff --git a/src/main/scss/components/_table.scss b/src/main/scss/components/_table.scss index 00ef3b3656..a860eeab75 100644 --- a/src/main/scss/components/_table.scss +++ b/src/main/scss/components/_table.scss @@ -6,10 +6,12 @@ position: relative; width: 100%; background: var(--table-background); - border-radius: calc(var(--table-border-radius) + 4px); - border: 4px solid var(--table-background); - border-bottom-width: 2px; - border-spacing: 0 2px; + border-radius: calc( + var(--table-border-radius) + (var(--card-border-width) * 2) + ); + border: calc(var(--card-border-width) * 2) solid var(--table-background); + border-bottom-width: var(--card-border-width); + border-spacing: 0 var(--card-border-width); background-clip: padding-box; margin-bottom: var(--section-padding); @@ -18,8 +20,8 @@ &::before { content: ""; position: absolute; - inset: -4px -4px -2px; - border: var(--card-border-width) solid var(--table-border-color); + inset: -3px -3px -2px; + border: var(--jenkins-border--subtle); border-radius: inherit; pointer-events: none; } @@ -38,8 +40,8 @@ padding-top: calc(var(--table-padding) * 0.9); padding-bottom: calc((var(--table-padding) * 0.9) + 2px); padding-left: 1.6rem; - font-weight: var(--font-bold-weight); font-size: var(--font-size-sm); + font-weight: var(--font-bold-weight); &[align="center"] { text-align: center; @@ -257,7 +259,7 @@ &__button, .sortheader, &__link { - @include mixins.item; + @include mixins.item($border: false); align-items: center; justify-content: center; @@ -283,39 +285,23 @@ } &__badge { + @include mixins.item; + + --item-background: color-mix(in sRGB, currentColor 5%, transparent); + --item-background--hover: color-mix(in sRGB, currentColor 10%, transparent); + --item-background--active: color-mix( + in sRGB, + currentColor 15%, + transparent + ); + --item-box-shadow--focus: color-mix(in sRGB, currentColor 5%, transparent); + margin-left: 1rem !important; + border-radius: 13px; - &::before { - inset: -5px -8px; - border-radius: 13px; - background: currentColor; - opacity: 0.05; - } - + &::before, &::after { inset: -5px -8px; - box-shadow: 0 0 0 10px currentColor; - opacity: 0; - } - - &:hover { - &::before { - background: currentColor; - border-radius: 6px; - } - } - - &:active, - &:focus { - &::before { - background: currentColor; - border-radius: 6px; - } - - &::after { - box-shadow: 0 0 0 5px currentColor; - opacity: 0.025; - } } } } diff --git a/src/main/scss/components/_tabs.scss b/src/main/scss/components/_tabs.scss index 3fc440d3dc..b7ac90c237 100644 --- a/src/main/scss/components/_tabs.scss +++ b/src/main/scss/components/_tabs.scss @@ -1,3 +1,7 @@ +@use "../abstracts/mixins"; + +$border-radius: 100px; + .tabBarFrame { position: relative; } @@ -7,8 +11,8 @@ display: inline-flex; align-items: center; flex-wrap: wrap; - background: var(--tabs-background); - border-radius: var(--tabs-border-radius); + background: var(--button-background); + border-radius: $border-radius; padding: 2px; margin-bottom: var(--section-padding); @@ -16,7 +20,7 @@ content: ""; position: absolute; inset: 0; - border: var(--card-border-width) solid var(--tabs-border-color); + border: var(--jenkins-border--subtle); border-radius: inherit; pointer-events: none; } @@ -27,38 +31,28 @@ } .tabBar .tab a { - position: relative; + @include mixins.item($border: false); + display: flex; align-items: center; justify-content: center; - min-width: 3rem; - text-decoration: none; - margin: 2px; - padding: 0.4rem 1.2rem; - border-radius: 100px; - background: var(--tabs-item-background); + min-height: 36px; + padding: 0 1.2rem; + border-radius: $border-radius; color: var(--tabs-item-foreground); - font-weight: var(--font-bold-weight); + font-weight: normal; font-size: var(--font-size-sm); - transition: var(--standard-transition); - cursor: pointer; + min-width: 3.75rem; - &:hover { - background: var(--tabs-item-background--hover); - color: var(--tabs-item-foreground--hover); - } - - &:active, - &:focus { - outline: none; - background: var(--tabs-item-background--active); - color: var(--tabs-item-foreground--active); + &::before, + &::after { + inset: 2px; } } .tabBar .tab .addTab svg { - width: 1.25rem; - height: 1.25rem; + width: 1.125rem; + height: 1.125rem; } .tabBar .tab [type="radio"] { @@ -66,10 +60,25 @@ } .tabBar .tab.active a { - background: var(--tabs-item-background--selected); - color: var(--tabs-item-foreground--selected); z-index: 2; cursor: default; + font-weight: 450; + color: var(--tabs-item-foreground--active); + + &::before { + background-clip: padding-box; + background-color: var(--tabs-item-background--selected) !important; + border: var(--jenkins-border--subtle) !important; + } + + &::after { + display: none; + } + + &::before, + &::after { + inset: 0; + } } .jenkins-tab-pane__title { diff --git a/src/main/scss/components/_tooltips.scss b/src/main/scss/components/_tooltips.scss index dabd16e1ef..90570a7ce3 100644 --- a/src/main/scss/components/_tooltips.scss +++ b/src/main/scss/components/_tooltips.scss @@ -36,7 +36,7 @@ position: absolute; inset: 0; border-radius: 0.375rem; - border: 0.1rem solid var(--text-color-secondary); + border: var(--jenkins-border-width) solid var(--text-color-secondary); opacity: 0.3; mask-image: linear-gradient( -45deg, @@ -101,8 +101,8 @@ position: absolute; inset: 0; border-radius: 0.375rem; - border: 0.1rem solid var(--text-color-secondary); - opacity: 0.3; + border: var(--jenkins-border-width) solid var(--text-color-secondary); + opacity: 0.2; } svg { diff --git a/src/main/scss/form/_checkbox.scss b/src/main/scss/form/_checkbox.scss index 6e5633dd99..92614fefe5 100644 --- a/src/main/scss/form/_checkbox.scss +++ b/src/main/scss/form/_checkbox.scss @@ -32,7 +32,7 @@ & + label { &::before { box-shadow: - 0 0 0 5px var(--focus-input-glow), + var(--form-input-glow--focus), inset 0 0 0 5px var(--focus-input-border); } } @@ -44,7 +44,7 @@ & + label { &::before { box-shadow: - 0 0 0 5px var(--focus-input-glow), + var(--form-input-glow--focus), inset 0 0 0 12px var(--focus-input-border); } } @@ -58,7 +58,7 @@ & + label { &::before { box-shadow: - 0 0 0 5px var(--focus-input-glow), + var(--form-input-glow--focus), inset 0 0 0 12px var(--focus-input-border); } } @@ -71,7 +71,7 @@ &:focus { &::before { box-shadow: - 0 0 0 5px var(--focus-input-glow), + var(--form-input-glow--focus), inset 0 0 0 12px var(--focus-input-border); } } @@ -80,7 +80,7 @@ & + label { &::before { box-shadow: - 0 0 0 10px transparent, + var(--form-input-glow), inset 0 0 0 12px var(--focus-input-border); } @@ -97,7 +97,7 @@ &::before { opacity: 0.35 !important; box-shadow: - 0 0 0 10px transparent, + var(--form-input-glow), inset 0 0 0 2px var(--input-border) !important; } } @@ -106,7 +106,7 @@ & + label { &::before { box-shadow: - 0 0 0 10px transparent, + var(--form-input-glow), inset 0 0 0 12px var(--focus-input-border) !important; } @@ -138,8 +138,8 @@ transition: var(--standard-transition); margin-right: 11px; box-shadow: - 0 0 0 10px transparent, - inset 0 0 0 2px var(--input-border); + var(--form-input-glow), + inset 0 0 0 var(--jenkins-border-width) var(--input-border); background: var(--input-color); } @@ -171,7 +171,7 @@ &:hover { &::before { box-shadow: - 0 0 0 10px transparent, + var(--form-input-glow), inset 0 0 0 5px var(--input-border-hover); } } @@ -180,7 +180,7 @@ &:focus { &::before { box-shadow: - 0 0 0 5px var(--focus-input-glow), + var(--form-input-glow--focus), inset 0 0 0 5px var(--focus-input-border); } } diff --git a/src/main/scss/form/_codemirror.scss b/src/main/scss/form/_codemirror.scss index a34165e8ba..4a860e628b 100644 --- a/src/main/scss/form/_codemirror.scss +++ b/src/main/scss/form/_codemirror.scss @@ -1,7 +1,7 @@ .CodeMirror { display: block; background: var(--input-color); - border: 2px solid var(--input-border); + border: var(--jenkins-border-width) solid var(--input-border); border-radius: var(--form-input-border-radius); width: 100%; box-shadow: var(--form-input-glow); diff --git a/src/main/scss/form/_file-upload.scss b/src/main/scss/form/_file-upload.scss index 1969d823ec..5c5f82f6c0 100644 --- a/src/main/scss/form/_file-upload.scss +++ b/src/main/scss/form/_file-upload.scss @@ -24,7 +24,6 @@ display: inline-flex; align-items: center; justify-content: center; - border: none; outline: none; margin: 0 1rem 0 0; padding: 0.5rem 0.85rem 0.5rem 2.5rem; @@ -34,7 +33,7 @@ padding: 0.5rem 0.85rem; } - font-size: 0.8rem; + font-size: var(--font-size-sm); font-weight: normal; color: var(--text-color); border-radius: var(--form-input-border-radius); @@ -43,7 +42,8 @@ white-space: nowrap; background: var(--button-background); transition: var(--standard-transition); - box-shadow: 0 0 0 10px transparent; + box-shadow: var(--form-input-glow); + border: var(--jenkins-border--subtle); &:hover { background: var(--button-background--hover); @@ -51,7 +51,7 @@ &:active { background: var(--button-background--active); - box-shadow: 0 0 0 5px var(--button-box-shadow--focus); + box-shadow: 0 0 0 4px var(--button-box-shadow--focus); } } diff --git a/src/main/scss/form/_input.scss b/src/main/scss/form/_input.scss index 0d97b08162..633f1f883a 100644 --- a/src/main/scss/form/_input.scss +++ b/src/main/scss/form/_input.scss @@ -1,7 +1,7 @@ .jenkins-input { display: block; background: var(--input-color); - border: 2px solid var(--input-border); + border: var(--jenkins-border-width) solid var(--input-border); padding: var(--form-input-padding); border-radius: var(--form-input-border-radius); width: 100%; @@ -13,15 +13,21 @@ height 0s, padding 0s; - &:hover { - border-color: var(--input-border-hover); + &:not(:disabled) { + &:hover { + border-color: var(--input-border-hover); + } + + &:active, + &:focus { + outline: none; + border-color: var(--focus-input-border); + box-shadow: var(--form-input-glow--focus); + } } - &:active, - &:focus { - outline: none; - border-color: var(--focus-input-border); - box-shadow: var(--form-input-glow--focus); + &:disabled { + cursor: not-allowed; } } diff --git a/src/main/scss/form/_layout.scss b/src/main/scss/form/_layout.scss index 2b0706f537..77e5dd58af 100644 --- a/src/main/scss/form/_layout.scss +++ b/src/main/scss/form/_layout.scss @@ -1,3 +1,5 @@ +@use "../abstracts/mixins"; + .jenkins-form { max-width: var(--form-item-max-width); } @@ -70,6 +72,8 @@ align-items: center; background-color: var(--button-background); border-radius: var(--form-input-border-radius); + outline: var(--jenkins-border--subtle); + outline-offset: calc(var(--jenkins-border-width) * -1); padding: 0 1rem; gap: 1.5rem; @@ -89,12 +93,14 @@ } .jenkins-help-button { - position: relative; + @include mixins.item; + + --item-background: var(--button-background); + display: inline-flex; justify-content: center; align-items: center; margin-left: 1ch; - color: var(--text-color) !important; border-radius: 100%; span { @@ -110,47 +116,6 @@ mask-position: center; mask-repeat: no-repeat; } - - &::before { - content: ""; - position: absolute; - inset: 0; - background: var(--text-color-secondary); - opacity: 0.1; - border-radius: inherit; - transition: var(--standard-transition); - } - - &::after { - content: ""; - position: absolute; - inset: 0; - border: 1px solid - color-mix(in sRGB, var(--text-color-secondary), transparent); - box-shadow: var(--form-input-glow); - border-radius: inherit; - opacity: 0.1; - transition: var(--standard-transition); - } - - &:hover { - &::before { - opacity: 0.2; - } - } - - &:active, - &:focus { - outline: none; - - &::before { - opacity: 0.3; - } - - &::after { - box-shadow: 0 0 0 5px var(--text-color); - } - } } .jenkins-select-help { @@ -170,7 +135,6 @@ gap: 0.45rem; margin-left: 0.4rem; font-size: 0.8rem; - font-weight: var(--font-bold-weight); cursor: default; svg { diff --git a/src/main/scss/form/_radio.scss b/src/main/scss/form/_radio.scss index 00a4e52615..6c4828cf59 100644 --- a/src/main/scss/form/_radio.scss +++ b/src/main/scss/form/_radio.scss @@ -1,10 +1,9 @@ $jenkins-radio-size: 1.375rem; -$jenkins-radio-border-size: 0.125rem; +$jenkins-radio-border-size: 1.5px; $jenkins-radio-border-hover-size: 0.3125rem; $jenkins-radio-border-active-size: 0.5rem; $jenkins-radio-border-checked-size: 0.4rem; -$jenkins-radio-glow-size: 0.625rem; -$jenkins-radio-glow-active-size: 0.3125rem; +$jenkins-radio-glow-size: 0.5rem; .jenkins-radio-help-wrapper { display: flex; @@ -37,7 +36,7 @@ $jenkins-radio-glow-active-size: 0.3125rem; &:active { & + label::before { box-shadow: - 0 0 0 $jenkins-radio-glow-active-size var(--focus-input-glow), + var(--form-input-glow--focus), inset 0 0 0 $jenkins-radio-border-active-size var(--focus-input-border); } @@ -62,7 +61,7 @@ $jenkins-radio-glow-active-size: 0.3125rem; &:active { & + label::before { box-shadow: - 0 0 0 $jenkins-radio-glow-active-size var(--focus-input-glow), + var(--form-input-glow--focus), inset 0 0 0 $jenkins-radio-border-active-size var(--focus-input-border); } diff --git a/src/main/scss/form/_search-bar.scss b/src/main/scss/form/_search-bar.scss index 79d6bfd899..e8b25e63f9 100644 --- a/src/main/scss/form/_search-bar.scss +++ b/src/main/scss/form/_search-bar.scss @@ -153,7 +153,7 @@ --search-bar-height: 3rem; width: 100%; - margin-block: -6px; + margin-block: -5px; @media (min-width: breakpoints.$tablet-breakpoint) { max-width: 50vw; diff --git a/src/main/scss/form/_select.scss b/src/main/scss/form/_select.scss index e8b2b2973b..12f7377bb6 100644 --- a/src/main/scss/form/_select.scss +++ b/src/main/scss/form/_select.scss @@ -8,26 +8,28 @@ top: 0; right: 13px; bottom: 0; - width: 12px; + width: 0.625rem; background-color: currentColor; mask-image: url("data:image/svg+xml;charset=UTF-8,%3c?xml version='1.0' encoding='UTF-8'?%3e%3csvg width='336px' height='192px' viewBox='0 0 336 192' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3ctitle%3ePath%3c/title%3e%3cg id='Page-1' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3e%3cg id='arrow' transform='translate(0.000000, 0.000000)' fill='%23FF0000' fill-rule='nonzero'%3e%3cpath d='M7.02943725,7.02943725 C16.3053957,-2.24652118 31.2852799,-2.34214962 40.6788451,6.74255194 L40.9705627,7.02943725 L168,134.059 L295.029437,7.02943725 C304.305396,-2.24652118 319.28528,-2.34214962 328.678845,6.74255194 L328.970563,7.02943725 C338.246521,16.3053957 338.34215,31.2852799 329.257448,40.6788451 L328.970563,40.9705627 L184.970563,184.970563 C175.694604,194.246521 160.71472,194.34215 151.321155,185.257448 L151.029437,184.970563 L7.02943725,40.9705627 C-2.34314575,31.5979797 -2.34314575,16.4020203 7.02943725,7.02943725 Z' id='Path'%3e%3c/path%3e%3c/g%3e%3c/g%3e%3c/svg%3e"); mask-size: contain; mask-repeat: no-repeat; mask-position: center; pointer-events: none; + transition: translate var(--elastic-transition); } &__input { appearance: none; display: block; - border: 2px solid var(--input-border); + border: var(--jenkins-border-width) solid var(--input-border); padding: var(--form-input-padding); width: 100% !important; // TODO remove important after https://github.com/jenkinsci/credentials-plugin/pull/255 max-width: 100% !important; // TODO remove important after https://github.com/jenkinsci/credentials-plugin/pull/255 border-radius: var(--form-input-border-radius); - box-shadow: 0 0 0 10px transparent; + box-shadow: var(--form-input-glow); transition: var(--standard-transition); min-height: 38px; + cursor: pointer; &:hover { border-color: var(--input-border-hover); @@ -37,27 +39,33 @@ &:focus { outline: none; border-color: var(--focus-input-border); - box-shadow: 0 0 0 5px var(--focus-input-glow); + box-shadow: var(--form-input-glow--focus); } &:disabled { pointer-events: none; } } + + &:hover { + &::after { + translate: 0 1px; + } + } } .jenkins-multi-select { position: relative; width: 100%; - border: 2px solid var(--input-border); + border: var(--jenkins-border-width) solid var(--input-border); border-radius: var(--form-input-border-radius); - box-shadow: 0 0 0 10px transparent; + box-shadow: var(--form-input-glow); transition: var(--standard-transition); outline: none; &:focus { border-color: var(--focus-input-border); - box-shadow: 0 0 0 5px var(--focus-input-glow); + box-shadow: var(--form-input-glow--focus); } &:disabled { diff --git a/src/main/scss/form/_textarea.scss b/src/main/scss/form/_textarea.scss index db59314073..94af18dd05 100644 --- a/src/main/scss/form/_textarea.scss +++ b/src/main/scss/form/_textarea.scss @@ -6,7 +6,8 @@ } .textarea-preview { - background-color: var(--very-light-grey); + background-color: var(--button-background); + border: var(--jenkins-border--subtle); padding: var(--form-input-padding); margin-top: 0.5rem; border-radius: var(--form-input-border-radius); diff --git a/src/main/scss/form/_toggle-switch.scss b/src/main/scss/form/_toggle-switch.scss index 5f7f46a7f5..33efe7d23c 100644 --- a/src/main/scss/form/_toggle-switch.scss +++ b/src/main/scss/form/_toggle-switch.scss @@ -69,6 +69,13 @@ &:active, &:focus { + &::before { + box-shadow: + inset 0 0 0 1.5px + color-mix(in sRGB, var(--text-color-secondary) 9%, transparent), + var(--form-input-glow--focus); + } + &::after { left: 20px; width: 25px; @@ -101,6 +108,7 @@ cursor: pointer; line-height: 30px; font-weight: var(--form-label-font-weight); + user-select: none; &::before { display: inline-block; @@ -113,8 +121,9 @@ transition: var(--standard-transition); margin-right: 1rem; box-shadow: - inset 0 0 0 1px rgb(0 0 0 / 0.05), - 0 0 0 10px transparent; + inset 0 0 0 1.5px + color-mix(in sRGB, var(--text-color-secondary) 9%, transparent), + var(--form-input-glow); } &::after { @@ -132,7 +141,8 @@ mask-position: center; border-radius: 100px; transition: var(--standard-transition); - box-shadow: 0 1px 0 rgb(0 0 0 / 0.1); + box-shadow: 0 0 0 1.5px + color-mix(in sRGB, var(--text-color-secondary) 9%, transparent); } &:hover::before { @@ -143,8 +153,10 @@ &:focus { &::before { box-shadow: - inset 0 0 0 1px rgb(0 0 0 / 0.05), - 0 0 0 5px var(--focus-input-glow); + inset 0 0 0 1.5px + color-mix(in sRGB, var(--text-color-secondary) 9%, transparent), + 0 0 0 4px + color-mix(in sRGB, var(--text-color-secondary) 25%, transparent); } &::after { diff --git a/src/main/scss/pages/_about.scss b/src/main/scss/pages/_about.scss index 99eb40d933..4879090b29 100644 --- a/src/main/scss/pages/_about.scss +++ b/src/main/scss/pages/_about.scss @@ -7,15 +7,18 @@ pointer-events: none; margin-bottom: var(--section-padding); overflow: hidden; - mask-border-source: url("data:image/svg+xml,%3Csvg width='45' height='45' viewBox='0 0 45 45' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 22.5C0 15.5109 0 12.0163 1.14181 9.25975C2.66422 5.58433 5.58433 2.66422 9.25975 1.14181C12.0163 0 15.5109 0 22.5 0C29.4891 0 32.9837 0 35.7402 1.14181C39.4157 2.66422 42.3358 5.58433 43.8582 9.25975C45 12.0163 45 15.5109 45 22.5C45 29.4891 45 32.9837 43.8582 35.7402C42.3358 39.4157 39.4157 42.3358 35.7402 43.8582C32.9837 45 29.4891 45 22.5 45C15.5109 45 12.0163 45 9.25975 43.8582C5.58433 42.3358 2.66422 39.4157 1.14181 35.7402C0 32.9837 0 29.4891 0 22.5Z' fill='%23D9D9D9'/%3E%3C/svg%3E%0A"); - mask-border-slice: 49% fill; + border-radius: 1rem; - &::before { + &::before, + &::after { content: ""; position: absolute; + z-index: 1; + } + + &::before { width: 120%; aspect-ratio: 1; - z-index: 1; background: repeating-conic-gradient( var(--background) 0deg, rgb(100 100 100 / 0.25) 20deg @@ -24,6 +27,12 @@ opacity: 0.25; } + &::after { + inset: 0; + border: var(--jenkins-border--subtle); + border-radius: inherit; + } + img { height: 7.5rem; z-index: 1; diff --git a/src/main/scss/pages/_dashboard.scss b/src/main/scss/pages/_dashboard.scss index c66b39e450..e8251c2dad 100644 --- a/src/main/scss/pages/_dashboard.scss +++ b/src/main/scss/pages/_dashboard.scss @@ -1,6 +1,6 @@ @use "../abstracts/mixins"; -$min-button-size: 36px; +$min-button-size: 2.375rem; .jenkins-icon-size { display: flex; diff --git a/src/main/scss/pages/_job.scss b/src/main/scss/pages/_job.scss index b9675ee8a6..105817790a 100644 --- a/src/main/scss/pages/_job.scss +++ b/src/main/scss/pages/_job.scss @@ -94,7 +94,7 @@ } .app-builds-container__item { - @include mixins.item; + @include mixins.item($border: false); display: grid; grid-template-columns: auto 1fr auto; From 32e030eddc43580650e125db1968a06ec93eaf94 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:56:59 +0000 Subject: [PATCH 07/56] Fix input height, fix codemirror gutter --- src/main/scss/form/_codemirror.scss | 3 +-- src/main/scss/form/_input.scss | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scss/form/_codemirror.scss b/src/main/scss/form/_codemirror.scss index 4a860e628b..fb14e6bb9f 100644 --- a/src/main/scss/form/_codemirror.scss +++ b/src/main/scss/form/_codemirror.scss @@ -48,8 +48,7 @@ } .CodeMirror-gutter-text { - padding: var(--form-input-padding) calc(var(--form-input-padding) * 0.5) - var(--form-input-padding) var(--form-input-padding); + padding: 0.5rem calc(0.625rem * 0.5) 0.625rem 0.5rem; color: var(--text-color-secondary); } } diff --git a/src/main/scss/form/_input.scss b/src/main/scss/form/_input.scss index 633f1f883a..d81ffb2cf7 100644 --- a/src/main/scss/form/_input.scss +++ b/src/main/scss/form/_input.scss @@ -5,6 +5,7 @@ padding: var(--form-input-padding); border-radius: var(--form-input-border-radius); width: 100%; + min-height: 2.375rem; box-shadow: var(--form-input-glow); // Set height transition to 0s as vertical resizing has a delay/lag otherwise From 01fdf90a2a49e4a88b27b20e471d4a5808b0e644 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 23 Jan 2025 10:49:10 +0100 Subject: [PATCH 08/56] Update jth to version with all fixes --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 594caf1542..8f2d2b2232 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -178,7 +178,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-test-harness - 2384.va_d3a_58a_4b_df5 + 2385.vfe86233d0d36 test From 305513ab76177436b0717db9267f7b24665c7b9c Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue, 28 Jan 2025 09:56:54 +0000 Subject: [PATCH 09/56] Update _build.scss --- src/main/scss/pages/_build.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/scss/pages/_build.scss b/src/main/scss/pages/_build.scss index cb5e3298fa..b8f84d8aca 100644 --- a/src/main/scss/pages/_build.scss +++ b/src/main/scss/pages/_build.scss @@ -15,6 +15,7 @@ pre { background: transparent; + border: none; margin: 0; padding: 0; line-height: 1.75; From cec920b9be5f827e51e8f9411e05ea965bd7c7d3 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:17:18 +0000 Subject: [PATCH 10/56] Fix incorrect border width --- src/main/scss/components/_row-selection-controller.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scss/components/_row-selection-controller.scss b/src/main/scss/components/_row-selection-controller.scss index cd984bc29e..b816adf2a9 100644 --- a/src/main/scss/components/_row-selection-controller.scss +++ b/src/main/scss/components/_row-selection-controller.scss @@ -13,7 +13,7 @@ border: none; box-shadow: var(--form-input-glow), - inset 0 0 0 0.125rem var(--input-border); + inset 0 0 0 var(--jenkins-border-width) var(--input-border); border-radius: 6px; transition: var(--standard-transition); cursor: pointer; From 5a6c0938b6137342fb5fafacca43709bf3ecec62 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 19:18:10 +0000 Subject: [PATCH 11/56] Update dependency stylelint to v16.14.1 --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 9459cbfdbd..75327cf4b0 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "sass": "1.83.4", "sass-loader": "16.0.4", "style-loader": "4.0.0", - "stylelint": "16.14.0", + "stylelint": "16.14.1", "stylelint-checkstyle-reporter": "1.0.0", "stylelint-config-standard-scss": "14.0.0", "webpack": "5.97.1", diff --git a/yarn.lock b/yarn.lock index 204203f456..a009ecd80b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4405,7 +4405,7 @@ __metadata: sass-loader: "npm:16.0.4" sortablejs: "npm:1.15.6" style-loader: "npm:4.0.0" - stylelint: "npm:16.14.0" + stylelint: "npm:16.14.1" stylelint-checkstyle-reporter: "npm:1.0.0" stylelint-config-standard-scss: "npm:14.0.0" tippy.js: "npm:6.3.7" @@ -6789,9 +6789,9 @@ __metadata: languageName: node linkType: hard -"stylelint@npm:16.14.0": - version: 16.14.0 - resolution: "stylelint@npm:16.14.0" +"stylelint@npm:16.14.1": + version: 16.14.1 + resolution: "stylelint@npm:16.14.1" dependencies: "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" @@ -6833,7 +6833,7 @@ __metadata: write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 10c0/a420db3b5fc6d1b7cd1fea0ca754283c42e28377c143d3e6ab951365d7162110e239e6927e5752283244853223cb01b5c50bbbc6eb8ddfe603bc731d89c47327 + checksum: 10c0/cce94374dc721d491d955f548ee81ba835d4955fa37d58a11323454f9f3721e5644fa89a04c14f85bdfa12790bdd043a41be2001a99cb0bfe23b38eb933199d7 languageName: node linkType: hard From 2c878d7f952d0976a7ba67d7ed4eb62bc1b34646 Mon Sep 17 00:00:00 2001 From: Stefan Spieker Date: Thu, 30 Jan 2025 21:23:26 +0100 Subject: [PATCH 12/56] removed obsolete exclusion --- core/src/spotbugs/excludesFilter.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/core/src/spotbugs/excludesFilter.xml b/core/src/spotbugs/excludesFilter.xml index 9bf8e5afa3..b361005cb8 100644 --- a/core/src/spotbugs/excludesFilter.xml +++ b/core/src/spotbugs/excludesFilter.xml @@ -239,13 +239,6 @@ - - - - - - - From 6109053fa281b59b3752b36341d692deb08cc25b Mon Sep 17 00:00:00 2001 From: Tim Jacomb <21194782+timja@users.noreply.github.com> Date: Fri, 31 Jan 2025 09:18:36 +0100 Subject: [PATCH 13/56] Revert "[JENKINS-75174] Move existing `web.xml` to `web-fragment.xml` under core (#10185)" (#10225) --- .../main/resources/META-INF/web-fragment.xml | 279 ------------------ war/src/main/webapp/WEB-INF/web.xml | 251 +++++++++++++++- 2 files changed, 250 insertions(+), 280 deletions(-) delete mode 100644 core/src/main/resources/META-INF/web-fragment.xml diff --git a/core/src/main/resources/META-INF/web-fragment.xml b/core/src/main/resources/META-INF/web-fragment.xml deleted file mode 100644 index c9acb6e151..0000000000 --- a/core/src/main/resources/META-INF/web-fragment.xml +++ /dev/null @@ -1,279 +0,0 @@ - - - - - jenkins - - - Stapler - org.kohsuke.stapler.Stapler - - default-encodings - text/html=UTF-8 - - - diagnosticThreadName - false - - true - - - - Stapler - /* - - - - suspicious-request-filter - jenkins.security.SuspiciousRequestFilter - true - - - diagnostic-name-filter - org.kohsuke.stapler.DiagnosticThreadNameFilter - true - - - encoding-filter - hudson.util.CharacterEncodingFilter - true - - - uncaught-exception-filter - org.kohsuke.stapler.UncaughtExceptionFilter - true - - - authentication-filter - hudson.security.HudsonFilter - true - - - csrf-filter - hudson.security.csrf.CrumbFilter - true - - - error-attribute-filter - jenkins.ErrorAttributeFilter - true - - - plugins-filter - hudson.util.PluginServletFilter - true - - - - - - suspicious-request-filter - /* - - - diagnostic-name-filter - /* - - - encoding-filter - /* - - - uncaught-exception-filter - /* - - - authentication-filter - /* - - - csrf-filter - /* - - - error-attribute-filter - /* - - - plugins-filter - /* - - - - - jenkins.util.SystemProperties$Listener - - - hudson.WebAppMain - - - jenkins.JenkinsHttpSessionListener - - - - - admin - - - user - - - hudson - - - - - Hudson - /loginEntry - - - - ** - - - - - - - Disable TRACE - /* - TRACE - - - - - - - other - /* - - - - - - FORM - - /login - /loginError - - - - - - xml - application/xml - - - - log - text/plain - - - war - application/octet-stream - - - ear - application/octet-stream - - - rar - application/octet-stream - - - webm - video/webm - - - - java.lang.Throwable - /oops - - - 404 - /404 - - - - - - true - - - - diff --git a/war/src/main/webapp/WEB-INF/web.xml b/war/src/main/webapp/WEB-INF/web.xml index 5e86c73a22..4ef6db9e3f 100644 --- a/war/src/main/webapp/WEB-INF/web.xml +++ b/war/src/main/webapp/WEB-INF/web.xml @@ -26,7 +26,256 @@ THE SOFTWARE. + version="3.1" + metadata-complete="true"> Jenkins v${project.version} Build management system + + + Stapler + org.kohsuke.stapler.Stapler + + default-encodings + text/html=UTF-8 + + + diagnosticThreadName + false + + true + + + + Stapler + /* + + + + suspicious-request-filter + jenkins.security.SuspiciousRequestFilter + true + + + diagnostic-name-filter + org.kohsuke.stapler.DiagnosticThreadNameFilter + true + + + encoding-filter + hudson.util.CharacterEncodingFilter + true + + + uncaught-exception-filter + org.kohsuke.stapler.UncaughtExceptionFilter + true + + + authentication-filter + hudson.security.HudsonFilter + true + + + csrf-filter + hudson.security.csrf.CrumbFilter + true + + + error-attribute-filter + jenkins.ErrorAttributeFilter + true + + + plugins-filter + hudson.util.PluginServletFilter + true + + + + + + suspicious-request-filter + /* + + + diagnostic-name-filter + /* + + + encoding-filter + /* + + + uncaught-exception-filter + /* + + + authentication-filter + /* + + + csrf-filter + /* + + + error-attribute-filter + /* + + + plugins-filter + /* + + + + + jenkins.util.SystemProperties$Listener + + + hudson.WebAppMain + + + jenkins.JenkinsHttpSessionListener + + + + + admin + + + user + + + hudson + + + + + Hudson + /loginEntry + + + + ** + + + + + + + Disable TRACE + /* + TRACE + + + + + + + other + /* + + + + + + FORM + + /login + /loginError + + + + + + xml + application/xml + + + + log + text/plain + + + war + application/octet-stream + + + ear + application/octet-stream + + + rar + application/octet-stream + + + webm + video/webm + + + + java.lang.Throwable + /oops + + + 404 + /404 + + + + + + true + + + From 0ca321172937d073b7c744f27b1dfd7fca009f35 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Fri, 31 Jan 2025 09:30:58 +0100 Subject: [PATCH 14/56] Reapply "[JENKINS-75174] Move existing `web.xml` to `web-fragment.xml` under core (#10185)" (#10225) This reverts commit 6109053fa281b59b3752b36341d692deb08cc25b. --- .../main/resources/META-INF/web-fragment.xml | 279 ++++++++++++++++++ war/src/main/webapp/WEB-INF/web.xml | 251 +--------------- 2 files changed, 280 insertions(+), 250 deletions(-) create mode 100644 core/src/main/resources/META-INF/web-fragment.xml diff --git a/core/src/main/resources/META-INF/web-fragment.xml b/core/src/main/resources/META-INF/web-fragment.xml new file mode 100644 index 0000000000..c9acb6e151 --- /dev/null +++ b/core/src/main/resources/META-INF/web-fragment.xml @@ -0,0 +1,279 @@ + + + + + jenkins + + + Stapler + org.kohsuke.stapler.Stapler + + default-encodings + text/html=UTF-8 + + + diagnosticThreadName + false + + true + + + + Stapler + /* + + + + suspicious-request-filter + jenkins.security.SuspiciousRequestFilter + true + + + diagnostic-name-filter + org.kohsuke.stapler.DiagnosticThreadNameFilter + true + + + encoding-filter + hudson.util.CharacterEncodingFilter + true + + + uncaught-exception-filter + org.kohsuke.stapler.UncaughtExceptionFilter + true + + + authentication-filter + hudson.security.HudsonFilter + true + + + csrf-filter + hudson.security.csrf.CrumbFilter + true + + + error-attribute-filter + jenkins.ErrorAttributeFilter + true + + + plugins-filter + hudson.util.PluginServletFilter + true + + + + + + suspicious-request-filter + /* + + + diagnostic-name-filter + /* + + + encoding-filter + /* + + + uncaught-exception-filter + /* + + + authentication-filter + /* + + + csrf-filter + /* + + + error-attribute-filter + /* + + + plugins-filter + /* + + + + + jenkins.util.SystemProperties$Listener + + + hudson.WebAppMain + + + jenkins.JenkinsHttpSessionListener + + + + + admin + + + user + + + hudson + + + + + Hudson + /loginEntry + + + + ** + + + + + + + Disable TRACE + /* + TRACE + + + + + + + other + /* + + + + + + FORM + + /login + /loginError + + + + + + xml + application/xml + + + + log + text/plain + + + war + application/octet-stream + + + ear + application/octet-stream + + + rar + application/octet-stream + + + webm + video/webm + + + + java.lang.Throwable + /oops + + + 404 + /404 + + + + + + true + + + + diff --git a/war/src/main/webapp/WEB-INF/web.xml b/war/src/main/webapp/WEB-INF/web.xml index 4ef6db9e3f..5e86c73a22 100644 --- a/war/src/main/webapp/WEB-INF/web.xml +++ b/war/src/main/webapp/WEB-INF/web.xml @@ -26,256 +26,7 @@ THE SOFTWARE. + version="3.1"> Jenkins v${project.version} Build management system - - - Stapler - org.kohsuke.stapler.Stapler - - default-encodings - text/html=UTF-8 - - - diagnosticThreadName - false - - true - - - - Stapler - /* - - - - suspicious-request-filter - jenkins.security.SuspiciousRequestFilter - true - - - diagnostic-name-filter - org.kohsuke.stapler.DiagnosticThreadNameFilter - true - - - encoding-filter - hudson.util.CharacterEncodingFilter - true - - - uncaught-exception-filter - org.kohsuke.stapler.UncaughtExceptionFilter - true - - - authentication-filter - hudson.security.HudsonFilter - true - - - csrf-filter - hudson.security.csrf.CrumbFilter - true - - - error-attribute-filter - jenkins.ErrorAttributeFilter - true - - - plugins-filter - hudson.util.PluginServletFilter - true - - - - - - suspicious-request-filter - /* - - - diagnostic-name-filter - /* - - - encoding-filter - /* - - - uncaught-exception-filter - /* - - - authentication-filter - /* - - - csrf-filter - /* - - - error-attribute-filter - /* - - - plugins-filter - /* - - - - - jenkins.util.SystemProperties$Listener - - - hudson.WebAppMain - - - jenkins.JenkinsHttpSessionListener - - - - - admin - - - user - - - hudson - - - - - Hudson - /loginEntry - - - - ** - - - - - - - Disable TRACE - /* - TRACE - - - - - - - other - /* - - - - - - FORM - - /login - /loginError - - - - - - xml - application/xml - - - - log - text/plain - - - war - application/octet-stream - - - ear - application/octet-stream - - - rar - application/octet-stream - - - webm - video/webm - - - - java.lang.Throwable - /oops - - - 404 - /404 - - - - - - true - - - From 25a6a84d8796d4f132f9e9fbed760bb71b618eab Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Fri, 31 Jan 2025 10:56:13 +0100 Subject: [PATCH 15/56] Update jetty plugin configuration for configuration discovery * Remove core classes from extra classpath, as when running `mvn -pl war jetty:run` it automatically gets added. --- war/pom.xml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/war/pom.xml b/war/pom.xml index 91cd5225ab..1e78b07c4a 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -691,12 +691,9 @@ THE SOFTWARE. com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl - - ${project.basedir}/../core/src/main/resources,${project.basedir}/../core/target/classes,${project.build.directory}/support-log-formatter.jar + + ${project.build.directory}/support-log-formatter.jar ${contextPath} - false - - NONE From 796a5579979fcb27e5ef7a4927d81a8f43179c06 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Fri, 31 Jan 2025 11:46:34 +0100 Subject: [PATCH 16/56] Only need to scan core jar --- war/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/war/pom.xml b/war/pom.xml index 1e78b07c4a..3d6705835e 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -694,6 +694,7 @@ THE SOFTWARE. ${project.build.directory}/support-log-formatter.jar ${contextPath} + .*(jenkins-core|target/classes).* From 326da6bd4f25d711ad44456f91e72c860592caff Mon Sep 17 00:00:00 2001 From: Markus Winter Date: Fri, 24 Jan 2025 19:23:24 +0100 Subject: [PATCH 17/56] remove commons-codec usage from core Since Java 17 we have HexFormat so use it instead of commons-codec or the self-written implementation --- core/src/main/java/hudson/Util.java | 29 +++++++++---------- .../security/seed/UserSeedProperty.java | 4 +-- .../java/jenkins/telemetry/Telemetry.java | 4 +-- .../jenkins/util/JSONSignatureValidator.java | 9 +++--- .../java/jenkins/telemetry/TelemetryTest.java | 4 +-- 5 files changed, 23 insertions(+), 27 deletions(-) diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index 07d00a44d0..8e9f1002f3 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -92,6 +92,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.EnumSet; +import java.util.HexFormat; import java.util.List; import java.util.Locale; import java.util.Map; @@ -115,7 +116,6 @@ import jenkins.model.Jenkins; import jenkins.util.MemoryReductionUtil; import jenkins.util.SystemProperties; import jenkins.util.io.PathRemover; -import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.time.FastDateFormat; import org.apache.tools.ant.BuildException; @@ -635,7 +635,6 @@ public class Util { * The stream will be closed by this method at the end of this method. * @return * 32-char wide string - * @see DigestUtils#md5Hex(InputStream) */ @NonNull public static String getDigestOf(@NonNull InputStream source) throws IOException { @@ -710,13 +709,7 @@ public class Util { @NonNull public static String toHexString(@NonNull byte[] data, int start, int len) { - StringBuilder buf = new StringBuilder(); - for (int i = 0; i < len; i++) { - int b = data[start + i] & 0xFF; - if (b < 16) buf.append('0'); - buf.append(Integer.toHexString(b)); - } - return buf.toString(); + return HexFormat.of().formatHex(data, start, len); } @NonNull @@ -726,12 +719,7 @@ public class Util { @NonNull public static byte[] fromHexString(@NonNull String data) { - if (data.length() % 2 != 0) - throw new IllegalArgumentException("data must have an even number of hexadecimal digits"); - byte[] r = new byte[data.length() / 2]; - for (int i = 0; i < data.length(); i += 2) - r[i / 2] = (byte) Integer.parseInt(data.substring(i, i + 2), 16); - return r; + return HexFormat.of().parseHex(data); } /** @@ -1992,9 +1980,18 @@ public class Util { * Returns Hex string of SHA-256 Digest of passed input */ @Restricted(NoExternalUse.class) - public static String getHexOfSHA256DigestOf(byte[] input) throws IOException { + public static String getHexOfSHA256DigestOf(byte[] input) { //get hex string of sha 256 of payload byte[] payloadDigest = Util.getSHA256DigestOf(input); return (payloadDigest != null) ? Util.toHexString(payloadDigest) : null; } + + + /** + * Returns Hex string of SHA-256 Digest of passed string + */ + @Restricted(NoExternalUse.class) + public static String getHexOfSHA256DigestOf(String input) { + return getHexOfSHA256DigestOf(input.getBytes(StandardCharsets.UTF_8)); + } } diff --git a/core/src/main/java/jenkins/security/seed/UserSeedProperty.java b/core/src/main/java/jenkins/security/seed/UserSeedProperty.java index 968ee9320f..17d9dd4335 100644 --- a/core/src/main/java/jenkins/security/seed/UserSeedProperty.java +++ b/core/src/main/java/jenkins/security/seed/UserSeedProperty.java @@ -28,6 +28,7 @@ import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.BulkChange; import hudson.Extension; +import hudson.Util; import hudson.model.User; import hudson.model.UserProperty; import hudson.model.UserPropertyDescriptor; @@ -39,7 +40,6 @@ import java.util.Objects; import jenkins.model.Jenkins; import jenkins.security.LastGrantedAuthoritiesProperty; import jenkins.util.SystemProperties; -import org.apache.commons.codec.binary.Hex; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; @@ -103,7 +103,7 @@ public class UserSeedProperty extends UserProperty { byte[] bytes = new byte[SEED_NUM_BYTES]; while (Objects.equals(newSeed, currentSeed)) { RANDOM.nextBytes(bytes); - newSeed = new String(Hex.encodeHex(bytes)); + newSeed = Util.toHexString(bytes); } this.seed = newSeed; } diff --git a/core/src/main/java/jenkins/telemetry/Telemetry.java b/core/src/main/java/jenkins/telemetry/Telemetry.java index de081c1695..968ca0f08d 100644 --- a/core/src/main/java/jenkins/telemetry/Telemetry.java +++ b/core/src/main/java/jenkins/telemetry/Telemetry.java @@ -32,6 +32,7 @@ import hudson.ExtensionList; import hudson.ExtensionPoint; import hudson.PluginWrapper; import hudson.ProxyConfiguration; +import hudson.Util; import hudson.model.AsyncPeriodicWork; import hudson.model.TaskListener; import hudson.model.UsageStatistics; @@ -51,7 +52,6 @@ import java.util.logging.Logger; import jenkins.model.Jenkins; import jenkins.util.SystemProperties; import net.sf.json.JSONObject; -import org.apache.commons.codec.digest.DigestUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -221,7 +221,7 @@ public abstract class Telemetry implements ExtensionPoint { wrappedData.put("type", telemetry.getId()); wrappedData.put("payload", data); String correlationId = ExtensionList.lookupSingleton(Correlator.class).getCorrelationId(); - wrappedData.put("correlator", DigestUtils.sha256Hex(correlationId + telemetry.getId())); + wrappedData.put("correlator", Util.getHexOfSHA256DigestOf(correlationId + telemetry.getId())); String body = wrappedData.toString(); if (LOGGER.isLoggable(Level.FINEST)) { diff --git a/core/src/main/java/jenkins/util/JSONSignatureValidator.java b/core/src/main/java/jenkins/util/JSONSignatureValidator.java index e6f5429f43..d3f416a91f 100644 --- a/core/src/main/java/jenkins/util/JSONSignatureValidator.java +++ b/core/src/main/java/jenkins/util/JSONSignatureValidator.java @@ -1,6 +1,7 @@ package jenkins.util; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import hudson.Util; import hudson.util.FormValidation; import java.io.ByteArrayInputStream; import java.io.File; @@ -33,8 +34,6 @@ import java.util.logging.Level; import java.util.logging.Logger; import jenkins.model.Jenkins; import net.sf.json.JSONObject; -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.binary.Hex; import org.apache.commons.io.output.TeeOutputStream; import org.jvnet.hudson.crypto.CertificateUtil; import org.jvnet.hudson.crypto.SignatureOutputStream; @@ -221,10 +220,10 @@ public class JSONSignatureValidator { // This approach might look unnecessarily clever, but short of having redundant Signature instances, // there doesn't seem to be a better approach for this. try { - if (signature.verify(Hex.decodeHex(providedSignature.toCharArray()))) { + if (signature.verify(Util.fromHexString(providedSignature))) { return true; } - } catch (SignatureException | DecoderException ignore) { + } catch (SignatureException | IllegalArgumentException ignore) { // ignore } @@ -242,7 +241,7 @@ public class JSONSignatureValidator { * Utility method supporting both possible digest formats: Base64 and Hex */ private boolean digestMatches(byte[] digest, String providedDigest) { - return providedDigest.equalsIgnoreCase(Hex.encodeHexString(digest)) || providedDigest.equalsIgnoreCase(Base64.getEncoder().encodeToString(digest)); + return providedDigest.equalsIgnoreCase(Util.toHexString(digest)) || providedDigest.equalsIgnoreCase(Base64.getEncoder().encodeToString(digest)); } diff --git a/test/src/test/java/jenkins/telemetry/TelemetryTest.java b/test/src/test/java/jenkins/telemetry/TelemetryTest.java index 701ffa7e4d..d5606a4842 100644 --- a/test/src/test/java/jenkins/telemetry/TelemetryTest.java +++ b/test/src/test/java/jenkins/telemetry/TelemetryTest.java @@ -13,6 +13,7 @@ import static org.junit.Assert.assertTrue; import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; import hudson.ExtensionList; +import hudson.Util; import hudson.model.UnprotectedRootAction; import hudson.security.csrf.CrumbExclusion; import jakarta.servlet.FilterChain; @@ -31,7 +32,6 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.regex.Pattern; import net.sf.json.JSONObject; -import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.IOUtils; import org.junit.Before; import org.junit.Rule; @@ -99,7 +99,7 @@ public class TelemetryTest { .atMost(10, TimeUnit.SECONDS) .until(() -> types, hasItem("test-data")); //90ecf3ce1cd5ba1e5ad3cde7ad08a941e884f2e4d9bd463361715abab8efedc5 - assertThat(correlators, hasItem(DigestUtils.sha256Hex(correlationId + "test-data"))); + assertThat(correlators, hasItem(Util.getHexOfSHA256DigestOf(correlationId + "test-data"))); } @Test From 349b6cc7e8f5995af3b4f1ab8399e87bf6e907df Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 08:31:16 -0800 Subject: [PATCH 18/56] Update dependency io.jenkins.plugins:design-library to v355 (#10229) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 4d0f4685cf..005b151c19 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -344,7 +344,7 @@ THE SOFTWARE. io.jenkins.plugins design-library - 354.v87d9d5804b_c1 + 355.v0f007356e15d hpi ${project.build.outputDirectory}/plugins design-library.jpi From 417812769b8db52996eb2de36e87b4b440c8e97b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 11:13:49 -0800 Subject: [PATCH 19/56] Update dependency io.jenkins.plugins:gson-api to v2.12.1-113.v347686d6729f (#10231) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 91cd5225ab..46bca903ad 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -525,7 +525,7 @@ THE SOFTWARE. io.jenkins.plugins gson-api - 2.11.0-109.v1ef91dd0829a_ + 2.12.1-113.v347686d6729f hpi From 7a7f056e5d885fec90d65270acb5f22e23250ef6 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Fri, 31 Jan 2025 09:28:19 +0100 Subject: [PATCH 20/56] [JENKINS-58743] Allow to provide a custom path for master key --- .../security/DefaultConfidentialStore.java | 37 ++++++++++-- .../DefaultConfidentialStoreTest.java | 59 +++++++++++++++---- 2 files changed, 77 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/jenkins/security/DefaultConfidentialStore.java b/core/src/main/java/jenkins/security/DefaultConfidentialStore.java index 9c97c9ae3b..f8cc528575 100644 --- a/core/src/main/java/jenkins/security/DefaultConfidentialStore.java +++ b/core/src/main/java/jenkins/security/DefaultConfidentialStore.java @@ -1,5 +1,6 @@ package jenkins.security; +import edu.umd.cs.findbugs.annotations.NonNull; import hudson.FilePath; import hudson.Util; import hudson.util.Secret; @@ -19,19 +20,35 @@ import javax.crypto.CipherInputStream; import javax.crypto.CipherOutputStream; import javax.crypto.SecretKey; import jenkins.model.Jenkins; +import jenkins.util.SystemProperties; /** * Default portable implementation of {@link ConfidentialStore} that uses * a directory inside $JENKINS_HOME. - * - * The master key is also stored in this same directory. + *

+ * The master key is stored by default in $JENKINS_HOME/secrets/master.key but another location can be provided using the system property master.key.file. + *

+ * It is also possible to prevent the generation of the master key file using the system property -Dmaster.key.readOnly. In this case, the master key file must be provided or startup will fail. * * @author Kohsuke Kawaguchi */ // @MetaInfServices --- not annotated because this is the fallback implementation public class DefaultConfidentialStore extends ConfidentialStore { + static final String MASTER_KEY_FILE_SYSTEM_PROPERTY = "master.key.file"; + static final String MASTER_KEY_READONLY_SYSTEM_PROPERTY_NAME = "master.key.readOnly"; + private final SecureRandom sr = new SecureRandom(); + @NonNull + private static File getMasterKeyFile(File rootDir) { + var jenkinsMasterKey = SystemProperties.getString(MASTER_KEY_FILE_SYSTEM_PROPERTY); + if (jenkinsMasterKey != null) { + return new File(jenkinsMasterKey); + } else { + return new File(rootDir, "master.key"); + } + } + /** * Directory that stores individual keys. */ @@ -51,6 +68,10 @@ public class DefaultConfidentialStore extends ConfidentialStore { } public DefaultConfidentialStore(File rootDir) throws IOException, InterruptedException { + this(rootDir, getMasterKeyFile(rootDir)); + } + + protected DefaultConfidentialStore(File rootDir, File keyFile) throws IOException, InterruptedException { this.rootDir = rootDir; if (rootDir.mkdirs()) { // protect this directory. but don't change the permission of the existing directory @@ -58,11 +79,15 @@ public class DefaultConfidentialStore extends ConfidentialStore { new FilePath(rootDir).chmod(0700); } - TextFile masterSecret = new TextFile(new File(rootDir, "master.key")); + TextFile masterSecret = new TextFile(keyFile); if (!masterSecret.exists()) { - // we are only going to use small number of bits (since export control limits AES key length) - // but let's generate a long enough key anyway - masterSecret.write(Util.toHexString(randomBytes(128))); + if (SystemProperties.getBoolean(MASTER_KEY_READONLY_SYSTEM_PROPERTY_NAME)) { + throw new IOException(masterSecret + " does not exist and system property " + MASTER_KEY_READONLY_SYSTEM_PROPERTY_NAME + " is set. You must provide a valid master key file."); + } else { + // we are only going to use small number of bits (since export control limits AES key length) + // but let's generate a long enough key anyway + masterSecret.write(Util.toHexString(randomBytes(128))); + } } this.masterKey = Util.toAes128Key(masterSecret.readTrim()); } diff --git a/core/src/test/java/jenkins/security/DefaultConfidentialStoreTest.java b/core/src/test/java/jenkins/security/DefaultConfidentialStoreTest.java index 117e1d5b18..bab1f7b1a8 100644 --- a/core/src/test/java/jenkins/security/DefaultConfidentialStoreTest.java +++ b/core/src/test/java/jenkins/security/DefaultConfidentialStoreTest.java @@ -7,10 +7,15 @@ import static org.junit.Assert.assertTrue; import hudson.FilePath; import hudson.Functions; +import hudson.Util; +import hudson.util.TextFile; import java.io.File; +import java.io.IOException; import java.nio.charset.MalformedInputException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.security.SecureRandom; +import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -20,6 +25,8 @@ public class DefaultConfidentialStoreTest { @Rule public TemporaryFolder tmpRule = new TemporaryFolder(); + private final SecureRandom sr = new SecureRandom(); + @Test public void roundtrip() throws Exception { File tmp = new File(tmpRule.getRoot(), "tmp"); // let ConfidentialStore create a directory @@ -27,20 +34,8 @@ public class DefaultConfidentialStoreTest { DefaultConfidentialStore store = new DefaultConfidentialStore(tmp); ConfidentialKey key = new ConfidentialKey("test") {}; - // basic roundtrip - String str = "Hello world!"; - store.store(key, str.getBytes(StandardCharsets.UTF_8)); - assertEquals(str, new String(store.load(key), StandardCharsets.UTF_8)); - - // data storage should have some stuff - assertTrue(new File(tmp, "test").exists()); assertTrue(new File(tmp, "master.key").exists()); - - assertThrows(MalformedInputException.class, () -> Files.readString(tmp.toPath().resolve("test"), StandardCharsets.UTF_8)); // the data shouldn't be a plain text, obviously - - if (!Functions.isWindows()) { - assertEquals(0700, new FilePath(tmp).mode() & 0777); // should be read only - } + roundTrip(store, key, tmp); // if the master key changes, we should gracefully fail to load the store new File(tmp, "master.key").delete(); @@ -49,4 +44,42 @@ public class DefaultConfidentialStoreTest { assertNull(store2.load(key)); } + private static void roundTrip(DefaultConfidentialStore store, ConfidentialKey key, File tmp) throws IOException, InterruptedException { + // basic roundtrip + String str = "Hello world!"; + store.store(key, str.getBytes(StandardCharsets.UTF_8)); + assertEquals(str, new String(store.load(key), StandardCharsets.UTF_8)); + + // data storage should have some stuff + assertTrue(new File(tmp, "test").exists()); + + assertThrows(MalformedInputException.class, () -> Files.readString(tmp.toPath().resolve("test"), StandardCharsets.UTF_8)); // the data shouldn't be a plain text, obviously + + if (!Functions.isWindows()) { + assertEquals(0700, new FilePath(tmp).mode() & 0777); // should be read only + } + } + + @Test + public void masterKeyGeneratedBeforehand() throws IOException, InterruptedException { + File external = new File(tmpRule.getRoot(), "external"); + File tmp = new File(tmpRule.getRoot(), "tmp"); + var masterKeyFile = new File(external, "master.key"); + new TextFile(masterKeyFile).write(Util.toHexString(randomBytes(128))); + System.setProperty(DefaultConfidentialStore.MASTER_KEY_FILE_SYSTEM_PROPERTY, masterKeyFile.getAbsolutePath()); + System.setProperty(DefaultConfidentialStore.MASTER_KEY_READONLY_SYSTEM_PROPERTY_NAME, "true"); + DefaultConfidentialStore store = new DefaultConfidentialStore(tmp); + ConfidentialKey key = new ConfidentialKey("test") {}; + roundTrip(store, key, tmp); + // With this configuration, the master key file deletion is fatal + masterKeyFile.delete(); + assertThrows(IOException.class, () -> new DefaultConfidentialStore(tmp)); + } + + private byte[] randomBytes(int size) { + byte[] random = new byte[size]; + sr.nextBytes(random); + return random; + } + } From 5748d3105e5e0949489776ee700a73c61ebb28a7 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Tue, 4 Feb 2025 10:33:23 +0100 Subject: [PATCH 21/56] Spotless --- .../java/jenkins/security/DefaultConfidentialStore.java | 8 ++++---- .../jenkins/security/DefaultConfidentialStoreTest.java | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/jenkins/security/DefaultConfidentialStore.java b/core/src/main/java/jenkins/security/DefaultConfidentialStore.java index f8cc528575..3fdae97486 100644 --- a/core/src/main/java/jenkins/security/DefaultConfidentialStore.java +++ b/core/src/main/java/jenkins/security/DefaultConfidentialStore.java @@ -26,16 +26,16 @@ import jenkins.util.SystemProperties; * Default portable implementation of {@link ConfidentialStore} that uses * a directory inside $JENKINS_HOME. *

- * The master key is stored by default in $JENKINS_HOME/secrets/master.key but another location can be provided using the system property master.key.file. + * The master key is stored by default in $JENKINS_HOME/secrets/master.key but another location can be provided using the system property jenkins.master.key.file. *

- * It is also possible to prevent the generation of the master key file using the system property -Dmaster.key.readOnly. In this case, the master key file must be provided or startup will fail. + * It is also possible to prevent the generation of the master key file using the system property -Djenkins.master.key.readOnly. In this case, the master key file must be provided or startup will fail. * * @author Kohsuke Kawaguchi */ // @MetaInfServices --- not annotated because this is the fallback implementation public class DefaultConfidentialStore extends ConfidentialStore { - static final String MASTER_KEY_FILE_SYSTEM_PROPERTY = "master.key.file"; - static final String MASTER_KEY_READONLY_SYSTEM_PROPERTY_NAME = "master.key.readOnly"; + static final String MASTER_KEY_FILE_SYSTEM_PROPERTY = "jenkins.master.key.file"; + static final String MASTER_KEY_READONLY_SYSTEM_PROPERTY_NAME = "jenkins.master.key.readOnly"; private final SecureRandom sr = new SecureRandom(); diff --git a/core/src/test/java/jenkins/security/DefaultConfidentialStoreTest.java b/core/src/test/java/jenkins/security/DefaultConfidentialStoreTest.java index bab1f7b1a8..eb6cc8c993 100644 --- a/core/src/test/java/jenkins/security/DefaultConfidentialStoreTest.java +++ b/core/src/test/java/jenkins/security/DefaultConfidentialStoreTest.java @@ -15,7 +15,6 @@ import java.nio.charset.MalformedInputException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.security.SecureRandom; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; From 11d1fa7b98e2a13952519e6e0b8a4346fbee672d Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 4 Feb 2025 13:21:12 +0100 Subject: [PATCH 22/56] Better document lib.hudson.widget-refresh --- core/src/main/resources/lib/hudson/widget-refresh.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/lib/hudson/widget-refresh.js b/core/src/main/resources/lib/hudson/widget-refresh.js index 8d406488a0..e38709f744 100644 --- a/core/src/main/resources/lib/hudson/widget-refresh.js +++ b/core/src/main/resources/lib/hudson/widget-refresh.js @@ -1,10 +1,17 @@ +/* global Behaviour, refreshPart */ +/** + * Use the `widget-refresh-reference` class on an element with `data-id` and `data-url` attributes. + * The content from the URL will be used to replace the element with the specified ID. + * Usually the URL content is an element with the same ID as specified here, to allow continuous updates. + * This is primarily used for sidepanel widgets, but not exclusively. + */ Behaviour.specify( ".widget-refresh-reference", "widget-refresh", 0, function (e) { - var id = e.getAttribute("data-id"); - var url = e.getAttribute("data-url"); + let id = e.getAttribute("data-id"); + let url = e.getAttribute("data-url"); refreshPart(id, url); }, ); From 484a617ea9837fd3bb0b5178ad1b7aa4ae40c54b Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Tue, 4 Feb 2025 13:38:06 +0000 Subject: [PATCH 23/56] [maven-release-plugin] prepare release jenkins-2.496 --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 6 +++--- test/pom.xml | 2 +- war/pom.xml | 2 +- websocket/jetty12-ee9/pom.xml | 2 +- websocket/spi/pom.xml | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index bf3390eed5..8181b0ec7e 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.496 jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index 2473629d23..b27e6290e6 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.496 cli diff --git a/core/pom.xml b/core/pom.xml index 0c9b072e0b..368ce9faa2 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.496 jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index fe1e89a120..32f600f2a6 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.496 jenkins-coverage diff --git a/pom.xml b/pom.xml index ba0bb25bd4..17b5948915 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.496 pom Jenkins main module @@ -63,7 +63,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - ${scmTag} + jenkins-2.496 https://github.com/jenkinsci/jenkins @@ -75,7 +75,7 @@ THE SOFTWARE. 2.496 -SNAPSHOT - 2025-01-28T13:58:52Z + 2025-02-04T10:33:32Z github diff --git a/test/pom.xml b/test/pom.xml index 005b151c19..5d6c73112c 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.496 jenkins-test diff --git a/war/pom.xml b/war/pom.xml index 46bca903ad..e2b455249f 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.496 jenkins-war diff --git a/websocket/jetty12-ee9/pom.xml b/websocket/jetty12-ee9/pom.xml index 2253163b3c..8f734089e2 100644 --- a/websocket/jetty12-ee9/pom.xml +++ b/websocket/jetty12-ee9/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.496 ../.. diff --git a/websocket/spi/pom.xml b/websocket/spi/pom.xml index 178413f92c..305227e5b5 100644 --- a/websocket/spi/pom.xml +++ b/websocket/spi/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.496 ../.. From 630b6b63abcf30959c7b1457a19e155e5f18a436 Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Tue, 4 Feb 2025 13:38:22 +0000 Subject: [PATCH 24/56] [maven-release-plugin] prepare for next development iteration --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 8 ++++---- test/pom.xml | 2 +- war/pom.xml | 2 +- websocket/jetty12-ee9/pom.xml | 2 +- websocket/spi/pom.xml | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index 8181b0ec7e..bf3390eed5 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.496 + ${revision}${changelist} jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index b27e6290e6..2473629d23 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.496 + ${revision}${changelist} cli diff --git a/core/pom.xml b/core/pom.xml index 368ce9faa2..0c9b072e0b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.496 + ${revision}${changelist} jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index 32f600f2a6..fe1e89a120 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.496 + ${revision}${changelist} jenkins-coverage diff --git a/pom.xml b/pom.xml index 17b5948915..f53f0578ea 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.496 + ${revision}${changelist} pom Jenkins main module @@ -63,7 +63,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - jenkins-2.496 + ${scmTag} https://github.com/jenkinsci/jenkins @@ -73,9 +73,9 @@ THE SOFTWARE. - 2.496 + 2.497 -SNAPSHOT - 2025-02-04T10:33:32Z + 2025-02-04T13:38:06Z github diff --git a/test/pom.xml b/test/pom.xml index 5d6c73112c..005b151c19 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.496 + ${revision}${changelist} jenkins-test diff --git a/war/pom.xml b/war/pom.xml index e2b455249f..46bca903ad 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.496 + ${revision}${changelist} jenkins-war diff --git a/websocket/jetty12-ee9/pom.xml b/websocket/jetty12-ee9/pom.xml index 8f734089e2..2253163b3c 100644 --- a/websocket/jetty12-ee9/pom.xml +++ b/websocket/jetty12-ee9/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.496 + ${revision}${changelist} ../.. diff --git a/websocket/spi/pom.xml b/websocket/spi/pom.xml index 305227e5b5..178413f92c 100644 --- a/websocket/spi/pom.xml +++ b/websocket/spi/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.496 + ${revision}${changelist} ../.. From 14c6a25786721979e209dfd4c9d193c62c39a46e Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 4 Feb 2025 14:54:03 -0500 Subject: [PATCH 25/56] `CronTab.floor` / `.ceil` should return times at minute granularity --- .../main/java/hudson/scheduler/CronTab.java | 7 +++++++ .../java/hudson/scheduler/CronTabTest.java | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/core/src/main/java/hudson/scheduler/CronTab.java b/core/src/main/java/hudson/scheduler/CronTab.java index 2c4b188a0d..86e5d28758 100644 --- a/core/src/main/java/hudson/scheduler/CronTab.java +++ b/core/src/main/java/hudson/scheduler/CronTab.java @@ -371,6 +371,11 @@ public final class CronTab { * (e.g. Jun 31) date, or at least a date too rare to be useful. This addresses JENKINS-41864 and was added in 2.49 */ public Calendar ceil(Calendar cal) { + if (cal.get(Calendar.SECOND) > 0 || cal.get(Calendar.MILLISECOND) > 0) { + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.add(Calendar.MINUTE, 1); + } Calendar twoYearsFuture = (Calendar) cal.clone(); twoYearsFuture.add(Calendar.YEAR, 2); OUTER: @@ -440,6 +445,8 @@ public final class CronTab { * (e.g. Jun 31) date, or at least a date too rare to be useful. This addresses JENKINS-41864 and was added in 2.49 */ public Calendar floor(Calendar cal) { + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); Calendar twoYearsAgo = (Calendar) cal.clone(); twoYearsAgo.add(Calendar.YEAR, -2); diff --git a/core/src/test/java/hudson/scheduler/CronTabTest.java b/core/src/test/java/hudson/scheduler/CronTabTest.java index 0ae6ae0f22..352e72f3a5 100644 --- a/core/src/test/java/hudson/scheduler/CronTabTest.java +++ b/core/src/test/java/hudson/scheduler/CronTabTest.java @@ -27,6 +27,7 @@ package hudson.scheduler; import static java.util.Calendar.MONDAY; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; @@ -340,6 +341,24 @@ public class CronTabTest { assertEquals("[35, 56]", times.toString()); } + @Test public void floorCeilMinuteGranularity() throws Exception { + var tab = new CronTab("*/5 * * * *"); + assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 15, 23), "Mar 4, 2025, 2:15:00 PM", "Mar 4, 2025, 2:20:00 PM"); + assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 19, 23), "Mar 4, 2025, 2:15:00 PM", "Mar 4, 2025, 2:20:00 PM"); + assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 16, 0), "Mar 4, 2025, 2:15:00 PM", "Mar 4, 2025, 2:20:00 PM"); + assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 19, 0), "Mar 4, 2025, 2:15:00 PM", "Mar 4, 2025, 2:20:00 PM"); + assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 15, 0), "Mar 4, 2025, 2:15:00 PM", "Mar 4, 2025, 2:15:00 PM"); + } + + private static void assertFloorCeil(CronTab tab, Calendar now, String expectedFloor, String expectedCeil) { + var fmt = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); + var nowFormatted = fmt.format(now.getTime()); + var nowClone = (Calendar) now.clone(); + assertThat("floor of " + nowFormatted, fmt.format(tab.floor(nowClone).getTime()), is(expectedFloor)); + nowClone = (Calendar) now.clone(); + assertThat("ceil of " + nowFormatted, fmt.format(tab.ceil(nowClone).getTime()), is(expectedCeil)); + } + @Issue("SECURITY-790") @Test(timeout = 1000L) public void testLongMonths() throws Exception { Calendar cal = Calendar.getInstance(); From 6c16c347f3ae1aaa2f171c7b5cf04fdf05b467dd Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Wed, 5 Feb 2025 12:26:53 +0100 Subject: [PATCH 26/56] Rename system properties --- .../main/java/jenkins/security/DefaultConfidentialStore.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/jenkins/security/DefaultConfidentialStore.java b/core/src/main/java/jenkins/security/DefaultConfidentialStore.java index 3fdae97486..2a2b602c22 100644 --- a/core/src/main/java/jenkins/security/DefaultConfidentialStore.java +++ b/core/src/main/java/jenkins/security/DefaultConfidentialStore.java @@ -34,8 +34,8 @@ import jenkins.util.SystemProperties; */ // @MetaInfServices --- not annotated because this is the fallback implementation public class DefaultConfidentialStore extends ConfidentialStore { - static final String MASTER_KEY_FILE_SYSTEM_PROPERTY = "jenkins.master.key.file"; - static final String MASTER_KEY_READONLY_SYSTEM_PROPERTY_NAME = "jenkins.master.key.readOnly"; + static final String MASTER_KEY_FILE_SYSTEM_PROPERTY = DefaultConfidentialStore.class.getName() + ".file"; + static final String MASTER_KEY_READONLY_SYSTEM_PROPERTY_NAME = DefaultConfidentialStore.class.getName() + ".readOnly"; private final SecureRandom sr = new SecureRandom(); From 047e875d029c1f0f876ac5a229082ff9cc690e6f Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Wed, 5 Feb 2025 12:27:17 +0100 Subject: [PATCH 27/56] Fail fast if the confidential store can't be loaded --- core/src/main/java/jenkins/model/Jenkins.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 802681c939..b294017239 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -974,6 +974,9 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve ClassFilterImpl.register(); LOGGER.info("Starting version " + getVersion()); + // Sanity check that we can load the confidential store. Fail fast if we can't. + ConfidentialStore.get(); + // initialization consists of ... executeReactor(is, pluginManager.initTasks(is), // loading and preparing plugins From 092756b83ba50652c23945ad4d2b43761da0c6bd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 11:18:58 -0800 Subject: [PATCH 28/56] Update dependency io.jenkins.plugins:checks-api to v2.2.2 (#10241) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 46bca903ad..31e457d5ce 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -344,7 +344,7 @@ THE SOFTWARE. io.jenkins.plugins checks-api - 2.2.1 + 2.2.2 hpi From 832ba1d6c69607c36e5e4360915798dec4d6b4d8 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 5 Feb 2025 18:25:02 -0500 Subject: [PATCH 29/56] More stable date formatting https://github.com/jenkinsci/jenkins/pull/10239#discussion_r1943013763 --- .../java/hudson/scheduler/CronTabTest.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/core/src/test/java/hudson/scheduler/CronTabTest.java b/core/src/test/java/hudson/scheduler/CronTabTest.java index 352e72f3a5..a75c7d7f31 100644 --- a/core/src/test/java/hudson/scheduler/CronTabTest.java +++ b/core/src/test/java/hudson/scheduler/CronTabTest.java @@ -34,12 +34,15 @@ import static org.junit.Assert.assertThrows; import antlr.ANTLRException; import java.text.DateFormat; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; import java.util.TimeZone; +import java.util.function.Function; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -343,20 +346,20 @@ public class CronTabTest { @Test public void floorCeilMinuteGranularity() throws Exception { var tab = new CronTab("*/5 * * * *"); - assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 15, 23), "Mar 4, 2025, 2:15:00 PM", "Mar 4, 2025, 2:20:00 PM"); - assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 19, 23), "Mar 4, 2025, 2:15:00 PM", "Mar 4, 2025, 2:20:00 PM"); - assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 16, 0), "Mar 4, 2025, 2:15:00 PM", "Mar 4, 2025, 2:20:00 PM"); - assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 19, 0), "Mar 4, 2025, 2:15:00 PM", "Mar 4, 2025, 2:20:00 PM"); - assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 15, 0), "Mar 4, 2025, 2:15:00 PM", "Mar 4, 2025, 2:15:00 PM"); + assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 15, 23), "2025-03-04T14:15:00", "2025-03-04T14:20:00"); + assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 19, 23), "2025-03-04T14:15:00", "2025-03-04T14:20:00"); + assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 16, 0), "2025-03-04T14:15:00", "2025-03-04T14:20:00"); + assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 19, 0), "2025-03-04T14:15:00", "2025-03-04T14:20:00"); + assertFloorCeil(tab, new GregorianCalendar(2025, 2, 4, 14, 15, 0), "2025-03-04T14:15:00", "2025-03-04T14:15:00"); } private static void assertFloorCeil(CronTab tab, Calendar now, String expectedFloor, String expectedCeil) { - var fmt = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); - var nowFormatted = fmt.format(now.getTime()); + Function fmt = c -> ZonedDateTime.ofInstant(c.toInstant(), c.getTimeZone().toZoneId()).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); + var nowFormatted = fmt.apply(now); var nowClone = (Calendar) now.clone(); - assertThat("floor of " + nowFormatted, fmt.format(tab.floor(nowClone).getTime()), is(expectedFloor)); + assertThat("floor of " + nowFormatted, fmt.apply(tab.floor(nowClone)), is(expectedFloor)); nowClone = (Calendar) now.clone(); - assertThat("ceil of " + nowFormatted, fmt.format(tab.ceil(nowClone).getTime()), is(expectedCeil)); + assertThat("ceil of " + nowFormatted, fmt.apply(tab.ceil(nowClone)), is(expectedCeil)); } @Issue("SECURITY-790") From 9e8794c3f9b8e3d69d56a3a158b85a6c3debbabe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 11:04:59 -0800 Subject: [PATCH 30/56] Update dependency org.jenkins-ci.plugins:credentials to v1408 (#10244) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 005b151c19..41d5bcefc0 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -224,7 +224,7 @@ THE SOFTWARE. org.jenkins-ci.plugins credentials - 1405.vb_cda_74a_f8974 + 1408.va_622a_b_f5b_1b_1 test From bad86cc6e4f0fb52a322e4392b6cb4b396e963a6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 11:05:50 -0800 Subject: [PATCH 31/56] Update dependency org.jenkins-ci.modules:sshd to v3.350.v1080103a_10fd (#10242) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index a58c6e2797..aafcfab57a 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -462,7 +462,7 @@ THE SOFTWARE. org.jenkins-ci.modules sshd - 3.330.vc866a_8389b_58 + 3.350.v1080103a_10fd hpi From 4f185213d2153c262471448d64d3139913115f31 Mon Sep 17 00:00:00 2001 From: Alexander Brandes Date: Fri, 7 Feb 2025 09:57:22 +0100 Subject: [PATCH 32/56] Update Plugin count (#10246) Signed-off-by: Alexander Brandes --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e69e309272..5a4524d6ec 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ [![Gitter](https://img.shields.io/gitter/room/jenkinsci/jenkins)](https://app.gitter.im/#/room/#jenkinsci_jenkins:gitter.im) In a nutshell, Jenkins is the leading open-source automation server. -Built with Java, it provides over 1,800 [plugins](https://plugins.jenkins.io/) to support automating virtually anything, +Built with Java, it provides over 2,000 [plugins](https://plugins.jenkins.io/) to support automating virtually anything, so that humans can spend their time doing things machines cannot. # What to Use Jenkins for and When to Use It From 3b3c41c6677ec3471150d9cc4c2f2969ccac00ba Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Fri, 7 Feb 2025 16:24:02 +0100 Subject: [PATCH 33/56] Remove comment due to duplicate declaration warning --- core/src/main/resources/lib/hudson/widget-refresh.js | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/resources/lib/hudson/widget-refresh.js b/core/src/main/resources/lib/hudson/widget-refresh.js index e38709f744..68f2202b8f 100644 --- a/core/src/main/resources/lib/hudson/widget-refresh.js +++ b/core/src/main/resources/lib/hudson/widget-refresh.js @@ -1,4 +1,3 @@ -/* global Behaviour, refreshPart */ /** * Use the `widget-refresh-reference` class on an element with `data-id` and `data-url` attributes. * The content from the URL will be used to replace the element with the specified ID. From 6fd9121623b9f297f5752a2492c6434d9ac688e7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 07:35:13 -0700 Subject: [PATCH 34/56] Update dependency org.jenkins-ci.plugins.workflow:workflow-support to v946 (#10243) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- war/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/pom.xml b/test/pom.xml index 41d5bcefc0..5f7064f31b 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -134,7 +134,7 @@ THE SOFTWARE. org.jenkins-ci.plugins.workflow workflow-support - 944.v5a_859593b_98a_ + 946.v2a_79d8a_4b_e14 diff --git a/war/pom.xml b/war/pom.xml index aafcfab57a..0a8335f526 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -352,7 +352,7 @@ THE SOFTWARE. org.jenkins-ci.plugins.workflow workflow-support - 944.v5a_859593b_98a_ + 946.v2a_79d8a_4b_e14 hpi From f8c9f3753ca2df1d795673d5c7f625ae685c165b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 07:35:23 -0700 Subject: [PATCH 35/56] Update dependency org.jenkins-ci.plugins:apache-httpcomponents-client-4-api to v4.5.14-269.vfa_2321039a_83 (#10247) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 0a8335f526..13efe46422 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -497,7 +497,7 @@ THE SOFTWARE. org.jenkins-ci.plugins apache-httpcomponents-client-4-api - 4.5.14-208.v438351942757 + 4.5.14-269.vfa_2321039a_83 hpi From e61ecca4fcd9c13b9c07e18555b0dc4159d6d69d Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Sat, 8 Feb 2025 06:37:48 -0800 Subject: [PATCH 36/56] Migrate from deprecated EE 8 methods to non-deprecated equivalents (#10233) * Migrate from deprecated EE 8 methods to non-deprecated equivalents * Clean up `GlobalComputerRetentionCheckIntervalConfiguration` as well --- core/src/main/java/hudson/Functions.java | 2 +- .../java/jenkins/console/ConsoleUrlProvider.java | 2 +- ...omputerRetentionCheckIntervalConfiguration.java | 4 ++-- .../java/jenkins/model/GlobalConfiguration.java | 2 +- .../resources/hudson/PluginManager/available.jelly | 2 +- .../resources/hudson/PluginManager/installed.jelly | 2 +- .../resources/hudson/PluginManager/updates.jelly | 2 +- .../diagnosis/MemoryUsageMonitor/index.jelly | 2 +- .../AbstractModelObject/descriptionForm.jelly | 4 ++-- .../hudson/model/AbstractProject/changes.jelly | 4 ++-- .../resources/hudson/model/AllView/noJob.groovy | 2 +- .../resources/hudson/model/ComputerSet/_new.jelly | 4 ++-- .../hudson/model/ParametersAction/index.jelly | 2 +- .../model/ParametersDefinitionProperty/index.jelly | 2 +- .../resources/hudson/model/Run/delete-retry.jelly | 2 +- .../main/resources/hudson/model/View/index.jelly | 2 +- .../hudson/search/Search/search-failed.jelly | 4 ++-- .../GlobalSecurityConfiguration/index.groovy | 2 +- .../HudsonPrivateSecurityRealm/signup.jelly | 4 ++-- .../resources/hudson/security/WhoAmI/index.jelly | 2 +- .../hudson/util/HudsonIsLoading/index.jelly | 2 +- .../hudson/util/HudsonIsRestarting/index.jelly | 2 +- .../resources/jenkins/agents/CloudSet/_new.jelly | 2 +- .../SetupWizard/authenticate-security-token.jelly | 2 +- .../resources/jenkins/model/Jenkins/_404.jelly | 6 +++--- .../jenkins/model/Jenkins/_404_simple.jelly | 2 +- .../resources/jenkins/model/Jenkins/login.jelly | 8 ++++---- .../resources/jenkins/model/Jenkins/oops.jelly | 6 +++--- .../model/Jenkins/projectRelationship.jelly | 14 +++++++------- .../security/seed/UserSeedProperty/config.jelly | 2 +- .../main/resources/lib/form/editableComboBox.jelly | 4 ++-- .../main/resources/lib/hudson/scriptConsole.jelly | 2 +- .../main/resources/lib/layout/breadcrumbBar.jelly | 2 +- core/src/main/resources/lib/layout/layout.jelly | 4 ++-- ...terRetentionCheckIntervalConfigurationTest.java | 4 ++-- 35 files changed, 57 insertions(+), 57 deletions(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 3ae81031b0..6c2d0b7a0e 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -1989,7 +1989,7 @@ public class Functions { */ public static @CheckForNull String getConsoleUrl(WithConsoleUrl withConsoleUrl) { String consoleUrl = withConsoleUrl.getConsoleUrl(); - return consoleUrl != null ? Stapler.getCurrentRequest().getContextPath() + '/' + consoleUrl : null; + return consoleUrl != null ? Stapler.getCurrentRequest2().getContextPath() + '/' + consoleUrl : null; } /** diff --git a/core/src/main/java/jenkins/console/ConsoleUrlProvider.java b/core/src/main/java/jenkins/console/ConsoleUrlProvider.java index 9c6080ac02..f779c07e62 100644 --- a/core/src/main/java/jenkins/console/ConsoleUrlProvider.java +++ b/core/src/main/java/jenkins/console/ConsoleUrlProvider.java @@ -80,7 +80,7 @@ public interface ConsoleUrlProvider extends Describable { * @return the URL for the console for the specified build, relative to the web server root */ static @NonNull String getRedirectUrl(Run run) { - return Stapler.getCurrentRequest().getContextPath() + '/' + run.getConsoleUrl(); + return Stapler.getCurrentRequest2().getContextPath() + '/' + run.getConsoleUrl(); } static List all() { diff --git a/core/src/main/java/jenkins/model/GlobalComputerRetentionCheckIntervalConfiguration.java b/core/src/main/java/jenkins/model/GlobalComputerRetentionCheckIntervalConfiguration.java index 46d760fe8e..9766cd9772 100644 --- a/core/src/main/java/jenkins/model/GlobalComputerRetentionCheckIntervalConfiguration.java +++ b/core/src/main/java/jenkins/model/GlobalComputerRetentionCheckIntervalConfiguration.java @@ -6,7 +6,7 @@ import java.util.logging.Logger; import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; -import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerRequest2; /** * Configures check interval for computer retention. @@ -56,7 +56,7 @@ public class GlobalComputerRetentionCheckIntervalConfiguration extends GlobalCon } @Override - public boolean configure(StaplerRequest req, JSONObject json) throws FormException { + public boolean configure(StaplerRequest2 req, JSONObject json) throws FormException { try { final int interval = json.getInt("computerRetentionCheckInterval"); setComputerRetentionCheckInterval(interval); diff --git a/core/src/main/java/jenkins/model/GlobalConfiguration.java b/core/src/main/java/jenkins/model/GlobalConfiguration.java index af788945b2..bc0d700403 100644 --- a/core/src/main/java/jenkins/model/GlobalConfiguration.java +++ b/core/src/main/java/jenkins/model/GlobalConfiguration.java @@ -67,7 +67,7 @@ public abstract class GlobalConfiguration extends Descriptor + value="${request2.getParameter('filter')}" />

diff --git a/core/src/main/resources/hudson/PluginManager/installed.jelly b/core/src/main/resources/hudson/PluginManager/installed.jelly index c9b7dd93f2..81b175b955 100644 --- a/core/src/main/resources/hudson/PluginManager/installed.jelly +++ b/core/src/main/resources/hudson/PluginManager/installed.jelly @@ -43,7 +43,7 @@ THE SOFTWARE. placeholder="${%Search installed plugins}" id="filter-box" autofocus="true" - value="${request.getParameter('filter')}" + value="${request2.getParameter('filter')}" enabled="${!noPlugins}" />
diff --git a/core/src/main/resources/hudson/PluginManager/updates.jelly b/core/src/main/resources/hudson/PluginManager/updates.jelly index d4163fb7cf..5ce8a810ff 100644 --- a/core/src/main/resources/hudson/PluginManager/updates.jelly +++ b/core/src/main/resources/hudson/PluginManager/updates.jelly @@ -41,7 +41,7 @@ THE SOFTWARE. placeholder="${%Search plugin updates}" id="filter-box" autofocus="true" - value="${request.getParameter('filter')}" + value="${request2.getParameter('filter')}" enabled="${!empty(list)}" />
diff --git a/core/src/main/resources/hudson/diagnosis/MemoryUsageMonitor/index.jelly b/core/src/main/resources/hudson/diagnosis/MemoryUsageMonitor/index.jelly index bb0efd378e..43c579130a 100644 --- a/core/src/main/resources/hudson/diagnosis/MemoryUsageMonitor/index.jelly +++ b/core/src/main/resources/hudson/diagnosis/MemoryUsageMonitor/index.jelly @@ -31,7 +31,7 @@ THE SOFTWARE.

${%JVM Memory Usage}

- +
${%Timespan}: diff --git a/core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm.jelly b/core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm.jelly index 633e67f356..b1754861c0 100644 --- a/core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm.jelly +++ b/core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm.jelly @@ -30,14 +30,14 @@ THE SOFTWARE. - + - +
diff --git a/core/src/main/resources/hudson/model/AbstractProject/changes.jelly b/core/src/main/resources/hudson/model/AbstractProject/changes.jelly index bc2ad59d22..dd6ec243a7 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/changes.jelly +++ b/core/src/main/resources/hudson/model/AbstractProject/changes.jelly @@ -31,8 +31,8 @@ THE SOFTWARE. - - + +

diff --git a/core/src/main/resources/hudson/model/AllView/noJob.groovy b/core/src/main/resources/hudson/model/AllView/noJob.groovy index f62125fed9..6a9e355d30 100644 --- a/core/src/main/resources/hudson/model/AllView/noJob.groovy +++ b/core/src/main/resources/hudson/model/AllView/noJob.groovy @@ -111,7 +111,7 @@ div { section(class: "empty-state-section") { ul(class: "empty-state-section-list") { li(class: "content-block") { - a(href: "${rootURL}/${app.securityRealm.loginUrl}?from=${request.requestURI}", + a(href: "${rootURL}/${app.securityRealm.loginUrl}?from=${request2.requestURI}", class: "content-block__link") { span(_("Log in to Jenkins")) span(class: "trailing-icon") { diff --git a/core/src/main/resources/hudson/model/ComputerSet/_new.jelly b/core/src/main/resources/hudson/model/ComputerSet/_new.jelly index 36e2f23fd7..5d3a79782e 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/_new.jelly +++ b/core/src/main/resources/hudson/model/ComputerSet/_new.jelly @@ -32,7 +32,7 @@ THE SOFTWARE. - + @@ -40,7 +40,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/hudson/model/ParametersAction/index.jelly b/core/src/main/resources/hudson/model/ParametersAction/index.jelly index a035793cfa..c8e8bf3aaf 100644 --- a/core/src/main/resources/hudson/model/ParametersAction/index.jelly +++ b/core/src/main/resources/hudson/model/ParametersAction/index.jelly @@ -30,7 +30,7 @@ THE SOFTWARE. - + ${title} diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly index 1302960c1a..0bea62baf0 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly @@ -40,7 +40,7 @@ THE SOFTWARE.

${it.job.pronoun} ${it.job.displayName}

${%description}

- + diff --git a/core/src/main/resources/hudson/model/Run/delete-retry.jelly b/core/src/main/resources/hudson/model/Run/delete-retry.jelly index 79dfa6beed..5e405e5284 100644 --- a/core/src/main/resources/hudson/model/Run/delete-retry.jelly +++ b/core/src/main/resources/hudson/model/Run/delete-retry.jelly @@ -20,7 +20,7 @@

diff --git a/core/src/main/resources/hudson/model/View/index.jelly b/core/src/main/resources/hudson/model/View/index.jelly index 14632b8e60..661e2e22ce 100644 --- a/core/src/main/resources/hudson/model/View/index.jelly +++ b/core/src/main/resources/hudson/model/View/index.jelly @@ -44,7 +44,7 @@ THE SOFTWARE. -