<?xml version='1.0' encoding='utf-8' ?>
<feed xml:lang='en-US' xmlns='http://www.w3.org/2005/Atom'>
<id>https://www.jenkins.io/</id>
<title>Jenkins Blog</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<link rel="self" type="application/atom+xml" href="https://www.jenkins.io/rss.xml" />
<link rel="alternate" type="text/html" href="https://www.jenkins.io/" />
<entry>
<id>https://www.jenkins.io/blog/2026/09/11/arjun-713-final-blog/</id>
<title>GSoC 2026 Final Blog: How It Was to Be a Contributor at Jenkins</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-09-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/09/11/arjun-713-final-blog/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='jenkins'></category>
<category term='ai'></category>
<category term='chatbot'></category>
<category term='rag'></category>
<category term='jenkins-plugin'></category>
<category term='open-source'></category>
<summary>
Hello everyone!


I am Mallikarjun G D, and I have been a GSoC 2026 contributor for the project Continue: AI-Powered Chatbot for Quick Access to Jenkins Resources.
Over the past few months, I have learnt a lot, not just about AI and Jenkins, but also about contributing to a large open-source project.
So for my final GSoC blog, I wanted to share how the whole journey actually went.


Before GSoC


My journey with Jenkins started pretty randomly.
I was learning Jenkins, got curious about its open-source codebase, and while exploring the GitHub organization, I stumbled across the resources-ai-chatbot-plugin.


I found out it had started as a GSoC...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello everyone!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am Mallikarjun G D, and I have been a GSoC 2026 contributor for the project &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/continue-ai-powered-chatbot-for-quick-access-to-jenkins-resources/&quot;&gt;Continue: AI-Powered Chatbot for Quick Access to Jenkins Resources&lt;/a&gt;.
Over the past few months, I have learnt a lot, not just about AI and Jenkins, but also about contributing to a large open-source project.
So for my final GSoC blog, I wanted to share how the whole journey actually went.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;before-gsoc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#before-gsoc&quot; /&gt;Before GSoC&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My journey with Jenkins started pretty randomly.
I was learning Jenkins, got curious about its open-source codebase, and while exploring the GitHub organization, I stumbled across the &lt;code&gt;resources-ai-chatbot-plugin&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I found out it had started as a GSoC 2025 project, cloned it, tried running it, and eventually filtered the Issues page by &lt;code&gt;good-first-issue&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And of course, I found a README issue the classic open-source starter pack.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I worked on a small setup guide, fixed a few missing links, and opened my first pull request.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;And there it was my first open-source PR.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After that, I slowly moved from documentation issues toward code-related contributions.
By the time GSoC applications opened, I had around five or six PRs and a much better understanding of the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I started my proposal early, focused on areas that matched both the project priorities and what I wanted to learn, went through the interview, and then came the selection.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That was when the real journey started.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;during-gsoc-at-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#during-gsoc-at-jenkins&quot; /&gt;During GSoC at Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first few weeks were a mix of excitement and nervousness.
Community bonding helped me understand the workflow, get comfortable with my mentors, and settle into regular coding, PR reviews, bi-weekly meetings, and weekly GSoC stand-ups.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One early lesson came while working on LLM-as-a-Judge.
I was stuck improving the faithfulness score and kept tuning the same things.
A mentor suggested changing the evaluation template itself, and that worked almost immediately.
It taught me to step back and rethink the approach instead of endlessly tuning the same solution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The hardest part was burnout when my college exams overlapped with the coding period.
Until midterm, I had also put a lot of pressure on myself simply because it was GSoC.
After midterm, that changed, and the work started feeling much more like normal open-source contribution and learning.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project was also extended by &lt;strong&gt;two weeks&lt;/strong&gt;, giving me some additional time to complete the remaining work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GraphRAG gave me another memorable challenge.
My first documentation-based graph was too small, so I researched further and found Jenkins Update Center data.
Rebuilding around it gave me roughly &lt;strong&gt;5,000 relationships&lt;/strong&gt;, which was one of the most satisfying moments of the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over time, I also started thinking more about testing, edge cases, maintainability, smaller PRs, and reusing existing architecture.
Most importantly, I became much more comfortable asking questions and discussing ideas with maintainers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By the end, GSoC felt less like something I had to prove myself through and more like something I genuinely enjoyed being part of.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-features-i-worked-on&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-features-i-worked-on&quot; /&gt;The Features I worked on:&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;llm-as-a-judge-evaluation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#llm-as-a-judge-evaluation&quot; /&gt;LLM-as-a-Judge Evaluation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first major feature I worked on was an &lt;strong&gt;LLM-as-a-Judge evaluation pipeline&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The goal was to move away from manually judging whether chatbot changes were actually improving responses.
I built an evaluation flow using a fixed golden dataset and DeepEval, measuring &lt;strong&gt;Faithfulness, Answer Relevancy, and Contextual Recall&lt;/strong&gt; directly in CI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature taught me a lot about evaluation beyond just looking at model outputs.
I also had to deal with model runtime, quantization, CI limitations, caching, and making the evaluation stable enough to be useful during development.&lt;/p&gt;
&lt;/div&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;500&quot; src=&quot;https://www.youtube.com/embed/XEmhqZTK1RU?start=844&amp;amp;autoplay=1&amp;amp;mute=1&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;graphrag-for-relationship-queries&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#graphrag-for-relationship-queries&quot; /&gt;GraphRAG for Relationship Queries&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next feature was &lt;strong&gt;GraphRAG&lt;/strong&gt;, mainly for Jenkins plugin dependency queries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Semantic retrieval works well for documentation questions, but it struggles when relationship direction matters.
For example, &lt;em&gt;&quot;What does git depend on?&quot;&lt;/em&gt; and &lt;em&gt;&quot;What depends on git?&quot;&lt;/em&gt; look very similar to a vector retriever but need completely different answers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I built a directional plugin graph using Jenkins documentation and Update Center data.
The graph now contains roughly &lt;strong&gt;5,000 relationships across around 1,400 plugins&lt;/strong&gt;, while normal documentation queries still continue through semantic retrieval.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/11/arjun-713-graphrag-dependency-answer.png&quot; alt=&quot;GraphRAG plugin dependency answer&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was probably the feature that taught me the most about how retrieval systems work underneath, and when structured retrieval is more useful than semantic similarity.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;build-failure-diagnosis-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#build-failure-diagnosis-agent&quot; /&gt;Build Failure Diagnosis Agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The third feature was the &lt;strong&gt;Build Failure Diagnosis Agent&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins console logs can become extremely long, even when only a few lines actually explain the failure.
The agent extracts the relevant error section and sends that focused context to the chatbot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While building this, security became an important part of the design.
Build logs can contain API keys, tokens, and other sensitive values, so the extracted snippet is sanitized before it reaches an external LLM.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/11/arjun-713-build-failure-diagnosis-flow.png&quot; alt=&quot;Build failure diagnosis flow from failed build to LLM diagnosis&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature made me think much more carefully about what data should reach an LLM in the first place, rather than simply sending everything and expecting the model to handle it.&lt;/p&gt;
&lt;/div&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;500&quot; src=&quot;https://www.youtube.com/embed/I1QG1lBp7No?autoplay=1&amp;amp;mute=1&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;third-party-llm-provider-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#third-party-llm-provider-support&quot; /&gt;Third-Party LLM Provider Support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One additional feature I worked on was &lt;strong&gt;third-party LLM provider integration&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Previously, the chatbot mainly depended on running a model locally.
That made development difficult for contributors without a capable GPU, which was something I faced myself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I added provider routing through &lt;strong&gt;LiteLLM&lt;/strong&gt;, along with a frontend provider and model selector.
The chatbot can now work with providers such as Groq, OpenRouter, Gemini, Claude, and OpenAI, while still supporting local inference.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Providers are configured through &lt;code&gt;providers.json&lt;/code&gt;, and credentials use a per-user &lt;strong&gt;Bring Your Own Key&lt;/strong&gt; setup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Interestingly, this ended up being the feature I enjoyed working on the most.
By this point I was much more comfortable with the codebase, and it felt less like figuring out how the project worked and more like actually building within it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/11/arjun-713-llm-provider-selector.png&quot; alt=&quot;LLM provider selector with local and third-party options&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;500&quot; src=&quot;https://www.youtube.com/embed/EDUVurumF-0?start=1276&amp;amp;autoplay=1&amp;amp;mute=1&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-plugin-installation-experience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-plugin-installation-experience&quot; /&gt;Jenkins Plugin Installation Experience&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another feature I worked on was improving the &lt;strong&gt;Jenkins plugin installation experience&lt;/strong&gt;.
Previously, installing the plugin did not automatically give users a complete chatbot interface because the frontend still had to be run separately.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The React frontend is now bundled directly inside the Jenkins plugin HPI, so installing the plugin through Jenkins makes the chatbot UI available without requiring a separate frontend server.
The plugin connects to the FastAPI backend through a &lt;strong&gt;Jenkins-configured backend URL&lt;/strong&gt;, with Jenkins acting as the same-origin API gateway between the frontend and backend.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The backend remains separately managed and can be started in a local setup.
This keeps Python dependencies and backend services outside the Jenkins process while making the plugin itself much easier to install and use.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-comes-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-comes-next&quot; /&gt;What Comes Next&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even though GSoC is ending, there are still a few things I would like to continue improving in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of the next areas are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Expand GraphRAG&lt;/strong&gt; to cover more conflict and incompatibility relationships.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integrate Jenkins authentication and authorization&lt;/strong&gt; so user context stays private, anonymous users only access public information, and data is not exposed across users.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More importantly, I would like to continue contributing to Jenkins instead of treating the final evaluation as the end of the project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;looking-back&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#looking-back&quot; /&gt;Looking Back&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The biggest change for me was probably how comfortable open source feels now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before GSoC, even opening a pull request felt like a big deal.
Now, reading a large codebase, discussing ideas with maintainers, asking questions, getting reviews, and iterating on changes feels much more natural.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I also stopped looking at GSoC as something I had to constantly prove myself through.
Somewhere along the way, it simply became a project I genuinely enjoyed working on and learning from.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That transition is probably what I will remember the most.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A huge thank you to my mentors, &lt;a href=&quot;https://www.jenkins.io/blog/authors/cnu1812&quot;&gt;V. Sreenivas&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/berviantoleo&quot;&gt;Bervianto Leo Pratama&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/giovanni-vaccarino&quot;&gt;Giovanni Vaccarino&lt;/a&gt; and special mention to &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt; for their guidance, reviews, and patience throughout the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A lot of my learning came from discussions where they did not just tell me what to change, but helped me understand why a different approach would be better.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would also like to thank the Jenkins community, the GSoC organization team, and the other contributors I interacted with throughout the program.
Being part of the community made the whole experience much more enjoyable.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;final-note&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#final-note&quot; /&gt;Final Note&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If there is one thing I would tell someone who is thinking about contributing to open source, it is to just start.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My journey began with a small README issue because I had no idea where else to begin.
That one contribution slowly turned into more issues, more code, a GSoC proposal, and eventually several months of working with the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You do not need to know everything before contributing.
Ask questions, start small, and keep going.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;follow-along&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#follow-along&quot; /&gt;Follow Along&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin/releases/tag/820.vc4b_81ec44d3a_&quot;&gt;jenkinsci/resources-ai-chatbot-plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href=&quot;https://github.com/arjun-713&quot;&gt;arjun-713&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href=&quot;https://www.linkedin.com/in/mallikarjun-gd/&quot;&gt;Mallikarjun G D&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/09/10/investigating-build-regressions-from-the-last-known-good-build/</id>
<title>Investigating Build Regressions From the Last Known-Good Build</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-09-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/09/10/investigating-build-regressions-from-the-last-known-good-build/" />
<category term='plugins'></category>
<category term='debugging'></category>
<category term='pipeline'></category>
<summary>
The following scenario is a case study. A Jenkins build fails in an integration test. The console contains a NoSuchMethodError, so the immediate task seems straightforward: find the incompatible dependency. Then someone points out that the last three builds failed too. Another developer asks whether the dependency change was already present in a successful build. The error is useful, but it has not yet established the investigation boundary.


That boundary matters. A log describes what happened during one execution. Investigating a regression also requires knowing what worked before it, which changes arrived afterward, and whether later failures represent the same problem.


The...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following scenario is a case study. A Jenkins build fails in an integration test. The console contains a &lt;code&gt;NoSuchMethodError&lt;/code&gt;, so the immediate task seems straightforward: find the incompatible dependency. Then someone points out that the last three builds failed too. Another developer asks whether the dependency change was already present in a successful build. The error is useful, but it has not yet established the investigation boundary.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That boundary matters. A log describes what happened during one execution. Investigating a regression also requires knowing what worked before it, which changes arrived afterward, and whether later failures represent the same problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The question is: what changed between the last successful build and the failed build, and which changes are most likely related to the regression?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting there gives the investigation an order. Establish the successful baseline. Examine the changes after it. Locate the first matching failure when the retained history supports that conclusion. Then connect those changes to the diagnostic and decide what to inspect first.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;establish-the-window-before-reading-every-change&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#establish-the-window-before-reading-every-change&quot; /&gt;Establish the window before reading every change&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Consider this synthetic payments build history. It is an illustrative investigation, not a report of a production incident:&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 20%;&quot;&gt;
&lt;col style=&quot;width: 20%;&quot;&gt;
&lt;col style=&quot;width: 60%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Build&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Result&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Retained failure evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;#869&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;SUCCESS&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Successful baseline&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;#870&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;FAILURE&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Specific payments API failure signature&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;#871&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;FAILURE&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Same signature&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;#872&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;FAILURE&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Same signature&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;#873&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;FAILURE&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Same signature; current investigation&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The failure occurs during payments integration tests. The retained diagnostic includes &lt;code&gt;NoSuchMethodError&lt;/code&gt; and the relevant stack frame. SCM history contains changes to &lt;code&gt;payment-common/pom.xml&lt;/code&gt;, &lt;code&gt;PaymentClient.java&lt;/code&gt;, documentation, and an unrelated service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If we compare only #872 with #873, we may concentrate on a change made after the problem began. If we collect everything between #869 and #873 and give every file equal attention, later changes can obscure the earlier candidates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The complete retained sequence supports a more useful window: #869 to #870. Build #870 is the first bad build in this observed sequence, while #873 supplies the current failure signal. Those are different roles and should remain visible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/build-change-investigator/dependency-light.jpg&quot; alt=&quot;Jenkins investigation showing a successful baseline, a first bad build, the current failure, and dependency evidence&quot; width=&quot;1024&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;A real V3 runtime capture using synthetic data: the change window stays beside the failure evidence.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build numbers alone are insufficient. If #872 has been deleted, or it was aborted, the sequence no longer verifies a continuous run of matching failures. An investigation should then say that the first bad build could not be narrowed. It should not silently bridge the gap because #871 and #873 look alike.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even a verified boundary does not prove that a commit caused the failure. A changed runtime dependency, external service, or environment could still be involved. What the boundary establishes is where the retained build evidence places the start of this failure sequence.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/col&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;connect-a-diagnostic-to-a-candidate-then-state-the-limitation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#connect-a-diagnostic-to-a-candidate-then-state-the-limitation&quot; /&gt;Connect a diagnostic to a candidate, then state the limitation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the payments example, &lt;code&gt;NoSuchMethodError&lt;/code&gt; makes dependency compatibility worth inspecting. It does not, on its own, tell us which dependency declaration is responsible. The exception, missing method, stack frame, build-task context, and changed paths need to be considered together.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Suppose the retained task output explicitly names &lt;code&gt;payment-common&lt;/code&gt;, and its &lt;code&gt;pom.xml&lt;/code&gt; changed in the narrowed window. That is a useful deterministic relationship: a file changed within the module named by the failing task. The next check is the module diff and the runtime classpath. The relationship does not establish which artifact was actually loaded when the test ran.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A changed &lt;code&gt;PaymentClient.java&lt;/code&gt; may offer a different relationship if the diagnostic names that source file. It deserves early inspection, but “the file changed” still does not mean “the failing line changed.” The diff must answer that second question.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stage context needs similar care. A stage label matching the first component of a changed path can help order the candidates. A changed &lt;code&gt;Jenkinsfile&lt;/code&gt; may also be relevant when a failing stage is observed. These are indirect clues. They do not establish that a particular configuration change executed in that stage or that the stage used a particular checkout.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/build-change-investigator/stage-aware-20-change.jpg&quot; alt=&quot;Stage-aware investigation ranking with relevant changes followed by the remaining change set&quot; width=&quot;1024&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Ranking provides an inspection order while keeping the other retained changes available.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The unrelated documentation should remain accessible. It should not receive the same prominence as a source path named by the failure, and it should not be declared harmless simply because no direct relationship was found.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is also why the explanation beside a ranking matters more than its position. “Strong evidence” is useful when it refers to a stated relationship. An unexplained confidence percentage would give the engineer less to verify.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;put-the-exact-failure-where-the-engineer-starts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#put-the-exact-failure-where-the-engineer-starts&quot; /&gt;Put the exact failure where the engineer starts&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Console Output remains necessary for many investigations. It should not be necessary merely to discover the diagnostic that the investigation is discussing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a compiler failure, the useful starting point may be a file, line and column, followed by &lt;code&gt;cannot find symbol&lt;/code&gt; and the unresolved symbol. For the payments failure, it is the API linkage error and the relevant stack frame. A test failure may need the test name. The form varies; the requirement is to preserve the evidence that makes the next check specific.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A short description such as “dependency issue” throws away too much. Conversely, displaying the entire Maven or Gradle log moves the original search task into a different page. The useful middle ground is an extracted diagnostic with supporting lines, a surrounding excerpt, and a link to the full console.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Extraction also has limits. The relevant lines may not have been retained, or the output may not match a recognized diagnostic format. In that case, showing the available excerpt and the evidence gap is more honest than manufacturing a precise failure category.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;bringing-this-workflow-into-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bringing-this-workflow-into-jenkins&quot; /&gt;Bringing this workflow into Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/build-change-investigator/&quot;&gt;Build Change Investigator&lt;/a&gt; implements this workflow on the Jenkins build page. It collects SCM changes and bounded, redacted failure evidence, then presents an investigation based on deterministic relationships. The core workflow does not require an AI provider.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The current implementation recognizes structured compiler diagnostics, Java exceptions, test failures, and API linkage errors when the retained evidence supports them. It ranks changes using direct source-path matches, explicit build-task module information, and weaker stage or configuration overlap. It does not traverse the full Pipeline execution graph or establish checkout ownership for every stage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Its first-bad calculation requires adjacent build numbers, matching specific failure signatures, and &lt;code&gt;FAILURE&lt;/code&gt; results back to a successful build. Missing builds, unavailable signatures, different failures, and intermediate results such as &lt;code&gt;UNSTABLE&lt;/code&gt; or &lt;code&gt;ABORTED&lt;/code&gt; leave the boundary unknown. The history inspection is bounded rather than an unlimited search.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes the automatic window is not the question an engineer needs to ask. Build-to-build comparison lets the engineer choose two completed builds of the same accessible job and inspect their evidence in the same view. The baseline must precede the target, and the supported comparison window is bounded to 100 build numbers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/build-change-investigator/comparison-result.jpg&quot; alt=&quot;Build comparison showing the selected baseline and target within the investigation view&quot; width=&quot;1024&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Explicit comparison uses the same evidence presentation with a selected build window.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Similar past failures provide another lead. A matching retained signature from before a successful boundary may be worth revisiting. It is historical context, not evidence that the earlier and current failures share a cause. There may be a useful old investigation to read; there may also be no recorded resolution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Native Jenkins Build History remains available alongside the investigation. &lt;strong&gt;Copy investigation&lt;/strong&gt; produces a bounded text summary for a handoff, including the evidence and suggested checks. Neither feature requires replacing the existing build navigation or asking someone else to reconstruct the entire case from console links.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;keep-the-investigation-verifiable&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#keep-the-investigation-verifiable&quot; /&gt;Keep the investigation verifiable&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Optional AI interpretation can suggest an explanation and checks using the collected evidence. An authorized user explicitly runs it; opening the page does not invoke a provider. Before an AI request, the plugin limits the evidence and applies best-effort secret redaction. That is a protection, not a guarantee that every sensitive string will be recognized.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a verified first-bad case, the interpretation receives the narrowed changes while the failure signal and build metadata remain identified as belonging to the current build. That distinction prevents a later failure from being presented as though its log came from the first bad build.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The interpretation should be read after the observed facts and their deterministic relationships. A fluent explanation cannot establish a dependency version that was not captured or prove which runtime artifact was loaded. If a provider fails, the engineer still has the deterministic investigation to work from.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the payments example, a useful handoff is modest and concrete: #869 succeeded; the matching failure sequence starts at #870; the narrowed changes include a file in the failing module; the current diagnostic is &lt;code&gt;NoSuchMethodError&lt;/code&gt;; inspect the module diff and loaded dependencies first. That gives the next engineer something to test.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The goal is not to replace Console Output or claim a root cause automatically. It is to give the engineer a better starting point: what last worked, what changed, where the matching failures began, and what evidence is worth checking first.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build Change Investigator is available in the &lt;a href=&quot;https://plugins.jenkins.io/build-change-investigator/&quot;&gt;Jenkins plugin directory&lt;/a&gt;, and the source and issue tracker are available in the &lt;a href=&quot;https://github.com/jenkinsci/build-change-investigator-plugin&quot;&gt;official Jenkins repository&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/09/08/daniele-caldarigi-gsoc-final-blog-post/</id>
<title>GSoC 2026 Final term: AI Chatbot to Guide User Workflow</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-09-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/09/08/daniele-caldarigi-gsoc-final-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
Hi everyone 👋,


I&#8217;m Daniele, the Google Summer of Code 2026 contributor who worked this summer on creating the AI Chatbot to Guide User Workflow plugin.


The extended period of my project is coming to an end, and I want to share a bit about this brand-new plugin and my journey through GSoC.


Index




About the Project


Second part of GSoC


My contributions


The plugin&#8217;s future


Acknowledgements


More about me






About the Project


The plugin integrates an agent-powered chatbot directly into the Jenkins interface. This tool is invaluable for both beginners who need guidance navigating the software and experts who want to quickly troubleshoot a failed build.





The agent can perform a...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/Jenkins_GSoC_2026_Program.png&quot; alt=&quot;Jenkins GSoC 2026 Program&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hi everyone 👋,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m Daniele, the Google Summer of Code 2026 contributor who worked this summer on creating the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/ai-chatbot-to-guide-user-workflow/&quot;&gt;AI Chatbot to Guide User Workflow&lt;/a&gt; plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The extended period of my project is coming to an end, and I want to share a bit about this brand-new plugin and my journey through GSoC.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;index&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#index&quot; /&gt;Index&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#about-the-project&quot;&gt;About the Project&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#second-part-of-gsoc&quot;&gt;Second part of GSoC&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#my-contributions&quot;&gt;My contributions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#the-plugins-future&quot;&gt;The plugin’s future&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#acknowledgements&quot;&gt;Acknowledgements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#more-about-me&quot;&gt;More about me&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about-the-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-the-project&quot; /&gt;About the Project&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin integrates an agent-powered chatbot directly into the Jenkins interface. This tool is invaluable for both beginners who need guidance navigating the software and experts who want to quickly troubleshoot a failed build.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/BUILD_FAILED.gif&quot; alt=&quot;BUILD FAILED&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agent can perform a variety of tasks, including:
* Searching the Jenkins documentation and Discourse topics.
* Reading Jenkins context data, such as failed build logs or job configurations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the first part of GSoC, I worked on the components surrounding the agentic logic: the Data Pipeline, Frontend UI, Hybrid Retrieval, and the communication layer between the frontend and backend.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;second-part-of-gsoc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#second-part-of-gsoc&quot; /&gt;Second part of GSoC&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this second phase of GSoC, I focused on building the core agent logic and the &lt;a href=&quot;https://jenkinsci.github.io/user-guide-ai-chatbot-plugin/developer-docs/agent-tools.html&quot;&gt;tools the agent uses to gather Jenkins context information&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agent logic is powered by LangGraph, and I found that a 20-billion parameter model is more than enough for our needs. In fact, using &lt;code&gt;gpt-oss-20b&lt;/code&gt;, the agent can seamlessly search through the logs of a failed build, analyze job configurations, and inspect workspace trees and files to retrieve general Jenkins information. (You can read more about the &lt;a href=&quot;https://jenkinsci.github.io/user-guide-ai-chatbot-plugin/developer-docs/agent.html&quot;&gt;agent logic here&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I also implemented two advanced, optional features that require more computational resources than the baseline setup:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reranking:&lt;/strong&gt; Allows the use of a specific reranker model to reorder the documents retrieved from the vector database, maximizing the relevance of the context.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contextual Retrieval:&lt;/strong&gt; A technique introduced by Anthropic that significantly improves RAG (Retrieval-Augmented Generation) accuracy. You can read more about it &lt;a href=&quot;https://www.datacamp.com/tutorial/contextual-retrieval-anthropic&quot;&gt;here&lt;/a&gt; and in the &lt;a href=&quot;https://platform.claude.com/cookbook/capabilities-contextual-embeddings-guide&quot;&gt;official Claude cookbook&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, both &lt;strong&gt;evaluation tests&lt;/strong&gt; and &lt;strong&gt;observability&lt;/strong&gt; were integrated into the project. This infrastructure ensures that future developers can easily troubleshoot the agent logic and evaluate any new features added to the agent. (Read more about &lt;a href=&quot;https://jenkinsci.github.io/user-guide-ai-chatbot-plugin/developer-docs/agent-tools.html&quot;&gt;evaluation here&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, I wrapped up my GSoC journey by thoroughly documenting the project (available on the &lt;a href=&quot;https://jenkinsci.github.io/user-guide-ai-chatbot-plugin/index.html&quot;&gt;official documentation site&lt;/a&gt;) and implementing End-to-End (E2E) Cypress tests using Docker. These tests are crucial to ensure that the entire architecture works and all components communicate exactly as expected.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;my-contributions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#my-contributions&quot; /&gt;My contributions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is the list of the Pull Requests I’ve worked on during the program:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/2&quot;&gt;1st PR: Implement Data Pipeline logic&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/3&quot;&gt;2nd PR: Implement Qdrant, Hybrid retriever and more&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/10&quot;&gt;3rd PR: Implement frontend UI, backend endpoints and PostgreSQL&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/20&quot;&gt;4th PR: Implement upload context&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/22&quot;&gt;5th PR: Implement agent logic&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/26&quot;&gt;6th PR: Implement Reranking, improve fetch_from_vectordb tool and more&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/30&quot;&gt;7th PR: Implement contextual retrieval&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/31&quot;&gt;8th PR: Implement get_workspace_file tool&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/48&quot;&gt;9th PR: Implement evaluation tests&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/49&quot;&gt;10th PR: Implement observability&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/56&quot;&gt;11th PR: Implement docs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/user-guide-ai-chatbot-plugin/pull/57&quot;&gt;12th PR: Implement e2e tests and update docs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-plugins-future&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-plugins-future&quot; /&gt;The plugin’s future&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin will be published soon so that anyone can test it out on their machine. Setup is very straightforward, and I’ve published a guide on how to quickly install and configure it: &lt;a href=&quot;https://jenkinsci.github.io/user-guide-ai-chatbot-plugin/user-guide/quick-installation.html&quot;&gt;AI Chatbot Workflow Quick Installation Guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the future, I would love to see the following features added:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Frontend UI Markdown support:&lt;/strong&gt; Currently, the frontend displays Markdown as plain text. Implementing a proper rendering of Markdown text will highly improve readability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&quot;Human-in-the-loop&quot; features:&lt;/strong&gt; It is fantastic that the chatbot can tell us how to do and fix things, but it would be even better if it could perform actions for us upon request. Changing a specific setting or updating a Jenkins pipeline file automatically without the need to do it manually would be an incredible time-saving feature.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past few months, I’ve had the privilege to work for a very important Open Source organization, assisted by my fantastic mentors: &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/shivaylamba&quot;&gt;Shivay Lamba&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/chiruu12&quot;&gt;Chirag Gupta&lt;/a&gt;, who guided me through the process of creating this incredible new plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m very grateful to the Jenkins Community for this opportunity, and I’m truly happy to be a part of it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See you soon!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;more-about-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-about-me&quot; /&gt;More about me&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here you can find my contact details:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/thatsdc&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/thatsdc/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;mailto:danielecaldarigi05@gmail.com&quot;&gt;Email Me&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/09/07/adopt-a-modern-idp-without-replacing-your-ci/</id>
<title>Jenkins + OpenChoreo: Adopt a modern Internal Developer Platform (IDP) Without Replacing Your CI System</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-09-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/09/07/adopt-a-modern-idp-without-replacing-your-ci/" />
<category term='pipeline'></category>
<category term='kubernetes'></category>
<category term='devops'></category>
<category term='cloud-native'></category>
<summary>
Your Jenkins setup represents a decade of institutional knowledge: countless custom pipelines, shared libraries, and specialized build agents.
Yet when platform engineering enters the conversation, most IDP demos ignore this investment entirely.
This article is for platform engineers and DevOps leads who run Jenkins at scale and are evaluating an internal developer platform.
It lays out a different path: add one stage to your pipeline, and keep everything else exactly where it is – along with a clear model of the CI/platform boundary, a Jenkinsfile stage you can copy directly, and an honest account of what the trade costs.


The most common misconception about...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Your Jenkins setup represents a decade of institutional knowledge: countless custom pipelines, shared libraries, and specialized build agents.
Yet when platform engineering enters the conversation, most IDP demos ignore this investment entirely.
This article is for platform engineers and DevOps leads who run Jenkins at scale and are evaluating an internal developer platform.
It lays out a different path: add one stage to your pipeline, and keep everything else exactly where it is – along with a clear model of the CI/platform boundary, a Jenkinsfile stage you can copy directly, and an honest account of what the trade costs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The most common misconception about platform engineering is that adopting an IDP means throwing away your CI tooling.
It doesn’t have to.
Here is where OpenChoreo can help with your workflow without altering your CI habits.
OpenChoreo’s external CI integration lets teams keep their Jenkins pipelines, plugin ecosystem, and institutional knowledge, while layering on environment management, self-service workflows, multi-cluster deployment, and observability – all via a single API call at the end of the build stage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-argument&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-argument&quot; /&gt;The Argument&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;CI is a core part of the platform experience.
But the real question is whether the platform should be tightly coupled to one specific CI implementation, and the answer is no.
With the right abstraction at the integration point, teams keep Jenkins or run something else entirely, and the developer experience the platform delivers stays the same.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To do its job, the platform doesn’t need your build graph, your test matrix, or your pipeline DSL.
It needs exactly one fact: &lt;em&gt;this image, for this component, is ready.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Everything before that fact is CI implementation, that’s Jenkins’s half of the experience, and it stays exactly as it is.
Everything after it is the platform’s half.
From there, &quot;adopt an IDP&quot; no longer means &quot;replace your CI&quot;.
It means only one thing: add one stage to your pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-jenkins-teams-fear-and-why&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-jenkins-teams-fear-and-why&quot; /&gt;What Jenkins Teams Fear (and Why)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The concern is real: when a platform team standardises on an IDP, what the Jenkins user hears is that hundreds of pipelines, the shared libraries, agents, etc. that took a long time to design and implement, are about to be thrown away.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That fear comes from how these platforms are usually demoed.
Almost every IDP demo starts at &lt;code&gt;git push&lt;/code&gt; and ends at &quot;running in production&quot;, which puts CI inside the platform the entire length of the demo.
That’s an accurate description of the experience for a team starting from scratch using the platform’s built-in CI.
It is not, however, an architectural requirement of the platform.
The two systems can be decoupled, and establishing that decoupling is the core focus of this article.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-boundary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-boundary&quot; /&gt;The Boundary&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So if the platform does not take over CI, where exactly does CI end and the platform begin?
Here is the split.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One artifact reference crosses the boundary.
That is the whole contract.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/from-jenkins-build-to-production.png&quot; alt=&quot;The Jenkins pipeline builds and tests, pushes the image to a container registry, and registers or updates a Workload in the OpenChoreo control plane. OpenChoreo auto deploys it to Development, and it is then promoted to Staging and Production.&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. From Jenkins build to Production&lt;/div&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 50%;&quot;&gt;
&lt;col style=&quot;width: 50%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;What stays in Jenkins&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;What moves to the platform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;SCM triggers, build agents, shared libraries&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Environments and promotion&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Test orchestration, the plugin ecosystem&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Per-environment config and secrets&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Build credentials, pre-build approvals&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Multi-cluster placement&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Build provenance and logs&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Runtime observability, self-service catalog&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The line sits here because the two columns change at different speeds, have different owners, and fail in different ways.
Build logic changes per team, per language, per repo.
Environments and promotion policy change per organisation.
Bundling the two together is what makes platform adoption feel like a CI migration.
Keep them separate, and it never has to be one.&lt;/p&gt;
&lt;/div&gt;
&lt;/colgroup&gt;
&lt;/table&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-stage-you-need-to-add&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-stage-you-need-to-add&quot; /&gt;The stage you need to add&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://openchoreo.dev/&quot;&gt;OpenChoreo&lt;/a&gt; is an open-source internal developer platform that runs on Kubernetes.
It owns the right-hand column of the table above: environments and promotion, per-environment configuration and secrets, multi-cluster placement, and a self-service portal with runtime observability, a layer your platform team operates over your clusters.
The unit it deploys is a Workload: a small record naming a component and the image that should run for it.
Registering that Workload from your pipeline is the entire integration, and the pattern applies to any platform with a similar API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If your pipeline already builds and pushes an image, the diff is small: get a token, then register the workload.
Here’s what that looks like with OpenChoreo as the platform.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;one-time-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#one-time-setup&quot; /&gt;One-time setup&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the platform side, create a service account – an OAuth2 client with the &lt;code&gt;client_credentials&lt;/code&gt; grant, scoped so it can only register workloads.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are following the &lt;a href=&quot;https://openchoreo.dev/docs/getting-started/quick-start-guide/&quot;&gt;quick start&lt;/a&gt;, that account already exists. The installer registers a &lt;strong&gt;Workload Publisher&lt;/strong&gt; client in the bundled Thunder identity provider and binds it to a &lt;code&gt;workload-publisher&lt;/code&gt; role. The defaults are:&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 50%;&quot;&gt;
&lt;col style=&quot;width: 50%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Value&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Default on a quick-start install&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Thunder token endpoint&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;&lt;a href=&quot;http://thunder.openchoreo.localhost:8080/oauth2/token&quot; class=&quot;bare&quot;&gt;http://thunder.openchoreo.localhost:8080/oauth2/token&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;OpenChoreo API&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;&lt;a href=&quot;http://api.openchoreo.localhost:8080&quot; class=&quot;bare&quot;&gt;http://api.openchoreo.localhost:8080&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Client ID&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;openchoreo-workload-publisher-client&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Client secret&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;openchoreo-workload-publisher-secret&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Confirm it works before wiring up Jenkins — this should return an access token:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;shell&quot;&gt;curl &lt;span class=&quot;nt&quot;&gt;-X&lt;/span&gt; POST &lt;span class=&quot;s2&quot;&gt;&quot;http://thunder.openchoreo.localhost:8080/oauth2/token&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--data-urlencode&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;grant_type=client_credentials&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--data-urlencode&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;client_id=openchoreo-workload-publisher-client&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--data-urlencode&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;client_secret=openchoreo-workload-publisher-secret&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a shared development credential — it is the same account OpenChoreo’s own in-cluster build workflow authenticates as — so it is fine for a local trial and nothing more. For anything shared, create your own client in the Thunder console (&lt;code&gt;&lt;a href=&quot;http://thunder.openchoreo.localhost:8080/console&quot; class=&quot;bare&quot;&gt;http://thunder.openchoreo.localhost:8080/console&lt;/a&gt;&lt;/code&gt;, &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;admin&lt;/code&gt;) as a &lt;strong&gt;Backend Service&lt;/strong&gt; application, then bind it to a role with a &lt;code&gt;ClusterAuthzRoleBinding&lt;/code&gt;: the shipped binding matches the default client’s &lt;code&gt;sub&lt;/code&gt; claim, so a new client inherits nothing. The &lt;a href=&quot;https://openchoreo.dev/docs/platform-engineer-guide/workflows/workflow-workload-configuration/&quot;&gt;Workload Publishing Credentials&lt;/a&gt; guide covers that setup, and &lt;a href=&quot;https://openchoreo.dev/docs/platform-engineer-guide/authorization/&quot;&gt;Authorization&lt;/a&gt; lists the shipped roles and bindings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then store three values as ordinary Jenkins credentials:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;workflows-credentials&lt;/code&gt; — the client ID and secret&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;thunder-url&lt;/code&gt; — the token endpoint of the identity provider (Thunder ships with OpenChoreo, but any OAuth2 IDP works)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;openchoreo-api-url&lt;/code&gt; — the platform API URL&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://openchoreo.dev/docs/platform-engineer-guide/workflows/external-ci/&quot;&gt;external-CI docs&lt;/a&gt; cover this step by step; we’ll walk through the complete setup in the next post in this series.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Worth knowing before you file the security review: the service account’s &lt;code&gt;workload-publisher&lt;/code&gt; role grants exactly &lt;code&gt;workload:create&lt;/code&gt;, &lt;code&gt;workload:update&lt;/code&gt;, &lt;code&gt;workload:view&lt;/code&gt;, &lt;code&gt;workflowrun:view&lt;/code&gt;, and &lt;code&gt;workflowrun:update&lt;/code&gt; and nothing else.
The two &lt;code&gt;workflowrun&lt;/code&gt; actions are there for OpenChoreo’s built-in build workflow, which annotates its own run - an external pipeline never needs them, so a dedicated client can be bound to a workload-only role.
If the Jenkins credential ever leaks, the blast radius is &quot;can register an image for this component’s workload&quot;.
It cannot promote anything, touch environment configuration, or reach the clusters.
We verified this the direct way: the same token that had just registered our workload got an HTTP 403 when it tried to create a staging release binding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The stage below isn’t pseudocode: it ran on a real Jenkins (2.541.1) against a live OpenChoreo cluster, twice in a row, so the second build exercises the update path.
&lt;code&gt;NAMESPACE&lt;/code&gt;, &lt;code&gt;PROJECT&lt;/code&gt;, &lt;code&gt;COMPONENT&lt;/code&gt;, and &lt;code&gt;IMAGE&lt;/code&gt; come from the surrounding pipeline; the credentials are standard Jenkins credentials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Register workload with OpenChoreo&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;withCredentials&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;usernamePassword&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;credentialsId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;workflows-credentials&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;usernameVariable:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;CLIENT_ID&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;passwordVariable:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;CLIENT_SECRET&#39;&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;credentialsId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;thunder-url&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;variable:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;THUNDER_URL&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;credentialsId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;openchoreo-api-url&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;variable:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;OPENCHOREO_API_URL&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;
                set -eu

                # Jenkins masks the credentials it injected, but NOT the token
                # derived from them -- keep it out of the build log.
                set +x

                # 1. Exchange client credentials for an access token.
                TOKEN=$(curl -sf -X POST &quot;${THUNDER_URL}/oauth2/token&quot; \
                  -d &quot;grant_type=client_credentials&quot; \
                  -d &quot;client_id=${CLIENT_ID}&quot; \
                  -d &quot;client_secret=${CLIENT_SECRET}&quot; \
                  | jq -r &#39;.access_token&#39;)

                # 2. Build the Workload payload.
                WORKLOAD_NAME=&quot;${COMPONENT}-workload&quot;
                cat &amp;gt; workload-cr.json &amp;lt;&amp;lt;EOF
{
  &quot;metadata&quot;: { &quot;name&quot;: &quot;${WORKLOAD_NAME}&quot;, &quot;namespace&quot;: &quot;${NAMESPACE}&quot; },
  &quot;spec&quot;: {
    &quot;owner&quot;: { &quot;projectName&quot;: &quot;${PROJECT}&quot;, &quot;componentName&quot;: &quot;${COMPONENT}&quot; },
    &quot;container&quot;: { &quot;image&quot;: &quot;${IMAGE}&quot; }
  }
}
EOF

                # 3. Create the Workload; on HTTP 409 fall back to PUT.
                #    The first build creates it; every build after that updates it.
                CODE=$(curl -s -o resp.json -w &#39;%{http_code}&#39; -X POST \
                  &quot;${OPENCHOREO_API_URL}/api/v1/namespaces/${NAMESPACE}/workloads&quot; \
                  -H &quot;Authorization: Bearer ${TOKEN}&quot; \
                  -H &quot;Content-Type: application/json&quot; \
                  -d @workload-cr.json)

                if [ &quot;${CODE}&quot; = &quot;409&quot; ]; then
                  curl -sf -X PUT \
                    &quot;${OPENCHOREO_API_URL}/api/v1/namespaces/${NAMESPACE}/workloads/${WORKLOAD_NAME}&quot; \
                    -H &quot;Authorization: Bearer ${TOKEN}&quot; \
                    -H &quot;Content-Type: application/json&quot; \
                    -d @workload-cr.json -o resp.json
                elif [ &quot;${CODE}&quot; -lt 200 ] || [ &quot;${CODE}&quot; -ge 300 ]; then
                  echo &quot;Workload registration failed (HTTP ${CODE}):&quot;
                  cat resp.json
                  exit 1
                fi
            &#39;&#39;&#39;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/colgroup&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;using-the-openchoreo-cli&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-the-openchoreo-cli&quot; /&gt;Using the OpenChoreo CLI&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alternatively, the OpenChoreo CLI (&lt;code&gt;occ&lt;/code&gt;) completes registration in five commands.
&lt;code&gt;occ apply&lt;/code&gt; checks whether the workload exists and creates or updates it, so the 409 fallback disappears; API errors come back as readable messages with a non-zero exit code, so no &lt;code&gt;jq&lt;/code&gt; is needed; and the CLI reads its credentials from environment variables and never prints the token, so the &lt;code&gt;set +x&lt;/code&gt; guard is unnecessary.
This sequence was verified on the same Jenkins instance:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;HOME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WORKSPACE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;   &lt;span class=&quot;c&quot;&gt;# occ stores its login under ${HOME}/.openchoreo&lt;/span&gt;
occ config controlplane update default &lt;span class=&quot;nt&quot;&gt;--url&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;OPENCHOREO_API_URL&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
occ login &lt;span class=&quot;nt&quot;&gt;--client-credentials&lt;/span&gt;   &lt;span class=&quot;c&quot;&gt;# reads OCC_CLIENT_ID / OCC_CLIENT_SECRET&lt;/span&gt;
occ workload create &lt;span class=&quot;nt&quot;&gt;--descriptor&lt;/span&gt; workload.yaml &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;NAMESPACE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PROJECT&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMPONENT&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--image&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;IMAGE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; workload-cr.yaml
occ apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; workload-cr.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Notice what the stage does not contain: the environment names, &lt;code&gt;kubectl&lt;/code&gt;, cluster credentials, manifests, and promotion logic.
The pipeline does not need to know how many environments exist.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the scale this post’s audience runs - hundreds of pipelines - you wouldn’t paste this stage into each Jenkinsfile by hand.
Wrap it as a step in your global shared library, and the per-pipeline diff shrinks to one line, something like &lt;code&gt;openchoreoRegister(image: env.IMAGE)&lt;/code&gt;.
Rolling the integration out, or changing it later, becomes a library release instead of a hundred pipeline edits.
We’re leaving the wrapper itself as packaging; the API call inside it is exactly the stage above.
The point is that Jenkins already has the distribution mechanism for this, and it is one your team uses today.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-you-get-back&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-you-get-back&quot; /&gt;What you get back&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The exact image Jenkins built, promoted unchanged through development → staging → production.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/openchoreo-component-deployment-view.png&quot; alt=&quot;The Deploy tab of the OpenChoreo Backstage portal showing the jenkins-greeter component active in Development, Staging, and Production, each marked as promoted.&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Component Deployment View in OpenChoreo Backstage Portal.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Promotion becomes a platform-level operation rather than a pipeline stage.
Engineers or release managers promote components through the UI portal or via a single CLI command:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;shell&quot;&gt;occ component deploy &amp;lt;component&amp;gt; &lt;span class=&quot;nt&quot;&gt;--to&lt;/span&gt; staging&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The exact build Jenkins produced was promoted through all three environments and served the same content in each, with Jenkins uninvolved after the registration call.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build-once, promote-many works because the line sits where it does: promotion has its own access control and doesn’t inherit from Jenkins.
Deploy the pipeline to each environment directly instead, and you’re left with two options: rebuild per environment, or teach Jenkins your organization’s entire promotion policy.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-trade-offs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-trade-offs&quot; /&gt;The Trade-Offs&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Access and Security:&lt;/strong&gt; Jenkins requires a service account and network access to the platform API, introducing a new credential to manage and an additional dependency in the build path.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shift in Deployment State:&lt;/strong&gt; Operational state shifts away from the pipeline. For teams accustomed to viewing &quot;the Jenkins job as the deploy,&quot; this represents a structural shift in workflow tracking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rollback Mechanics:&lt;/strong&gt; Re-running a Jenkins job builds and registers a new artifact. Rollbacks are executed as platform actions targeting previously validated releases.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The migration is incremental by design: one component, one extra stage, one pipeline you don’t otherwise touch.
Nothing about it is a cutover.
By decoupling the build from the deployment, you gain the benefits of a modern platform without the friction of a forced migration, proving that progress can be achieved through evolution rather than revolution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to try this yourself, the &lt;a href=&quot;https://openchoreo.dev/docs/getting-started/quick-start-guide/&quot;&gt;OpenChoreo quick start&lt;/a&gt; gives you a local cluster with the three environments used above.
In the next post in this series, we will walk through the complete setup end to end — the service account, the credentials, the component, and surfacing Jenkins build status inside the portal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Links:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;OpenChoreo Repository: &lt;a href=&quot;https://github.com/openchoreo/openchoreo&quot; class=&quot;bare&quot;&gt;https://github.com/openchoreo/openchoreo&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;OpenChoreo external-CI integration docs: &lt;a href=&quot;https://openchoreo.dev/docs/platform-engineer-guide/workflows/external-ci&quot; class=&quot;bare&quot;&gt;https://openchoreo.dev/docs/platform-engineer-guide/workflows/external-ci&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/09/01/plugin-of-the-month-oras-artifact-manager/</id>
<title>Plugin of the Month – September 2026: ORAS Artifact Manager</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-09-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/09/01/plugin-of-the-month-oras-artifact-manager/" />
<category term='plugins'></category>
<category term='community'></category>
<category term='artifacts'></category>
<category term='oci'></category>
<category term='plugin-of-the-month'></category>
<summary>
Welcome back to the Plugin of the Month series, where we highlight useful and impactful tools from the Jenkins ecosystem.


This September, we&#8217;re featuring a plugin that rethinks where your build artifacts actually live: the ORAS Artifact Manager Plugin.


What is the ORAS Artifact Manager Plugin?


By default, Jenkins stores archived artifacts and stashes on the controller&#8217;s local disk (or on whatever storage backend an artifact manager plugin provides).
The ORAS Artifact Manager Plugin takes a different approach: it stores them in any OCI-compliant registry, using ORAS (OCI Registry As Storage).


OCI registries were originally built to distribute container images, but the OCI ecosystem has...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Welcome back to the &lt;strong&gt;Plugin of the Month&lt;/strong&gt; series, where we highlight useful and impactful tools from the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This September, we’re featuring a plugin that rethinks where your build artifacts actually live: the &lt;a href=&quot;https://plugins.jenkins.io/oras-artifact-manager/&quot;&gt;ORAS Artifact Manager Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-oras-artifact-manager-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-oras-artifact-manager-plugin&quot; /&gt;What is the ORAS Artifact Manager Plugin?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By default, Jenkins stores archived artifacts and stashes on the controller’s local disk (or on whatever storage backend an artifact manager plugin provides).
The ORAS Artifact Manager Plugin takes a different approach: it stores them in &lt;strong&gt;any OCI-compliant registry&lt;/strong&gt;, using &lt;a href=&quot;https://oras.land&quot;&gt;ORAS&lt;/a&gt; (OCI Registry As Storage).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;OCI registries were originally built to distribute container images, but the OCI ecosystem has since standardized on storing arbitrary content — SBOMs, Helm charts, signatures, and now Jenkins build artifacts — as regular OCI artifacts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once configured, every archived file and every stash produced by your jobs is pushed to the registry of your choice instead of piling up on the Jenkins controller’s disk:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/artifacts.png&quot; alt=&quot;Build artifacts listed on a Jenkins build page, backed by an OCI registry&quot; width=&quot;800&quot; title=&quot;Build artifacts listed on a Jenkins build page, backed by an OCI registry&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the build page, artifacts look exactly like artifacts always have — you don’t lose the familiar Jenkins UX, you just change where the bytes are stored.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;built-on-oras-and-the-oras-java-sdk&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#built-on-oras-and-the-oras-java-sdk&quot; /&gt;Built on ORAS and the ORAS Java SDK&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/oras.svg&quot; alt=&quot;oras&quot; width=&quot;200px&quot; title=&quot;ORAS Logo&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin doesn’t talk to registries directly.
It relies on a dedicated &lt;strong&gt;ORAS Java API&lt;/strong&gt; Jenkins plugin, which in turn bundles the official &lt;a href=&quot;https://github.com/oras-project/oras-java&quot;&gt;ORAS Java SDK&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This layering matters:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://oras.land&quot;&gt;ORAS&lt;/a&gt; defines the client tooling and conventions for pushing/pulling arbitrary artifacts to OCI registries, on top of the OCI Distribution and OCI Image spec.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/oras-project/oras-java&quot;&gt;ORAS Java SDK&lt;/a&gt; is a CNCF ORAS sub-project library that implements those conventions natively in Java.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The ORAS Artifact Manager Plugin builds Jenkins&#39; artifact and stash storage model on top of that SDK.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because the underlying protocol is just OCI, any registry that speaks the OCI Distribution Spec works: Docker Registry, Harbor, Zot, GitHub Container Registry, Artifactory, and others.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-artifacts-are-structured-in-the-registry&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-artifacts-are-structured-in-the-registry&quot; /&gt;How Artifacts Are Structured in the Registry&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the part that’s genuinely interesting if you’re curious about OCI internals, and not just &quot;another storage backend.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin maps each Jenkins job to an OCI repository, sanitizing the name in the process (for example &lt;code&gt;folder/My Job&lt;/code&gt; becomes &lt;code&gt;folder/my-job&lt;/code&gt;).
For every build, it pushes a &lt;strong&gt;build root artifact&lt;/strong&gt;, tagged with the build number, which acts as the anchor for everything produced during that build.
Every archived file is then pushed as its own single-layer OCI manifest, linked back to that root artifact using the OCI 1.1 &lt;code&gt;subject&lt;/code&gt; field — the same mechanism used for referrers like signatures or SBOMs on container images.
Stashes follow a similar pattern, stored as tagged, gzip-compressed layers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The two custom media types you’ll see on the manifests are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;application/vnd.io.jenkins.oras-artifact-manager.build.v1+json&lt;/code&gt; for the build root artifact&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;application/vnd.io.jenkins.oras-artifact-manager.file.v1+json&lt;/code&gt; for each individual archived file&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because files reference the build root through &lt;code&gt;subject&lt;/code&gt; instead of a hand-rolled index file, the plugin can discover every artifact for a build with a &lt;strong&gt;single call to the registry’s referrers API&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can see this structure yourself with the &lt;code&gt;oras&lt;/code&gt; CLI.
Given a build root tagged &lt;code&gt;13&lt;/code&gt;, asking the registry what refers to it:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;oras discover &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; tree localhost:5000/test:13

localhost:5000/test:13
└── application/vnd.io.jenkins.oras-artifact-manager.file.v1+json
    ├── sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7a
    ├── sha256:9e58a1ce0ff0aad2adf3f18e6c92e58a17d3f4b5c6a7891234567890abcdef0
    └── sha256:d1f2c3a4b5e6d7c8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each of those digests is an independent manifest carrying a single layer (the file’s content) plus annotations that preserve the metadata Jenkins cares about — the archived path, the creation timestamp, and so on.
A registry UI that understands OCI referrers, like Zot, will show exactly that relationship when you inspect the build root artifact:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/09/zot.png&quot; alt=&quot;A file artifact showing its subject relationship to the build root, viewed in the Zot registry UI&quot; width=&quot;800&quot; title=&quot;A file artifact showing its subject relationship (Referred By) to the build root, viewed in Zot&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Notice the annotations: &lt;code&gt;io.jenkins.oras-artifact-manager.path&lt;/code&gt; tells you which archived file this manifest corresponds to, and standard OCI annotations like &lt;code&gt;org.opencontainers.image.created&lt;/code&gt; come along for free.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;worth-keeping-in-mind&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#worth-keeping-in-mind&quot; /&gt;Worth Keeping in Mind&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin is still in beta, and so is the underlying ORAS Java SDK — APIs on both sides may still change before things settle.
If you’re evaluating it, start with non-critical jobs, keep an eye on the &lt;a href=&quot;https://github.com/jenkinsci/oras-artifact-manager-plugin&quot;&gt;GitHub repository&lt;/a&gt; for updates, and report anything unexpected through its issue tracker.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;looking-ahead&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#looking-ahead&quot; /&gt;Looking Ahead&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If your Jenkins controllers are drowning in archived artifacts, or you already run an OCI registry for your container images and would rather not maintain a second storage system just for build outputs, the ORAS Artifact Manager Plugin is worth a look.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned for next month’s Plugin of the Month, and feel free to suggest plugins you’d like to see featured!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/08/25/admin-blog_01/</id>
<title>Daily Life as a Jenkins Administrator</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-08-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/08/25/admin-blog_01/" />
<category term='community'></category>
<category term='user-experience'></category>
<category term='maintenance'></category>
<summary>
Introduction


Hi, my name is Mark.
I am a Jenkins administrator, and I want to share some of my daily experiences using and maintaining Jenkins.
I hope you enjoy it.




Environment and setup


We have two Jenkins servers, production and quality.
Both run on a commercially supported Linux distribution, normally on the latest LTS version, with around 200 plugins installed.
Production runs more than 6,000 builds every day and supports more than 1,000 users and 200 agents running Windows and Linux.
On this note, most of the agents are maintained by the departments themselves.
We offer guidance and also (limited) support.


In addition to the Jenkins servers, we provide every...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introduction&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introduction&quot; /&gt;Introduction&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hi, my name is Mark.
I am a Jenkins administrator, and I want to share some of my daily experiences using and maintaining Jenkins.
I hope you enjoy it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;environment-and-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#environment-and-setup&quot; /&gt;Environment and setup&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have two Jenkins servers, &lt;code&gt;production&lt;/code&gt; and &lt;code&gt;quality&lt;/code&gt;.
Both run on a commercially supported Linux distribution, normally on the latest LTS version, with around 200 plugins installed.
Production runs more than 6,000 builds every day and supports more than 1,000 users and 200 agents running Windows and Linux.
On this note, most of the agents are maintained by the departments themselves.
We offer guidance and also (limited) support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the Jenkins servers, we provide every Jenkins user with access to Kubernetes agents.
These agents use a special build image that we maintain.
The image includes and configures various tools (Java, .NET, Python, Node.js) and services (proxies and certificates).
Users can therefore get started with their multibranch pipelines quickly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also provide template repositories for different languages, including examples of how to build and deploy an application to a Kubernetes cluster.
Users can use these repositories to get started quickly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, we have a shared library with common methods for accessing our tools and setting up tool-specific steps.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;lts-and-maintenance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lts-and-maintenance&quot; /&gt;LTS and maintenance&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our maintenance is announced one week in advance.
Between the announcement and the date, we test the changes on &lt;code&gt;quality&lt;/code&gt; with different jobs and coordinate with a few departments on additional testing.
Security advisories with an impact on our environment are addressed within 36 hours.
Breaking changes in Jenkins or its plugins, such as a Java 21 upgrade, are announced further in advance because of their complexity:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java 21 upgrades: announced three months in advance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins plugin updates affecting only a few users: announced one week in advance&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;tickets-and-daily-life&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tickets-and-daily-life&quot; /&gt;Tickets and daily life&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have a ticketing system for our users to report issues or request support.
Most tickets actually concern access.
We have guides for these requests, but it seems they are hidden well.
The remaining tickets involve pipeline support, debugging connections to other tools, evaluating new plugins, and supporting user-managed agents.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;feedback-outlook&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#feedback-outlook&quot; /&gt;Feedback &amp;amp; outlook&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Believe me or not but I have content for a few more posts, so I hope you had fun and will have fun in the future.
I plan to post a new blog every two weeks, so stay tuned for more content.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have feedback or questions, please use the comment section below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Greetings,
Mark&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/08/24/pratik-mane-gsoc-endterm-blog-post/</id>
<title>GSoC 2026 Endterm - Plugin Modernizer Stats Visualization</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-08-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/08/24/pratik-mane-gsoc-endterm-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='gsoc2026-endterm'></category>
<category term='plugin-modernization'></category>
<category term='data-visualization'></category>
<summary>
Hello everyone,


This blog showcases the work done on the Plugin Modernizer Stats Visualization project during Google Summer of Code 2026. For a detailed description of the project, please refer to the project page.





Table of Contents




About the Project


Phase 1


Phase 2


Challenges and Learnings


Next Steps


Acknowledgements


Useful Links






About the Project


The Plugin Modernizer Tool automates the modernization of Jenkins plugins using OpenRewrite recipes, creating pull requests with the results.
As part of GSoC 2025, a metadata repository was established that stores raw modernization metadata in JSON/CSV format.


My GSoC 2026 project, Plugin Modernizer Stats Visualization, builds a static visualization site that consumes this metadata, consolidates it into a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello everyone,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog showcases the work done on the &lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-stats&quot;&gt;Plugin Modernizer Stats Visualization&lt;/a&gt; project during Google Summer of Code 2026. For a detailed description of the project, please refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/plugin-modernizer-stats-visualization/&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;table-of-contents&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#table-of-contents&quot; /&gt;Table of Contents&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#about-the-project&quot;&gt;About the Project&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#phase-1&quot;&gt;Phase 1&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#phase-2&quot;&gt;Phase 2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#challenges-and-learnings&quot;&gt;Challenges and Learnings&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#next-steps&quot;&gt;Next Steps&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#acknowledgements&quot;&gt;Acknowledgements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#useful-links&quot;&gt;Useful Links&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about-the-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-the-project&quot; /&gt;About the Project&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-tool&quot;&gt;Plugin Modernizer Tool&lt;/a&gt; automates the modernization of Jenkins plugins using OpenRewrite recipes, creating pull requests with the results.
As part of GSoC 2025, a &lt;a href=&quot;https://github.com/jenkins-infra/metadata-plugin-modernizer&quot;&gt;metadata repository&lt;/a&gt; was established that stores raw modernization metadata in JSON/CSV format.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My GSoC 2026 project, &lt;strong&gt;Plugin Modernizer Stats Visualization&lt;/strong&gt;, builds a static visualization site that consumes this metadata, consolidates it into a structured format and presents dashboards alongside per-plugin and per-recipe report pages.
The goal was to give plugin maintainers, modernizer authors, new contributors and the infra team a single place to understand modernization health at a glance without manually browsing hundreds of plugin directories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The diagram below shows how the different pieces of the ecosystem fit together:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/08/24/plugin-modernizer-stats-workflow.png&quot; alt=&quot;Plugin Modernizer Stats workflow — from CLI tool to visualization dashboard&quot; width=&quot;100%&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;phase-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-1&quot; /&gt;Phase 1&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By the midterm, we accomplished the following milestones:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Pipeline (ETL):&lt;/strong&gt; A GitHub Actions workflow in &lt;a href=&quot;https://github.com/jenkins-infra/metadata-plugin-modernizer&quot;&gt;metadata-plugin-modernizer&lt;/a&gt; validates raw modernization data, runs a Python consolidation script to produce a single &lt;a href=&quot;https://jenkins-infra.github.io/metadata-plugin-modernizer/report.json&quot;&gt;report.json&lt;/a&gt; and deploys it via GitHub Pages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dashboard (Home Page):&lt;/strong&gt; Summary stat cards, migration status donut chart, recipe performance bar chart, migration timeline trend, and tag distribution visualization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plugin List Page:&lt;/strong&gt; A searchable table of 400+ plugins with status badges, migration ratios, last-updated dates, and links to plugin pages and GitHub repositories.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://jenkins-infra.github.io/plugin-modernizer-stats/&quot;&gt;live demo&lt;/a&gt; and my &lt;a href=&quot;https://www.jenkins.io/blog/2026/07/10/pratik-mane-gsoc-midterm-blog-post/&quot;&gt;midterm blog post&lt;/a&gt; for more details on the first half of the coding period.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;phase-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-2&quot; /&gt;Phase 2&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the second half of GSoC, the focus shifted from foundational pages to drill-down reports, polish and production readiness.
The result is a fully navigable site where users can move from a high-level overview down to individual plugins and recipes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;dashboard&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dashboard&quot; /&gt;Dashboard&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The home page brings together the key metrics from across the modernization effort : total plugins, migrations, successes and failures alongside charts that reveal trends over time and highlight which recipes need attention.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/08/24/plugin-modernizer-stats-dashboard.png&quot; alt=&quot;Plugin Modernizer Stats dashboard with summary cards and migration charts&quot; width=&quot;100%&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;plugin-list-page&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-list-page&quot; /&gt;Plugin List Page&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin list page displays all &lt;strong&gt;plugins&lt;/strong&gt; that have been processed by the Plugin Modernizer Tool.
Each row shows the plugin name, overall migration status (All Passed, All Failed, Mostly Passed, Mostly Failed), the success-to-failure ratio, the last updated date and quick links to the plugin’s detail page and GitHub repository.
The table is searchable and filterable, making it easy to find a specific plugin or scan for ones that need attention.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;per-plugin-detail-pages&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#per-plugin-detail-pages&quot; /&gt;Per-Plugin Detail Pages&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Clicking into any plugin opens a dedicated detail page with a complete picture of that plugin’s modernization history.
For example, the page for the &lt;strong&gt;ansible&lt;/strong&gt; plugin shows:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A header with the plugin’s overall status, repository link, branch, last updated date and merged PR count.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Summary stat cards for total migrations, successes and failures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;migration timeline&lt;/strong&gt; chart that visualizes when recipes were applied and whether they succeeded or failed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;recipe breakdown&lt;/strong&gt; table listing every recipe applied to the plugin, along with applied, success and failed counts and per-recipe status.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;PR history&lt;/strong&gt; section with links to the pull requests generated by the modernizer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;failed migrations&lt;/strong&gt; table surfacing error details for any recipes that did not succeed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/08/24/plugin-modernizer-stats-plugin-detail.png&quot; alt=&quot;Per-plugin detail page showing migration timeline&quot; width=&quot;100%&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;recipe-list-page&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#recipe-list-page&quot; /&gt;Recipe List Page&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The recipe list page displays all &lt;strong&gt;recipes&lt;/strong&gt; that have been applied across the plugin ecosystem.
Each row shows the recipe name, how many plugins it was applied to, the overall success rate and a link to the recipe’s detail page.
This view helps recipe authors quickly identify which recipes are performing well and which ones may need fixes or improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;per-recipe-detail-pages&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#per-recipe-detail-pages&quot; /&gt;Per-Recipe Detail Pages&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each recipe has its own detail page with stats scoped to that recipe.
For example, the page for the &lt;strong&gt;AddCodeOwner&lt;/strong&gt; recipe shows:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A header with the recipe’s fully qualified name and overall success rate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Summary stat cards for total applications, successes, failures and success rate percentage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An &lt;strong&gt;application status&lt;/strong&gt; donut chart breaking down success, failure and other outcomes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An &lt;strong&gt;application timeline&lt;/strong&gt; chart showing when the recipe was applied over time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An &lt;strong&gt;affected plugins&lt;/strong&gt; table listing every plugin the recipe was run against, along with per-plugin status and date.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/08/24/plugin-modernizer-stats-recipe-detail.png&quot; alt=&quot;Per-recipe detail page showing application status&quot; width=&quot;100%&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stretch-goal-cli-command-snippets&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stretch-goal-cli-command-snippets&quot; /&gt;Stretch Goal: CLI Command Snippets&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a stretch goal, I added copy-paste &lt;strong&gt;CLI command snippets&lt;/strong&gt; on both the per-plugin and per-recipe detail pages.
These snippets show the exact &lt;code&gt;plugin-modernizer&lt;/code&gt; command needed to run a dry-run (or apply) a recipe on a specific plugin, lowering the barrier for maintainers who want to reproduce or retry a modernization locally.
Users can expand a dropdown to see per-recipe commands for a given plugin, or per-plugin commands for a given recipe, and copy any command with a single click.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;uiux-theming-and-reliability&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#uiux-theming-and-reliability&quot; /&gt;UI/UX, Theming and Reliability&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beyond the core pages, several improvements went into making the site production-ready:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins-aligned theming&lt;/strong&gt; using &lt;a href=&quot;https://github.com/jenkins-infra/jenkins-io-components&quot;&gt;jenkins-io-components&lt;/a&gt; for shared navbar and footer, with a color palette consistent with the Jenkins visual ecosystem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Error boundaries and error pages&lt;/strong&gt; for graceful handling of missing data, network failures and invalid routes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Skeleton loaders&lt;/strong&gt; on dashboard, list and detail pages so the UI feels responsive while data is being fetched.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;testing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing&quot; /&gt;Testing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project now has &lt;strong&gt;32 test files&lt;/strong&gt; with &lt;strong&gt;303 passing tests&lt;/strong&gt; covering pages, components, hooks and utility functions using Vitest and Testing Library.
A GitHub Actions CI pipeline runs linting, formatting, build and test checks on every pull request.
The site is deployed automatically to &lt;a href=&quot;https://jenkins-infra.github.io/plugin-modernizer-stats/&quot;&gt;GitHub Pages&lt;/a&gt; on every merge to the &lt;code&gt;main&lt;/code&gt; branch.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;documentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation&quot; /&gt;Documentation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-stats&quot;&gt;repository README&lt;/a&gt; includes setup instructions, a description of the data flow and references to the related Plugin Modernizer and metadata repositories, making it straightforward for new contributors to get started.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;challenges-and-learnings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges-and-learnings&quot; /&gt;Challenges and Learnings&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Designing a consistent data model that could power both plugin-level and recipe-level views from a single &lt;code&gt;report.json&lt;/code&gt; was one of the bigger technical challenges.
The consolidated report needed to be rich enough for detailed drill-down pages while remaining small enough to fetch quickly in the browser.
Working closely with my mentors on the schema in &lt;code&gt;metadata-plugin-modernizer&lt;/code&gt; early on helped avoid rework later.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Performance was another consideration with &lt;code&gt;431 plugins and 21 recipes&lt;/code&gt;, list pages needed virtualization and careful chart rendering to stay smooth.
Using react-window for the plugin and recipe tables and lazy-loading chart data on detail pages kept the experience snappy even on slower connections.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, coordinating changes across two repositories (&lt;code&gt;metadata-plugin-modernizer&lt;/code&gt; for the ETL pipeline and &lt;code&gt;plugin-modernizer-stats&lt;/code&gt; for the UI) taught me a lot about planning cross-repo work, writing clear PR descriptions and keeping both sides in sync through regular mentor syncs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#next-steps&quot; /&gt;Next Steps&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While the core deliverables are complete, the following areas represent the clearest next steps for making the modernization effort more targeted and effective:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;plugin-health-score-page&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-health-score-page&quot; /&gt;Plugin Health Score Page&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Add a dedicated page that displays a &lt;strong&gt;health score&lt;/strong&gt; for each plugin, similar to the existing score on the Jenkins Plugin Index (e.g., &lt;a href=&quot;https://plugins.jenkins.io/ansible-tower/healthscore/&quot;&gt;ansible-tower health score&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Today, the stats site shows &lt;strong&gt;what happened&lt;/strong&gt; during modernization — which recipes ran, which PRs were opened and whether they succeeded. A health score page would show &lt;strong&gt;where a plugin stands overall&lt;/strong&gt; — surfacing gaps in documentation, dependencies, security advisories, adoption and other factors that affect maintainability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Expected outcome:&lt;/strong&gt; Plugin maintainers and contributors could open a single page, see a plugin’s health at a glance and immediately understand which modernization recipes would have the highest impact. This turns the stats site from a historical report into a prioritization tool helping the community focus modernization efforts on plugins that need it most.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;ai-assisted-plugin-specific-recipe-recommendations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ai-assisted-plugin-specific-recipe-recommendations&quot; /&gt;AI-Assisted, Plugin-Specific Recipe Recommendations&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Explore integrating AI technologies to analyze a plugin’s modernization history and recommend &lt;strong&gt;specific, plugin-level recipes&lt;/strong&gt; tailored to that plugin’s current state.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Not every plugin needs the same set of recipes. Running all 21 recipes blindly is inefficient; some plugins may only need a Java version upgrade, while others need dependency migrations or CI workflow updates. By learning from patterns in the existing metadata (which recipes succeeded, which failed and in what order), an AI-assisted layer could suggest the most relevant next steps for each plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Expected outcome:&lt;/strong&gt; Instead of a maintainer guessing which recipes to apply, the tool would surface a ranked list of recommended recipes with reasoning, improving the accuracy and effectiveness of the modernization process and reducing failed migration attempts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;other-enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-enhancements&quot; /&gt;Other Enhancements&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add deeper filtering and sorting options on list pages (e.g., filter plugins by tag or recipe).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Explore embedding or linking the stats from &lt;a href=&quot;https://stats.jenkins.io/&quot;&gt;stats.jenkins.io&lt;/a&gt; for broader discoverability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add export options (CSV/JSON) for plugin and recipe reports.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continue expanding test coverage as new features are added and the dataset grows beyond 431 plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A huge thank you to my mentors, &lt;a href=&quot;https://www.jenkins.io/blog/authors/jonesbusy&quot;&gt;Valentin Delaye&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/sridamul&quot;&gt;Sridhar Sivakumar&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/CodexRaunak&quot;&gt;Raunak Madan&lt;/a&gt;, for their constant support, refining the approach and timely reviews throughout the journey. They conducted sync meetings twice a week, were always reachable on Slack and actively reviewed my pull requests — that made all the difference.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d also like to thank the organization admins for always checking in and offering help.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project builds on the work started by Sridhar Sivakumar in GSoC 2024, &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/projects/using-openrewrite-recipes-for-plugin-modernization-or-automation-plugin-build-metadata-updates/&quot;&gt;Using OpenRewrite Recipes for Plugin Modernization&lt;/a&gt;, and improved by Raunak Madan in GSoC 2025, &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2025/projects/plugin-modernizer-improvements/&quot;&gt;Improving Plugin Modernizer&lt;/a&gt;. I’m grateful to continue that lineage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, thank you to the Jenkins community for being welcoming and supportive throughout GSoC 2026.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;useful-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#useful-links&quot; /&gt;Useful Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/plugin-modernizer-stats-visualization/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-infra.github.io/plugin-modernizer-stats/&quot;&gt;Live Demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-stats&quot;&gt;Source Code (jenkins-infra)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/metadata-plugin-modernizer&quot;&gt;Metadata Repository (data source)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-tool&quot;&gt;Plugin Modernizer Tool&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-stats/pull/55&quot;&gt;Plugin Detail Page PR&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-stats/pull/68&quot;&gt;Recipe List Page PR&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-stats/pull/77&quot;&gt;Recipe Detail Page PR&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-stats/pull/90&quot;&gt;Testing Improvements PR&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2026/05/23/pratik-mane-gsoc-community-bonding-blog-post/&quot;&gt;Community Bonding Blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2026/07/10/pratik-mane-gsoc-midterm-blog-post/&quot;&gt;Midterm Blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/08/24/contributor-summit-virtual/</id>
<title>Announcing a Contributor Summit Virtual Event (September 11, 2026)</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-08-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/08/24/contributor-summit-virtual/" />
<category term='contribute'></category>
<category term='community'></category>
<category term='contributor-summit'></category>
<summary>
We are excited to announce the Contributor Summit Virtual Event happening on September 11, 2026.


The Contributor Summit is an opportunity for Jenkins contributors, users, and enthusiasts to come together, share knowledge, and collaborate on the future of Jenkins.
Mark your calendars and join us for a day of insightful sessions, networking, and community building.


Event Details


The summit will be entirely online.
Join us for all the sessions or just a few.


Jenkins Contributor Summit 2026: The virtual hackathon

We will be hosting a virtual hackathon on September 11, 2026, from 08:30 to 19:30 CEST.
The event will be conducted online, allowing participants from around the world...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are excited to announce the &lt;strong&gt;Contributor Summit Virtual Event&lt;/strong&gt; happening on September 11, 2026.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Contributor Summit is an opportunity for Jenkins contributors, users, and enthusiasts to come together, share knowledge, and collaborate on the future of Jenkins.
Mark your calendars and join us for a day of insightful sessions, networking, and community building.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;event-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#event-details&quot; /&gt;Event Details&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The summit will be entirely online.
Join us for all the sessions or just a few.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-contributor-summit-2026-the-virtual-hackathon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-contributor-summit-2026-the-virtual-hackathon&quot; /&gt;Jenkins Contributor Summit 2026: The virtual hackathon&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will be hosting a virtual hackathon on September 11, 2026, from 08:30 to 19:30 CEST.
The event will be conducted online, allowing participants from around the world to join and contribute.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It will be structured into two main blocks:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;morning-block-the-apac-emea-connection&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#morning-block-the-apac-emea-connection&quot; /&gt;Morning Block: The APAC-EMEA Connection&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Focus: Catching APAC before they sign off for the weekend.&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 16.6666%;&quot;&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 50.0001%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Time (CEST)&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Session&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Activity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;08:30&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Tech Prep&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Moderator opens the Zoom/Teams bridge and pins the GitHub Repo link.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;09:00&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Opening Plenary&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Livestream: Welcome, 2026 Roadmap, and “How to use the Repo” tutorial.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;09:30&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Squad Formation&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Breakout rooms of 4 people. Each squad picks a GitHub Issue to “own.”&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;09:45&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Interactive Intro&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Squad Task: 15 mins of personal intros + creating their Google Doc (linked in their GitHub Issue).&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;10:15&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Working Session A&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Hackathon: Live coding/doc writing. Moderator “visits” rooms to unblock squads.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;12:00&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Showcase 1&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Squads post their progress/PR links in the GitHub Issue. Quick 2-min demos.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;12:30&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Mid-Day Sync&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Moderator Note: Label issues as [Status: In Progress] or [Status: Needs Handover].&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/col&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-moderators-siesta-1230-1500-cest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-moderators-siesta-1230-1500-cest&quot; /&gt;The “Moderator’s Siesta” (12:30 – 15:00 CEST)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The bridge remains open for EMEA contributors, but the formal moderation pauses.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;afternoon-block-the-emea-americas-connection&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#afternoon-block-the-emea-americas-connection&quot; /&gt;Afternoon Block: The EMEA-Americas Connection&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Focus: Bringing the US/LATAM online and finishing what started in the morning.&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 16.6666%;&quot;&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 50.0001%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Time (CEST)&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Session&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Activity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;15:00&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Re-Opening&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Moderator summarizes morning wins. Introduce the “Handover” issues for newcomers.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;15:30&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Squad Formation&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;New squads of 4 people. Mix of fresh Americas faces and lingering EMEA contributors.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;15:45&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Interactive Intro&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Squad Task: Intros + “Adopting” an Issue. If it’s a handover, they read the previous squad’s Google Doc.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;16:15&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Working Session B&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Hackathon: Deep work. Americas morning energy meets EMEA afternoon focus.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;18:00&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Final Sprint&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;“Last call” for Pull Requests. Moderator helps with training and reviews.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;19:00&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Global Showcase&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Final demos of the day’s achievements. Credits and closing remarks.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;19:30&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Hard Stop&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Moderator closes the bridge.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/col&gt;
&lt;/colgroup&gt;
&lt;/table&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-squad-of-4-workflow&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-squad-of-4-workflow&quot; /&gt;The “Squad of 4” Workflow&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every squad will have this 3-Step Checklist to complete in their breakout room:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;The Personal Connect (15 min)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Intros: Name, location, and “One thing I love/hate about Jenkins.”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Roles: Assign a Driver (shares screen), a Scribe (updates Google Doc or GitHub issue), and two Reviewers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The GitHub “Claim”&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Talk about the Issue you want to work on and how you plan to tackle it or create a new one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Squad comments on a GitHub Issue: “Squad 4 (Alice, Bob, Charlie, Dana) is taking this!”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;They paste their Google Doc link directly into that GitHub Issue comment so you can track them.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Documentation&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;All working notes go in the Google Doc or in a GitHub issue.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final output (Code or Text) is submitted as a Pull Request referencing the Issue number.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-github-repo-structure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-github-repo-structure&quot; /&gt;The GitHub Repo Structure&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the day of the event, we will use a GitHub Project Board (Kanban style).
It will give everyone a “God’s eye view” of every squad’s progress without you having to ask them for updates constantly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We might have issues for pure knowledge sharing, like &quot;See my cool new plugin&quot;, or &quot;Let us create a small documentation update for this specific jenkins.io page&quot; or &quot;Let’s create a new plugin for this specific use case.&quot;
The goal is to have a mix of coding, documentation, and knowledge sharing for the day.
So that new contributors can get a taste of the Jenkins ecosystem and learn how to contribute and more experienced contributors can work on more complex issues.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;call-for-participation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#call-for-participation&quot; /&gt;Call for Participation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The whole day is about collaboration, learning, and contributing to the Jenkins ecosystem. We encourage everyone to join, whether you’re a seasoned contributor or new to Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Attending the summit&lt;/strong&gt;, please fill out the registration form: &lt;a href=&quot;https://forms.gle/mxwginEuTT68BVj99&quot;&gt;Register Here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Having an idea&lt;/strong&gt; for a GitHub Issue to work on or talk about, please submit it here: &lt;a href=&quot;https://github.com/StefanSpieker/jenkins-virtual-contrib-summit-2026/issues&quot;&gt;Submit Here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Remarks or questions&lt;/strong&gt;, please use the discourse thread at the bottom.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/08/23/mohammed-faheem-gsoc-finalterm-blogpost/</id>
<title>GSoC 2026 Final Update - Jenkins Email Notifications using Outlook SMTP with OAuth</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-08-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/08/23/mohammed-faheem-gsoc-finalterm-blogpost/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='jenkins.io'></category>
<category term='email'></category>
<category term='oauth'></category>
<category term='security'></category>
<summary>
Hey everyone!


This post marks the end of my Google Summer of Code 2026 project, Jenkins email notifications using Outlook SMTP with OAuth. It&#8217;s been a great few months working across the email-ext, oauth-credentials, and entra-oauth plugins with my mentors Alex Earl and Kris Stern. If you want the first half of the story, my midterm update has it.


Table of Contents




About the Project


Recap: Where Things Stood at Midterm


Progress After Midterm


What Still Needs Fixing


All the PRs


What I&#8217;ve Learned


Acknowledgements


Follow Along






About the Project


email-ext only supported username/password-based SMTP authentication, which doesn&#8217;t work for Google Workspace or Microsoft Entra environments that require OAuth 2.0. This project...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hey everyone!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post marks the end of my Google Summer of Code 2026 project, &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/jenkins-email-notifications-using-outlook-smtp-with-oath/&quot;&gt;Jenkins email notifications using Outlook SMTP with OAuth&lt;/a&gt;. It’s been a great few months working across the &lt;code&gt;email-ext&lt;/code&gt;, &lt;code&gt;oauth-credentials&lt;/code&gt;, and &lt;code&gt;entra-oauth&lt;/code&gt; plugins with my mentors &lt;a href=&quot;https://www.jenkins.io/blog/authors/slide_o_mix&quot;&gt;Alex Earl&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;. If you want the first half of the story, my &lt;a href=&quot;https://www.jenkins.io/blog/2026/07/09/mohammed-faheem-gsoc-midterm-update-blog-post/&quot;&gt;midterm update&lt;/a&gt; has it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;table-of-contents&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#table-of-contents&quot; /&gt;Table of Contents&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#about-the-project&quot;&gt;About the Project&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#recap-where-things-stood-at-midterm&quot;&gt;Recap: Where Things Stood at Midterm&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#progress-after-midterm&quot;&gt;Progress After Midterm&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#what-still-needs-fixing&quot;&gt;What Still Needs Fixing&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#all-the-prs&quot;&gt;All the PRs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#what-ive-learned&quot;&gt;What I’ve Learned&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#acknowledgements&quot;&gt;Acknowledgements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#follow-along&quot;&gt;Follow Along&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about-the-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-the-project&quot; /&gt;About the Project&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;email-ext&lt;/code&gt; only supported username/password-based SMTP authentication, which doesn’t work for Google Workspace or Microsoft Entra environments that require OAuth 2.0. This project adds OAuth 2.0 SMTP authentication support to &lt;code&gt;email-ext&lt;/code&gt;, alongside the existing username/password flow.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;recap-where-things-stood-at-midterm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#recap-where-things-stood-at-midterm&quot; /&gt;Recap: Where Things Stood at Midterm&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By midterm, OAuth 2.0 SMTP auth was working end-to-end, validated using Google Workspace in &lt;code&gt;email-ext&lt;/code&gt;, alongside the existing username/password flow. We’d also just gotten maintainer rights on &lt;code&gt;oauth-credentials-plugin&lt;/code&gt;, which let us fix a design issue regarding scope requirements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The existing design had ScopeRequirement objects defined locally within each OAuth provider plugin. This meant the consumer had to add the corresponding provider plugin as a development dependency simply to construct and use its ScopeRequirement object. This made it difficult to build provider-agnostic functionality. Our work in oauth-credentials-plugin addressed this by providing a resolver API that could operate on these requirements without requiring consumers to depend directly on a provider plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;progress-after-midterm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#progress-after-midterm&quot; /&gt;Progress After Midterm&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-capability-scope-resolver&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-capability-scope-resolver&quot; /&gt;The Capability &amp;amp; Scope Resolver&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was the main feature for this half. Up to this point, if a plugin like &lt;code&gt;email-ext&lt;/code&gt; wanted to request OAuth scopes through &lt;code&gt;oauth-credentials&lt;/code&gt;, it had to hard-depend on each concrete provider plugin (Google, Entra, etc) just to build an &lt;code&gt;OAuth2ScopeRequirement&lt;/code&gt;. That works fine for one provider, but it doesn’t scale if a plugin wants to support multiple providers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/oauth-credentials-plugin/pull/47&quot;&gt;PR #47&lt;/a&gt; adds a capability &amp;amp; scope resolver API to &lt;code&gt;oauth-credentials-plugin&lt;/code&gt;. Instead of asking for a concrete requirement type, a consuming plugin now just asks for a capability like &lt;code&gt;&quot;send email&quot;&lt;/code&gt; as a plain string, and each provider supplies its own resolver class that maps that string to whatever scopes it actually needs under the hood. &lt;code&gt;email-ext&lt;/code&gt; doesn’t need to know any scope-specific information regarding OAuth providers anymore.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Entra implementation of this is in &lt;a href=&quot;https://github.com/jenkinsci/entra-oauth-plugin/pull/21&quot;&gt;entra-oauth-plugin #21&lt;/a&gt;, which implements the resolver for Entra so it plugs into the new API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alongside that, &lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1600&quot;&gt;PR #1600&lt;/a&gt; adds a test-email button to the mail account section of the system configuration page, so admins can check their SMTP setup actually works without saving the config and configuring a real build to trigger a notification.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-still-needs-fixing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-still-needs-fixing&quot; /&gt;What Still Needs Fixing&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So far, OAuth flow has only been validated end to end against a real Google Workspace environment - I haven’t had the chance to run it against a real Entra environment, so that’s still an open gap before I’d call the Entra path equally proven out. Another thing that could warrant further discussion is the  &lt;code&gt;getAccessToken()&lt;/code&gt; function signature from the &lt;code&gt;oauth-credentials-plugin&lt;/code&gt;. It returns &lt;code&gt;null&lt;/code&gt; in failure cases instead of surfacing an error, which makes debugging a broken credential difficult from the provider side.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;all-the-prs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#all-the-prs&quot; /&gt;All the PRs&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s everything from this GSoC period organised by repo for a paper trail.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;email-ext-plugin&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1600&quot;&gt;#1600&lt;/a&gt; - Add test email feature&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1593&quot;&gt;#1593&lt;/a&gt; - Unit tests for the authenticator and OAuth retry logic&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1592&quot;&gt;#1592&lt;/a&gt; - Handle authentication failures more explicitly instead of swallowing them&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1590&quot;&gt;#1590&lt;/a&gt; - Tests for &lt;code&gt;ExtendedEmailPublisherDescriptor&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1589&quot;&gt;#1589&lt;/a&gt; - Single-attempt retry logic added to the authenticator&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1587&quot;&gt;#1587&lt;/a&gt; - Modified the authenticator to actually support OAuth2 credentials&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1586&quot;&gt;#1586&lt;/a&gt; - Report errors properly even when not in debug mode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1583&quot;&gt;#1583&lt;/a&gt; - Added a Test OAuth2 Credentials class for unit/integration tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1581&quot;&gt;#1581&lt;/a&gt; - Added OAuth2 credential selection to the MailAccount dropdown&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1579&quot;&gt;#1579&lt;/a&gt; - Restored &lt;code&gt;ACL.SYSTEM&lt;/code&gt; for credential lookup on the config page&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/email-ext-plugin/pull/1557&quot;&gt;#1557&lt;/a&gt; - Expanded tests to verify multipart structure and body content&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;oauth-credentials-plugin&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/oauth-credentials-plugin/pull/47&quot;&gt;#47&lt;/a&gt; - Capability &amp;amp; scope resolver API (the big one, see above)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;entra-oauth-plugin&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/entra-oauth-plugin/pull/21&quot;&gt;#21&lt;/a&gt; - Entra capability-based scope resolver for provider-agnostic OAuth handling&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/entra-oauth-plugin/pull/15&quot;&gt;#15&lt;/a&gt; - Display Entra errors in &lt;code&gt;doTestConnection&lt;/code&gt; in the UI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/entra-oauth-plugin/pull/8&quot;&gt;#8&lt;/a&gt; - Add scope validation before calling the endpoint&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-ive-learned&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-ive-learned&quot; /&gt;What I’ve Learned&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Working across email-ext, oauth-credentials, and entra-oauth gave me hands-on experience with OAuth 2.0, SMTP authentication, API design, testing, and error handling.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beyond the technical side, working with my mentors and the Jenkins community helped me improve how I approach problems, respond to code reviews, and think about long-term maintainability rather than just making something work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Overall, this experience made me a more confident developer and open source contributor, while giving me a much better understanding of how large open source projects are designed and maintained.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks again to my mentors, &lt;a href=&quot;https://www.jenkins.io/blog/authors/slide_o_mix&quot;&gt;Alex Earl&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, for their guidance through both halves of this project, and to the Jenkins community for being so welcoming to a first-time contributor.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;follow-along&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#follow-along&quot; /&gt;Follow Along&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can reach me here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Faheem12005&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/mohdfaheem2005/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;mailto:mohdfaheem.1205@gmail.com&quot;&gt;Gmail&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks for reading along this summer!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/08/22/vatsal-verma-gsoc-end-term-blog-post/</id>
<title>GSoC 2026 final term - Retooling Jenkins.io Web Success Stories</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-08-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/08/22/vatsal-verma-gsoc-end-term-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='jenkins.io'></category>
<category term='web development'></category>
<category term='ui/ux'></category>
<category term='retooling'></category>
<summary>
Hello everyone!


This post marks the successful completion of my Google Summer of Code 2026 Retool jenkins.io website Success Stories project.
The project focused on modernizing the Jenkins Success Stories website by migrating it from Gatsby to Vite, improving performance, streamlining the story submission workflow, and enhancing the overall user experience.


It has been an incredible learning experience, and I’m grateful to the Jenkins community and my mentors for their guidance, feedback, and support throughout the project.


For a detailed overview, please refer to the project page.


Table of Contents




About the Project


Progress till Midterm



Application Migration


YAML Refinement and Validation





Progress After Midterm



Story Submission


UI/UX Redesign


Code Quality &amp; Tooling





What...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/Jenkins_GSoC_2026_Program.png&quot; alt=&quot;Jenkins GSoC 2026 Program&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello everyone!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post marks the successful completion of my Google Summer of Code 2026 &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/retool-jenkins-io-website-success-stories/&quot;&gt;Retool jenkins.io website Success Stories&lt;/a&gt; project.
The project focused on modernizing the Jenkins Success Stories website by migrating it from Gatsby to Vite, improving performance, streamlining the story submission workflow, and enhancing the overall user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It has been an incredible learning experience, and I’m grateful to the Jenkins community and my mentors for their guidance, feedback, and support throughout the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a detailed overview, please refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/retool-jenkins-io-website-success-stories/&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;table-of-contents&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#table-of-contents&quot; /&gt;Table of Contents&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#about-the-project&quot;&gt;About the Project&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#progress-till-midterm&quot;&gt;Progress till Midterm&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;olist loweralpha&quot;&gt;
&lt;ol class=&quot;loweralpha&quot; type=&quot;a&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#application-migration&quot;&gt;Application Migration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#yaml-refinement-and-validation&quot;&gt;YAML Refinement and Validation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#progress-after-midterm&quot;&gt;Progress After Midterm&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;olist loweralpha&quot;&gt;
&lt;ol class=&quot;loweralpha&quot; type=&quot;a&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#story-submission&quot;&gt;Story Submission&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#uiux-redesign&quot;&gt;UI/UX Redesign&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#code-quality-tooling&quot;&gt;Code Quality &amp;amp; Tooling&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#what-ive-learned&quot;&gt;What I’ve Learned?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#acknowledgements&quot;&gt;Acknowledgements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about-the-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-the-project&quot; /&gt;About the Project&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project aims to migrate the Jenkins.io Success Stories website from Gatsby to Vite, enabling faster builds, improved developer experience, and better performance. It focuses on modernizing the UI/UX with a responsive, accessible, and user-centric design.
A key objective is redesigning the story submission workflow, allowing structured, automated, and scalable content contributions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This transition will also involve refining and standardizing YAML-based content files for better consistency, validation, and maintainability.
Overall, the project enhances performance, scalability, and contributor experience while aligning the platform with modern web development practices.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;project repository: &lt;a href=&quot;https://github.com/jenkins-infra/stories/&quot;&gt;Jenkins Success Stories&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;progress-till-midterm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#progress-till-midterm&quot; /&gt;Progress till Midterm&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By midterm, the project had made significant progress in two key areas: &lt;code&gt;application migration&lt;/code&gt; and &lt;code&gt;Success Stories data quality.&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;application-migration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#application-migration&quot; /&gt;Application Migration&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Migrated the application from &lt;code&gt;Gatsby to Vite&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replaced &lt;code&gt;GraphQL&lt;/code&gt; with &lt;code&gt;YAML-based&lt;/code&gt; data loading.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added &lt;code&gt;SSG&lt;/code&gt;, &lt;code&gt;dynamic routing&lt;/code&gt;, and &lt;code&gt;Leaflet&lt;/code&gt; map support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;yaml-refinement-and-validation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#yaml-refinement-and-validation&quot; /&gt;YAML Refinement and Validation&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Cleaned&lt;/code&gt; and &lt;code&gt;standardized&lt;/code&gt; all 194 YAML files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added &lt;code&gt;yamllint&lt;/code&gt; for structural checks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added &lt;code&gt;AJV schema validation&lt;/code&gt; for consistent data.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;progress-after-midterm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#progress-after-midterm&quot; /&gt;Progress After Midterm&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the midterm, the project focused on completing the &lt;code&gt;story submission workflow&lt;/code&gt;, &lt;code&gt;modernizing the UI/UX&lt;/code&gt;, and &lt;code&gt;strengthening code quality&lt;/code&gt; and &lt;code&gt;project tooling&lt;/code&gt;.
These improvements made the platform easier to use, more maintainable, and more efficient for both contributors and maintainers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;story-submission&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#story-submission&quot; /&gt;Story Submission&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Integrated &lt;code&gt;Decap CMS&lt;/code&gt; to provide a user-friendly interface for &lt;code&gt;submitting Success Stories&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added &lt;code&gt;GitHub OAuth authentication&lt;/code&gt; and a workflow to automatically generate PRs from submissions (already OAuth configured for stories.jenkins.io).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improved the &lt;code&gt;submission process&lt;/code&gt; with form &lt;code&gt;validation&lt;/code&gt; and automated story generation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/08/story-workflow.png&quot; alt=&quot;story workflow&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new story submission workflow uses &lt;code&gt;Decap CMS&lt;/code&gt; to provide a simple form-based interface for contributors.
After signing in through &lt;code&gt;GitHub OAuth&lt;/code&gt;, contributors fill out the story form, which generates the required story data and automatically creates a Pull Request in the repository for maintainers to review.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;uiux-redesign&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#uiux-redesign&quot; /&gt;UI/UX Redesign&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Redesigned&lt;/code&gt; the Success Stories interface with a &lt;code&gt;modern&lt;/code&gt; and &lt;code&gt;cleaner&lt;/code&gt; user experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improved &lt;code&gt;navigation&lt;/code&gt;, &lt;code&gt;story discovery&lt;/code&gt;, &lt;code&gt;stories pages&lt;/code&gt;, and &lt;code&gt;responsive&lt;/code&gt; layouts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enhanced overall visual &lt;code&gt;consistency&lt;/code&gt;, &lt;code&gt;accessibility&lt;/code&gt;, and &lt;code&gt;usability&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;code-quality-tooling&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#code-quality-tooling&quot; /&gt;Code Quality &amp;amp; Tooling&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Improved the project’s development workflow by adding &lt;code&gt;tool version&lt;/code&gt; management, &lt;code&gt;Prettier&lt;/code&gt;, and &lt;code&gt;additional GitHub Actions&lt;/code&gt;.
These changes helped standardize the development environment, maintain consistent code formatting, and automate important checks across the project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-ive-learned&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-ive-learned&quot; /&gt;What I’ve Learned?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project has been a valuable learning experience, both technically and personally.
Working on the migration from Gatsby to Vite, improving the data pipeline, and building the new story submission workflow gave me hands-on experience with SSG, routing, data management, performance, CI/CD, and open source tooling.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beyond the technical aspects, working with the Jenkins community and my mentors helped me improve how I approach problems, write maintainable code, and collaborate through reviews and discussions.
The continuous feedback and guidance have contributed greatly to my growth as a developer and open source contributor.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to sincerely thank my mentors, &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/iamrajiv&quot;&gt;Rajiv Singh&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/chamodshehanka&quot;&gt;Chamod Shehanka Perera&lt;/a&gt;, for their continuous guidance, valuable feedback, and support throughout the project.
I am also grateful to the Jenkins community and GSoC organizers for providing me with this opportunity to learn, contribute, and grow through open source.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;follow-along&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#follow-along&quot; /&gt;Follow Along&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can contact me:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/vatsal-verma-b27925291/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Vatsal-Verma&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;mailto:vatsalverma2004@gmail.com&quot;&gt;Gmail&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/08/21/win-2019-container-end-of-life/</id>
<title>Windows Server 2019 Agent Containers End of Life</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-08-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/08/21/win-2019-container-end-of-life/" />
<category term='agents'></category>
<category term='docker'></category>
<category term='cloud-native'></category>
<category term='containers'></category>
<category term='distribution'></category>
<category term='packaging'></category>
<category term='platform-sig'></category>
<summary>
Jenkins core stopped supporting Windows Server 2019 container images in Jenkins 2.569 and Jenkins 2.568.1.
It is now time to drop Windows Server 2019 container images for the inbound agent container images and the SSH agent container images.


Effective August 21, 2026, the Jenkins project will no longer deliver container images based on Windows Server 2019.
We will continue to deliver container images based on newer versions of Windows Server, like Windows Server 2022 and Windows Server 2025.


For users running Windows Server 2019 for their agents, the alternatives are:




Upgrade to Windows Server 2022 or Windows Server 2025


Build their own agent image for Windows...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins core stopped supporting Windows Server 2019 container images in &lt;a href=&quot;https://www.jenkins.io/changelog/2.569/&quot;&gt;Jenkins 2.569&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/changelog/2.568.1/&quot;&gt;Jenkins 2.568.1&lt;/a&gt;.
It is now time to drop Windows Server 2019 container images for the &lt;a href=&quot;https://hub.docker.com/r/jenkins/inbound-agent/&quot;&gt;inbound agent container&lt;/a&gt; images and the &lt;a href=&quot;https://hub.docker.com/r/jenkins/ssh-agent/&quot;&gt;SSH agent container&lt;/a&gt; images.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Effective August 21, 2026, the Jenkins project will no longer deliver container images based on Windows Server 2019.
We will continue to deliver container images based on newer versions of Windows Server, like Windows Server 2022 and Windows Server 2025.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For users running Windows Server 2019 for their agents, the alternatives are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Upgrade to Windows Server 2022 or Windows Server 2025&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build their own agent image for Windows Server 2019&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Windows Server 2019 was &lt;a href=&quot;https://github.com/Azure/AKS/issues/4091&quot;&gt;retired&lt;/a&gt; from the Azure Kubernetes Service (AKS) on March 1, 2026.
Azure Kubernetes Service no longer provides new node images or security patches.
Existing node pools with Windows Server 2019 are unsupported.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More details are available in the &lt;a href=&quot;https://github.com/jenkinsci/docker-agents/issues/1277&quot;&gt;inbound agent issue&lt;/a&gt; and the &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/issues/679&quot;&gt;SSH agent pull issue&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/08/18/plugin_month_august/</id>
<title>Plugin of the Month – August 2026: Dark Theme Plugin</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-08-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/08/18/plugin_month_august/" />
<category term='plugins'></category>
<category term='community'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<category term='plugin-of-the-month'></category>
<summary>
Welcome back to the Plugin of the Month series, where we highlight useful and impactful tools from the Jenkins ecosystem.


August is here, bringing high temperatures and long, bright days.
While we can’t turn down the sun outside, we can certainly give your eyes a break inside.
When you spend hours looking at build logs, pipeline statuses, and administrative panels, a bright white screen can quickly turn into a source of glare and heat.


This August, we are beating the summer heat with a cool, comfortable upgrade: the Dark Theme Plugin.


What is the Dark Theme Plugin?


The Dark Theme Plugin provides a sleek, modern dark...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Welcome back to the &lt;strong&gt;Plugin of the Month&lt;/strong&gt; series, where we highlight useful and impactful tools from the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;August is here, bringing high temperatures and long, bright days.
While we can’t turn down the sun outside, we can certainly give your eyes a break inside.
When you spend hours looking at build logs, pipeline statuses, and administrative panels, a bright white screen can quickly turn into a source of glare and heat.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This August, we are beating the summer heat with a cool, comfortable upgrade: the &lt;a href=&quot;https://plugins.jenkins.io/dark-theme/&quot;&gt;Dark Theme Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-dark-theme-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-dark-theme-plugin&quot; /&gt;What is the Dark Theme Plugin?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Dark Theme Plugin provides a sleek, modern dark mode interface for Jenkins.
Built on top of Jenkins&#39; native theme engine and design system (based on CSS custom properties), it seamlessly transforms the default light background into a dark, high-contrast aesthetic designed.
This reduces eye strain in low-light environments or simply during long monitoring sessions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whether you prefer a dark interface year-round or just want a cooler visual experience during late-night build debugging, this plugin delivers a polished UI out of the box.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But a picture tells more than a thousand words:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/08/dark_theme_screenshot_ci_jenkins_io.png&quot; alt=&quot;Dark Theme example from ci.jenkins.io&quot; width=&quot;800&quot; title=&quot;Dark Theme example from ci.jenkins.io&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-highlights&quot; /&gt;Key Highlights&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;1-system-preference-synchronization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-system-preference-synchronization&quot; /&gt;1. System Preference Synchronization&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Dark Theme Plugin supports automatic theme switching by detecting your OS/browser preference (prefers-color-scheme).
If your workstation switches to dark mode in the evening, Jenkins will follow automatically without the need for manual toggling.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;2-consistent-ui-across-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-consistent-ui-across-plugins&quot; /&gt;2. Consistent UI Across Plugins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because the plugin leverages modern Jenkins CSS variables, it styles not just the core dashboard, but also modern Jenkins UI elements, job pages, and plugin settings, ensuring a cohesive dark aesthetic across your dashboard.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;3-easy-integration-with-appearance-settings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3-easy-integration-with-appearance-settings&quot; /&gt;3. Easy Integration with Appearance Settings&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin integrates directly into the standard Appearance configuration page in Jenkins, making it easy for administrators to configure global defaults or for individual users to pick their preferred theme in their user profile settings.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-to-enable-dark-theme&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-enable-dark-theme&quot; /&gt;How to Enable Dark Theme&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Getting a cooler UI takes only a few seconds:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Navigate to Manage Jenkins → Plugins → Available Plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for Dark Theme (dark-theme) and install it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to Manage Jenkins → Appearance (or open your user profile under User → Appearance).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select Dark from the list of available themes, or choose System default to match your system settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save your preferences!&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;not-a-fan-of-dark-mode-explore-other-themes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#not-a-fan-of-dark-mode-explore-other-themes&quot; /&gt;Not a Fan of Dark Mode? Explore Other Themes!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If dark mode isn’t your style, but you are bored with the standard Jenkins look, don’t worry!
The Jenkins UI extension ecosystem offers a variety of alternative themes to refresh your dashboard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://plugins.jenkins.io/ui/search/?labels=theme&quot;&gt;Jenkins Theme Plugins Index&lt;/a&gt; to explore all available options.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For instance, if you want soothing pastel palettes instead of stark high contrast, the community has shown great interest in the &lt;a href=&quot;https://plugins.jenkins.io/catppuccin-theme/&quot;&gt;Catppuccin Theme Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/07/21/security-process/</id>
<title>Navigating My First Jenkins Security Advisory: A Maintainer’s Journey</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-07-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/07/21/security-process/" />
<category term='plugins'></category>
<category term='security'></category>
<summary>
Navigating My First Jenkins Security Advisory: A Maintainer’s Journey


As a maintainer of the job-config-history plugin, I have always appreciated the community and the robustness of the Jenkins ecosystem.
However, recently I had the opportunity to experience a different, and perhaps more critical, side of open-source maintenance: the Jenkins security process.


Back on April 13, 2026, I received a notification in Jira regarding a potential security issue in my plugin.
What followed was a journey that taught me quite a bit about the Jenkins core security architecture I wasn&#8217;t familiar with.




The Learning Journey





1. Initial Contact and Confidentiality

When I first received the issue, the instructions...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;navigating-my-first-jenkins-security-advisory-a-maintainers-journey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#navigating-my-first-jenkins-security-advisory-a-maintainers-journey&quot; /&gt;Navigating My First Jenkins Security Advisory: A Maintainer’s Journey&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a maintainer of the &lt;a href=&quot;https://plugins.jenkins.io/jobConfigHistory/&quot;&gt;job-config-history plugin&lt;/a&gt;, I have always appreciated the community and the robustness of the Jenkins ecosystem.
However, recently I had the opportunity to experience a different, and perhaps more critical, side of open-source maintenance: the Jenkins security process.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back on April 13, 2026, I received a notification in Jira regarding a potential security issue in my plugin.
What followed was a journey that taught me quite a bit about the Jenkins core security architecture I wasn’t familiar with.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-learning-journey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-learning-journey&quot; /&gt;The Learning Journey&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/security_process_job_config_history.png&quot; alt=&quot;security process job config history&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;1-initial-contact-and-confidentiality&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-initial-contact-and-confidentiality&quot; /&gt;1. Initial Contact and Confidentiality&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I first received the issue, the instructions were clear: keep everything confidential.
The issues are handled in a private part of the Jenkins Jira, which is not accessible to the public.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By default, most Jenkins plugins are developed in public repositories on GitHub.
Since an unresolved security vulnerability is sensitive, and even acknowledging it publicly can put users at risk, you cannot work on the fix in the public eye.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;/request-fork&lt;/code&gt; command triggers the creation of a private repository within the &lt;code&gt;jenkinsci-cert&lt;/code&gt; GitHub organization.
This organization is reserved for security-sensitive work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I promptly ran &lt;code&gt;/request-fork StefanSpieker&lt;/code&gt; to get access to a private repository.
A nice automation then gave me access to the private fork of my plugin, where I could work on the fix without exposing the details to the public.
Since the private fork was created some time ago, before I was added as a maintainer, the state of the code was not up to date with the public repository.
The automation does not take care of syncing the private fork with the public repository and kept the private fork in its original state.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It took me a moment to realize my fork was essentially a time capsule; catching up with the present became my first hurdle.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;2-understanding-the-issue&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-understanding-the-issue&quot; /&gt;2. Understanding the Issue&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once I got the environment set up and verified the security issue, which was indeed real, I began the work of crafting a fix.
My first attempt was, admittedly, a bit naive.
The security team’s feedback was immediate and educational (shortened for brevity):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
This is too narrow.
Use &lt;code&gt;ExtendedReadRedaction&lt;/code&gt;, an extension point in core.
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Daniel Beck - Jenkins Security Team
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;3-admitting-the-complexity&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3-admitting-the-complexity&quot; /&gt;3. Admitting the Complexity&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was a turning point for me.
I had to pivot from a quick patch to implementing a more robust, core-integrated solution.
Between balancing family life and my regular professional responsibilities, it was a process of iterative improvement.
I spent weeks refining the code, writing tests, and responding to feedback from Daniel Beck and Kevin Guerroudj, who guided me through the intricacies of the fix.
Although I was not always able to respond immediately, the security team was patient and supportive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By mid-June, after a few rounds of revisions, the fix was finally complete and approved.
Then came the administrative side: the coordinated disclosure.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;4-getting-ready-for-disclosure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#4-getting-ready-for-disclosure&quot; /&gt;4. Getting Ready for Disclosure&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On June 16, I received a detailed roadmap from the security team, outlining the path to the June 24 security advisory.
One of the most reassuring aspects of this experience was the support provided.
When asked who would perform the release, me or the security team, I chose the latter.
I opted to let Kevin handle the staging and technical release heavy lifting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Watching the process unfold was fascinating.
The security team locked the default branch, generated the artifacts, and drafted the advisory.
I was able to review the final advisory text on June 23, and by June 24, 2026, the update was live and the security advisory was published.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;reflections&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reflections&quot; /&gt;Reflections&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking back, I am grateful for the process.
While receiving a security report for a plugin you maintain can feel daunting, the Jenkins security team turned it into an educational experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;plugin-insight&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-insight&quot; /&gt;Plugin Insight&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I understand the internals of my plugin far better now than I did when I first adopted it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;core-knowledge&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#core-knowledge&quot; /&gt;Core Knowledge&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I gained valuable experience with Jenkins&#39; security mechanisms, like &lt;code&gt;ExtendedReadRedaction&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-power-of-collaboration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-power-of-collaboration&quot; /&gt;The Power of Collaboration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The security process is not just about patching code;
it is a well-oiled machine designed to protect users while supporting maintainers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are a maintainer, and you receive a security issue notification, do not panic.
Engage with the team, follow the provided documentation, and treat it as an opportunity to harden your plugin and learn from some of the best in the industry.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Have you ever navigated a security disclosure for an open-source project, or are you interested in becoming a plugin maintainer yourself?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;useful-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#useful-links&quot; /&gt;Useful Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;general-security-resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#general-security-resources&quot; /&gt;General Security Resources&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/reporting/&quot;&gt;Reporting Security Vulnerabilities&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisories/&quot;&gt;Jenkins Security Advisories&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;specific-to-this-blog-post&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#specific-to-this-blog-post&quot; /&gt;Specific to this Blog Post&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisory/2026-06-24/#SECURITY-3742&quot;&gt;SECURITY-3742: job-config-history Plugin Vulnerability&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/job-config-history-plugin/releases/tag/1367.vc8fa_b_15101dc&quot;&gt;job-config-history-plugin Release 1367.vc8fa_b_15101dc&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/07/17/plugin_month_july/</id>
<title>Plugin of the Month – July 2026: Disk Usage Simple</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-07-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/07/17/plugin_month_july/" />
<category term='plugins'></category>
<category term='community'></category>
<category term='maintenance'></category>
<category term='storage'></category>
<category term='plugin-of-the-month'></category>
<summary>
Welcome back to the Plugin of the Month series, where we highlight useful and impactful tools from the Jenkins ecosystem.


Last month, we explored the Build Discarder Plugin, focusing on how a smart global policy can automatically clean up old builds and prevent hard disk waste.
How do you locate the specific jobs or folders that are silently hoarding gigabytes without SSHing into the controller and running heavy du -sh commands that drag down performance?


This July, we are highlighting the CloudBees Disk Usage Simple Plugin the perfect tool to help you identify storage bottlenecks efficiently and trigger manual cleanups.


What is the Disk...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Welcome back to the &lt;strong&gt;Plugin of the Month&lt;/strong&gt; series, where we highlight useful and impactful tools from the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last month, we explored the &lt;a href=&quot;https://www.jenkins.io/blog/2026/06/13/plugin_month_june/&quot;&gt;Build Discarder Plugin&lt;/a&gt;, focusing on how a smart global policy can automatically clean up old builds and prevent hard disk waste.
How do you locate the specific jobs or folders that are silently hoarding gigabytes without SSHing into the controller and running heavy &lt;code&gt;du -sh&lt;/code&gt; commands that drag down performance?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This July, we are highlighting the &lt;a href=&quot;https://plugins.jenkins.io/cloudbees-disk-usage-simple/&quot;&gt;CloudBees Disk Usage Simple Plugin&lt;/a&gt; the perfect tool to help you identify storage bottlenecks efficiently and trigger manual cleanups.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-disk-usage-simple-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-disk-usage-simple-plugin&quot; /&gt;What is the Disk Usage Simple Plugin?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On a large Jenkins controller, calculating disk usage can be surprisingly resource-intensive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;strong&gt;CloudBees Disk Usage Simple Plugin&lt;/strong&gt; provides an elegant solution.
It calculates disk usage while limiting the performance impact on your controller.
And it is caching results and only recalculating when necessary.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-it-matters-building-on-build-discarder&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-it-matters-building-on-build-discarder&quot; /&gt;Why It Matters: Building on Build Discarder&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you configured a global build discarder last month, you stopped the endless growth of build histories.
However, a single misconfigured pipeline generating massive, untracked workspace artifacts can still fill up your disk.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of waiting for a &quot;Disk Full&quot; alert to crash your production environment, the CloudBees Disk Usage Simple Plugin gives you a lightweight dashboard directly inside Jenkins to identify exactly which folders and jobs are wasting space.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;detailed-storage-breakdown&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#detailed-storage-breakdown&quot; /&gt;Detailed Storage Breakdown&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By navigating to &lt;strong&gt;Manage Jenkins&lt;/strong&gt; → &lt;strong&gt;Disk usage&lt;/strong&gt;, you will see a clean, sorted table for Jobs:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/disk_usage_jobs.png&quot; alt=&quot;Disk Usage Jobs&quot; width=&quot;800&quot; title=&quot;Disk Usage Jobs&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And for Directories:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/disk_usage_directories.png&quot; alt=&quot;Disk Usage Directories&quot; width=&quot;800&quot; title=&quot;Disk Usage Directories&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;recalculation-cleanup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#recalculation-cleanup&quot; /&gt;Recalculation &amp;amp; Cleanup&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last month, we discussed how automated discarding handles routine hygiene.
It is recalculated on a schedule.
But what if you just manually deleted a major set of builds or updated a job’s discarding configuration, and you want to trigger a cleanup cycle right now?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The CloudBees Disk Usage Simple Plugin allows administrators to manually request a fresh disk usage calculation directly from the UI.
This triggers an immediate, throttled scan so you can verify that your cleanup efforts worked and that your controller’s filesystem has successfully recovered the expected space.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-started&quot; /&gt;Getting Started&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To install the plugin:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;strong&gt;Manage Jenkins&lt;/strong&gt; → &lt;strong&gt;Plugins&lt;/strong&gt; → &lt;strong&gt;Available Plugins&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for &lt;code&gt;CloudBees Disk Usage Simple&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install and restart Jenkins if prompted.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once installed, simply navigate to &lt;strong&gt;Manage Jenkins&lt;/strong&gt; → &lt;strong&gt;Disk usage&lt;/strong&gt; to see your dashboard and check if any runaway pipelines are consuming valuable storage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Keep your controller lightweight, fast, and stable!
If you have tips on how you keep your Jenkins storage organized, share them with the community in our forum.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/07/10/vatsal-verma-gsoc-mid-term-blog-post/</id>
<title>GSoC 2026 Midterm - Retooling Jenkins.io Web Success Stories</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-07-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/07/10/vatsal-verma-gsoc-mid-term-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='jenkins.io'></category>
<category term='web development'></category>
<category term='ui/ux'></category>
<category term='retooling'></category>
<summary>
Hello everyone!


I’m Vatsal Verma, working on Retool jenkins.io website Success Stories project. The project&#8217;s vision is to modernize the Jenkins Success Stories website by migrating it from Gatsby to Vite, improving performance, streamlining the story submission workflow, and enhancing the overall user experience.


For a detailed overview, please refer to the please refer to the project page.


We&#8217;ve just crossed the midterm evaluations, so I&#8217;d like to share a progress update on the project.


Table of Contents




What we’ve accomplished so far?



Application Migration


YAML Refinement and Validation





What I’ve Learned?


What&#8217;s Next?


Acknowledgements






What we’ve accomplished so far?


The project has made significant progress since the start of GSoC, with...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/Jenkins_GSoC_2026_Program.png&quot; alt=&quot;Jenkins GSoC 2026 Program&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello everyone!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m Vatsal Verma, working on &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/retool-jenkins-io-website-success-stories/&quot;&gt;Retool jenkins.io website Success Stories&lt;/a&gt; project. The project’s vision is to modernize the Jenkins Success Stories website by migrating it from Gatsby to Vite, improving performance, streamlining the story submission workflow, and enhancing the overall user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a detailed overview, please refer to the please refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/retool-jenkins-io-website-success-stories/&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve just crossed the midterm evaluations, so I’d like to share a progress update on the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;table-of-contents&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#table-of-contents&quot; /&gt;Table of Contents&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#what-weve-accomplished-so-far&quot;&gt;What we’ve accomplished so far?&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;olist loweralpha&quot;&gt;
&lt;ol class=&quot;loweralpha&quot; type=&quot;a&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#application-migration&quot;&gt;Application Migration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#yaml-refinement-and-validation&quot;&gt;YAML Refinement and Validation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#what-ive-learned&quot;&gt;What I’ve Learned?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#whats-next&quot;&gt;What’s Next?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#acknowledgements&quot;&gt;Acknowledgements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-weve-accomplished-so-far&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-weve-accomplished-so-far&quot; /&gt;What we’ve accomplished so far?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project has made significant progress since the start of GSoC, with work primarily focused on two major areas: &lt;code&gt;the application migration&lt;/code&gt; and &lt;code&gt;improving the quality of the Success Stories data&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;application-migration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#application-migration&quot; /&gt;Application Migration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We successfully migrated the entire application from Gatsby to Vite, laying the foundation for a faster and more maintainable codebase. This work included:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/10/data-flow.jpg&quot; alt=&quot;data flow&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Migrating all &lt;code&gt;existing React components&lt;/code&gt; while adapting their &lt;code&gt;logic&lt;/code&gt; and &lt;code&gt;structure&lt;/code&gt; to the new architecture.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setting up &lt;code&gt;dynamic routing&lt;/code&gt; using &lt;code&gt;vite-react-ssg&lt;/code&gt; to enable static site generation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replacing the previous &lt;code&gt;GraphQL-based&lt;/code&gt; data layer with direct &lt;code&gt;YAML parsing&lt;/code&gt; using import.meta.glob, simplifying data loading and improving maintainability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recreating the interactive world map using &lt;code&gt;Leaflet&lt;/code&gt; while ensuring compatibility with static site generation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Preserving and improving the site’s &lt;code&gt;performance&lt;/code&gt; and &lt;code&gt;SEO&lt;/code&gt; throughout the migration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;yaml-refinement-and-validation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#yaml-refinement-and-validation&quot; /&gt;YAML Refinement and Validation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another major focus was improving the quality and reliability of the Success Stories dataset. This included:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Auditing&lt;/code&gt; and &lt;code&gt;cleaning&lt;/code&gt; all 194 YAML files to resolve &lt;code&gt;broken structures&lt;/code&gt; and &lt;code&gt;data inconsistencies&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Removing unknown, unused, and inconsistent metadata fields.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Introducing &lt;code&gt;yaml-lint&lt;/code&gt; to detect structural issues during development and CI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Implementing &lt;code&gt;strict schema validation&lt;/code&gt; using &lt;code&gt;AJV&lt;/code&gt; and &lt;code&gt;ajv-formats&lt;/code&gt; to ensure every story adheres to a consistent schema before being accepted.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-ive-learned&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-ive-learned&quot; /&gt;What I’ve Learned?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project has been a great learning experience, both technically and personally. Migrating the application from Gatsby to Vite helped me understand static site generation, routing, data loading, performance optimization, and SEO, while improving the YAML data pipeline taught me the importance of building reliable and maintainable systems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beyond the technical work, I’ve learned a lot from the Jenkins community and my mentors. Their reviews, discussions, and continuous guidance have helped me think more about maintainability, writing better code, and approaching problems from different perspectives. Their support has played a significant role in my growth as both a developer and an open source contributor.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s Next?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next phase of the project will focus on the following areas:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Redesign the user story submission workflow using GitHub Actions to simplify the contribution process.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modernize the website’s UI/UX by creating new designs and implementing a more intuitive interface.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Introduce additional testing to improve the reliability of the application.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enhance the existing code quality tooling to ensure long-term maintainability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to thank my mentors, &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/iamrajiv&quot;&gt;Rajiv Singh&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/chamodshehanka&quot;&gt;Chamod Shehanka Perera&lt;/a&gt;, and the community for giving me this opportunity. I am excited to learn, contribute, and share my experience with others.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;follow-along&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#follow-along&quot; /&gt;Follow Along&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can contact me:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/vatsal-verma-b27925291/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Vatsal-Verma&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;mailto:vatsalverma2004@gmail.com&quot;&gt;Gmail&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/07/10/pratik-mane-gsoc-midterm-blog-post/</id>
<title>GSoC 2026 Midterm - Plugin Modernizer Stats Visualization</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-07-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/07/10/pratik-mane-gsoc-midterm-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='gsoc2026-midterm'></category>
<category term='plugin-modernization'></category>
<category term='data-visualization'></category>
<summary>
Hello everyone! I&#8217;m Pratik Mane, working on the Plugin Modernizer Stats Visualization project as part of Google Summer of Code 2026 with Jenkins.
We&#8217;ve reached the midterm and I&#8217;m excited to share what has been accomplished so far, what I&#8217;ve learned and what lies ahead.





Table of Contents




What We&#8217;ve Accomplished So Far


What I&#8217;ve Learned


Challenges I Faced


What&#8217;s Next?


Acknowledgements


Useful Links






What We&#8217;ve Accomplished So Far




Data Pipeline (ETL): Built a GitHub Actions workflow in metadata-plugin-modernizer that validates the raw modernization data, runs a Python consolidation script to produce a single report.json and deploys it via GitHub Pages giving the UI a single, stable URL to fetch...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello everyone! I’m Pratik Mane, working on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/plugin-modernizer-stats-visualization/&quot;&gt;Plugin Modernizer Stats Visualization&lt;/a&gt; project as part of Google Summer of Code 2026 with Jenkins.
We’ve reached the midterm and I’m excited to share what has been accomplished so far, what I’ve learned and what lies ahead.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;table-of-contents&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#table-of-contents&quot; /&gt;Table of Contents&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#what-we-accomplished-so-far&quot;&gt;What We’ve Accomplished So Far&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#my-experience-and-learnings&quot;&gt;What I’ve Learned&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#challenges-i-faced&quot;&gt;Challenges I Faced&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#whats-next&quot;&gt;What’s Next?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#acknowledgements&quot;&gt;Acknowledgements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#useful-links&quot;&gt;Useful Links&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-we-accomplished-so-far&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-we-accomplished-so-far&quot; /&gt;What We’ve Accomplished So Far&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Pipeline (ETL):&lt;/strong&gt; Built a GitHub Actions workflow in &lt;a href=&quot;https://github.com/jenkins-infra/metadata-plugin-modernizer&quot;&gt;metadata-plugin-modernizer&lt;/a&gt; that validates the raw modernization data, runs a Python consolidation script to produce a single &lt;a href=&quot;https://jenkins-infra.github.io/metadata-plugin-modernizer/report.json&quot;&gt;report.json&lt;/a&gt; and deploys it via GitHub Pages giving the UI a single, stable URL to fetch all aggregated data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dashboard (Home Page):&lt;/strong&gt; Implemented summary stat cards showing total plugins, total migrations, successes and failures. Added a migration status donut chart, recipe performance bar chart, migration timeline trend and tag distribution visualization.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/10/plugin-modernizer-stats-dashboard.png&quot; alt=&quot;Plugin Modernizer Stats Dashboard&quot; width=&quot;100%&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plugin List Page:&lt;/strong&gt; A searchable table of all 431 plugins with status badges (All Passed, All Failed, Mostly Passed, Mostly Failed), migration ratios, last updated dates and direct links to plugin pages and GitHub repositories.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/10/plugin-modernizer-stats-plugins.png&quot; alt=&quot;Plugin Modernizer Stats Plugins Page&quot; width=&quot;100%&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://jenkins-infra.github.io/plugin-modernizer-stats/&quot;&gt;live demo&lt;/a&gt; to see the current state of the project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;my-experience-and-learnings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#my-experience-and-learnings&quot; /&gt;What I’ve Learned&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beyond the technical skills, this first half of GSoC has taught me a lot about how open source really works. It is not just about writing code, it is about &lt;code&gt;collaboration, transparency and shared ownership&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The community bonding period set a strong foundation.
My organization held introductory meetings even before bonding started and my mentors quickly scheduled syncs to discuss the proposed solution and finalize the plan.
Since the initial phase depended on inputs from the infra team, I joined their meetings early and we collectively chose the best architectural approach switching from reports.jenkins.io to GitHub Pages for deployment autonomy.
Those early decisions saved me weeks of rework once the coding period began.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One thing that stands out about Jenkins as an organization is &lt;code&gt;how well documented it is, how responsive the mentors are and how genuinely welcoming the community is to newcomers&lt;/code&gt;.
I chose Jenkins for exactly these reasons before GSoC and that impression has only strengthened over the past two months.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;challenges-i-faced&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges-i-faced&quot; /&gt;Challenges I Faced&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Understanding a project ecosystem that has been evolving for years with multiple interconnected repositories was the steepest learning curve.
Navigating the metadata structures, understanding how the plugin modernizer tool produces its output and mapping that to a useful visualization schema required significant upfront effort.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Maintaining consistency was another challenge: picking up issues, debugging, submitting fixes, iterating on mentor feedback and repeating that cycle week after week while also managing my internship at Red Hat.
Balancing both commitments demanded careful time management but the structured twice a week meetings with my mentors kept me on track and ensured I was never stuck for long.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s Next?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Per-Plugin Detail Pages:&lt;/strong&gt; Adding dedicated pages for each plugin with migration timelines, recipe breakdowns, PR history and failure details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Per-Recipe Reports:&lt;/strong&gt; Detail pages showing application trends, success/failure rates and the list of affected plugins for each recipe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UI/UX improvements:&lt;/strong&gt; Iterating on the dashboards based on community feedback adding more interactive filters and drill-downs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stability &amp;amp; Documentation:&lt;/strong&gt; Comprehensive testing, developer documentation and a final blog post.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A huge thank you to my mentors &lt;a href=&quot;https://www.jenkins.io/blog/authors/jonesbusy&quot;&gt;Valentin Delaye&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/sridamul&quot;&gt;Sridhar Sivakumar&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/CodexRaunak&quot;&gt;Raunak Madan&lt;/a&gt; for their constant support, responsiveness and timely reviews.
They conduct meetings with me twice a week, are always reachable on Slack and actively review my pull requests.
In short, they ensure I am never blocked and that makes all the difference.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d also like to thank the organization admins for always checking in and offering help.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Excited for the second half of GSoC!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;useful-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#useful-links&quot; /&gt;Useful Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/plugin-modernizer-stats-visualization/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-infra.github.io/plugin-modernizer-stats/&quot;&gt;Live Demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-tool&quot;&gt;Plugin Modernizer Tool&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/metadata-plugin-modernizer&quot;&gt;Metadata Plugin Modernizer (data source)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/PratikMane0112/plugin-modernizer-stats&quot;&gt;Source Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/07/10/daniele-caldarigi-gsoc-midterm-blog-post/</id>
<title>GSoC 2026 Midterm: AI Chatbot to Guide User Workflow</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-07-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/07/10/daniele-caldarigi-gsoc-midterm-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
Hi everyone 👋,
I&#8217;m Daniele, the Google Summer of Code 2026 contributor currently working on the AI ​​Chatbot to Guide User Workflow plugin.


The coding phase began over a month ago, and I have a lot to tell you about the progress made.
During this first half of the GSoC, I&#8217;ve been focusing on Data Storage, Hybrid Retrieval, the Frontend UI and the Jenkins Controller Proxy.


Data Storage


My first step was to implement different data retrieval systems, which get information from four different sources: Jenkins Docs, Plugin Docs, Reddit, and Discourse.


I&#8217;ve collected all the documentation for Jenkins and its plugins, which will be useful...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/Jenkins_GSoC_2026_Program.png&quot; alt=&quot;Jenkins GSoC 2026 Program&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hi everyone 👋,
I’m Daniele, the Google Summer of Code 2026 contributor currently working on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/ai-chatbot-to-guide-user-workflow/&quot;&gt;AI ​​Chatbot to Guide User Workflow&lt;/a&gt; plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The coding phase began over a month ago, and I have a lot to tell you about the progress made.
During this first half of the GSoC, I’ve been focusing on Data Storage, Hybrid Retrieval, the Frontend UI and the Jenkins Controller Proxy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;data-storage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#data-storage&quot; /&gt;Data Storage&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My first step was to implement different data retrieval systems, which get information from four different sources: Jenkins Docs, Plugin Docs, Reddit, and Discourse.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve collected all the documentation for Jenkins and its plugins, which will be useful both for configuring and troubleshooting the system. I’ve also collected all the most helpful discussions on Reddit and Discourse that contain possible solutions to Jenkins common problems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For Discourse, I use its API endpoints to retrieve topics, while for the other three sources, I use a scraping approach.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/10/aigw-data-pipeline.png&quot; alt=&quot;aigw data pipeline&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The data follows a pipeline where it’s processed, formatted, chunked, embedded, and finally stored in Qdrant (a vector database). I chose to use Qdrant because it offers native support for hybrid retrieval,
which is exactly what our agent will need to search for useful information and provide the user with the most relevant answer possible.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;hybrid-retrieval&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hybrid-retrieval&quot; /&gt;Hybrid Retrieval&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m currently using a 384-dimensional embedding model from HuggingFace to vectorize and retrieve semantically chunks (model name: &lt;a href=&quot;https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2&quot;&gt;all-MiniLM-L6-v2&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For sparse retrieval, I use BM25. These two models compose the Hybrid Retriever, which will be used to retrieve data from both the four sources (Jenkins documentation, etc.) and the Jenkins context data.
Using this type of retrieval, we’ll perform both semantic and keyword searches. Each chunk stored in VectorDB has its own metadata, which allows us to narrow down the set of chunks to search.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;frontend-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#frontend-ui&quot; /&gt;Frontend UI&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The frontend user interface is built entirely with React + Vite, Typescript, and the MUI component library.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The user interface appears as a side panel that can be opened by clicking a simple overlay button at the bottom right of the Jenkins screen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/10/aigw-overlay-button.png&quot; alt=&quot;aigw overlay button&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By interacting with the user interface, you can create a new conversation with the chatbot, continue a previous conversation, or upload the current Jenkins context.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins context that may be uploaded includes: current screen name, job config.xml file, Jenkins pipeline, failed run logs, and more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/10/aigw-side-panel.png&quot; alt=&quot;aigw side panel&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All chat histories are stored permanently in a PostgreSQL instance and can be accessed by clicking a button at the top left of the panel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The user interface supports both light and dark mode, which can be toggled using a button at the top right of the panel.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-controller-proxy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-controller-proxy&quot; /&gt;Jenkins Controller Proxy&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Regarding communication between the frontend and backend, every request from React passes through the Jenkins Controller, which acts as a proxy and forwards each request to the FastAPI backend.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is possible thanks to a Stapler Endpoint in the Jenkins Controller, which verifies that each request includes a Jenkins CRSF Token and then uses a secret key to generate a valid temporary JWT, which will be attached as a header when the received request is forwarded to the backend.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins stores both the backend URL and the secret symmetric key used to generate the JWT (which will be stored in the backend).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It can be modified from Manage Jenkins &amp;gt; System &amp;gt; AI Chatbot Settings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This image shows the architecture after all the changes made during this first half of the Coding Period.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/10/aigw-architecture.png&quot; alt=&quot;aigw architecture&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;my-experience-so-far&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#my-experience-so-far&quot; /&gt;My experience so far&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past few weeks, I had the opportunity to work alongside my mentors, and it has been an incredibly valuable experience. They have been very supportive throughout the development process, providing insightful feedback and practical suggestions that have helped me improve both the project and my approach to working to complex problems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Overall, I am very satisfied with the progress made so far. The project is moving forward steadily, and I feel that the guidance and encouragement from my mentors and the rest of the Jenkins community have played a significant role in making this experience both productive and enjoyable.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s next?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m currently working on Jenkins context retrieval, which is the part that retrieves, vectorizes, and stores the context of the Jenkins screen focused by the user.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next steps will involve creating the Agent’s core logic and tools to gather more information to provide the user with the most accurate response possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, I will implement the RAGAS evaluation, which will test and evaluate the entire Agent system.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I can’t wait to participate in this second part of GSoC and to continue working with this incredible community!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See you soon!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/07/10/arjun-713-midterm-blog/</id>
<title>GSoC 2026 Midterm Update: Improving Evaluation and Retrieval for the Jenkins AI Chatbot</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-07-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/07/10/arjun-713-midterm-blog/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='jenkins'></category>
<category term='ai'></category>
<category term='chatbot'></category>
<category term='rag'></category>
<category term='jenkins-plugin'></category>
<category term='open-source'></category>
<summary>
Hello everyone!


I&#8217;m Mallikarjun G D, and this is my midterm update for my GSoC 2026 project,
Continue AI-Powered Chatbot for Quick Access to Jenkins Resources.


In my community bonding blog, I outlined three main areas for the coding period: an LLM-as-Judge evaluation pipeline, GraphRAG-based retrieval, and a Build Failure Diagnosis Agent.
At the midterm point, the first major piece is now in place: the LLM-as-Judge CI pipeline.


The first half of GSoC mainly focused on the evaluation side of the chatbot.
This is not the most visible part of the project from a user&#8217;s point of view, but it is the base that makes future...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello everyone!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m Mallikarjun G D, and this is my midterm update for my GSoC 2026 project,
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/continue-ai-powered-chatbot-for-quick-access-to-jenkins-resources/&quot;&gt;Continue AI-Powered Chatbot for Quick Access to Jenkins Resources&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my &lt;a href=&quot;https://www.jenkins.io/blog/2026/05/26/mallikarjun-gd-gsoc-community-bonding-blog-post/&quot;&gt;community bonding blog&lt;/a&gt;, I outlined three main areas for the coding period: an LLM-as-Judge evaluation pipeline, GraphRAG-based retrieval, and a Build Failure Diagnosis Agent.
At the midterm point, the first major piece is now in place: the &lt;strong&gt;LLM-as-Judge CI pipeline&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first half of GSoC mainly focused on the evaluation side of the chatbot.
This is not the most visible part of the project from a user’s point of view, but it is the base that makes future chatbot improvements safer to build and review.
Before adding more retrieval or diagnosis features, the project needs a reliable way to check whether chatbot changes are actually improving answer quality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;llm-as-judge-ci-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#llm-as-judge-ci-pipeline&quot; /&gt;LLM-as-Judge CI Pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The LLM-as-Judge pipeline evaluates chatbot changes using a fixed golden dataset, generated chatbot responses, and DeepEval judge metrics.
Each run uses the same set of questions, expected answers, and supporting retrieval context, which makes comparisons across pull requests more consistent.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The workflow starts by checking whether retrieval artifacts are already available.
If they are cached, the pipeline skips rebuilding them and directly continues to response generation.
If they are not available, it builds the retrieval artifacts first.
The chatbot then generates responses for the golden dataset, and DeepEval evaluates those responses using the selected metrics.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The evaluation currently uses three main metrics: &lt;strong&gt;Faithfulness&lt;/strong&gt;, &lt;strong&gt;Answer Relevancy&lt;/strong&gt;, and &lt;strong&gt;Contextual Recall&lt;/strong&gt;.
Together, these help identify whether a failure comes from weak retrieval, unsupported generation, or an unfocused answer.
At midterm, the scores are above the 0.85 benchmark, with contextual recall around 0.92 and faithfulness and answer relevancy around 0.88.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Getting this to work in GitHub Actions was one of the main engineering challenges.
Running local models inside CI meant dealing with runner limits, timeouts, logs, artifacts, and repeated work across jobs.
Job splitting, matrix builds, artifact reuse, and better logging made the workflow practical for pull request review.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;possible-future-enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#possible-future-enhancements&quot; /&gt;Possible Future Enhancements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The current pipeline works for its intended scope, but future contributors could explore a few improvements:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Production-aligned retrieval:&lt;/strong&gt; The production chatbot uses an LLM to choose between plugin docs, Jenkins docs, and Discourse, while CI currently calls all retrievers. This can create noisy context for the small local model. A faster router or lightweight classifier could improve this without adding too much CI time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Category-specific reporting:&lt;/strong&gt; Since the golden dataset already stores source metadata, scores could be reported separately for plugin docs, Jenkins docs, and Discourse. This would make weak areas easier to identify and could support category-specific thresholds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Historical and question-level dashboards:&lt;/strong&gt; Evaluation runs could be stored in a persistent JSON history and displayed through an HTML dashboard showing score trends, model versions, trigger information, and question-level failures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Comment-triggered reruns:&lt;/strong&gt; Authorized maintainers could rerun evaluation using a PR comment such as &lt;code&gt;/rerun-eval&lt;/code&gt;, avoiding empty commits when an LLM-based run fails nondeterministically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Benchmarking newer local models:&lt;/strong&gt; Future contributors could periodically test newer 4B-class models against the same dataset and compare judge quality, runtime, and resource usage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-i-learned-in-the-first-half&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-i-learned-in-the-first-half&quot; /&gt;What I Learned in the First Half&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This first half was more research-heavy than I expected.
I spent a lot of time comparing approaches, understanding evaluation behavior, planning the CI flow, and thinking about how maintainers would use the results during review.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It also changed how I think about building software.
Most of my earlier experience was with personal projects, side projects, or hackathon-style builds, where the goal is usually to make the feature work and move fast.
In a project like Jenkins, the code also has to fit the existing architecture, reuse existing utilities where possible, and remain maintainable after the contributor moves on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Planning became much more important.
Breaking work into smaller phases, pull request splits, or commit-level milestones made it easier to keep moving when something unexpected came up.
Mentor discussions also helped me look at blockers from different directions, especially around evaluation behavior and faithfulness scores.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;current-work-graphrag-hybrid-retrieval&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-work-graphrag-hybrid-retrieval&quot; /&gt;Current Work: GraphRAG Hybrid Retrieval&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My current focus is GraphRAG for hybrid retrieval.
The existing retrieval system works well for normal documentation-style questions, but some Jenkins questions are more relationship-based.
For example, a user may ask about plugin dependencies, related plugins, or how one Jenkins resource connects to another.
In those cases, normal vector retrieval may not always be enough because the answer depends on relationships between entities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/10/graphrag-hybrid-retrieval.png&quot; alt=&quot;GraphRAG Hybrid Retrieval&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GraphRAG is being added as an additional retrieval path, not as a replacement for the existing retriever.
The entity gate checks whether a query needs GraphRAG.
If it does, the chatbot can combine normal FAISS-based retrieval with graph-based evidence from plugin relationships.
The goal is to improve relationship-heavy questions without hurting normal documentation-style questions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-comes-next-build-failure-diagnosis-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-comes-next-build-failure-diagnosis-agent&quot; /&gt;What Comes Next: Build Failure Diagnosis Agent&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After GraphRAG, the next major feature is the Build Failure Diagnosis Agent.
Jenkins build logs can become very large, especially for complex pipelines, and users may not immediately know which part of the log actually caused the failure.
The goal of this feature is to reduce that noise by identifying the relevant failure section, stripping the log down to useful context, sanitizing sensitive values, and then passing only safe and focused context to the LLM for explanation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The planned Jenkins UI entry point is a Jelly button on failed builds.
When a user triggers it, the diagnosis flow should analyze the failed build log, extract the likely error section, mask secrets and environment values, and generate a focused explanation of what went wrong.
This should make the chatbot more useful in debugging workflows, where users need help understanding the cause of a failure rather than only being pointed to general documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature also needs to be careful from a safety and privacy perspective. Build logs can contain environment variables, credentials, tokens, URLs, or other sensitive values. Because of that, the sanitizer step is an important part of the design, not an optional cleanup step. The LLM should receive only the minimum useful log context needed to explain the failure.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;closing-thoughts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#closing-thoughts&quot; /&gt;Closing Thoughts&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the midterm point, the biggest completed piece is the LLM-as-Judge CI pipeline.
It is a foundational capability for the project because it makes future chatbot improvements measurable, reviewable, and easier to validate with confidence.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This first half taught me that improving an AI-powered developer tool is not only about making responses better.
It is also about building the systems that help the community measure quality, catch regressions, and review changes with confidence.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to my mentors — V. Sreenivas, Bervianto Leo Pratama, and Giovanni Vaccarino — for their reviews, guidance, and suggestions throughout the first half.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am looking forward to continuing with GraphRAG hybrid retrieval and the Build Failure Diagnosis Agent in the second half of GSoC.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;follow-along&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#follow-along&quot; /&gt;Follow Along&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin&quot;&gt;jenkinsci/resources-ai-chatbot-plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href=&quot;https://github.com/arjun-713&quot;&gt;@arjun-713&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href=&quot;https://www.linkedin.com/in/mallikarjun-gd/&quot;&gt;Mallikarjun G D&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/07/09/mohammed-faheem-gsoc-midterm-update-blog-post/</id>
<title>GSoC 2026 Midterm Update - Jenkins Email Notifications using Outlook SMTP with OAuth</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-07-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/07/09/mohammed-faheem-gsoc-midterm-update-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026-midterm'></category>
<category term='jenkins.io'></category>
<category term='email'></category>
<category term='oauth'></category>
<category term='security'></category>
<summary>
Hey everyone!


We&#8217;ve hit the midpoint of GSoC 2026, so here&#8217;s an update on Jenkins email notifications using Outlook SMTP with OAuth, the project I&#8217;ve been working on with the email-ext plugin.


What I&#8217;ve Accomplished So Far


The first half was mostly about building out OAuth 2.0 support for SMTP across both Microsoft Entra ID and Google Workspace, alongside the existing username/password flow. That meant reworking how the plugin decides which authentication path to use depending on the credential type, while keeping the retry and error handling logic shared across providers.


Along the way I ran into and fixed a few real bugs, including...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hey everyone!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve hit the midpoint of GSoC 2026, so here’s an update on &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/jenkins-email-notifications-using-outlook-smtp-with-oath/&quot;&gt;Jenkins email notifications using Outlook SMTP with OAuth&lt;/a&gt;, the project I’ve been working on with the email-ext plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-ive-accomplished-so-far&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-ive-accomplished-so-far&quot; /&gt;What I’ve Accomplished So Far&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first half was mostly about building out OAuth 2.0 support for SMTP across both Microsoft Entra ID and Google Workspace, alongside the existing username/password flow. That meant reworking how the plugin decides which authentication path to use depending on the credential type, while keeping the retry and error handling logic shared across providers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Along the way I ran into and fixed a few real bugs, including one in how OAuth tokens were being sent over SMTP that violated the protocol spec once tokens got long enough. I also added better test coverage using GreenMail so we could actually exercise the SMTP protocol instead of relying purely on mocks, which surfaced quite a few issues. We wrapped up the first half with a midterm presentation walking through everything.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-ive-learned&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-ive-learned&quot; /&gt;What I’ve Learned&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This half has been challenging but fulfilling. A good chunk of the progress came from talking through ideas with my mentors, hitting a wall, and working through the problem again from a different angle. The trickier bugs only really got resolved because I could bring them up in discussion.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The other big lesson has been around testing. Writing proper tests forced me to slow down and read through the existing mail sending code carefully, and that’s exactly how I found some of the bugs above. It made something click that I understood in theory but hadn’t really seen in action before, good tests are what stops you from quietly breaking things that already worked while we are making our changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Going in, I expected contributing to a project like Jenkins to feel pretty rigid and strict. It’s been the opposite. The community, and my mentors especially, have been very helpful and quick to jump into a discussion whenever I got stuck.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One hiccup we faced was getting a real Entra application set up to test against, which took longer than expected. We pivoted to a Google Workspace trial account instead, which let us validate the OAuth flow end to end without waiting on that.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-lies-ahead&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-lies-ahead&quot; /&gt;What Lies Ahead&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We recently got maintainer rights on the oauth-credentials plugin, which lets us make a change we’ve wanted for a while: introducing a factory for requirement objects so provider plugins don’t each need to be pulled in as explicit dependencies. Beyond that, the plan for the second half is to add a test send email feature so admins can verify their setup directly from Jenkins, write documentation and migration guidance, and keep working through the smaller bugs we found during testing.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to my mentors, &lt;a href=&quot;https://www.jenkins.io/blog/authors/slide_o_mix&quot;&gt;Alex Earl&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, for being responsive and generous with their time so far.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;follow-along&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#follow-along&quot; /&gt;Follow Along&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can reach me here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Faheem12005&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/mohdfaheem2005/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;mailto:mohdfaheem.1205@gmail.com&quot;&gt;Gmail&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking forward to the second half!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/07/06/smart-retry/</id>
<title>Introducing Smart Retry: Safer retries for transient Jenkins failures.</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-07-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/07/06/smart-retry/" />
<author>
<name>donhui</name>
</author>
<category term='plugins'></category>
<category term='pipeline'></category>
<category term='ci'></category>
<summary>
In many Jenkins environments, a failed build does not always mean the code is broken.


Sometimes a Kubernetes agent gets evicted.
Sometimes a Git fetch is interrupted.
Sometimes an artifact repository has a short outage.
In all of these cases, the next manual rebuild often succeeds.


smartRetry is designed for exactly this kind of CI problem: transient failures that are worth retrying, without turning every failed step into an automatic rerun.


What is Smart Retry?


smartRetry is a Jenkins Pipeline step that retries only the failures worth retrying.


Instead of rerunning a failed block unconditionally, it classifies the failure first and then decides whether a retry is allowed...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/07/06/smart-retry.png&quot; alt=&quot;Smart Retry&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In many Jenkins environments, a failed build does not always mean the code is broken.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes a Kubernetes agent gets evicted.
Sometimes a Git fetch is interrupted.
Sometimes an artifact repository has a short outage.
In all of these cases, the next manual rebuild often succeeds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;smartRetry&lt;/code&gt; is designed for exactly this kind of CI problem: transient failures that are worth retrying, without turning every failed step into an automatic rerun.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-smart-retry&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-smart-retry&quot; /&gt;What is Smart Retry?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;smartRetry&lt;/code&gt; is a Jenkins Pipeline step that retries only the failures worth retrying.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of rerunning a failed block unconditionally, it classifies the failure first and then decides whether a retry is allowed under the active profile.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;smartRetry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;profile:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;infra&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;maxRetries:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;backoff:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;exponential&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn -B verify&#39;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the wrapped step fails, &lt;code&gt;smartRetry&lt;/code&gt; will:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Capture the thrown error and a bounded slice of console output from the current attempt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Classify the failure into a deterministic category such as &lt;code&gt;AGENT_LOST&lt;/code&gt;, &lt;code&gt;SCM_TRANSIENT&lt;/code&gt;, &lt;code&gt;NETWORK_TRANSIENT&lt;/code&gt;, &lt;code&gt;COMPILATION_FAILURE&lt;/code&gt;, or &lt;code&gt;UNKNOWN&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check whether that category is retryable under the active profile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Log the decision clearly and schedule another attempt only when the policy allows it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This keeps retry behavior explicit, deterministic, and easier to understand.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-use-smart-retry&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-use-smart-retry&quot; /&gt;Why use Smart Retry?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main idea behind &lt;code&gt;smartRetry&lt;/code&gt; is simple: classify first, retry second.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That lets the plugin stay conservative by default.
It can automatically recover from high-confidence transient infrastructure problems while still failing fast on deterministic issues such as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;compilation failures&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline script logic errors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;UNKNOWN&lt;/code&gt; failures that do not match a high-confidence rule&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;user-initiated aborts&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For day-to-day CI, those defaults work well because the retry decision remains visible and explainable.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-it-works&quot; /&gt;How it works&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;1-configure-smart-retry-globally&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-configure-smart-retry-globally&quot; /&gt;1. Configure Smart Retry globally&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After installing the plugin, you can configure shared defaults in &lt;strong&gt;Manage Jenkins &amp;gt; System&lt;/strong&gt;, including:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;the default profile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the default maximum retry count&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fixed or exponential backoff&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;custom profiles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;narrow custom classification rules&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The current built-in profiles are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;conservative&lt;/code&gt;: retries only &lt;code&gt;AGENT_LOST&lt;/code&gt; and &lt;code&gt;SCM_TRANSIENT&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;infra&lt;/code&gt;: includes &lt;code&gt;conservative&lt;/code&gt;, plus &lt;code&gt;NETWORK_TRANSIENT&lt;/code&gt;, &lt;code&gt;ARTIFACT_REPO_TRANSIENT&lt;/code&gt;, and &lt;code&gt;IDENTITY_PROVIDER_TRANSIENT&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are introducing automated retries to a team for the first time, &lt;code&gt;conservative&lt;/code&gt; is the safest place to start.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;2-use-it-in-a-jenkinsfile&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-use-it-in-a-jenkinsfile&quot; /&gt;2. Use it in a Jenkinsfile&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The simplest pattern is to wrap steps that are idempotent and exposed to infrastructure volatility.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, around checkout:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;smartRetry&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;branch:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;main&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;credentialsId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;scm-creds&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;url:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;https://gitlab.example.com/your-group/your-repo.git&#39;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or around a build step that depends more heavily on external services:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;smartRetry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;profile:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;infra&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;maxRetries:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;backoff:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;fixed&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;initialDelaySeconds:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn -B verify&#39;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a general rule, keep the wrapped block as small and as idempotent as possible.
That reduces risk and makes retry behavior easier to understand.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;3-inspect-the-decision&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3-inspect-the-decision&quot; /&gt;3. Inspect the decision&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another key part of &lt;code&gt;smartRetry&lt;/code&gt; is explainability.
When a build fails, it does not just say &quot;retrying&quot;.
It logs the classification, the decision, and the reason.
For example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;text&quot;&gt;[smartRetry] begin attempt=1
[smartRetry] attempt=1 profile=infra classified=SCM_TRANSIENT retryCandidate=true decision=RETRY nextAttempt=2 delayMillis=10000 reason=&quot;Failure type SCM_TRANSIENT is retryable under profile infra and retry budget remains.&quot;
[smartRetry] begin attempt=2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each build that uses &lt;code&gt;smartRetry&lt;/code&gt; also gets a dedicated Smart Retry page showing:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;the active profile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the classification result for each attempt&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;which rule matched the failure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;whether the build recovered or stopped retrying&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is especially useful when you need to answer &quot;why did this build retry?&quot; or &quot;why did it stop here?&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conservative-by-design&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conservative-by-design&quot; /&gt;Conservative by design&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;smartRetry&lt;/code&gt; is not trying to turn Jenkins into a system that guesses its way through every failure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The current implementation keeps a few boundaries on purpose:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;no AI-based failure classification&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;no retry on &lt;code&gt;UNKNOWN&lt;/code&gt; by default&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;no retry on compilation failures, Pipeline logic failures, or user aborts by default&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;no deployment-style failure retry in the default policy&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That may sound less ambitious than &quot;intelligent retries for everything&quot;, but it is often a better fit for real CI systems where safety and predictability matter.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;where-smart-retry-fits-best&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-smart-retry-fits-best&quot; /&gt;Where Smart Retry fits best&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;smartRetry&lt;/code&gt; is a good fit for:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins installations running on Kubernetes or other ephemeral agents&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;checkout steps frequently affected by Git or SCM transport instability&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline steps that depend on Maven, npm, PyPI, Docker registries, Artifactory, or other external services&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;teams that already know a manual rebuild often succeeds, but do not want to retry every failure blindly&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is not meant to replace every use of &lt;code&gt;retry {}&lt;/code&gt;, and it is not a default wrapper for non-idempotent release or deployment steps.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;try-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#try-it&quot; /&gt;Try it&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If your Jenkins environment regularly sees lost agents, SCM hiccups, or short-lived dependency service outages, &lt;code&gt;smartRetry&lt;/code&gt; is worth trying in a small and controlled scope.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Start with the &lt;code&gt;conservative&lt;/code&gt; profile, use it around idempotent steps such as checkout or dependency download, and expand to &lt;code&gt;infra&lt;/code&gt; only after you have seen how it behaves in your own environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For many teams, the goal is not another blind retry, but a safer way to retry only when it actually makes sense.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project is open source on GitHub: &lt;a href=&quot;https://github.com/jenkinsci/smart-retry-plugin&quot;&gt;jenkinsci/smart-retry-plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have a transient failure pattern that should be covered, or you want to help improve the built-in rules, issues and pull requests are very welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/06/13/plugin_month_june/</id>
<title>Plugin of the Month – June 2026: Build Discarder Plugin</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-06-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/06/13/plugin_month_june/" />
<category term='plugins'></category>
<category term='community'></category>
<category term='maintenance'></category>
<category term='plugin-of-the-month'></category>
<summary>
Welcome back to the Plugin of the Month series, where we highlight useful and impactful plugins from the Jenkins ecosystem.


For June 2026, we&#8217;re featuring the Build Discarder Plugin.


Do you maintain a Jenkins server with thousands of active users? And even more builds? Spring cleaning? Or you just want to keep things neat and tidy?
A global configuration for your build items can help, because this is one of those things that is easy to forget until it becomes a problem.
This month, we are highlighting the Build Discarder Plugin.


What is the Build Discarder Plugin?


Jenkins comes with a built-in build discarder that can...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Welcome back to the &lt;strong&gt;Plugin of the Month&lt;/strong&gt; series, where we highlight useful and impactful plugins from the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For June 2026, we’re featuring the &lt;a href=&quot;https://plugins.jenkins.io/build-discarder/&quot;&gt;Build Discarder Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Do you maintain a Jenkins server with thousands of active users? And even more builds? Spring cleaning? Or you just want to keep things neat and tidy?
A global configuration for your build items can help, because this is one of those things that is easy to forget until it becomes a problem.
This month, we are highlighting the Build Discarder Plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-build-discarder-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-build-discarder-plugin&quot; /&gt;What is the Build Discarder Plugin?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins comes with a built-in build discarder that can be configured per job — but that only works well when every user or team manages its own settings.
The Build Discarder Plugin takes it a step further by adding a &lt;strong&gt;global default&lt;/strong&gt; that only kicks in when no job-specific discarder is set.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The idea is elegant in its simplicity: define a smart server-wide policy once, and let individual jobs override it whenever they need something different.
This trick will save you time and discussions, or simply help keep your environment tidy.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-features&quot; /&gt;Key Features&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;1-global-defaults&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-global-defaults&quot; /&gt;1. Global Defaults&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The core feature is the &lt;code&gt;Default Build Discarder&lt;/code&gt;, which you configure once under:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;Manage Jenkins → System → Global Build Discarders&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Choose between &lt;strong&gt;Days to keep builds&lt;/strong&gt;, &lt;strong&gt;Max # of builds to keep&lt;/strong&gt;, &lt;strong&gt;Days to keep artifacts&lt;/strong&gt;, &lt;strong&gt;Max # of builds to keep with artifacts&lt;/strong&gt;, or combine both - your choice.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
We set &lt;strong&gt;Max # of builds to keep&lt;/strong&gt; to 20
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;2-per-job-override-no-surprises&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-per-job-override-no-surprises&quot; /&gt;2. Per-Job Override — No Surprises&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Everyone can configure their jobs individually to their liking in the job configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This means your release pipeline builds can be kept for 90 days, your feature branch jobs can be discarded after 5 builds, your artifacts can be removed before the build logs.
Your builds which you kept forever do not count.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;getting-started-in-a-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-started-in-a-pipeline&quot; /&gt;Getting Started in a Pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using a job-specific discarder in your &lt;code&gt;Jenkinsfile&lt;/code&gt; is another way to define your options:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;pipeline&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;options&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;buildDiscarder&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;logRotator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;daysToKeepStr:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;10&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;// discard builds older than 10 days&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;numToKeepStr:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;20&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;           &lt;span class=&quot;c1&quot;&gt;// keep at most 20 builds&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;artifactDaysToKeepStr:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;5&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;// discard artifacts older than 5 days&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;artifactNumToKeepStr:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;10&#39;&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;// keep artifacts for the last 10 builds&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;[...]&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jobs that do &lt;strong&gt;not&lt;/strong&gt; define this block will fall back to whatever you have configured as the global default.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-this-matters&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-this-matters&quot; /&gt;Why This Matters&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Build Discarder Plugin solves a real operational pain point.
Asking every team to configure their own retention policy is error-prone, time-consuming and easy to forget but still provides the freedom to do what they want.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;link&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#link&quot; /&gt;Link&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Explore the plugin today on the &lt;a href=&quot;https://plugins.jenkins.io/build-discarder/&quot;&gt;Jenkins Plugin Site&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/06/08/jenkinsfilelint-pre-commit/</id>
<title>Introducing jenkinsfilelint: Catch Jenkinsfile Errors Before You Commit</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-06-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/06/08/jenkinsfilelint-pre-commit/" />
<category term='jenkins'></category>
<category term='pipeline'></category>
<category term='developer-tools'></category>
<category term='pre-commit'></category>
<summary>
Have you ever pushed a Jenkinsfile change only to discover a syntax error after Jenkins has started running the pipeline?
Or had to wait through a full CI cycle just to learn that you have missed a closing bracket?


I have built jenkinsfilelint to catch these problems early — right at commit time, before the code ever reaches the CI.


  


What is jenkinsfilelint?


jenkinsfilelint is a command-line tool and a pre-commit hook that validates Jenkinsfiles through your real Jenkins instance.
Instead of trying to parse Jenkins Pipeline syntax locally — which is notoriously difficult since Jenkinsfiles are Groovy-based with server-side resolution — it...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Have you ever pushed a Jenkinsfile change only to discover a syntax error after Jenkins has started running the pipeline?
Or had to wait through a full CI cycle just to learn that you have missed a closing bracket?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have built &lt;a href=&quot;https://github.com/jenkinsci/jenkinsfilelint&quot;&gt;jenkinsfilelint&lt;/a&gt; to catch these problems early — right at commit time, before the code ever reaches the CI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;app-post-page__carousel app-post-page__carousel__full_width&quot;&gt;
  &lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/06/jenkinsfilelint-demo.gif&quot; alt=&quot;jenkinsfilelint demo&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-jenkinsfilelint&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-jenkinsfilelint&quot; /&gt;What is jenkinsfilelint?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jenkinsfilelint&lt;/code&gt; is a command-line tool and a &lt;a href=&quot;https://pre-commit.com/&quot;&gt;pre-commit&lt;/a&gt; hook that validates Jenkinsfiles through your real Jenkins instance.
Instead of trying to parse Jenkins Pipeline syntax locally — which is notoriously difficult since Jenkinsfiles are Groovy-based with server-side resolution — it sends the file to your Jenkins controller’s validation endpoint and reports the results directly in your terminal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under the hood, it calls the Pipeline Linter endpoint:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;$JENKINS_URL/pipeline-model-converter/validate&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the same validation that Jenkins uses when you manually test a pipeline script through the web UI.
If the file passes validation on this endpoint, it will pass on the server as well.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-not-just-use-the-built-in-linter&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-not-just-use-the-built-in-linter&quot; /&gt;Why Not Just Use the Built-in Linter?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins provides a built-in &quot;Pipeline Syntax&quot; page where you can paste a script and test it manually.
The problem is that copy-pasting every Jenkinsfile change into a web form is tedious and error-prone, especially when you are working with multiple pipeline files or iterating rapidly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jenkinsfilelint&lt;/code&gt; automates this step so that validation becomes part of your normal development workflow.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-it-works&quot; /&gt;How It Works&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;1-configure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-configure&quot; /&gt;1. Configure&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Add the hook to your &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt; file:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;na&quot;&gt;repos&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;https://github.com/jenkinsci/jenkinsfilelint&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;rev&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v1.4.0&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;hooks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jenkinsfilelint&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--include&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Jenkinsfile&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Adjust the pattern as needed&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Install the pre-commit hooks:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;bash&quot;&gt;pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;pre-commit
pre-commit &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Set your Jenkins credentials as environment variables (never commit tokens to your config file):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JENKINS_URL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;https://your-jenkins-instance.com
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JENKINS_USER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;your-username
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JENKINS_TOKEN&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;your-api-token&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;2-commit&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-commit&quot; /&gt;2. Commit&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If there is an error, the commit is blocked and an error message is shown in your terminal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;bash&quot;&gt;% git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Update Jenkinsfile&quot;&lt;/span&gt;
jenkinsfilelint..........................................................Failed
- hook &lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;: jenkinsfilelint
- &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;code: 1

Errors encountered validating Jenkinsfile:
WorkflowScript: 17: Expected a step @ line 17, column 11.
             &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt;
             ^&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After fixing the error, the commit will succeed:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;bash&quot;&gt;% git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Update Jenkinsfile&quot;&lt;/span&gt;
jenkinsfilelint..........................................................Passed
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;master 9b0fd49] Update Jenkinsfile
 1 file changed, 1 insertion&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;+&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;filtering-files&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#filtering-files&quot; /&gt;Filtering Files&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In real-world repositories — especially Jenkins shared libraries — not every &lt;code&gt;.groovy&lt;/code&gt; file is a Jenkins Pipeline script.
Some are pure Groovy helper classes that should not be sent to the Pipeline Linter.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jenkinsfilelint&lt;/code&gt; provides two filtering options to handle this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# Use `--skip` to exclude non-pipeline Groovy files&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;hooks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jenkinsfilelint&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--skip=*/src/*.groovy&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--skip=vars/*.groovy&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# Use `--include` to validate only files matching specific patterns&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;hooks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jenkinsfilelint&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--include=Jenkinsfile*&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--include=pipelines/*.groovy&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;--include&lt;/code&gt; and &lt;code&gt;--skip&lt;/code&gt; options can be combined: &lt;code&gt;--include&lt;/code&gt; first narrows the set of files, then &lt;code&gt;--skip&lt;/code&gt; further excludes files within that set.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;command-line-usage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#command-line-usage&quot; /&gt;Command-Line Usage&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jenkinsfilelint&lt;/code&gt; also works as a standalone CLI tool, useful for one-off validation or integrating into scripts:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Validate a single file&lt;/span&gt;
jenkinsfilelint path/to/Jenkinsfile

&lt;span class=&quot;c&quot;&gt;# Validate multiple files&lt;/span&gt;
jenkinsfilelint Jenkinsfile Jenkinsfile.prod tests/Jenkinsfile

&lt;span class=&quot;c&quot;&gt;# Pass credentials via command-line arguments&lt;/span&gt;
jenkinsfilelint Jenkinsfile &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--jenkins-url&lt;/span&gt; https://your-jenkins-instance.com &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--username&lt;/span&gt; your-username &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--token&lt;/span&gt; your-api-token&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;security-notes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security-notes&quot; /&gt;Security Notes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Never commit Jenkins tokens&lt;/strong&gt; to &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt; or &lt;code&gt;.env&lt;/code&gt; files. Use environment variables or a local secrets manager.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Avoid administrator tokens&lt;/strong&gt; for linting. A user-scoped API token with minimal permissions is sufficient.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins credentials are only sent to your own Jenkins server via HTTPS—no third-party services are involved.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-status&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-status&quot; /&gt;Project status&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jenkinsfilelint&lt;/code&gt; is still an early-stage project, and feedback from Jenkins users and Pipeline authors is very welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project has now been accepted and moved under the &lt;a href=&quot;https://github.com/jenkinsci&quot;&gt;jenkinsci&lt;/a&gt; GitHub organization. Feedback from Jenkins users and Pipeline authors is still very welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;try-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#try-it&quot; /&gt;Try It&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project is open source under the MIT license. Contributions, bug reports, and feature requests are welcome at &lt;a href=&quot;https://github.com/jenkinsci/jenkinsfilelint&quot;&gt;github.com/jenkinsci/jenkinsfilelint&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Catch Jenkinsfile syntax errors before they reach CI.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/06/01/nested-layout-for-pipeline-graph-view/</id>
<title>Nested layout for pipeline graph view</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-06-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/06/01/nested-layout-for-pipeline-graph-view/" />
<category term='jenkins'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<summary>
We&#8217;re happy to announce that the most requested feature for the Pipeline Graph View plugin (and for Blue Ocean before it) is finally here: a new layout that renders nested pipelines in full detail.


  


Pipelines with nested parallel stages (like CI &#8594; Run tests &#8594; Frontend &#8594; cypress above) or nested sequential stages (like CD above) benefit from this change the most.


Upgrade the Pipeline Graph View plugin to version 918.vf572523124f2 or later to use the new layout.


Previously, a fixed column-based layout was used for displaying the pipeline graph. It supported one level of parallel nesting and the display of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re happy to announce that the most requested feature for the &lt;a href=&quot;https://plugins.jenkins.io/pipeline-graph-view&quot;&gt;Pipeline Graph View&lt;/a&gt; plugin (and for Blue Ocean before it) is finally here: a new layout that renders nested pipelines in full detail.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;app-post-page__carousel app-post-page__carousel__full_width&quot;&gt;
  &lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/05/2026-05-31-complex-pipeline-nested-layout.png&quot; alt=&quot;A complex nested pipeline using the nested layout&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipelines with nested parallel stages (like &lt;code&gt;CI&lt;/code&gt; → &lt;code&gt;Run tests&lt;/code&gt; → &lt;code&gt;Frontend&lt;/code&gt; → &lt;code&gt;cypress&lt;/code&gt; above) or nested sequential stages (like &lt;code&gt;CD&lt;/code&gt; above) benefit from this change the most.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Upgrade the &lt;a href=&quot;https://plugins.jenkins.io/pipeline-graph-view&quot;&gt;Pipeline Graph View&lt;/a&gt; plugin to version &lt;a href=&quot;https://github.com/jenkinsci/pipeline-graph-view-plugin/releases/tag/918.vf572523124f2&quot;&gt;&lt;code&gt;918.vf572523124f2&lt;/code&gt;&lt;/a&gt; or later to use the new layout.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Previously, a fixed column-based layout was used for displaying the pipeline graph. It supported one level of parallel nesting and the display of nested sequential stages was confusing.&lt;/p&gt;
&lt;/div&gt;
&lt;details class=&quot;paragraph&quot;&gt;
&lt;summary&gt;Click to see a rendering of the same run with the old layout.&lt;/summary&gt;

&lt;div class=&quot;app-post-page__carousel app-post-page__carousel__full_width&quot;&gt;
  &lt;figure&gt;
    &lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/05/2026-05-31-complex-pipeline-column-layout.png&quot; alt=&quot;A complex nested pipeline using the column layout&quot; /&gt;
    &lt;figcaption&gt;
      Notice how nested sequential stages (&lt;code&gt;CI&lt;/code&gt; / &lt;code&gt;CD&lt;/code&gt;) are displayed as regular nodes.
      The parallel test stages are flattened into a sequential-looking flow.
      The parallel stages for &lt;code&gt;cypress&lt;/code&gt; are not displayed.
    &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;/details&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new graph-based layout supports arbitrary nesting. Similar to parallel stages, it uses labels above the nodes for nested sequential stages. These labels stack up with increasing nesting.
The nodes of nested stages are horizontally aligned to bring order into complex pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nested skipped stages (like &lt;code&gt;Fuzzing&lt;/code&gt; in the screenshot) can now use the same rendering as skipped stages at the top level (like &lt;code&gt;Deploy to staging&lt;/code&gt;). The connections to parallel skipped stages (like &lt;code&gt;Slack&lt;/code&gt;) are shown as dotted lines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to the existing separation between the layout engine and the rendering of nodes/labels, the nested layout can reuse most of the existing implementation for rendering the graph.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Due to the vast flexibility of Jenkins pipelines, bugs from unhandled edge cases may still exist in the new implementation.
We are collecting feedback in this GitHub issue: &lt;a href=&quot;https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/1286&quot;&gt;Nested parallel feedback #1286&lt;/a&gt;.
If you find an issue, add your feedback there with a screenshot and an example pipeline demonstrating the issue.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many thanks to the early adopters for finding and reporting multiple edge cases already.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can compare the rendering of your own pipelines by toggling between &lt;code&gt;?nestedLayout=1&lt;/code&gt; (new layout, default in plugin version 918+) and &lt;code&gt;?nestedLayout=0&lt;/code&gt; (old layout) in your browser address bar. See the &lt;a href=&quot;https://github.com/jenkinsci/pipeline-graph-view-plugin/issues/1286&quot;&gt;GitHub issue&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We plan to remove the old layout in a future release.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/05/28/mohammed-faheem-gsoc-community-bonding-blog-post/</id>
<title>Meet Mohammed Faheem - GSoC 2026 Contributor Working on Jenkins Email Notifications using Outlook SMTP with OAuth</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-05-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/05/28/mohammed-faheem-gsoc-community-bonding-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='jenkins.io'></category>
<category term='email'></category>
<category term='oauth'></category>
<category term='security'></category>
<summary>
Hey everyone!


I&#8217;m Mohammed Faheem, a software engineering student and a Google Summer of Code 2026 contributor with Jenkins. This summer, I&#8217;ll be working on Jenkins email notifications using Outlook SMTP with OAuth, focused on adding a secure OAuth-based authentication flow for sending email notifications through Microsoft Outlook SMTP, as well as supporting other OAuth providers.


Project Description


This project aims to enhance the Jenkins Email Extension (email-ext) plugin by introducing OAuth support for SMTP using the client credentials flow. As providers continue deprecating legacy username/password authentication, Jenkins users need a modern and reliable way to keep CI/CD notifications working.


The work includes supporting...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hey everyone!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m Mohammed Faheem, a software engineering student and a Google Summer of Code 2026 contributor with Jenkins. This summer, I’ll be working on &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/jenkins-email-notifications-using-outlook-smtp-with-oath/&quot;&gt;Jenkins email notifications using Outlook SMTP with OAuth&lt;/a&gt;, focused on adding a secure OAuth-based authentication flow for sending email notifications through Microsoft Outlook SMTP, as well as supporting other OAuth providers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-description&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-description&quot; /&gt;Project Description&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project aims to enhance the Jenkins Email Extension (email-ext) plugin by introducing OAuth support for SMTP using the client credentials flow. As providers continue deprecating legacy username/password authentication, Jenkins users need a modern and reliable way to keep CI/CD notifications working.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The work includes supporting Oauth for SMTP authentication generally across providers, configuration improvements for easier administrator setup, documentation to help users adopt the new authentication approach, and maintaining backwards compatibility. Overall, the project strengthens security and future-proofs Jenkins email delivery for teams that depend on email-ext for build and deployment notifications.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-i-did-in-the-community-bonding-period&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-i-did-in-the-community-bonding-period&quot; /&gt;What I did in the Community Bonding Period&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Joined GSoC onboarding calls and connected with mentors and the Jenkins community.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Discussed project milestones, scope, and implementation direction with mentors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reviewed the existing architecture and flow ahead of the changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up the local development environment and resolved a few issues to ensure a smooth start to the coding period.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Discussed how to handle OAuth scopes and provider requirements within the plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-lies-ahead-coding-period&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-lies-ahead-coding-period&quot; /&gt;What lies ahead (Coding Period)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Implement OAuth authentication support for SMTP in email-ext using the client credentials flow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add configuration options in Jenkins to make OAuth setup straightforward for administrators.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build integration tests to validate delivery behavior and error handling across common scenarios.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write documentation and migration guidance for users transitioning away from legacy SMTP auth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Test using a real Entra application to ensure the project works in a production environment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;future-plans&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-plans&quot; /&gt;Future Plans&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My long-term goal is to keep contributing to Jenkins beyond GSoC, growing my software engineering and communication skills while giving back to the community. Being part of this project has already been a great learning experience, and I’m looking forward to doing more.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d like to thank my mentors, &lt;a href=&quot;https://www.jenkins.io/blog/authors/slide_o_mix&quot;&gt;Alex Earl&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, and the Jenkins community for this opportunity and for being so welcoming and supportive. I’m excited for what lies ahead.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;follow-along&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#follow-along&quot; /&gt;Follow Along&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can reach me here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Faheem12005&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/mohdfaheem2005/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;mailto:mohdfaheem.1205@gmail.com&quot;&gt;Gmail&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking forward to building this with the community this summer!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/05/26/mallikarjun-gd-gsoc-community-bonding-blog-post/</id>
<title>GSoC 2026 Community Bonding Wrap-Up: Continuation of AI-Powered Chatbot for Jenkins Resources</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-05-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/05/26/mallikarjun-gd-gsoc-community-bonding-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='jenkins'></category>
<category term='ai'></category>
<category term='chatbot'></category>
<category term='rag'></category>
<category term='jenkins-plugin'></category>
<category term='open-source'></category>
<summary>
Hello everyone!


I&#8217;m Mallikarjun G D, a second-year B.E. Computer Science and Design student at Dayananda Sagar College of Engineering, Bengaluru (India).
This summer I&#8217;m a GSoC 2026 contributor with Jenkins, working on
Continue AI-Powered Chatbot for Quick Access to Jenkins Resources.





Project Description


This project is a continuation of a Jenkins plugin that embeds an AI chatbot into the Jenkins UI, allowing users to query documentation, plugin details, and community resources without leaving Jenkins.


My work this summer extends that base with three core features:




An LLM-as-a-Judge evaluation pipeline using a curated golden dataset and DeepEval metrics to score retrieval and answer quality.


GraphRAG via NetworkX for...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello everyone!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m Mallikarjun G D, a second-year B.E. Computer Science and Design student at Dayananda Sagar College of Engineering, Bengaluru (India).
This summer I’m a GSoC 2026 contributor with Jenkins, working on
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/continue-ai-powered-chatbot-for-quick-access-to-jenkins-resources/&quot;&gt;Continue AI-Powered Chatbot for Quick Access to Jenkins Resources&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-description&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-description&quot; /&gt;Project Description&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project is a continuation of a Jenkins plugin that embeds an AI chatbot into the Jenkins UI, allowing users to query documentation, plugin details, and community resources without leaving Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My work this summer extends that base with three core features:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;An &lt;strong&gt;LLM-as-a-Judge evaluation pipeline&lt;/strong&gt; using a curated golden dataset and DeepEval metrics to score retrieval and answer quality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GraphRAG via NetworkX&lt;/strong&gt; for plugin ecosystem queries that need to traverse dependency relationships across plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;Build Failure Diagnosis Agent&lt;/strong&gt; that reads Jenkins build logs, strips PII with Presidio, and passes the sanitized context to the LLM.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-i-did-in-the-community-bonding-period&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-i-did-in-the-community-bonding-period&quot; /&gt;What I Did in the Community Bonding Period&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;environment-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#environment-setup&quot; /&gt;Environment Setup&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I set up the local development environment on Fedora Linux — downloading the LLM model, running the data pipeline to populate the vector database, and getting the frontend and backend running together end to end.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;codebase-study&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#codebase-study&quot; /&gt;Codebase Study&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I read through the full codebase: the RAG pipeline, plugin configuration, query flow between frontend and backend, and how responses are returned to the user.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;framework-research&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#framework-research&quot; /&gt;Framework Research&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I studied the &lt;a href=&quot;https://docs.confident-ai.com/&quot;&gt;DeepEval documentation&lt;/a&gt; and the &lt;a href=&quot;https://networkx.org/documentation/stable/&quot;&gt;NetworkX&lt;/a&gt; source and docs in preparation for the GraphRAG graph layer.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;eval-pipeline-design&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#eval-pipeline-design&quot; /&gt;Eval Pipeline Design&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I designed the evaluation pipeline architecture — dataset format, judge model selection, which metrics to track, and how to store results so that runs remain comparable over time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/05/eval-pipeline-architecture.png&quot; alt=&quot;Eval Pipeline Architecture&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;prototype-run&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#prototype-run&quot; /&gt;Prototype Run&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I ran a prototype pipeline on a small synthetic dataset in a personal repository before touching the main codebase.
This surfaced a real problem early: the initial judge model choice was too slow at scale, which I was able to address before it blocked any coding-period work.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;frontend-bug-fix&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#frontend-bug-fix&quot; /&gt;Frontend Bug Fix&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I fixed a frontend rendering bug where the plugin frontend wasn’t injected correctly into the Jenkins page:
&lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin/pull/370&quot;&gt;#370&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;dataset-branch-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dataset-branch-setup&quot; /&gt;Dataset Branch Setup&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I set up the dataset branch with a file structure and versioning plan for the golden Q&amp;amp;A dataset, establishing the conventions that will carry through the coding period.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;mentor-syncs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mentor-syncs&quot; /&gt;Mentor Syncs&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I attended sync meetings with mentors V. Sreenivas, Bervianto Leo Pratama, and Giovanni Vaccarino to align on approach and surface blockers early. The key decisions from these meetings were: biweekly progress update meetings will be the default cadence; day-to-day questions and blockers go through Slack to keep async communication fast; I will maintain a daily work log throughout the coding period to keep the team informed; and the golden Q&amp;amp;A dataset will be built manually rather than using DeepEval’s synthetic data generator — this keeps the ground-truth answers grounded in real Jenkins documentation and reduces the risk of hallucinated reference answers inflating eval scores.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-lies-ahead-coding-period&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-lies-ahead-coding-period&quot; /&gt;What Lies Ahead (Coding Period)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The coding period started on &lt;strong&gt;May 25, 2026&lt;/strong&gt;. Work is sequenced so that the evaluation pipeline is in place before any RAG changes land, keeping every improvement measurable from day one.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;week-12-golden-qa-dataset&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-12-golden-qa-dataset&quot; /&gt;Week 1–2 — Golden Q&amp;amp;A Dataset&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build 100 curated Q&amp;amp;A pairs covering plugin documentation, Jenkinsfile syntax, and common build failure cases. The dataset will be assembled manually (not synthesized) to ensure ground-truth answers are accurate and hallucination-free. This dataset is the foundation every subsequent eval run depends on.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;week-34-deepeval-integration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-34-deepeval-integration&quot; /&gt;Week 3–4 — DeepEval Integration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Integrate DeepEval metrics (Answer Relevancy, Faithfulness, Contextual Recall) into the GitHub Actions pipeline and record a baseline score against the current chatbot.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;week-57-graphrag-with-networkx&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-57-graphrag-with-networkx&quot; /&gt;Week 5–7 — GraphRAG with NetworkX&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build the GraphRAG layer on top of the existing FAISS retriever using NetworkX and benchmark it against flat-RAG on plugin dependency queries — validating whether graph traversal genuinely improves recall on multi-hop plugin questions or only adds latency.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;week-810-build-failure-diagnosis-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-810-build-failure-diagnosis-agent&quot; /&gt;Week 8–10 — Build Failure Diagnosis Agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build the agent in two stages: log ingestion and structured parsing first, then Presidio-based PII sanitization before context is passed to the LLM. Both stages will be covered by eval metrics before the feature is considered complete.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to my mentors — V. Sreenivas, Bervianto Leo Pratama, and Giovanni Vaccarino — for their time and feedback throughout the bonding period.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks also to Kris Stern and the Jenkins org admins for running a well-organized program.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;follow-along&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#follow-along&quot; /&gt;Follow Along&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin&quot;&gt;jenkinsci/resources-ai-chatbot-plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href=&quot;https://github.com/arjun-713&quot;&gt;@arjun-713&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href=&quot;https://www.linkedin.com/in/mallikarjun-gd&quot;&gt;Mallikarjun G D&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/05/26/jenkins-community-award-winners/</id>
<title>Jenkins 2026 Community Award Winners</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-05-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/05/26/jenkins-community-award-winners/" />
<category term='jenkins'></category>
<category term='community'></category>
<category term='awards'></category>
<category term='cdcon'></category>
<category term='cdf'></category>
<summary>
cdCon 2026 just wrapped up in Minneapolis and this included announcing the winners of the Continuous Delivery Foundation and Jenkins Community Awards.
The CD Foundation provides awards for the Top CDF ambassador, contributor, documenter, and end user.
Anyone that is part of the CD Foundation can be nominated for these.
Additionally, as a graduated project, Jenkins has three of its own awards:




Most Valuable Jenkins Advocate


Most Valuable Jenkins Contributor


Jenkins Security MVP




Thanks to the voters and to everyone who nominated candidates.
We extend special thanks to all the nominees for their work in Jenkins.
The project thrives because of its community, and the award recipients are outstanding...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://cd.foundation/cdcon-2026/&quot;&gt;cdCon 2026&lt;/a&gt; just wrapped up in Minneapolis and this included announcing the winners of the Continuous Delivery Foundation and Jenkins Community Awards.
The CD Foundation provides awards for the Top CDF ambassador, contributor, documenter, and end user.
Anyone that is part of the CD Foundation can be nominated for these.
Additionally, as a graduated project, Jenkins has three of its own awards:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Most Valuable Jenkins Advocate&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most Valuable Jenkins Contributor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Security MVP&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to the voters and to everyone who nominated candidates.
We extend special thanks to all the nominees for their work in Jenkins.
The project thrives because of its community, and the award recipients are outstanding examples of that spirit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 2026 Jenkins award winners are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/avatars/kguerroudj.jpg&quot; alt=&quot;image&quot; width=&quot;99&quot; height=&quot;99&quot; /&gt; &lt;strong&gt;Security MVP: &lt;a href=&quot;https://github.com/kevin-cb&quot;&gt;Kevin Guerroudj&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kevin has served on the Jenkins Security Team for many years.
He helps manage the Jenkins Bug Bounty Program and has collaborated with fellow Security Team members to coordinate several Jenkins security releases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/avatars/strangelookingnerd.jpg&quot; alt=&quot;image&quot; width=&quot;99&quot; height=&quot;99&quot; /&gt; &lt;strong&gt;Most Valuable Contributor: &lt;a href=&quot;https://github.com/strangelookingnerd&quot;&gt;Daniel Krämer&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Daniel is a member of the &lt;a href=&quot;https://www.jenkins.io/project/board/&quot;&gt;Jenkins Board&lt;/a&gt; and has been the major driving force behind the transition from JUnit 4 to JUnit Jupiter in the Jenkins ecosystem.
Modernizing the testing stack across a project as large and long-lived as Jenkins is not a small task, but Daniel has been steadily moving this effort forward.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;He provided the technical groundwork for the initial implementation of JUnit Jupiter in Jenkins.
He has opened hundreds of pull requests to Jenkins core components and Jenkins plugins to complete the migration in those components.
150 of the top 250 most popular, actively maintained plugins have completed the transition to JUnit Jupiter.
35 of the top 250 plugins have open pull requests for their transition to JUnit Jupiter.
Daniel’s work improves the reliability, maintainability, and future readiness of the Jenkins testing ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/avatars/gounthar.png&quot; alt=&quot;image&quot; width=&quot;99&quot; height=&quot;99&quot; /&gt; &lt;strong&gt;Most Valuable Advocate: &lt;a href=&quot;https://github.com/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Bruno has shown consistent dedication to the Jenkins community in 2025.
His leadership in the &lt;a href=&quot;https://www.jenkins.io/sigs/platform/&quot;&gt;Platform SIG&lt;/a&gt; has provided better support for ARM and RISC-V architectures.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For years, Bruno has been the driving force behind the Jenkins table at FOSDEM.
From organizing the booth and preparing materials to coordinating volunteers, he consistently ensures that Jenkins is visible and represented at one of Europe’s largest open source gatherings.
Bruno is always ready to listen to Jenkins users and bring their insights to the project.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/05/26/daniele-caldarigi-gsoc-community-bonding-blog-post/</id>
<title>AI Chatbot to Guide User Workflow (GSoC 2026)</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-05-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/05/26/daniele-caldarigi-gsoc-community-bonding-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
Hello everyone,
I&#8217;m Daniele, an Italian computer science student, and this summer I&#8217;ll be working on the AI ​​Chatbot to Guide User Workflow plugin during GSoC 2026.


I started contributing to Jenkins many months ago, and after following the official communication channels, I noticed how difficult it can be for beginners
to understand the functionality of complex software like Jenkins. My goal is to create a plugin that&#8217;s useful for Jenkins beginners, but can also
help every developer debug their own failed Jenkins executions, reducing the time spent fixing a specific error and maximizing productivity.


The plugin will allow you to connect the current application...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/Jenkins_GSoC_2026_Program.png&quot; alt=&quot;Jenkins GSoC 2026 Program&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello everyone,
I’m Daniele, an Italian computer science student, and this summer I’ll be working on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/ai-chatbot-to-guide-user-workflow/&quot;&gt;AI ​​Chatbot to Guide User Workflow&lt;/a&gt; plugin during GSoC 2026.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I started contributing to Jenkins many months ago, and after following the official communication channels, I noticed how difficult it can be for beginners
to understand the functionality of complex software like Jenkins. My goal is to create a plugin that’s useful for Jenkins beginners, but can also
help every developer debug their own failed Jenkins executions, reducing the time spent fixing a specific error and maximizing productivity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin will allow you to connect the current application context to give the chatbot access to the current screen, logs, and pipeline configuration files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agent will be able to access data from a VectorDB to get information about documentation, plugin documentation, and even discussions on Discourse and Reddit.
Using all this data, it will be possible to provide the most accurate response possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here you can find a summary of the Plugin specifications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;plugin-architecture&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-architecture&quot; /&gt;Plugin architecture&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/05/ai-guide-workflow-plugin-architecture.png&quot; alt=&quot;ai guide workflow plugin architecture&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins Plugin Frontend:&lt;/strong&gt; Sidebar created in React + Vite Frontend. Here it is possible to see the chat history, pick an older chat or also start a new one. It also presents a specific button which lets the user make the decision of attaching the current context.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins Controller:&lt;/strong&gt; The Jenkins Controller is fundamental as it is the bridge between the frontend and the FastAPI backend, it has the task to validate the authentication and decide if the user can access the backend or not.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FastAPI Backend:&lt;/strong&gt; The backend is the core part of the plugin, I decide to opt with FastAPI as it is a very solid framework for building backend applications. The heart of the agent will be LangGraph which will manage the different reasoning states. The agent will have at his disposal different tools which will be useful to get more info as possible in order to give the most accurate response back to the user.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ChromaDB:&lt;/strong&gt; In the vector db data different types of data will be stored as vectors, such as Jenkins Docs, Jenkins Plugins Docs, Discourse and Reddit Discussions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LLM:&lt;/strong&gt; choose a local open source LLM hosted with Ollama or a third party api.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The architecture is designed to be modular so that the user is free to decide where to host each component, on the same machine or on different ones.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;agent-tools&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#agent-tools&quot; /&gt;Agent tools&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here you can find an example list of the tools that the agent will be able to use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;hybrid-retrieval-vectordb-bm25-indexer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hybrid-retrieval-vectordb-bm25-indexer&quot; /&gt;Hybrid Retrieval (VectorDB + BM25 Indexer)&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Search Build Logs:&lt;/strong&gt; Search in the logs of the build (Stored in RAM)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Search Jenkins Docs:&lt;/strong&gt; Search in the Jenkins Documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Search Plugin Docs:&lt;/strong&gt; Search in the Jenkins Plugins Documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Search Discussion:&lt;/strong&gt; Search in the Reddit and Discourse Discussions&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;deterministic&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deterministic&quot; /&gt;Deterministic&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get Workspace Tree:&lt;/strong&gt; Get the tree of the workspace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get Workspace File:&lt;/strong&gt; Get a specific file of the workspace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get Job File:&lt;/strong&gt; Get the Job file (config.xml, build.xml, jenkinsfile)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get Diff File:&lt;/strong&gt; Get the diff of a specific file&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here you can find the link of the repository of the plugin → link:github url[AI Chatbot to Guide User Workflow Repository]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m very excited to create a plugin which can help all the Jenkins users and I would also be really happy to have your feedback.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Talk soon!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/05/24/vatsal-verma-gsoc-community-bonding-blog-post/</id>
<title>Meet Vatsal Verma – GSoC 2026 Contributor Working on Retooling Jenkins.io Web Success Stories</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-05-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/05/24/vatsal-verma-gsoc-community-bonding-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='jenkins.io'></category>
<category term='web development'></category>
<category term='ui/ux'></category>
<category term='retooling'></category>
<summary>
Hello everyone!


I’m Vatsal Verma, a final-year student and a Google Summer of Code 2026 contributor with Jenkins. This summer, I’ll be working on Retool jenkins.io website Success Stories which aims to modernize the tech stack, improving the submission workflow, and enhancing the overall UI/UX experience of the website.


Project Description


This project aims to migrate the Jenkins.io Success Stories website from Gatsby to Vite, enabling faster builds, improved developer experience, and better performance. It focuses on modernizing the UI/UX with a responsive, accessible, and user-centric design. A key objective is redesigning the story submission workflow by moving from Decap/Netlify CMS to a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello everyone!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m Vatsal Verma, a final-year student and a Google Summer of Code 2026 contributor with Jenkins. This summer, I’ll be working on &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/retool-jenkins-io-website-success-stories/&quot;&gt;Retool jenkins.io website Success Stories&lt;/a&gt; which aims to modernize the tech stack, improving the submission workflow, and enhancing the overall UI/UX experience of the website.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-description&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-description&quot; /&gt;Project Description&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project aims to migrate the &lt;strong&gt;Jenkins.io Success Stories website&lt;/strong&gt; from Gatsby to Vite, enabling faster builds, improved developer experience, and better performance. It focuses on modernizing the UI/UX with a responsive, accessible, and user-centric design. A key objective is redesigning the story submission workflow by moving from Decap/Netlify CMS to a GitHub Actions–based workflow, allowing structured, automated, and scalable content contributions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This transition will also involve refining and standardizing YAML-based content files for better consistency, validation, and maintainability. Overall, the project enhances performance, scalability, and contributor experience while aligning the platform with modern web development practices.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-i-did-in-the-community-bonding-period&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-i-did-in-the-community-bonding-period&quot; /&gt;What I did in the Community Bonding Period?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Joined the Jenkins GSoC onboarding and introductory call with mentors and organization admins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attended mentor meetings to discuss project scope, ideas, and implementation plans.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up the local development environment by forking the &lt;code&gt;jenkins-infra/stories&lt;/code&gt; repository and configuring a dedicated &lt;code&gt;gsoc-2026-revamp&lt;/code&gt; branch for development.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Discussed the story submission workflow and &lt;code&gt;GitHub Actions-based&lt;/code&gt; approach for handling user-story submissions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Designed and proposed a new UI for the project, collected mentor feedback, and iterated on the designs accordingly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Explored the integration of the &lt;code&gt;Vite SSG plugin&lt;/code&gt; in the project to improve performance, scalability, and static page generation for story routes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-lies-ahead-coding-period&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-lies-ahead-coding-period&quot; /&gt;What lies ahead (Coding Period)?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Begin the migration of the stories.jenkins.io platform from &lt;code&gt;Gatsby&lt;/code&gt; to a &lt;code&gt;Vite + React&lt;/code&gt; based architecture to improve maintainability, performance, and developer experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Refactor existing components and routing logic while replacing Gatsby-specific APIs and the GraphQL data layer with a lightweight &lt;code&gt;YAML/JSON&lt;/code&gt; based approach.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work on refining and standardizing the &lt;code&gt;YAML structure&lt;/code&gt; used across existing stories to improve consistency and maintainability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Design and implement the new story submission workflow, including a guided submission interface, live YAML preview, and automated &lt;code&gt;GitHub Actions based&lt;/code&gt; processing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continue iterating on the proposed &lt;code&gt;UI/UX redesign&lt;/code&gt; for the platform, focusing on responsiveness, accessibility, filtering, navigation, and overall user experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add and improve repository tooling, including ESLint, Prettier, CI workflows, validation checks, and contributor-focused documentation to ensure long-term maintainability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;future-plans&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-plans&quot; /&gt;Future Plans&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My future plans are to continue contributing to Jenkins and stay actively engaged with the community. I also want to help new contributors get started with this organization and open source in general. Being part of this community has taught me a lot, and I believe there is still so much more to learn and explore.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to thank my mentors, &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/iamrajiv&quot;&gt;Rajiv Singh&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/chamodshehanka&quot;&gt;Chamod Shehanka Perera&lt;/a&gt;, and the community for giving me this opportunity. I am excited to learn, contribute, and share my experience with others.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;follow-along&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#follow-along&quot; /&gt;Follow Along&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can contact me:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/vatsal-verma-b27925291/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Vatsal-Verma&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;mailto:vatsalverma2004@gmail.com&quot;&gt;Gmail&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Excited to contribute to Jenkins and collaborate with the community throughout the summer!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/05/23/pratik-mane-gsoc-community-bonding-blog-post/</id>
<title>GSoC 2026 Community Bonding Period - Plugin Modernizer Stats Visualization</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-05-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/05/23/pratik-mane-gsoc-community-bonding-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='plugin-modernization'></category>
<category term='data-visualization'></category>
<summary>
Hey everyone! Myself Pratik Mane, a final year student at Vishwakarma Institute of Technology, Pune (India) and currently an intern at Red Hat.
It&#8217;s been a wonderful experience getting involved with the Jenkins community over the past few weeks and I&#8217;m thrilled to be working on this project with an amazing team of mentors.





Table of Contents




About the Project


Why is This Project Important?


What I Did in the Community Bonding Period


What Lies Ahead (Coding Period)


Acknowledgements


Useful Links






About the Project


The Plugin Modernizer Tool automates the modernization of Jenkins plugins using OpenRewrite recipes, creating pull requests with the results.
As part of GSoC 2025, a metadata repository...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hey everyone! Myself Pratik Mane, a final year student at Vishwakarma Institute of Technology, Pune (India) and currently an intern at Red Hat.
It’s been a wonderful experience getting involved with the Jenkins community over the past few weeks and I’m thrilled to be working on this project with an amazing team of mentors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;table-of-contents&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#table-of-contents&quot; /&gt;Table of Contents&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#about-the-project&quot;&gt;About the Project&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#why-is-this-project-important&quot;&gt;Why is This Project Important?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#what-i-did-in-the-community-bonding-period&quot;&gt;What I Did in the Community Bonding Period&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#what-lies-ahead&quot;&gt;What Lies Ahead (Coding Period)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#acknowledgements&quot;&gt;Acknowledgements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#useful-links&quot;&gt;Useful Links&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about-the-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-the-project&quot; /&gt;About the Project&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-tool&quot;&gt;Plugin Modernizer Tool&lt;/a&gt; automates the modernization of Jenkins plugins using OpenRewrite recipes, creating pull requests with the results.
As part of GSoC 2025, a &lt;a href=&quot;https://github.com/jenkins-infra/metadata-plugin-modernizer&quot;&gt;metadata repository&lt;/a&gt; was established that stores raw modernization metadata all in JSON/CSV format.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My project, &lt;strong&gt;Plugin Modernizer Stats Visualization&lt;/strong&gt;, aims to build a static visualization site that consumes this raw metadata, consolidates it into a structured format and presents dashboards alongside per-plugin/per-recipe report pages.
For a detailed description of the project, please refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/plugin-modernizer-stats-visualization/&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-is-this-project-important&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-is-this-project-important&quot; /&gt;Why is This Project Important?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With over 400+ plugins already processed by the Plugin Modernizer Tool and more being added regularly, exploring the modernization results currently requires manually navigating between multiple directories for each plugin.
There is no consolidated view or visual interface to understand the overall modernization health at a glance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project will help:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plugin maintainers&lt;/strong&gt; to see at a glance what their plugin needs to be modernized and what recipes have been applied.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plugin modernizer authors&lt;/strong&gt; to identify which recipes are working well and which need attention or fixes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New contributors&lt;/strong&gt; to lower the barrier to find plugins that need help, answering the question &quot;where should I start ?&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The infra team&lt;/strong&gt; to measure and communicate the impact of the modernization effort to the broader community.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-i-did-in-the-community-bonding-period&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-i-did-in-the-community-bonding-period&quot; /&gt;What I Did in the Community Bonding Period&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Architecture decisions with the Infra Team:&lt;/strong&gt; I attended the Jenkins Infrastructure team meeting where we finalized the deployment architecture for the project.
The original plan to publish data to &lt;code&gt;reports.jenkins.io&lt;/code&gt; was revised instead, we will use GitHub Actions as our ETL pipeline and GitHub Pages to serve the aggregated data.
This gives us full autonomy, a shorter feedback loop and no dependency on trusted.ci credentials.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Environment setup and prototype refinement:&lt;/strong&gt; I set up my local development environment and created &lt;a href=&quot;https://plugin-modernizer-stats.netlify.app&quot;&gt;a small prototype&lt;/a&gt; (a temporary static UI that fetches data from the metadata repository and presents dashboards, per-plugin reports and per-recipe detail pages).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Community introduction:&lt;/strong&gt; I drafted and sent an introduction email to the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;Jenkins Developer Mailing List&lt;/a&gt; to introduce the team, explain the project and solicit feedback from the community on what metrics and features would be most valuable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Planning and scheduling:&lt;/strong&gt; I worked closely with my mentors to refine the project phases, discuss data schema decisions and create a detailed plan for the coding period.
We discussed the consolidation script design, the &lt;code&gt;report.json&lt;/code&gt; structure and how the UI will consume the data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Studying the ecosystem:&lt;/strong&gt; I explored the existing &lt;a href=&quot;https://github.com/jenkins-infra/jenkins-io-components&quot;&gt;jenkins-io-components&lt;/a&gt; library to understand which shared UI components (navbar, footer, etc) I can reuse and studied &lt;a href=&quot;https://stats.jenkins.io/&quot;&gt;stats.jenkins.io&lt;/a&gt; for UI/UX alignment with the Jenkins visual ecosystem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Communication is key:&lt;/strong&gt; I attended Weekly sync project meetings &amp;amp; gsoc office hours with mentors, org admins and other gsoc contributors. One of the most valuable lessons from this bonding period staying transparent with mentors about decisions, progress and blockers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-lies-ahead&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-lies-ahead&quot; /&gt;What Lies Ahead (Coding Period)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The coding period is structured into five phases:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Phase 1 : Data Pipeline (ETL):&lt;/strong&gt; A GitHub Actions workflow in &lt;code&gt;metadata-plugin-modernizer&lt;/code&gt; that validates the raw data, runs a Python consolidation script to produce a single &lt;code&gt;report.json&lt;/code&gt; and deploys it via GitHub Pages.
This gives the UI a single, stable URL to fetch all aggregated modernization data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Phase 2 : Dashboard (Home Page):&lt;/strong&gt; Summary stat cards, migration status breakdown (donut chart), top 10 recipe performance (stacked bar), migration timeline trend, tag distribution and recipes with most failures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Phase 3 : Plugin List &amp;amp; Per Plugin Reports:&lt;/strong&gt; A virtualized, searchable, filterable table of all 400+ plugins with per-plugin detail pages showing migration timelines, recipe breakdowns, PR history and failure details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Phase 4 : Recipe List &amp;amp; Per Recipe Reports:&lt;/strong&gt; A table of all recipes with success/failure rates and per-recipe detail pages showing application trends and affected plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Phase 5 : Stability &amp;amp; Documentation:&lt;/strong&gt; Comprehensive testing, developer documentation and a final blog post.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The tech stack includes &lt;strong&gt;Vite 8 + React 19 + TypeScript&lt;/strong&gt;, &lt;strong&gt;Material UI&lt;/strong&gt;, &lt;strong&gt;Apache ECharts&lt;/strong&gt; for charts and &lt;strong&gt;GitHub Actions + GitHub Pages&lt;/strong&gt; for CI/CD and hosting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am excited to start coding and bring visibility to the amazing modernization work happening across the Jenkins ecosystem!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to thank my mentors &lt;a href=&quot;https://www.jenkins.io/blog/authors/jonesbusy&quot;&gt;Valentin Delaye&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/sridamul&quot;&gt;Sridhar Sivakumar&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/CodexRaunak&quot;&gt;Raunak Madan&lt;/a&gt; for their guidance, encouragement and time.
I would also like to thank the Jenkins Infrastructure team for their help in finalizing the deployment architecture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a continuation of the work started by Sridhar Sivakumar in GSoC 2024 &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/projects/using-openrewrite-recipes-for-plugin-modernization-or-automation-plugin-build-metadata-updates/&quot;&gt;Using OpenRewrite Recipes for Plugin Modernization&lt;/a&gt;, improved by Raunak Madan in GSoC 2025 &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2025/projects/plugin-modernizer-improvements/&quot;&gt;Improving Plugin Modernizer&lt;/a&gt; and I am grateful to have them as my mentors for this project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special thanks to the Jenkins community for being welcoming and supportive. I look forward to contributing throughout the summer and beyond also…​&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;useful-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#useful-links&quot; /&gt;Useful Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/plugin-modernizer-stats-visualization/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-tool&quot;&gt;Plugin Modernizer tool&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/metadata-plugin-modernizer&quot;&gt;Metadata Plugin Modernizer (data source)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/PratikMane0112/plugin-modernizer-stats&quot;&gt;Prototype Source Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/5103&quot;&gt;Helpdesk Issue: New repo request&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/05/15/plugin_month_mai/</id>
<title>Plugin of the Month – May 2026: Coverage Plugin</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-05-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/05/15/plugin_month_mai/" />
<category term='plugins'></category>
<category term='community'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<category term='plugin-of-the-month'></category>
<summary>
Welcome back to the Plugin of the Month series, where we highlight useful and impactful plugins from the Jenkins ecosystem.


For May 2026, we’re featuring the Coverage Plugin.


Quality assurance is a pillar of modern CI/CD.
Knowing how much of your code is actually tested—and how effectively those tests find bugs is crucial for maintaining a healthy codebase.
This month, we are highlighting the Coverage Plugin, a comprehensive solution for collecting, aggregating, and visualizing code and mutation coverage reports in Jenkins.


What is the Coverage Plugin?


The Coverage Plugin is the modern successor to several older, format-specific coverage plugins.
Instead of installing a different plugin for every...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Welcome back to the &lt;strong&gt;Plugin of the Month&lt;/strong&gt; series, where we highlight useful and impactful plugins from the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For May 2026, we’re featuring the &lt;a href=&quot;https://github.com/jenkinsci/coverage-plugin&quot;&gt;Coverage Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quality assurance is a pillar of modern CI/CD.
Knowing how much of your code is actually tested—and how effectively those tests find bugs is crucial for maintaining a healthy codebase.
This month, we are highlighting the Coverage Plugin, a comprehensive solution for collecting, aggregating, and visualizing code and mutation coverage reports in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-coverage-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-coverage-plugin&quot; /&gt;What is the Coverage Plugin?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Coverage Plugin is the modern successor to several older, format-specific coverage plugins.
Instead of installing a different plugin for every language in your stack, the Coverage Plugin provides a unified object model and a sleek UI to handle a wide variety of report formats.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whether you are measuring line coverage with JaCoCo or mutation density with PIT, this plugin brings all that data into a single, high-level overview within your Jenkins dashboard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/05/2026-05-15-coverage-report-overview.png&quot; alt=&quot;2026 05 15 coverage report overview&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;supported-formats&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#supported-formats&quot; /&gt;Supported Formats&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the strongest selling points of this plugin is its versatility.
Out of the box, it supports an extensive list of report formats across various ecosystems:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Java&lt;/strong&gt;: JaCoCo, OpenClover, JUnit, and PIT (Mutation Coverage).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Node&lt;/strong&gt;: Cobertura&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt;: Go Coverage results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C#/.NET&lt;/strong&gt;: OpenCover, NUnit&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Embedded/Safety Critical&lt;/strong&gt;: VectorCAST (including MC/DC, Function, and Function Call coverage).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Testing Frameworks&lt;/strong&gt;: JUnit, NUnit, and XUnit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Static Analysis&lt;/strong&gt;: PMD software metrics (via a patched version of PMD).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-features&quot; /&gt;Key Features&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;1-unified-visualization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-unified-visualization&quot; /&gt;1. Unified Visualization&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin provides beautiful, interactive charts that track coverage trends over time.
You can see at a glance whether your team is improving their test suite or if technical debt is creeping in.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;2-detailed-source-code-view&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-detailed-source-code-view&quot; /&gt;2. Detailed Source Code View&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It doesn’t just show percentages.
You can drill down into specific files to see exactly which lines of code are covered (green) and which are missed (red), allowing developers to pinpoint gaps without leaving the Jenkins UI.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;3-quality-gates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3-quality-gates&quot; /&gt;3. Quality Gates&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can define &quot;Quality Gates&quot; in your Pipeline.
For example, you can configure the build to fail or become unstable if the overall coverage drops below a certain percentage, or if a specific pull request decreases the coverage by more than 1%.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;4-mutation-coverage-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#4-mutation-coverage-support&quot; /&gt;4. Mutation Coverage Support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beyond standard code coverage, the plugin supports PIT (Pitest).
Mutation coverage tests the effectiveness of your tests by injecting faults into your code and seeing if your tests catch them.
This provides a much deeper look into the reliability of your test suite.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;getting-started-in-a-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-started-in-a-pipeline&quot; /&gt;Getting Started in a Pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Integrating the Coverage Plugin into your &lt;code&gt;Jenkinsfile&lt;/code&gt; is straightforward.
Here is a simple snippet for a Java project with Maven using JaCoCo:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;pipeline&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;any&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;stages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Test&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Run your tests (e.g. Maven with JaCoCo)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;./mvnw clean verify&#39;&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;always&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Record coverage results&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;recordCoverage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;tools:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;parser:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;JACOCO&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;pattern:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;/target/site/jacoco/jacoco.xml&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]])&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contribute-to-the-ecosystem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contribute-to-the-ecosystem&quot; /&gt;Contribute to the Ecosystem&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins community thrives on contribution.
If your favorite coverage tool is not yet supported, the Coverage Plugin is built on a highly extensible Coverage Model.
The maintainers welcome pull requests to add new parsers and features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Explore the plugin today on the &lt;a href=&quot;https://plugins.jenkins.io/coverage/&quot;&gt;Jenkins Plugin Site&lt;/a&gt; and start improving your project’s transparency and quality!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/05/08/JVM-upgrade/</id>
<title>Java JVM Updates and Memory Improvements in Jenkins</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-05-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/05/08/JVM-upgrade/" />
<category term='jvm'></category>
<category term='update'></category>
<category term='memory'></category>
<summary>
In this post, we share our experience upgrading Jenkins from Java 17 to Java 21 and the impact this had on memory usage.
After the move, we observed a reduction in out-of-the-field memory consumption from a monthly mean of 33–34 GB down to 28 GB.
This improvement helped us reduce operational pressure and improve overall efficiency in our Jenkins environment.


Why we upgraded to Java 21


Java 17 served us well as a stable long-term support release, but as part of our ongoing platform modernization, we evaluated Java 21 for Jenkins.
Our goals were simple:




benefit from the latest JVM performance improvements


reduce memory footprint


follow the platform...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this post, we share our experience upgrading Jenkins from Java 17 to Java 21 and the impact this had on memory usage.
After the move, we observed a reduction in out-of-the-field memory consumption from a monthly mean of &lt;strong&gt;33–34 GB&lt;/strong&gt; down to &lt;strong&gt;28 GB&lt;/strong&gt;.
This improvement helped us reduce operational pressure and improve overall efficiency in our Jenkins environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-we-upgraded-to-java-21&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-we-upgraded-to-java-21&quot; /&gt;Why we upgraded to Java 21&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 17 served us well as a stable long-term support release, but as part of our ongoing platform modernization, we evaluated Java 21 for Jenkins.
Our goals were simple:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;benefit from the latest JVM performance improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;reduce memory footprint&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;follow the platform recommendation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java upgrades in production systems are never just about version numbers.
They are about measurable operational outcomes.
For us, memory usage was one of the most important signals.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-we-observed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-we-observed&quot; /&gt;What we observed&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After moving from Java 17 to Java 21, we tracked memory usage in our production environment and compared the results over time.
We made use of the &lt;a href=&quot;https://plugins.jenkins.io/monitoring/&quot;&gt;Jenkins monitoring plugin&lt;/a&gt; based on Java melody.
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/05/2026-05-08-JVM-upgrade-January-to-April-diff.png&quot; alt=&quot;2026 05 08 JVM upgrade January to April diff&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The result was clear:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Before the upgrade:&lt;/strong&gt; monthly mean memory usage of roughly &lt;strong&gt;33–34 GB&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;After the upgrade:&lt;/strong&gt; monthly mean memory usage of roughly &lt;strong&gt;28 GB&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That is a meaningful reduction of approximately &lt;strong&gt;5–6 GB&lt;/strong&gt;, or around &lt;strong&gt;15–18%&lt;/strong&gt; depending on the baseline.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-memory-improved&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-memory-improved&quot; /&gt;Why memory improved&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We did not make a single code-level change to achieve this reduction.
The main driver was the JVM change itself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 21 includes a number of runtime and garbage collection improvements that can positively affect memory behavior, especially in long-running server applications like Jenkins.
While the exact impact depends on workload and configuration, the following areas are commonly relevant:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;improved garbage collection behavior&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;runtime optimizations in the JVM&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our case, the upgrade improved the memory usage in our production environment significantly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;preparation-for-bigger-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#preparation-for-bigger-updates&quot; /&gt;Preparation for bigger updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Measure before and after.&lt;/strong&gt; Establish a baseline with monitoring data before the upgrade, then compare metrics after the upgrade to validate improvements.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;recommendation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#recommendation&quot; /&gt;Recommendation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are currently running Jenkins on Java 17, it is worth your time to evaluate the latest LTS update and Java 21.
You may see improvements in performance, stability, and memory efficiency, depending on your workload and configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot; /&gt;Conclusion&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Upgrading from Java 17 to Java 21 delivered a noticeable improvement in Jenkins memory usage for our environment. We saw a reduction from &lt;strong&gt;33–34 GB&lt;/strong&gt; to a monthly mean of &lt;strong&gt;28 GB&lt;/strong&gt; without requiring application-level changes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;system-information&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#system-information&quot; /&gt;System information&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;more than 10000 daily builds&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;more than 1000 active users&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;more than 100 connected agents&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/05/02/gsoc-2026-kickstart/</id>
<title>Gear Up for Google Summer of Code (GSoC) 2026 with Jenkins</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-05-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/05/02/gsoc-2026-kickstart/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
We are thrilled to announce that the Jenkins project has been allotted 5 slots in Google Summer of Code (GSoC) 2026 program!
This is an incredible opportunity for aspiring developers to contribute to one of the most widely used open-source automation servers in the world.


The 5 selected projects for GSoC 2026 are:




AI Chatbot to Guide User Workflow with Daniele Caldarigi as the GSoC contributor - Helping users navigate Jenkins with smart, automated assistance.


Continue AI-Powered Chatbot for Quick Access to Jenkins Resources with Mallikarjun G D as the GSoC contributor - Ongoing modernization of the Jenkins documentation retrieval experience.


Jenkins email notifications using...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/Jenkins_GSoC_2026_Program.png&quot; alt=&quot;Jenkins GSoC 2026 Program&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are thrilled to announce that the Jenkins project has been allotted 5 slots in Google Summer of Code (GSoC) 2026 program!
This is an incredible opportunity for aspiring developers to contribute to one of the most widely used open-source automation servers in the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 5 selected projects for GSoC 2026 are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/ai-chatbot-to-guide-user-workflow&quot;&gt;AI Chatbot to Guide User Workflow&lt;/a&gt; with &lt;a href=&quot;https://github.com/thatsdc&quot;&gt;Daniele Caldarigi&lt;/a&gt; as the GSoC contributor - Helping users navigate Jenkins with smart, automated assistance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/continue-ai-powered-chatbot-for-quick-access-to-jenkins-resources&quot;&gt;Continue AI-Powered Chatbot for Quick Access to Jenkins Resources&lt;/a&gt; with &lt;a href=&quot;https://github.com/arjun-713&quot;&gt;Mallikarjun G D&lt;/a&gt; as the GSoC contributor - Ongoing modernization of the Jenkins documentation retrieval experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/jenkins-email-notifications-using-outlook-smtp-with-oath&quot;&gt;Jenkins email notifications using Outlook SMTP with OAuth&lt;/a&gt; with &lt;a href=&quot;https://github.com/Faheem12005&quot;&gt;Mohammed Faheem&lt;/a&gt; as the GSoC contributor - Enhancing Jenkins email notifications with secure Outlook SMTP integration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/plugin-modernizer-stats-visualization&quot;&gt;Plugin Modernizer Stats Visualization&lt;/a&gt; with &lt;a href=&quot;https://github.com/pratikmane0112&quot;&gt;Pratik Mane&lt;/a&gt; as the GSoC contributor - Visualizing plugin modernization efforts with insightful statistics and trends.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/projects/retool-jenkins-io-website-success-stories&quot;&gt;Retool jenkins.io website Success Stories&lt;/a&gt; with &lt;a href=&quot;https://github.com/Vatsal-Verma&quot;&gt;Vatsal Verma&lt;/a&gt; as the GSoC contributor - Showcasing inspiring success stories on the jenkins.io website to motivate and guide users in their Jenkins journey.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These projects were selected from a pool of exciting proposals that aim to enhance the Jenkins ecosystem and improve the user experience. Each project will be mentored by experienced members of the Jenkins community, providing guidance and support throughout the summer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would like to extend our heartfelt congratulations to the selected contributors and express our gratitude to all the candidates who took the time to submit their proposals. Your enthusiasm and dedication to open source are what make the Jenkins community so vibrant and innovative.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We encourage everyone to follow the progress of these projects and support the contributors as they embark on their GSoC journey. Stay tuned for updates and insights from the contributors as they work on their projects over the summer!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/04/30/introducing-secret-guard-plugin/</id>
<title>Introducing the Secret Guard Plugin</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-04-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/04/30/introducing-secret-guard-plugin/" />
<category term='plugins'></category>
<category term='security'></category>
<category term='pipeline'></category>
<category term='secrets'></category>
<summary>
Hardcoded secrets still show up in Jenkins for very ordinary reasons.


A token is pasted into a job field during a quick test. A webhook URL with a secret query parameter stays in config.xml. An inline Pipeline header works once and is never revisited. These cases are easy to introduce and easy to overlook.


Once a secret is stored in job configuration or a Jenkinsfile, it becomes harder to rotate and easier to expose through exports, backups, logs, or screenshots.


The Secret Guard Plugin was created to help Jenkins administrators and job authors catch those patterns earlier.




What it checks


Secret Guard is a Jenkins...
</summary>
<content type='html'>
&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/04/30/secret-guard-cover-jenkins-shield.png&quot; alt=&quot;Secret Guard cover&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hardcoded secrets still show up in Jenkins for very ordinary reasons.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A token is pasted into a job field during a quick test. A webhook URL with a secret query parameter stays in &lt;code&gt;config.xml&lt;/code&gt;. An inline Pipeline header works once and is never revisited. These cases are easy to introduce and easy to overlook.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once a secret is stored in job configuration or a Jenkinsfile, it becomes harder to rotate and easier to expose through exports, backups, logs, or screenshots.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Secret Guard Plugin was created to help Jenkins administrators and job authors catch those patterns earlier.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-it-checks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-it-checks&quot; /&gt;What it checks&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Secret Guard is a Jenkins plugin that checks Jenkins jobs and Pipeline definitions for hardcoded secret leakage risks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It scans common high-risk locations such as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Job &lt;code&gt;config.xml&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;inline Pipeline scripts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline-from-SCM Jenkinsfiles when lightweight SCM access is available&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;multibranch Pipeline Jenkinsfiles when lightweight SCM access is available&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;parameter default values&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;environment variable definitions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;command content such as &lt;code&gt;sh&lt;/code&gt;, &lt;code&gt;bat&lt;/code&gt;, &lt;code&gt;powershell&lt;/code&gt;, and HTTP-style request usage&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It can be used in several practical ways:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;save-time enforcement for job configuration changes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;build-time scanning&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;job-level &lt;code&gt;Scan Now&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;global &lt;code&gt;Scan All Jobs&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin stores masked results only, so administrators can review findings without persisting raw secret values in plugin reports.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The global Secret Guard page gives administrators a single place to review the latest scan results and run an on-demand scan across jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/04/30/secret-guard-root-action-page-screenshot.png&quot; alt=&quot;Secret Guard root action page&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;a-simple-example&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-simple-example&quot; /&gt;A simple example&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A common case is a Pipeline that embeds a token directly in an environment variable or HTTP header:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;pipeline&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;any&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;environment&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;API_TOKEN&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ghp_012345678901234567890123456789012345&#39;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Call API&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;curl -H &#39;Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.abc123456789.def123456789&#39; https://example.invalid&quot;&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The safer pattern is to store the secret in Jenkins Credentials and inject it only at runtime:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;pipeline&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;any&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Call API&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;withCredentials&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;credentialsId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;api-token&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;variable:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;API_TOKEN&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;curl -H &quot;Authorization: Bearer $API_TOKEN&quot; https://example.invalid&#39;&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the kind of issue Secret Guard is designed to catch with deterministic rules rather than broad inference.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-the-scope-is-narrow&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-the-scope-is-narrow&quot; /&gt;Why the scope is narrow&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Secret Guard is intentionally narrow in scope.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It does not try to be a general-purpose governance platform or a generic code-quality tool. Instead, it focuses on recurring high-confidence secret leakage patterns in Jenkins configuration and Pipeline usage. That keeps the plugin easier to reason about and reduces noise from overly aggressive heuristics.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For teams that want to adopt it gradually, the plugin supports multiple enforcement modes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;AUDIT&lt;/code&gt; records findings without blocking&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;WARN&lt;/code&gt; allows the operation but surfaces the risk&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;BLOCK&lt;/code&gt; prevents unexempted findings at or above the configured threshold&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This makes it possible to start with visibility and move toward stricter enforcement when teams are ready.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;learn-more&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#learn-more&quot; /&gt;Learn more&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Plugin site: &lt;a href=&quot;https://plugins.jenkins.io/secret-guard&quot;&gt;Secret Guard Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Source code: &lt;a href=&quot;https://github.com/jenkinsci/secret-guard-plugin&quot;&gt;jenkinsci/secret-guard-plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feedback and contributions are welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/04/29/windows-installer-signing-change/</id>
<title>Jenkins 2.562 and 2.555.2: Signed by LF Open Source, LLC</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-04-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/04/29/windows-installer-signing-change/" />
<category term='announcement'></category>
<category term='windows'></category>
<category term='platform'></category>
<summary>
Beginning April 28, 2026 with Jenkins weekly 2.562, the MSI installer is signed using the Microsoft Artifact Signing Service.
The installer is signed by LF Open Source, LLC, courtesy of the Linux Foundation.
The same change will be made in Jenkins LTS 2.555.2 beginning May 13, 2026.


In the transition period, there are some changes to the installation process.
We hope that these changes are temporary while the installer&#8217;s reputation develops in Microsoft Defender SmartScreen.


Windows Edge - infrequently downloaded


Windows Edge, the default browser on Microsoft Windows, is integrated with Windows Defender SmartScreen.
That integration causes new installers and new applications to be flagged as "infrequently...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning April 28, 2026 with Jenkins weekly 2.562, the MSI installer is signed using the Microsoft Artifact Signing Service.
The installer is signed by LF Open Source, LLC, courtesy of the Linux Foundation.
The same change will be made in Jenkins LTS 2.555.2 beginning May 13, 2026.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the transition period, there are some changes to the installation process.
We hope that these changes are temporary while the installer’s reputation develops in Microsoft Defender SmartScreen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;windows-edge-infrequently-downloaded&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#windows-edge-infrequently-downloaded&quot; /&gt;Windows Edge - infrequently downloaded&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Windows Edge, the default browser on Microsoft Windows, is integrated with Windows Defender SmartScreen.
That integration causes new installers and new applications to be flagged as &quot;infrequently downloaded&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Windows administrators that download the Jenkins installer with Microsoft Edge will need to click the &quot;&lt;strong&gt;Keep anyway&lt;/strong&gt;&quot; button until Windows Defender SmartScreen decides the Jenkins MSI installer has enough reputation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Windows Edge dialog looks like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/04/29/make-sure-you-trust-jenkins-msi.png&quot; alt=&quot;make sure you trust jenkins msi&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;windows-defender-smartscreen&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#windows-defender-smartscreen&quot; /&gt;Windows Defender SmartScreen&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the MSI installer is run, Windows displays the SmartScreen prompt that says:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
Microsoft Defender SmartScreen prevented an unrecognized app from starting.
Running this app might put your PC at risk.
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Microsoft Defender SmartScreen
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The dialog looks like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/windows/protected-your-pc-1.png&quot; alt=&quot;protected your pc 1&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Click the &quot;&lt;strong&gt;More info&lt;/strong&gt;&quot; link and that will change the dialog to display the publisher of the signed MSI file.
The publisher is &quot;LF Open Source, LLC&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The dialog looks like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/windows/protected-your-pc-2.png&quot; alt=&quot;protected your pc 2&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Press the &quot;&lt;strong&gt;Run anyway&lt;/strong&gt;&quot; button and the MSI installer will run.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;frequently-asked-questions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#frequently-asked-questions&quot; /&gt;Frequently Asked Questions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-change-the-msi-signing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-change-the-msi-signing&quot; /&gt;Why change the MSI signing?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The previous code signing certificate expires May 16, 2026.
An unsigned MSI installer has an even worse experience for users than the experience with Windows Defender SmartScreen.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-use-lf-open-source-llc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-use-lf-open-source-llc&quot; /&gt;Why use LF Open Source, LLC?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Linux Foundation has already pioneered the MSI installer signing process through their work with the NodeJS Foundation.
We were able to use their experiences to quickly revise our MSI installer signing to use the same techniques used by the NodeJS Foundation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We interact frequently with the Linux Foundation because they host the Jira issue tracker for the Jenkins project.
Those interactions continue to help the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Linux Foundation is the parent organization of the Continuous Delivery Foundation.
The Continuous Delivery Foundation is the parent organization of the Jenkins project and holds its intellectual property.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-not-purchase-an-extended-validation-code-signing-certificate&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-not-purchase-an-extended-validation-code-signing-certificate&quot; /&gt;Why not purchase an extended validation code signing certificate?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Extended validation certificates require a secure physical storage device or they require reliance on the code signing service of the certificate prvider.
We rarely interact with the certificate providers and find it difficult when we interact with them.
They are accustomed to working with corporations, not open source projects.
Open source projects are not their primary income source and are not their target market.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;which-operating-systems-are-affected&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#which-operating-systems-are-affected&quot; /&gt;Which operating systems are affected?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All supported versions of Windows are affected.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/04/10/open-source-ehrenamt/</id>
<title>Supporting Open Source Maintainers: A German Petition for Better Legal Frameworks</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-04-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/04/10/open-source-ehrenamt/" />
<category term='sustainability'></category>
<category term='community'></category>
<category term='open-source'></category>
<summary>
Open source software, as Jenkins, is the foundation of modern software development.
Contributors maintain plugins, review pull requests, fix security issues, and support users, often alongside their regular jobs.


Many of these contributions happen in what is often called “Ehrenamt” (voluntary work), especially in Germany.
However, the work done by thousands of volunteers for this goal is not recognized in Germany as volunteering, neither fiscally nor in terms of funding.


A Petition Addressing German Legislation


A German initiative is raising awareness for this challenge and calling for improvements in the legal and structural framework for open source contributors:


Petition: Recognition of Work on Open-Source as Volunteering...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open source software, as Jenkins, is the foundation of modern software development.
Contributors maintain plugins, review pull requests, fix security issues, and support users, often alongside their regular jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many of these contributions happen in what is often called &lt;strong&gt;“Ehrenamt”&lt;/strong&gt; (voluntary work), especially in Germany.
However, the work done by thousands of volunteers for this goal is not recognized in Germany as volunteering, neither fiscally nor in terms of funding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;a-petition-addressing-german-legislation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-petition-addressing-german-legislation&quot; /&gt;A Petition Addressing German Legislation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A German initiative is raising awareness for this challenge and calling for improvements in the legal and structural framework for open source contributors:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.openpetition.de/petition/online/recognition-of-work-on-open-source-as-volunteering-in-germany&quot;&gt;Petition: Recognition of Work on Open-Source as Volunteering in Germany&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The goal of this petition is to &lt;strong&gt;encourage German legislators to improve the current situation for open source maintainers&lt;/strong&gt;.
It highlights that open source has become critical digital infrastructure, yet the people maintaining it often lack proper recognition and supportive legal conditions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While the initiative is focused on Germany, its message resonates far beyond national borders.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-this-matters-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-this-matters-for-jenkins&quot; /&gt;Why This Matters for Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is a community-driven project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From core maintainers to plugin authors, documentation writers, and community organizers, Jenkins exists because people contribute their time and knowledge.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the Jenkins Contributor Summit and many community discussions, one theme comes up repeatedly:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;How do we make open source contribution more sustainable?&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Maintainers face increasing challenges:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Growing number of contributions and pull requests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rising expectations around security and quality&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Limited time and resources&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These challenges are not unique to Jenkins, they affect the entire open source ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;german-contributors-in-the-jenkins-community&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#german-contributors-in-the-jenkins-community&quot; /&gt;German Contributors in the Jenkins Community&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has a strong and active group of contributors from Germany.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is also reflected in the project’s leadership and governance.
With contributors like &lt;a href=&quot;https://www.jenkins.io/blog/authors/notmyfault/&quot;&gt;Alex Brandes&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/strangelookingnerd/&quot;&gt;Daniel Krämer&lt;/a&gt; serving on the Jenkins Governance Board, and roles such as the Events Officer &lt;a href=&quot;https://www.jenkins.io/blog/authors/stefan_spieker/&quot;&gt;Stefan Spieker&lt;/a&gt; being represented from Germany, the German open source community plays an important role in shaping Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Like many others in the ecosystem, these contributors invest significant time into maintaining and evolving Jenkins, often alongside their regular professional responsibilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This makes the topic of better legal and structural support for open source maintainers especially relevant.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;a-shared-responsibility&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-shared-responsibility&quot; /&gt;A Shared Responsibility&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open source is not just a development model, it is shared infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Companies, public institutions, and individuals all rely on projects like Jenkins.
Supporting maintainers is therefore not only a community concern, but also a topic for policymakers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Initiatives like this petition aim to bring open source sustainability into legislative discussions and improve the framework conditions for contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-involved&quot; /&gt;Get Involved&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to support this initiative, you can learn more and sign the petition here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ehrenamt-opensource.de/petition-international&quot;&gt;Petition for Open Source Maintainers&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;looking-ahead&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#looking-ahead&quot; /&gt;Looking Ahead&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins community continues to evolve, and so do the challenges around maintaining such a large ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By supporting initiatives like this, we can help improve the framework conditions for contributors, both within Jenkins and across the broader open source world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because in the end, open source is built by people, and it depends on us to support them!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/04/06/plugin-of-the-month/</id>
<title>Plugin of the Month – April 2026: Pipeline Graph View</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-04-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/04/06/plugin-of-the-month/" />
<category term='plugins'></category>
<category term='community'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<category term='plugin-of-the-month'></category>
<summary>
Welcome back to the Plugin of the Month series, where we highlight useful and impactful plugins from the Jenkins ecosystem.


For April 2026, we’re featuring the Pipeline Graph View Plugin.


A Modern Pipeline Visualization


The Pipeline Graph View plugin provides a clean and modern visualization of Jenkins pipelines directly in the standard Jenkins UI.





It is designed to give users a clear overview of pipeline stages and their execution flow, without requiring a separate interface or additional UI layer.


If you’ve used Blue Ocean in the past, this might feel familiar, but with an important difference.




The Successor to Blue Ocean


As many in the Jenkins community...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Welcome back to the &lt;strong&gt;Plugin of the Month&lt;/strong&gt; series, where we highlight useful and impactful plugins from the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For April 2026, we’re featuring the &lt;a href=&quot;https://github.com/jenkinsci/pipeline-graph-view-plugin&quot;&gt;Pipeline Graph View Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;a-modern-pipeline-visualization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-modern-pipeline-visualization&quot; /&gt;A Modern Pipeline Visualization&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Pipeline Graph View plugin provides a &lt;strong&gt;clean and modern visualization of Jenkins pipelines directly in the standard Jenkins UI&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/04/pipeline_graph_example_1.png&quot; alt=&quot;pipeline graph example 1&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is designed to give users a clear overview of pipeline stages and their execution flow, without requiring a separate interface or additional UI layer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve used Blue Ocean in the past, this might feel familiar, but with an important difference.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-successor-to-blue-ocean&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-successor-to-blue-ocean&quot; /&gt;The Successor to Blue Ocean&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As many in the Jenkins community are aware, Blue Ocean has been &lt;strong&gt;deprecated&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While it introduced a modern and intuitive way to visualize pipelines, maintaining a separate UI stack proved challenging in the long run.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Pipeline Graph View plugin takes a different approach:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It integrates directly into the existing Jenkins UI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It focuses specifically on &lt;strong&gt;pipeline visualization&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It avoids the overhead of maintaining a full alternative interface&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This makes it a natural and lightweight successor for users looking for a &lt;strong&gt;modern pipeline view without switching contexts&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-it-matters&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-it-matters&quot; /&gt;Why It Matters&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Understanding pipeline execution is essential for debugging, optimization, and daily development workflows.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Pipeline Graph View plugin helps by:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Providing a &lt;strong&gt;clear visual representation&lt;/strong&gt; of pipeline stages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Making it easier to identify failures and bottlenecks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improving the overall usability of Jenkins pipelines&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keeping everything within the familiar Jenkins interface&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It brings back the visual clarity many users appreciated in Blue Ocean, while aligning with the direction of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you work in a rather complex pipeline environment, this plugin can help you to faster find the stage that is interesting for you and to understand the flow of your pipeline.
You can simply use the search function to find the stage you are looking for and then click on it to jump to the stage details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/04/pipeline_graph_example_2.png&quot; alt=&quot;pipeline graph example 2&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;seamless-integration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#seamless-integration&quot; /&gt;Seamless Integration&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the biggest advantages of this plugin is its seamless integration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s no need to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Switch to a different UI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maintain a separate plugin ecosystem&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Relearn how Jenkins works&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You simply get an improved pipeline visualization experience where you already work.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;interactive-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#interactive-features&quot; /&gt;Interactive Features&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is a small video to show some of the interactive features of the plugin:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;800&quot; height=&quot;420&quot; src=&quot;https://www.youtube.com/embed/da1QV6lIvX8?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;looking-ahead&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#looking-ahead&quot; /&gt;Looking Ahead&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Pipeline Graph View plugin is a great example of how the Jenkins community continues to evolve the user experience while staying true to the platform’s strengths.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re still relying on older visualization tools or missing features from Blue Ocean, this plugin is definitely worth exploring.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned for next month’s Plugin of the Month, and feel free to suggest plugins you’d like to see featured!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/04/06/jetbrains-report-highlights-jenkins-as-a-popular-tool-in-2026/</id>
<title>JetBrains Report Highlights Jenkins as a Popular CI/CD Tool in 2026</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-04-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/04/06/jetbrains-report-highlights-jenkins-as-a-popular-tool-in-2026/" />
<category term='jenkins'></category>
<category term='user-experience'></category>
<category term='devops'></category>
<category term='popularity'></category>
<summary>
A recent JetBrains blog post, "Best CI/CD Tools for 2026: What the Data Actually Shows", provides an overview of CI/CD tool adoption and trends.
According to the report, Jenkins continues to play a major role in the ecosystem, with a 28% adoption rate, ranking just behind GitHub Actions.
This highlights that Jenkins remains a widely used and trusted solution across organizations of all sizes.


The article highlights that while newer tools focus on ease of use, Jenkins’ enduring value lies in its unparalleled autonomy and extensibility.
Here are the key strengths of Jenkins as identified in the report:


1. Flexibility and Control


The blog emphasizes that...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A recent JetBrains blog post, &lt;a href=&quot;https://blog.jetbrains.com/teamcity/2026/03/best-ci-tools/&quot;&gt;&lt;strong&gt;&quot;Best CI/CD Tools for 2026: What the Data Actually Shows&quot;&lt;/strong&gt;&lt;/a&gt;, provides an overview of CI/CD tool adoption and trends.
According to the report, Jenkins continues to play a major role in the ecosystem, with a &lt;strong&gt;28% adoption rate&lt;/strong&gt;, ranking just behind GitHub Actions.
This highlights that Jenkins remains a widely used and trusted solution across organizations of all sizes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The article highlights that while newer tools focus on ease of use, Jenkins’ enduring value lies in its unparalleled &lt;strong&gt;autonomy and extensibility&lt;/strong&gt;.
Here are the key strengths of Jenkins as identified in the report:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;1-flexibility-and-control&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-flexibility-and-control&quot; /&gt;1. Flexibility and Control&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The blog emphasizes that Jenkins is the premier choice for teams that need &quot;full control over infrastructure and data.&quot;
Unlike SaaS-based CI tools, Jenkins allows organizations to own their entire environment, which is a critical requirement for:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Strict Security &amp;amp; Compliance:&lt;/strong&gt; Organizations with sensitive data that cannot leave private infrastructure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Self-Hosting:&lt;/strong&gt; Teams that prefer to manage their own compute resources to avoid the &quot;black box&quot; nature of cloud-native CI.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;2-a-strong-and-open-ecosystem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-a-strong-and-open-ecosystem&quot; /&gt;2. A Strong and Open Ecosystem&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even in 2026, Jenkins&#39; ecosystem remains its greatest asset.
The report highlights that:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Universal Integration:&lt;/strong&gt; It can integrate with almost any tool in the software development lifecycle, from legacy version control systems to modern cloud providers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom Workflows:&lt;/strong&gt; Because of its open-source nature and thousands of plugins, it supports highly specialized or &quot;bespoke&quot; workflows that standard commercial tools might not accommodate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;3-resilience-in-complex-and-legacy-environments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3-resilience-in-complex-and-legacy-environments&quot; /&gt;3. Resilience in &quot;Complex and Legacy&quot; Environments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The article categorizes Jenkins as the &quot;Best fit&quot; for &lt;strong&gt;complex or legacy setups.&lt;/strong&gt;
While newer tools excel at &quot;greenfield&quot; projects (starting from scratch), Jenkins is praised for its ability to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Manage &quot;long-lived&quot; setups that have evolved over years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support diverse, multi-platform environments (Windows, Linux, macOS).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Handle &quot;heavy&quot; pipelines that require professional DevOps expertise to orchestrate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;4-open-source-and-cost-transparency&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#4-open-source-and-cost-transparency&quot; /&gt;4. Open Source and Cost Transparency&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As an open-source tool, Jenkins offers a significant financial advantage: &lt;strong&gt;no licensing fees.&lt;/strong&gt;
For large-scale enterprises with the engineering talent to maintain it, Jenkins provides a way to scale without the per-user or per-minute costs associated with commercial platforms like TeamCity or CircleCI.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;5-mature-pipeline-as-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#5-mature-pipeline-as-code&quot; /&gt;5. Mature Pipeline-as-Code&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The blog acknowledges Jenkins’ commitment to modern practices through the &lt;code&gt;Jenkinsfile&lt;/code&gt;.
This allows teams to define build, test, and deployment logic as code, ensuring that even this &quot;venerable&quot; tool remains compatible with GitOps and modern version-control-driven development.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;a-balanced-perspective&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-balanced-perspective&quot; /&gt;A Balanced Perspective&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The JetBrains report also notes that Jenkins typically requires more operational effort compared to fully managed CI/CD services.
This is an important consideration: Jenkins provides flexibility and control, but it also assumes that teams are willing to invest in operating and maintaining their setup.
For many organizations, this trade-off is intentional.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary&quot; /&gt;Summary&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The report reinforces what many in the community already know:
Jenkins continues to be a &lt;strong&gt;reliable and flexible CI/CD platform&lt;/strong&gt; that adapts to a wide variety of use cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Its strength lies not in being the simplest tool, but in being one of the most &lt;strong&gt;adaptable and extensible&lt;/strong&gt;.
As the CI/CD landscape evolves, Jenkins remains a strong choice for teams that value:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Control over their infrastructure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Flexibility in their workflows&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A mature and active open source ecosystem&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And most importantly, it continues to be shaped by the contributions of its global community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JetBrains has long supported open source communities, including Jenkins.
Many Jenkins contributors benefit from &lt;strong&gt;free JetBrains IDE licenses&lt;/strong&gt;, which help them build, maintain, and improve the project.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/04/02/redesigned-credentials-plugin/</id>
<title>Redesigned Credentials in Jenkins</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-04-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/04/02/redesigned-credentials-plugin/" />
<category term='jenkins'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<category term='credentials'></category>
<category term='credential-provider'></category>
<category term='security'></category>
<summary>
We’re introducing a fresh new look for the Credentials plugin,
one of the most widely used Jenkins plugins and the foundation for securely storing and supplying credentials
across Jenkins.



So what&#8217;s new?

Integration with the new Manage Jenkins UI


This update brings the plugin into Jenkins’ experimental Manage Jenkins UI, aligning credential management with
the broader interface modernization underway in Jenkins core. Jenkins has been rolling out an experimental Manage
Jenkins layout alongside a wider redesign focused on clarity, accessibility, and reducing older navigation patterns,
and the Credentials plugin now joins that effort with its own refreshed experience.  ￼


Goodbye tables


The old table-based layout has been replaced with...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/04/02/redesigned-credentials-plugin.png&quot; alt=&quot;Redesigned Credentials in Jenkins&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re introducing a fresh new look for the &lt;a href=&quot;https://plugins.jenkins.io/credentials/&quot;&gt;Credentials&lt;/a&gt; plugin,
one of the most widely used Jenkins plugins and the foundation for securely storing and supplying credentials
across Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;so-whats-new&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#so-whats-new&quot; /&gt;So what’s new?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Integration with the new Manage Jenkins UI&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This update brings the plugin into Jenkins’ experimental Manage Jenkins UI, aligning credential management with
the broader interface modernization underway in Jenkins core. Jenkins has been rolling out an experimental Manage
Jenkins layout alongside a wider redesign focused on clarity, accessibility, and reducing older navigation patterns,
and the Credentials plugin now joins that effort with its own refreshed experience.  ￼&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Goodbye tables&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The old table-based layout has been replaced with card-based views that are much easier to scan and navigate.
Information is presented more clearly, with less visual clutter and a stronger focus on the actions people need.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Wizards and dialogs&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Creating credentials now happens through guided wizards that make each step clearer and easier to follow.
Actions such as editing, moving, and deleting credentials are now handled in dialogs, keeping users in context
instead of sending them through a chain of separate pages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;app-post-page__carousel&quot;&gt;
  &lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/04/02/add-dialog.png&quot; alt=&quot;Add Credentials dialog&quot; /&gt;
  &lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/04/02/update-dialog.png&quot; alt=&quot;Update credential dialog&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;available-now&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#available-now&quot; /&gt;Available now 🚀&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The update is available now for users on Jenkins 2.541.1 and later.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to get involved in the UI and UX discussions of Jenkins join the &lt;a href=&quot;https://www.jenkins.io/sigs/ux&quot;&gt;User Experience SIG&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Take advantage of new components and patterns in your plugin via the &lt;a href=&quot;https://weekly.ci.jenkins.io/design-library/&quot;&gt;Design Library&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can watch our monthly meetings on &lt;a href=&quot;https://www.youtube.com/playlist?list=PLN7ajX_VdyaOnsIIsZHsv_fM9QhOcajWe&quot;&gt;YouTube&lt;/a&gt; and you can view in-progress work on &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pulls?q=is%3Apr+is%3Aopen+label%3Aweb-ui&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/03/22/introducing-chinese-workday-plugin/</id>
<title>Introducing the Chinese Workday Plugin</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-03-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/03/22/introducing-chinese-workday-plugin/" />
<author>
<name>donhui</name>
</author>
<category term='plugins'></category>
<category term='pipeline'></category>
<category term='automation'></category>
<summary>
Many Jenkins jobs depend on business calendars.


For teams in China, that can be difficult to model with a simple weekday/weekend check. A weekday is not always a workday, and a weekend is not always a holiday. Chinese statutory holidays and make-up workdays change every year, so Pipeline logic often needs more than basic date rules.


The Chinese Workday Plugin was created to support that use case in Jenkins.




What the plugin provides


The plugin adds Pipeline steps for Chinese workday checks:




isChineseWorkday(&#8230;&#8203;)


isChineseHoliday(&#8230;&#8203;)


chineseWorkdaySupportedYears()




It also lets administrators add or override calendar data in:


Manage Jenkins &#8594; System &#8594; Chinese Workday


This makes it possible to keep holiday calendar...
</summary>
<content type='html'>
&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many Jenkins jobs depend on business calendars.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For teams in China, that can be difficult to model with a simple weekday/weekend check. A weekday is not always a workday, and a weekend is not always a holiday. Chinese statutory holidays and make-up workdays change every year, so Pipeline logic often needs more than basic date rules.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://plugins.jenkins.io/chinese-workday/&quot;&gt;Chinese Workday Plugin&lt;/a&gt; was created to support that use case in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-the-plugin-provides&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-the-plugin-provides&quot; /&gt;What the plugin provides&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin adds Pipeline steps for Chinese workday checks:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;isChineseWorkday(…​)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;isChineseHoliday(…​)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;chineseWorkdaySupportedYears()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It also lets administrators add or override calendar data in:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;Manage Jenkins → System → Chinese Workday&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This makes it possible to keep holiday calendar logic in one place instead of repeating it across Jenkinsfiles.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;example&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#example&quot; /&gt;Example&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One common use case is to run a stage only on a Chinese workday:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;pipeline&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;any&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Release&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;expression&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;isChineseWorkday&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Release runs only on a Chinese workday.&#39;&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-it-helps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-it-helps&quot; /&gt;Why it helps&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Without dedicated support, teams often duplicate holiday logic in Pipelines or rely on weekday-only checks. That can cause jobs to run during holidays or skip make-up workdays.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin keeps those rules centralized and makes Pipeline behavior easier to understand.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;learn-more&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#learn-more&quot; /&gt;Learn more&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Plugin site: &lt;a href=&quot;https://plugins.jenkins.io/chinese-workday/&quot;&gt;plugins.jenkins.io/chinese-workday&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Source code: &lt;a href=&quot;https://github.com/jenkinsci/chinese-workday-plugin&quot;&gt;github.com/jenkinsci/chinese-workday-plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feedback and contributions are welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/03/19/revamped-build-monitor-plugin/</id>
<title>Revamped Build Monitor plugin</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-03-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/03/19/revamped-build-monitor-plugin/" />
<category term='jenkins'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<summary>
We&#8217;re excited to announce a major update to the Build Monitor
plugin - a complete redesign that refreshes its big-screen view with a cleaner, more modern interface for
following build statuses.



So what&#8217;s new?

Rewritten and redesigned


Originally created for Jenkins 1 and powered by AngularJS, the plugin has now been completely rebuilt in React. The
redesign uses components from the Jenkins Design Library and aligns with the new Jenkins interface, delivering a
cleaner look, smoother navigation, theme support, and a more maintainable foundation for future development.


Customization


Build Monitor is now theme-aware - allowing you to match its appearance to your Jenkins theme.


Check out some of the themes...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/03/19/revamped-build-monitor-plugin.png&quot; alt=&quot;Revamped Build Monitor plugin&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re excited to announce a major update to the &lt;a href=&quot;https://plugins.jenkins.io/build-monitor-plugin/&quot;&gt;Build Monitor&lt;/a&gt;
plugin - a complete redesign that refreshes its big-screen view with a cleaner, more modern interface for
following build statuses.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;so-whats-new&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#so-whats-new&quot; /&gt;So what’s new?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Rewritten and redesigned&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Originally created for Jenkins 1 and powered by AngularJS, the plugin has now been completely rebuilt in React. The
redesign uses components from the Jenkins Design Library and aligns with the new Jenkins interface, delivering a
cleaner look, smoother navigation, theme support, and a more maintainable foundation for future development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Customization&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build Monitor is now theme-aware - allowing you to match its appearance to your Jenkins theme.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check out some of the themes available for Jenkins:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/dark-theme&quot;&gt;Dark theme&lt;/a&gt; - A sleek, modern look that’s easy on the eyes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/solarized-theme&quot;&gt;Solarized theme&lt;/a&gt; - Ethan Schoonover’s beloved, balanced theme returns
with a fresh release for Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/catppuccin-theme&quot;&gt;Catppuccin theme&lt;/a&gt; - A soothing pastel theme for Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/chocolate-theme&quot;&gt;Chocolate theme&lt;/a&gt; - Indulge your Jenkins in rich, dark tones with
golden highlights for a refined and elegant developer experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/nord-theme&quot;&gt;Nord theme&lt;/a&gt; - A clear, uncluttered, and elegant design
to achieve undisturbed focus and excellent readability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/03/19/theme.png&quot; alt=&quot;Solarized theme for Jenkins&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build Monitor now also supports &lt;a href=&quot;https://plugins.jenkins.io/customizable-header/&quot;&gt;Customizable Header&lt;/a&gt; plugin,
allowing you to customise the header shown in the monitor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;And more!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build Monitor now displays the view description and introduces several long-requested improvements,
including customizable auto-refresh, user avatars, and colorful badges, making the dashboard more
informative and easier to scan at a glance.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;available-now&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#available-now&quot; /&gt;Available now 🚀&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The update is available now for users on Jenkins 2.516.3 and later.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to get involved in the UI and UX discussions of Jenkins join the &lt;a href=&quot;https://www.jenkins.io/sigs/ux&quot;&gt;User Experience SIG&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Take advantage of new components and patterns in your plugin via the &lt;a href=&quot;https://weekly.ci.jenkins.io/design-library/&quot;&gt;Design Library&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can watch our monthly meetings on &lt;a href=&quot;https://www.youtube.com/playlist?list=PLN7ajX_VdyaOnsIIsZHsv_fM9QhOcajWe&quot;&gt;YouTube&lt;/a&gt; and you can view in-progress work on &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pulls?q=is%3Apr+is%3Aopen+label%3Aweb-ui&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/03/16/plugin-of-the-month/</id>
<title>Introducing the Jenkins Plugin of the Month</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-03-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/03/16/plugin-of-the-month/" />
<category term='plugins'></category>
<category term='community'></category>
<category term='security'></category>
<category term='plugin-of-the-month'></category>
<summary>
Introducing the Jenkins Plugin of the Month





The Jenkins ecosystem thrives because of its plugins.


With more than two thousand plugins available, Jenkins users can extend their automation platform in countless ways—integrating with tools, improving security, enhancing the user interface, or supporting new development workflows.
Behind each plugin are maintainers and contributors who invest their time to build and support these extensions.


To highlight this work and help users discover useful functionality, we are introducing a new initiative on the Jenkins blog:




Plugin of the Month


Each month, we will feature a Plugin of the Month.


The goal is to showcase plugins that provide valuable functionality for...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introducing-the-jenkins-plugin-of-the-month&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-the-jenkins-plugin-of-the-month&quot; /&gt;Introducing the Jenkins Plugin of the Month&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/03/plugin_of_the_month_march.png&quot; alt=&quot;plugin of the month march&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins ecosystem thrives because of its plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With more than two thousand plugins available, Jenkins users can extend their automation platform in countless ways—integrating with tools, improving security, enhancing the user interface, or supporting new development workflows.
Behind each plugin are maintainers and contributors who invest their time to build and support these extensions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To highlight this work and help users discover useful functionality, we are introducing a new initiative on the Jenkins blog:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;plugin-of-the-month&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-of-the-month&quot; /&gt;Plugin of the Month&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each month, we will feature a &lt;strong&gt;Plugin of the Month&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The goal is to showcase plugins that provide valuable functionality for Jenkins users, highlight the work of their maintainers, and help the community discover capabilities they may not yet know about.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes the featured plugin will be widely used but underappreciated.
Other times it may be a newer plugin that solves an interesting problem.
In all cases, the focus is on highlighting contributions that strengthen the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you maintain or use a plugin that deserves more visibility, we welcome suggestions for future editions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;plugin-of-the-month-oidc-provider-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-of-the-month-oidc-provider-plugin&quot; /&gt;Plugin of the Month: OIDC Provider Plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our first featured plugin is the &lt;a href=&quot;https://plugins.jenkins.io/oidc-provider/&quot;&gt;OIDC Provider Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This plugin allows Jenkins to act as an &lt;strong&gt;OpenID Connect (OIDC) provider&lt;/strong&gt; so that external systems can securely authenticate using identities issued by Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of storing long-lived credentials or secrets inside Jenkins pipelines, systems can request short-lived tokens using the OIDC standard.
This significantly reduces the need to manage and rotate static secrets.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-this-matters&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-this-matters&quot; /&gt;Why This Matters&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Managing credentials and secrets in CI/CD pipelines can quickly become complex and risky.
Long-lived access keys stored in configuration or credentials stores are a common attack vector.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By using &lt;strong&gt;OIDC-based authentication&lt;/strong&gt;, Jenkins can issue &lt;strong&gt;short-lived identity tokens&lt;/strong&gt; that external systems trust.
This approach improves security while simplifying credential management.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is especially useful when Jenkins pipelines interact with cloud providers such as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Microsoft Azure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Google Cloud Platform (GCP)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Web Services (AWS)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of storing cloud access keys in Jenkins, pipelines can authenticate using federated identity through OIDC.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin is not limited to cloud providers.
It can also be used to authenticate with &lt;strong&gt;internal services&lt;/strong&gt;, such as a local &lt;strong&gt;Artifactory&lt;/strong&gt; instance or other systems that support OIDC.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;reducing-secrets-in-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reducing-secrets-in-pipelines&quot; /&gt;Reducing Secrets in Pipelines&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the biggest advantages of this approach is the ability to &lt;strong&gt;reduce or eliminate stored secrets&lt;/strong&gt; in Jenkins pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Benefits include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;No long-lived credentials stored in pipelines&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reduced secret management overhead&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Short-lived tokens issued on demand&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Better alignment with modern cloud security practices&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;looking-ahead&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#looking-ahead&quot; /&gt;Looking Ahead&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins plugin ecosystem is one of the project’s greatest strengths.
With the new &lt;strong&gt;Plugin of the Month&lt;/strong&gt; series, we hope to highlight the innovation and dedication that plugin maintainers bring to the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned for next month’s featured plugin — and if you have a favorite plugin you think should be highlighted, let us know.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Together, we continue to grow and strengthen the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/03/09/contributor-summit-part-2/</id>
<title>Jenkins Contributor Summit: Officers View on the Present and Future</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-03-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/03/09/contributor-summit-part-2/" />
<category term='contribute'></category>
<category term='community'></category>
<category term='contributor-summit'></category>
<summary>
The Present and the Future of Jenkins





This post continues the recap of the Jenkins Contributor Summit held in Brussels alongside FOSDEM.
If you missed the first overview of the event, you can read it here:


Impressions from the Jenkins Contributor Summit in Brussels


While the first post focused on the atmosphere and discussions during the summit, this article highlights one of the key sessions of the day: “The Present and the Future – The Jenkins Officer’s View.”
During this session, Jenkins project officers shared updates about the current state of the ecosystem and the work being done to keep Jenkins evolving.




Release Automation and Dependency...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-present-and-the-future-of-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-present-and-the-future-of-jenkins&quot; /&gt;The Present and the Future of Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/03/contributor_summit_officers_view.jpg&quot; alt=&quot;contributor summit officers view&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post continues the recap of the Jenkins Contributor Summit held in Brussels alongside FOSDEM.
If you missed the first overview of the event, you can read it here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2026/03/02/contributor-summit/&quot;&gt;Impressions from the Jenkins Contributor Summit in Brussels&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While the first post focused on the atmosphere and discussions during the summit, this article highlights one of the key sessions of the day: &lt;strong&gt;“The Present and the Future – The Jenkins Officer’s View.”&lt;/strong&gt;
During this session, Jenkins project officers shared updates about the current state of the ecosystem and the work being done to keep Jenkins evolving.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;release-automation-and-dependency-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#release-automation-and-dependency-updates&quot; /&gt;Release Automation and Dependency Updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Automation continues to play an important role in maintaining the health of the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently, &lt;strong&gt;673 plugins and 35 components&lt;/strong&gt; are using automated releases.
The adoption of this process has steadily grown over the past few years:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2023: 280 automated releases&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2024: 580 automated releases&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2025: 708 automated releases&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the same time, dependency management across the Jenkins organization has improved significantly.
The introduction of &lt;strong&gt;Renovate&lt;/strong&gt; across the &lt;code&gt;jenkinsci&lt;/code&gt; GitHub organization allows maintainers to keep dependencies up to date automatically, reducing maintenance burden and improving overall security and stability.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;security-continuous-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security-continuous-improvements&quot; /&gt;Security: Continuous Improvements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Security remains a major focus for the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past several years, the Jenkins security team has continued to manage vulnerability disclosures and advisories for the ecosystem:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2022: 16 security advisories covering 297 tickets&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2023: 17 advisories covering 212 tickets&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2024: 11 advisories covering 57 tickets&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2025: 12 advisories covering 82 tickets&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Only &lt;strong&gt;two critical vulnerabilities&lt;/strong&gt; were reported in 2025, both affecting plugins with relatively low usage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Around &lt;strong&gt;20% of vulnerabilities are reported directly by the Jenkins security team&lt;/strong&gt;, demonstrating the proactive work being done to improve the security of the ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Security research and education also remain an important mission for the project.
Over the past years, Jenkins has collaborated with students and researchers:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2021: 4 master students from Luminy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2022: Valdes – 6-month internship&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2023: Andrea – 3-month internship&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2024: onboarding of Swapna Nanda&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2025: 7 master students from Luminy&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These collaborations have led to &lt;strong&gt;5 findings being fixed&lt;/strong&gt; and &lt;strong&gt;30 findings being published without fixes&lt;/strong&gt;, mostly affecting long-tail plugins that currently lack active maintainers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;content-security-policy-csp&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#content-security-policy-csp&quot; /&gt;Content Security Policy (CSP)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another long-term effort discussed during the summit was the implementation of &lt;strong&gt;Content Security Policy (CSP)&lt;/strong&gt; support in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This initiative has been evolving over several years:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;August 2020 – first public draft PR demonstrating the concept&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;October 2021 – discussed during Hacktoberfest&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;July 2022 – broader involvement with Jenkins core and documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;September 2022 – revisited during Hacktoberfest&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;End of 2024 – major progress supported by Alpha Omega funding&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;January 2026 – CSP support introduced as &lt;strong&gt;opt-in&lt;/strong&gt; in Jenkins &lt;strong&gt;2.539 / 2.541.1&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This work aims to strengthen the browser security model of Jenkins while ensuring compatibility with the large plugin ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;user-experience-progress&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#user-experience-progress&quot; /&gt;User Experience Progress&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;User experience improvements have been gaining significant momentum.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The past year has been the &lt;strong&gt;biggest year yet for the Jenkins User Experience SIG&lt;/strong&gt;, with:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;86 merged pull requests&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;54 issues resolved&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;5 blog posts&lt;/strong&gt; sharing progress and improvements&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These efforts aim to gradually modernize the Jenkins interface and make the system easier to use for both new and experienced users.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;looking-ahead&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#looking-ahead&quot; /&gt;Looking Ahead&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The updates from the project officers demonstrated that Jenkins continues to evolve across multiple fronts: automation, security, infrastructure, and user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Maintaining a project of this size requires sustained effort from contributors across the globe.
The numbers shared during the summit highlight not only the scale of the Jenkins ecosystem, but also the steady progress being made to keep it secure, modern, and sustainable for the future.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/03/06/jenkins-contributor-awards-2026-nomination-is-open/</id>
<title>Jenkins Contributor Awards 2026 - Nominations are Open</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-03-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/03/06/jenkins-contributor-awards-2026-nomination-is-open/" />
<category term='community'></category>
<category term='events'></category>
<summary>
The Jenkins community thrives because of its contributors.


Every day, maintainers, advocates, security researchers, and community members invest their time to improve Jenkins and support users around the world.
The Jenkins Contributor Awards are our way of recognizing these efforts and celebrating the people who make the project stronger.


For 2026, the Jenkins awards are being hosted by the Continuous Delivery Foundation (CDF) alongside the broader CDF Community Awards.


Nominate Outstanding Contributors


Nominations are now open, and any contributor is eligible for recognition.


To ensure transparency and openness, nominations are being collected publicly through GitHub issues.
This allows the community to see the nominations and celebrate contributors...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/03/cdf_community_awards.png&quot; alt=&quot;cdf community awards&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins community thrives because of its contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every day, maintainers, advocates, security researchers, and community members invest their time to improve Jenkins and support users around the world.
The &lt;strong&gt;Jenkins Contributor Awards&lt;/strong&gt; are our way of recognizing these efforts and celebrating the people who make the project stronger.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For 2026, the Jenkins awards are being hosted by the Continuous Delivery Foundation (CDF) alongside the broader CDF Community Awards.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;nominate-outstanding-contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#nominate-outstanding-contributors&quot; /&gt;Nominate Outstanding Contributors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominations are now open, and &lt;strong&gt;any contributor is eligible&lt;/strong&gt; for recognition.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To ensure transparency and openness, nominations are being collected publicly through GitHub issues.
This allows the community to see the nominations and celebrate contributors together.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Make sure to submit your nominations before the deadline on &lt;strong&gt;April 2, 2026&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;cast-your-vote&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cast-your-vote&quot; /&gt;Cast Your Vote&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After nominations close, the community will have the opportunity to vote.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voting opens on &lt;strong&gt;April 8&lt;/strong&gt; and runs until &lt;strong&gt;May 5, 2026&lt;/strong&gt;.
During this period, everyone in the community can participate by voting through the official Google Form, which will list all nominees and award categories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is your chance to help highlight the people who move Jenkins forward.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-award-categories&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-award-categories&quot; /&gt;Jenkins Award Categories&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can nominate contributors in several Jenkins-specific categories:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/8919&quot;&gt;Most Valuable Jenkins Contributor&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/8917&quot;&gt;Most Valuable Jenkins Advocate&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/8918&quot;&gt;Jenkins Security MVP&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each category highlights a different kind of impact — from technical contributions and community advocacy to improving the security of the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The winners will be officially announced at &lt;a href=&quot;https://cd.foundation/cdcon-2026/&quot;&gt;cdCon 2026&lt;/a&gt;, taking place &lt;strong&gt;May 18–20, 2026&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;additional-cdf-community-awards&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#additional-cdf-community-awards&quot; /&gt;Additional CDF Community Awards&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the Jenkins-specific awards, the Continuous Delivery Foundation also recognizes contributors across the broader CD ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Categories include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Top CDF Ambassador&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Top CDF Contributor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Top CDF End User&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you know someone making an impact beyond Jenkins, consider nominating them as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For full details about all award categories and the nomination process, visit the &lt;a href=&quot;https://cd.foundation/awards-2026/&quot;&gt;CDF Awards page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;celebrate-the-community&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#celebrate-the-community&quot; /&gt;Celebrate the Community&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open source projects succeed because of the people behind them.
The Jenkins Contributor Awards are a chance to highlight those efforts and say &lt;strong&gt;thank you&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If someone in the community inspired you this year — submit a nomination and help us celebrate their contributions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/03/02/contributor-summit/</id>
<title>Impressions from Jenkins Contributor Summit in Brussels</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-03-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/03/02/contributor-summit/" />
<category term='contribute'></category>
<category term='community'></category>
<category term='contributor-summit'></category>
<summary>
Jenkins Contributor Summit 2026: A Personal Reflection


The Jenkins Contributor Summit in Brussels was a milestone for me.


Not just because contributors from across Europe and also from the United States came together in one place.
But because it was the first time I had the privilege of moderating the event.
Thanks a lot to Stephane Merle for the time keeping and Bruno Verachten for the planning and organization support.


Standing in front of a room full of long-time maintainers, officers, SIG leads, and community members is both humbling and inspiring.
Many of us collaborate daily online, yet being physically in the same room changes the...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-contributor-summit-2026-a-personal-reflection&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-contributor-summit-2026-a-personal-reflection&quot; /&gt;Jenkins Contributor Summit 2026: A Personal Reflection&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Contributor Summit in Brussels was a milestone for me.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not just because contributors from across Europe and also from the United States came together in one place.
But because it was the first time I had the privilege of moderating the event.
Thanks a lot to Stephane Merle for the time keeping and Bruno Verachten for the planning and organization support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Standing in front of a room full of long-time maintainers, officers, SIG leads, and community members is both humbling and inspiring.
Many of us collaborate daily online, yet being physically in the same room changes the dynamic completely.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This summit reminded me that Jenkins is not just an automation server — it’s a living ecosystem shaped by people who care deeply about it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;setting-the-stage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-the-stage&quot; /&gt;Setting the Stage&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We began by welcoming everyone and outlining the goals for the day.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As moderator, my role wasn’t to dominate discussions but to guide them with keeping conversations focused, making sure different voices were heard, and ensuring we stayed aligned with the broader objectives.
Open source thrives on open discussion, but structure helps turn discussion into progress.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the beginning, the atmosphere was collaborative and forward-looking.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-present-and-the-future-officer-perspectives&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-present-and-the-future-officer-perspectives&quot; /&gt;The Present and the Future - Officer Perspectives&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the core sessions focused on the present state and the year 2025 of Jenkins from the perspective of project officers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We heard updates covering the year’s accomplishments, ongoing challenges, and strategic priorities from the officers’ point of view:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Infrastructure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release processes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation challenges and improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Events and community engagement&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security efforts&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These perspectives grounded the summit in reality.
Jenkins operates at global scale, and maintaining trust — in releases, infrastructure, and security — requires continuous effort behind the scenes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was a reminder that governance and operational work are just as critical as writing code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There will be a separate blog post covering the officer updates in more detail, but I want to highlight the security update here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;security-and-bug-bounty-program&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security-and-bug-bounty-program&quot; /&gt;Security and Bug Bounty Program&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An important aspect worth highlighting is the sponsorship support from the European Commission.
The funding, managed by YesWeHack as part of a structured Bug Bounty program, strengthens the security posture of Jenkins in a very concrete way.
This kind of institutional support demonstrates that open source infrastructure like Jenkins is recognized as critical digital infrastructure.
If you missed the blog post about the Bug Bounty program, you can find it here: &lt;a href=&quot;https://www.jenkins.io/blog/2025/12/10/jenkins-bug-bounty-program-yeswehack-european-commission/&quot;&gt;Introducing the Jenkins Bug Bounty Program&lt;/a&gt;.
A big thanks also to the security team for their ongoing efforts in this area and securing nice shirts for all contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;sig-updates-and-technical-direction&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sig-updates-and-technical-direction&quot; /&gt;SIG Updates and Technical Direction&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Special Interest Groups shared progress and plans, particularly around User Experience and Platform topics.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The UX discussions highlighted how carefully the project must balance modernization with backward compatibility.
Jenkins cannot simply reinvent itself overnight — it evolves incrementally, respecting the massive ecosystem built around it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the technical side, we discussed Java support, the challenges faced by community plugin maintainers, and the ongoing effort to modernize plugins at scale.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The session on plugin modernization and OpenRewrite stood out.
Automating large-scale refactoring is essential for keeping the ecosystem healthy without overwhelming maintainers.
Sustainability is not just about infrastructure, it’s also about reducing maintenance burden.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;interaction-and-momentum&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#interaction-and-momentum&quot; /&gt;Interaction and Momentum&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We made space for interaction — including brainstorming workshop ideas and identifying areas where deeper collaboration is needed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once contributors start exchanging ideas in person, momentum builds quickly.
Topics ranged from AI fabricated Pull Requests to onboarding improvements and UX refinements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The energy in the room was constructive.
Disagreements were pragmatic rather than ideological.
Everyone shared the same goal: ensuring Jenkins remains relevant and reliable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I took a photo during one of the sessions, and it captures the spirit of the summit:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/03/contributor_summit_room.jpg&quot; alt=&quot;Jenkins Contributor Summit Session&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;advocacy-and-community-building&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#advocacy-and-community-building&quot; /&gt;Advocacy and Community Building&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also talked about advocacy and outreach.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How do we attract new contributors?
How do we support existing maintainers?
How do we communicate innovations more effectively?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One recurring realization: Jenkins builds valuable improvements, but we don’t always communicate them clearly enough.
Strengthening community outreach is essential for long-term growth.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;open-discussion-and-the-headstand-exercise&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#open-discussion-and-the-headstand-exercise&quot; /&gt;Open Discussion and the “Headstand” Exercise&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the open discussion, we ran a structured “headstand” exercise to generate fresh ideas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of asking,
“How do we achieve our goal?”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;we deliberately flipped the challenge upside down and asked,
“How could we guarantee the opposite?”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-headstand&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-headstand&quot; /&gt;The Headstand&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The concrete question we explored was:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;How can we help maintainers spend as much time as possible with first-time contributors?&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We brainstormed policies, tools, behaviors, and attitudes that would &lt;strong&gt;guarantee&lt;/strong&gt; this outcome.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The answers were intentionally “bad” ideas:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Remove or neglect documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Avoid automation wherever possible&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make contribution guidelines unclear&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spending as much time as possible on manual feedback&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Auto merge failing pull requests without feedback&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By exaggerating the negative, we uncovered hidden assumptions about onboarding, mentorship, and process inefficiencies.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;flip-it-back&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#flip-it-back&quot; /&gt;Flip It Back&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We then inverted the ideas:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;How could we make maintainers spend as little time as possible with first-time contributors?&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each “bad” idea was turned into its constructive opposite:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Improve documentation clarity and structure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automate repetitive feedback and checks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Invest in contributor education and self-service resources&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make use of bots and tools to handle common issues&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The exercise created clarity quickly.
Instead of abstract discussions about “better onboarding,” we identified concrete improvement areas grounded in real maintainer experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes, thinking about how to fail is the fastest way to understand how to succeed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;workshops-ai-and-ux&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#workshops-ai-and-ux&quot; /&gt;Workshops: AI and UX&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We closed with focused workshop discussions, including:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;ai-slop-when-automation-creates-more-noise-than-value&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ai-slop-when-automation-creates-more-noise-than-value&quot; /&gt;AI Slop: When Automation Creates More Noise Than Value&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One topic that surfaced in our discussions — and that clearly extends beyond Jenkins — is the growing pressure on maintainers in what some call the AI slop.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GitHub recently described this phenomenon: contribution has never been easier.
Opening issues, submitting pull requests, and now even generating code with AI tools can be done in minutes.
The barrier to entry is low — which is great for accessibility — but the review burden remains high.
This creates a paradox: more contributions can mean more noise, not necessarily more value.
If you are curious about this topic, check out the GitHub blog post: &lt;a href=&quot;https://github.blog/open-source/maintainers/welcome-to-the-eternal-september-of-open-source-heres-what-we-plan-to-do-for-maintainers/&quot;&gt;Welcome to the eternal september of open source&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;practical-uiux-evolution-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#practical-uiux-evolution-steps&quot; /&gt;Practical UI/UX evolution steps&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There was also a workshop focused on practical steps for evolving the Jenkins UI/UX.
The challenge is how to modernize the user experience without alienating existing users or breaking plugins.
One way to test changes is with the feature flag system, allowing gradual rollout and feedback collection.
If you are curious what is already possible, see what is already available in your Jenkins instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/03/UI_Experiments.png&quot; alt=&quot;Feature Flags in Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;personal-reflections&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#personal-reflections&quot; /&gt;Personal Reflections&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me personally, moderating the summit was a learning experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It required:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Managing time without suppressing energy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Encouraging quieter participants to speak&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigating strong opinions constructively&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reading the room and adjusting pace&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most of all, it reinforced something I already knew but felt more strongly in Brussels:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is sustained by people who show up.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Contributor Summit wasn’t just a series of agenda items.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was alignment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was trust-building.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was shared responsibility.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And I’m grateful that this time, I got to help guide the conversation from the front of the room.
Thanks to everyone who participated, shared their perspectives, and contributed to the discussions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/02/19/jenkins-accepted-as-gsoc-2026-mentoring-org/</id>
<title>Jenkins accepted as mentoring org for Google Summer of Code (GSoC) 2026</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-02-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/02/19/jenkins-accepted-as-gsoc-2026-mentoring-org/" />
<category term='gsoc'></category>
<category term='gsoc2026'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
Jenkins Accepted to Google Summer of Code 2026 🎉


We are thrilled to announce that Jenkins has been accepted as a mentoring organization for Google Summer of Code (GSoC) 2026!
This marks our tenth year participating in this prestigious program, and we are excited to continue welcoming new contributors into our vibrant open-source community.




Why GSoC Matters


Google Summer of Code is an outstanding opportunity for aspiring developers to gain hands-on experience in open-source software development.
Participants work on real-world projects, collaborate closely with experienced mentors, and make meaningful contributions to the Jenkins ecosystem.
We are committed to providing a supportive and inclusive environment for all...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/Jenkins_GSoC_2026_Program.png&quot; alt=&quot;Jenkins GSoC 2026 Program&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-accepted-to-google-summer-of-code-2026&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-accepted-to-google-summer-of-code-2026&quot; /&gt;Jenkins Accepted to Google Summer of Code 2026 🎉&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are thrilled to announce that Jenkins has been accepted as a mentoring organization for Google Summer of Code (GSoC) 2026!
This marks our tenth year participating in this prestigious program, and we are excited to continue welcoming new contributors into our vibrant open-source community.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-gsoc-matters&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-gsoc-matters&quot; /&gt;Why GSoC Matters&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Google Summer of Code is an outstanding opportunity for aspiring developers to gain hands-on experience in open-source software development.
Participants work on real-world projects, collaborate closely with experienced mentors, and make meaningful contributions to the Jenkins ecosystem.
We are committed to providing a supportive and inclusive environment for all GSoC participants, and we look forward to seeing another summer of fruitful contributions that will emerge from this year’s program.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;preparing-your-application&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#preparing-your-application&quot; /&gt;Preparing Your Application&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in applying, now is the perfect time to get started.
We encourage all interested candidates to start preparing their applications and to join our upcoming webinars where we will discuss potential project ideas and provide guidance on the application process.
Stay tuned for more details on how to get involved and make the most of this exciting opportunity!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-on-the-near-horizon-for-gsoc-candidates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-on-the-near-horizon-for-gsoc-candidates&quot; /&gt;What’s on the near horizon for GSoC candidates?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Review the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors/&quot;&gt;information for contributors&lt;/a&gt; page for detailed application guidelines.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Join our webinars for a walk through of project ideas, the details of which will be made available over the coming days via our official communication channels.
Recordings of these webinars will be made available after each session.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use &lt;a href=&quot;https://docs.google.com/document/d/1dIlPLXfLbFsvcaHFuwmH9_lSCVm9m6-SgNYTNAnSZpY/edit?usp=sharing&quot;&gt;the official proposal template&lt;/a&gt; to structure and draft your project proposal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We encourage you to start engaging with the community early, ask questions, and explore the available project ideas.
The more familiar you are with Jenkins and its ecosystem, the stronger your proposal will be.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.google.com/open-source/gsoc/timeline&quot;&gt;GSoC timeline&lt;/a&gt; for a complete list of important dates.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/02/16/fosdem-stand-report/</id>
<title>Impressions from Jenkins Stand at FOSDEM Brussels</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-02-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/02/16/fosdem-stand-report/" />
<category term='fosdem2026'></category>
<category term='contribute'></category>
<category term='community'></category>
<summary>
Two Days Behind the Jenkins Booth at FOSDEM 2026


FOSDEM is always a blur.
Two days, hundreds of conversations, one booth, and just enough coffee and beer to get through the weekend.


This year at FOSDEM 2026, I had the privilege of standing behind the Jenkins booth.
If you&#8217;ve ever wondered what it’s like on the other side of the table at one of the busiest open source conferences in Europe — here’s a field report.









The Visitor Archetypes


After about 50 conversations, patterns emerge.
By the end of day two, you can almost predict the opening line.


1. The “I Just Wanted to Say Thank You” Visitor

They...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;two-days-behind-the-jenkins-booth-at-fosdem-2026&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#two-days-behind-the-jenkins-booth-at-fosdem-2026&quot; /&gt;Two Days Behind the Jenkins Booth at FOSDEM 2026&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;FOSDEM is always a blur.
Two days, hundreds of conversations, one booth, and just enough coffee and beer to get through the weekend.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year at &lt;a href=&quot;https://fosdem.org/&quot;&gt;FOSDEM 2026&lt;/a&gt;, I had the privilege of standing behind the Jenkins booth.
If you’ve ever wondered what it’s like on the other side of the table at one of the busiest open source conferences in Europe — here’s a field report.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/fosdem_stand_2026.jpg&quot; alt=&quot;Jenkins stand at FOSDEM 2026&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-visitor-archetypes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-visitor-archetypes&quot; /&gt;The Visitor Archetypes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After about 50 conversations, patterns emerge.
By the end of day two, you can almost predict the opening line.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;1-the-i-just-wanted-to-say-thank-you-visitor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-the-i-just-wanted-to-say-thank-you-visitor&quot; /&gt;1. The “I Just Wanted to Say Thank You” Visitor&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;They don’t want stickers.
They don’t want to debate YAML vs Groovy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;They just walk up and say:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;“Hey, I’ve been using Jenkins for years. Thank you.”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some run builds for research labs.
Some ship medical devices.
Some maintain internal tooling for companies you’ve definitely heard of.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;They’ve been quietly relying on Jenkins for a decade or more.
No drama.
Just pipelines running at 2am.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These conversations are short — but they’re the ones you carry home.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;2-the-wait-blue-ocean-is-being-deprecated-crowd&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-the-wait-blue-ocean-is-being-deprecated-crowd&quot; /&gt;2. The “Wait… Blue Ocean Is Being Deprecated?” Crowd&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This one starts with excitement:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;“I love Blue Ocean!”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And then we gently explain the status of &lt;a href=&quot;https://plugins.jenkins.io/blueocean/&quot;&gt;Blue Ocean&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cue visible surprise.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean was a bold experiment in rethinking the Jenkins UX.
It brought modern pipeline visualization to a platform that predates most current frontend frameworks.
But maintaining a parallel UI stack long-term is hard — especially in an open source project driven by volunteers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The common reactions:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;“Oh… I didn’t know.”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;“What should I use instead?”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;“Is there something new coming?”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Which leads directly to…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;3-have-you-heard-of-pipeline-graph-view&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3-have-you-heard-of-pipeline-graph-view&quot; /&gt;3. “Have You Heard of Pipeline Graph View?”&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Short answer: probably not.
Long answer: that’s part of the problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/pipeline-graph-view/&quot;&gt;Pipeline Graph View&lt;/a&gt; is the modern, actively maintained visualization for Jenkins pipelines.
It’s lighter, integrated into the main UI direction, and not trying to be an entire alternative universe.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yet over two days, most people who loved Blue Ocean had never heard of it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the classic open source paradox:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We built the thing.
We shipped the thing.
But communicating the thing?
That’s harder than merging the PR.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re still associating Jenkins pipeline visualization exclusively with Blue Ocean, it might be time for another look.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;4-groovy-pipeline-confessions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#4-groovy-pipeline-confessions&quot; /&gt;4. Groovy Pipeline Confessions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some conversations begin in a whisper:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;“I… may have abused scripted pipeline.”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We heard it all: 2,000-line Jenkinsfiles&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Groovy is powerful. Maybe too powerful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But here’s the interesting part: these weren’t complaints.
They were confessions from people who pushed Jenkins to its limits — and sometimes beyond — because it let them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Declarative pipelines helped.
Shared libraries helped.
But the raw flexibility of Groovy remains both Jenkins’ superpower and its chaos engine.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And we love you for using it creatively.
Even if we gently recommend refactoring.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;5-the-angry-butler-sticker-phenomenon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#5-the-angry-butler-sticker-phenomenon&quot; /&gt;5. The Angry Butler Sticker Phenomenon&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We brought stickers. Lots of stickers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One clear winner:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/logos/fire/fire.png&quot; alt=&quot;Angry Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It turns out that an anthropomorphic CI server expressing mild frustration is extremely relatable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s something deeply honest about a slightly annoyed butler judging your broken build.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;6-our-neighbors-gitlab&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#6-our-neighbors-gitlab&quot; /&gt;6. Our Neighbors: GitLab&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Right next to us: GitLab.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You might expect rivalry vibes. Instead? It was refreshingly friendly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We traded stickers.
We compared notes on visitor questions.
We laughed about shared CI/CD pain points.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the booth level, it wasn’t “us vs them.”
It was: “CI is hard. Solidarity.”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open source ecosystems overlap more than marketing pages suggest.
Many people run hybrid setups.
Many teams experiment.
The lines are blurrier than Twitter debates imply.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And honestly?
The GitLab folks were pretty cool.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;everywhere-ai&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#everywhere-ai&quot; /&gt;Everywhere AI&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If FOSDEM 2026 had a background soundtrack, it would be:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;“Does it use AI?”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every hallway track, every devroom, every booth.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So yes — Jenkins conversations also drifted there.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Which made this especially relevant:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-explain-errors-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-explain-errors-plugin&quot; /&gt;The Explain Errors Plugin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you haven’t seen it yet, check out the &lt;a href=&quot;https://plugins.jenkins.io/explain-error/&quot;&gt;Explain Errors Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The idea is simple:
When your pipeline fails, you don’t just get a stack trace.
You get help understanding it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s the kind of AI integration that feels aligned with CI/CD:
Practical.
Contextual.
Opt-in.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not replacing engineers.
Helping them get unstuck faster.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;behind-the-booth-learning-the-ropes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#behind-the-booth-learning-the-ropes&quot; /&gt;Behind the Booth: Learning the Ropes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A booth doesn’t run itself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before FOSDEM, I had no idea how much choreography is involved: sticker logistics, demo rotations, handling tough questions, knowing when to go deep and when to keep the line moving.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Huge thanks to Bruno Verachten and Stephane Merle for patiently teaching me how to operate the booth — from the practical details to the subtle art of engaging passersby without overwhelming them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If I looked like I knew what I was doing, it’s because I had excellent teachers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-two-days-behind-the-booth-teaches-you&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-two-days-behind-the-booth-teaches-you&quot; /&gt;What Two Days Behind the Booth Teaches You&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is still everywhere.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Communication is as important as code.
Special thanks go to everyone who stopped by to share their stories, ask questions, and give feedback.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stickers matter more than you think.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open source is powered by humans showing up in person.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;FOSDEM compresses an entire year of GitHub issues into two days of real conversations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And behind the booth, between sticker handoffs and pipeline debates, you’re reminded:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins isn’t just a server.
It’s a community that keeps shipping.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See you next year.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/02/06/tuning-java-settings-for-higher-performance/</id>
<title>Tuning Jenkins Java Settings For Responsiveness and Stability with Large Instances</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-02-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/02/06/tuning-java-settings-for-higher-performance/" />
<category term='performance'></category>
<category term='scalability'></category>
<category term='administration'></category>
<category term='java17'></category>
<category term='java21'></category>
<category term='java25'></category>
<category term='gc'></category>
<summary>
Hello, Jenkins Community!


As of Java 17, the JVM&#8217;s defaults have improved to the point where hand-tuned configurations often
make performance worse rather than better.


The runtime now:




Detects container limits and sizes heaps/threads accordingly


Optimizes pause times automatically using real-time profiling


Allocates memory more efficiently


Uses G1GC by default, which is more predictable than older collectors




Using -XX:MaxRAMPercentage and -XX:InitialRAMPercentage settings instead of fixed -Xms and -Xmx
has resulted in fewer GC pauses, better stability across different container sizes, and less memory pressure.


Understanding the Settings


Before diving into configuration, it&#8217;s important to understand what these JVM options do:



G1GC (Garbage First Garbage Collector)

G1GC divides the heap into regions and collects...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/02/06/2026-02-06-tuning-java-settings-for-higher-performance.png&quot; alt=&quot;Tuning Java Settings for Higher Performance&quot; width=&quot;50%&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello, Jenkins Community!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of Java 17, the JVM’s defaults have improved to the point where hand-tuned configurations often
make performance worse rather than better.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The runtime now:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Detects container limits and sizes heaps/threads accordingly&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optimizes pause times automatically using real-time profiling&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allocates memory more efficiently&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Uses G1GC by default, which is more predictable than older collectors&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using &lt;code&gt;-XX:MaxRAMPercentage&lt;/code&gt; and &lt;code&gt;-XX:InitialRAMPercentage&lt;/code&gt; settings instead of fixed &lt;code&gt;-Xms&lt;/code&gt; and &lt;code&gt;-Xmx&lt;/code&gt;
has resulted in fewer GC pauses, better stability across different container sizes, and less memory pressure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;understanding-the-settings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#understanding-the-settings&quot; /&gt;Understanding the Settings&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before diving into configuration, it’s important to understand what these JVM options do:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;G1GC (Garbage First Garbage Collector)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;G1GC divides the heap into regions and collects garbage incrementally, designed to keep pause times predictable and low. It’s the default for Java 17+ and works well for heaps from 4GB to 40GB.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;MaxRAMPercentage&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Specifies what percentage of the container’s available memory should be used for the Java heap. Unlike fixed &lt;code&gt;-Xmx&lt;/code&gt;, this automatically scales if the container is resized. A value of 60.0 means 60% of the container’s RAM becomes the max heap.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;InitialRAMPercentage&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Sets the initial heap size as a percentage of available memory. Starting smaller (20%) allows the heap to grow gradually, which can reduce pressure during startup and allow the GC to tune itself as workload patterns emerge.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;recommended-settings-for-java-17-21-and-up&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#recommended-settings-for-java-17-21-and-up&quot; /&gt;Recommended Settings for Java 17, 21, and up&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;For Controllers (larger instances):&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;JAVA_OPTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;
  -XX:+UseG1GC
  -XX:MaxRAMPercentage=60.0
  -XX:InitialRAMPercentage=20.0
&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;For Workers or smaller instances:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;JAVA_OPTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;
  -XX:+UseG1GC
  -XX:MaxRAMPercentage=75.0
  -XX:InitialRAMPercentage=50.0
&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For controllers, the conservative 60% setting leaves room for OS buffers and native memory. Workers often tolerate higher heap percentages since they’re more isolated and less likely to have multiple memory-intensive processes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a more in depth analysis of what Jenkins does under the hood, view the original 2016 article here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/11/21/gc-tuning/#the-magic-settings/&quot;&gt;GC Tuning, the magic settings&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cloudbees also has an article here which is more up to date:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.cloudbees.com/docs/cloudbees-ci-kb/latest/best-practices/jvm-memory-settings-best-practice/&quot;&gt;JVM Memory Settings Best Practice&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;notes-on-older-java-versions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#notes-on-older-java-versions&quot; /&gt;Notes on Older Java Versions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you still run Java 11 or earlier:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use fixed heap sizing (&lt;code&gt;-Xms&lt;/code&gt; / &lt;code&gt;-Xmx&lt;/code&gt;), because container support varies and automatic scaling is unreliable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure &lt;code&gt;-XX:+UseContainerSupport&lt;/code&gt; is set (it’s default in most builds, but verify).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set both &lt;code&gt;-Xms&lt;/code&gt; and &lt;code&gt;-Xmx&lt;/code&gt; to the same value to avoid pauses from heap expansion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example for 8GB container: &lt;code&gt;-Xms4G -Xmx4G -XX:+UseG1GC&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Consider upgrading to Java 17+ if possible, as the memory management is substantially better.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;common-pitfalls-and-anti-patterns&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#common-pitfalls-and-anti-patterns&quot; /&gt;Common Pitfalls and Anti-Patterns&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;Don’t set heap to 100% of container memory&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The OS needs memory for buffers, caches, and native libraries. Leaving 30–40% for the OS prevents out-of-memory kills and improves overall performance.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;Don’t mix fixed sizing with percentages&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Using both &lt;code&gt;-Xmx&lt;/code&gt; and &lt;code&gt;-XX:MaxRAMPercentage&lt;/code&gt; creates confusion about which takes precedence. Choose one approach and stick with it.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;Don’t use aggressive GC tuning without monitoring&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Settings like &lt;code&gt;-XX:MaxGCPauseMillis&lt;/code&gt; or &lt;code&gt;-XX:G1HeapRegionSize&lt;/code&gt; can worsen performance if misconfigured. G1GC’s defaults are usually optimal.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;Don’t ignore JVM warnings&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Run Jenkins once and check the logs for JVM warnings about ergonomics or container detection. These often indicate configuration issues.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;Don’t deploy to production without testing&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Run under realistic load for at least 24 hours to observe GC behavior, memory growth, and response times.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;monitoring-and-validation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#monitoring-and-validation&quot; /&gt;Monitoring and Validation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once deployed, monitor these metrics to validate your settings are working:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;Garbage Collection&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Use tools like &lt;code&gt;jstat&lt;/code&gt; or observability platforms to track:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GC pause times (should be &amp;lt;1 second for G1GC in normal operation)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Full GC frequency (should be rare or non-existent)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Heap utilization patterns&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;Memory Usage&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Monitor heap memory growth over time:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Watch for continuous growth (memory leak indicator)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Peak memory should stay below your &lt;code&gt;MaxRAMPercentage&lt;/code&gt; setting&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initial memory should stabilize around your &lt;code&gt;InitialRAMPercentage&lt;/code&gt; setting&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;Java Command Line&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Verify settings are applied correctly:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;jcmd &amp;lt;pid&amp;gt; VM.command_line&lt;/code&gt; to see actual JVM arguments&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/environ&lt;/code&gt; (Linux) or &lt;code&gt;ps&lt;/code&gt; output to confirm &lt;code&gt;JAVA_OPTS&lt;/code&gt; are set&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;Simple Health Check&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;div class=&quot;openblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enable basic logging:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;JAVA_OPTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;
  -XX:+UseG1GC
  -XX:MaxRAMPercentage=60.0
  -XX:InitialRAMPercentage=20.0
  -XX:+PrintGCDetails
  -XX:+PrintGCDateStamps
  -Xloggc:/var/log/jenkins/gc.log
&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Monitor &lt;code&gt;gc.log&lt;/code&gt; for unexpected pause times or full GC events.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;quick-rules-of-thumb&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#quick-rules-of-thumb&quot; /&gt;Quick Rules of Thumb&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Controllers&lt;/strong&gt;: Prefer &lt;strong&gt;G1&lt;/strong&gt;, aim for &lt;strong&gt;50–65%&lt;/strong&gt; of container RAM as heap.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Workers&lt;/strong&gt;: Can tolerate &lt;strong&gt;70–75%&lt;/strong&gt; since workload is more predictable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Don’t give the JVM the entire container&lt;/strong&gt;: Leave at least 25–30% for OS and native memory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start conservative&lt;/strong&gt;: You can always increase percentages if memory is being left on the table.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitor before tuning further&lt;/strong&gt;: Most performance issues aren’t solved by tweaking JVM options.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/01/30/fosdem/</id>
<title>Meet Jenkins at FOSDEM Brussels</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-01-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/01/30/fosdem/" />
<category term='fosdem2026'></category>
<category term='contribute'></category>
<category term='community'></category>
<summary>
Meet Jenkins at FOSDEM Brussels


We’re excited to share that Jenkins has a stand at FOSDEM in Brussels this year!


If you’re attending, come by the Jenkins booth to say hello. Whether you want to talk CI/CD best practices, share what you’re building with Jenkins, ask questions, or just geek out about automation, we’d love to chat.


What is FOSDEM?

FOSDEM (Free and Open Source Developers' European Meeting) is one of the largest gatherings of open-source enthusiasts in Europe. It’s a free event that brings together developers, contributors, and users from around the world to share knowledge, collaborate on projects, and celebrate open-source software.


FOSDEM...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2026/fosdem2026.png&quot; alt=&quot;FOSDEM 2026&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;meet-jenkins-at-fosdem-brussels&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#meet-jenkins-at-fosdem-brussels&quot; /&gt;Meet Jenkins at FOSDEM Brussels&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re excited to share that &lt;strong&gt;Jenkins has a stand at FOSDEM in Brussels&lt;/strong&gt; this year!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re attending, come by the Jenkins booth to say hello. Whether you want to talk CI/CD best practices, share what you’re building with Jenkins, ask questions, or just geek out about automation, we’d love to chat.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-is-fosdem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-fosdem&quot; /&gt;What is FOSDEM?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;FOSDEM (Free and Open Source Developers&#39; European Meeting) is one of the largest gatherings of open-source enthusiasts in Europe. It’s a free event that brings together developers, contributors, and users from around the world to share knowledge, collaborate on projects, and celebrate open-source software.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;FOSDEM is all about community, and this is a great chance to meet Jenkins contributors and users face to face.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;👉 &lt;strong&gt;Will you be at FOSDEM?&lt;/strong&gt;
Drop by the Jenkins stand and let’s talk — see you there!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2026/01/05/google-summer-of-code-2026-volunteers-needed-to-mentor-future-jenkins-contributors/</id>
<title>Google Summer of Code 2026: Volunteers Needed to Mentor Future Jenkins Contributors</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2026-01-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2026/01/05/google-summer-of-code-2026-volunteers-needed-to-mentor-future-jenkins-contributors/" />
<author>
<name>shivaylamba</name>
</author>
<category term='gsoc2026'></category>
<category term='contribute'></category>
<category term='community'></category>
<summary>
TL,DR:

Jenkins is preparing to participate in its tenth (10th) year in Google Summer of Code (GSoC). We are seeking volunteers to be Jenkins mentors in the program:




Mentoring takes about 5 to 8 hours of work per week for a 10-22 weeks program.


Mentors provide guidance, coaching, review proposals, pull-requests, and contributor presentations.


Sign up to mentor one of these project ideas or propose your own.




Don’t have time to read? Watch this video.



What is Google Summer of Code?


Google Summer of Code (GSoC) is a global, online mentoring program focused on introducing new contributors to open-source software development.
GSoC participants undertake a programming project lasting...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/12/gsoc-call-for-mentors.png&quot; alt=&quot;Google Summer of Code call for mentors.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tldr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tldr&quot; /&gt;TL,DR:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is preparing to participate in its tenth (10th) year in Google Summer of Code (GSoC). We are seeking volunteers to be Jenkins mentors in the program:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mentoring takes about 5 to 8 hours of work per week for a 10-22 weeks program.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors provide guidance, coaching, review proposals, pull-requests, and contributor presentations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sign up to mentor &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/project-ideas/&quot;&gt;one of these project ideas&lt;/a&gt; or propose your own.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t have time to read? &lt;a href=&quot;https://youtu.be/02Ygo5RAcu4&quot;&gt;Watch this video.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-google-summer-of-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-google-summer-of-code&quot; /&gt;What is Google Summer of Code?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code&lt;/a&gt; (GSoC) is a global, online mentoring program focused on introducing new contributors to open-source software development.
GSoC participants undertake a programming project lasting 10 to 22 weeks, guided by mentors from their chosen open-source organizations.
This experience pairs accepted contributors with experienced developers, offering valuable exposure to real-world software development techniques.
Contributors gain the opportunity to learn from seasoned open-source developers while writing code for real-world projects.
A small stipend is also provided to support and incentivize their open-source contributions.
Refer to the &lt;a href=&quot;https://summerofcode.withgoogle.com/get-started&quot;&gt;GSoC contributor eligibility&lt;/a&gt; documentation for more details.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-might-you-consider-being-a-jenkins-in-gsoc-mentor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-might-you-consider-being-a-jenkins-in-gsoc-mentor&quot; /&gt;Why might you consider being a Jenkins in GSoC mentor?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Participating as a mentor is crucial to the success of GSoC.
Mentoring is a wonderful opportunity to give back to the community while improving your management and people (or general “soft”) skills.
In return for mentoring, a GSoC contributor works on your project full-time for 10-22 weeks.
Think about the projects you’ve always wanted to tackle but never had the time to complete.
The Jenkins project is excited to participate in this fantastic program again in 2026, and we hope you will join us!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-does-mentoring-involve&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-does-mentoring-involve&quot; /&gt;What does mentoring involve?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Potential mentors are invited to read the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors&quot;&gt;information for mentors&lt;/a&gt;.
Serving as a GSoC mentor does not require expert knowledge of Jenkins.
Mentors do not work alone, every project has at least two mentors.
GSoC organization administrators will help find technical advisers, allowing you to learn together with your GSoC contributor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentoring takes about 5 to 8 hours of work per week (more at the start, less at the end).
Mentors provide guidance, coaching, and encouragement.
They review GSoC contributor proposals, pull-requests, and presentations during the evaluation phase.
Mentors also complete the Google-provided final evaluations at the end of the coding period.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;so-you-want-to-be-a-mentor-but-dont-have-a-project-idea-we-can-help-with-that&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#so-you-want-to-be-a-mentor-but-dont-have-a-project-idea-we-can-help-with-that&quot; /&gt;So you want to be a mentor but don’t have a project idea? We can help with that!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC project ideas are coding projects that potential contributors are expected to accomplish in about 10-22 weeks.
The projects can include new features, plugins, test frameworks, infrastructure improvements, graphical interfaces, and more.
If you don’t have a specific project idea, consider being a mentor for one of &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2026/project-ideas/&quot;&gt;these project ideas&lt;/a&gt;.
If you do have a project in mind, please submit it before the beginning of February so it can be reviewed by the GSoC committee and the Jenkins community.
We would love for you to mentor your own project idea.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-to-submit-a-project-idea&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-submit-a-project-idea&quot; /&gt;How to submit a project idea&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Create a pull request with your idea in an &lt;code&gt;.adoc&lt;/code&gt; file in the &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/tree/master/content/projects/gsoc/2026/project-ideas&quot;&gt;project ideas directory&lt;/a&gt;.
Submitting a Google Doc is optional, though still acceptable.
Refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas/&quot;&gt;instructions&lt;/a&gt; for submitting ideas, which include an &lt;code&gt;.adoc&lt;/code&gt; template and examples.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;need-more-inspiration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#need-more-inspiration&quot; /&gt;Need more inspiration?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A great example is the &lt;a href=&quot;https://www.jenkins.io/blog/2023/10/25/what-is-the-plugin-health-score/&quot;&gt;Plugin Health Score&lt;/a&gt;.
This GSoC project idea began in the summer of 2022 and was implemented in the summer of 2023, benefiting millions of Jenkins users worldwide!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We look forward to welcoming new mentors for GSoC 2026!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For any questions, you can find the GSoC Org Admins, mentors, and participants on the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;GSoC SIG Gitter&lt;/a&gt; chat.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/12/29/election-results-2025/</id>
<title>2025 Jenkins Board and Officer Election Results</title>
<updated>2026-09-13T16:43:23+00:00</updated>
<published>2025-12-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/12/29/election-results-2025/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
The Jenkins community has completed the 2025 elections.
On behalf of the Jenkins community and the elections committee,
we congratulate all newly elected board members and officers!
We also thank all candidates and voters who participated this year.


Election results:




Daniel Krämer joins Alexander Brandes, Valentin Delaye, Alex Earl and Basil Crow on the Jenkins Governance Board


Stefan Spieker will serve as Events Officer (uncontested)


Tim Jacomb will continue as Release Officer (uncontested)


Damien Duportal will continue as Infrastructure Officer (uncontested)


Wadeck Follonier will continue as Security Officer (uncontested)


Kris Stern will serve as Documentation Officer




The board positions and officer roles are an essential part of the Jenkins project and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/governance/elections/2025/2025-announcement.svg&quot; alt=&quot;Jenkins Elections&quot; height=&quot;178&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins community has completed the 2025 elections.
On behalf of the Jenkins community and the elections committee,
we congratulate all newly elected board members and officers!
We also thank all candidates and voters who participated this year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Election results:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/strangelookingnerd&quot;&gt;Daniel Krämer&lt;/a&gt; joins &lt;a href=&quot;https://www.jenkins.io/blog/authors/NotMyFault&quot;&gt;Alexander Brandes&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/jonesbusy&quot;&gt;Valentin Delaye&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/slide_o_mix-board&quot;&gt;Alex Earl&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil/&quot;&gt;Basil Crow&lt;/a&gt; on the &lt;a href=&quot;https://www.jenkins.io/project/governance/#governance-board&quot;&gt;Jenkins Governance Board&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/stefan_spieker/&quot;&gt;Stefan Spieker&lt;/a&gt; will serve as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#events&quot;&gt;Events Officer&lt;/a&gt; (uncontested)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/timja/&quot;&gt;Tim Jacomb&lt;/a&gt; will continue as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release Officer&lt;/a&gt; (uncontested)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal/&quot;&gt;Damien Duportal&lt;/a&gt; will continue as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#infrastructure&quot;&gt;Infrastructure Officer&lt;/a&gt; (uncontested)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck/&quot;&gt;Wadeck Follonier&lt;/a&gt; will continue as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#security&quot;&gt;Security Officer&lt;/a&gt; (uncontested)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern/&quot;&gt;Kris Stern&lt;/a&gt; will serve as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation Officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The board positions and officer roles are an essential part of the Jenkins project and we are excited to see contributors taking these roles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The board continues to require that no single company may have a majority on the Jenkins governance board.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;governance-board-election-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#governance-board-election-details&quot; /&gt;Governance Board election details&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year we had three candidates for the Jenkins Governance Board, two for the Documentation Officer, and one for Events Officer.
All of them are awesome community leaders who actively contribute to the Jenkins project and represent its users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We used the &lt;a href=&quot;https://civs1.civs.us/&quot;&gt;Condorcet Internet Voting Service&lt;/a&gt; that allows voters to rank their choices rather than just picking their one favorite choice.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All board members are elected for a 2-year term.
The estimated end of the term for them is December 15, 2027.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;officer-election-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#officer-election-details&quot; /&gt;Officer election details&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All 5 officer positions were up for election this year.
These roles have a 1-year term, with the estimated end of term on December 15, 2026.
After the initial review of nominations and confirmations with potential candidates, 3 officer positions were uncontested:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stefan Spieker&lt;/strong&gt; - &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#events&quot;&gt;Events Officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Damien Duportal&lt;/strong&gt; - &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#infrastructure&quot;&gt;Infrastructure Officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wadeck Follonier&lt;/strong&gt; - &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#security&quot;&gt;Security Officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to all Jenkins officers for their continued leadership!
Officers take responsibility for many day-to-day processes in the Jenkins community and lead the contributor teams working on them.
It requires significant time commitment and it is not taken for granted.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;statistics&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#statistics&quot; /&gt;Statistics&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year we had &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2025&quot;&gt;66 registered voters&lt;/a&gt; and 39 actual votes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#feedback&quot; /&gt;Feedback&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project plans to conduct elections every year.
We appreciate and welcome feedback regarding the election process so that we can improve the process.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have any private feedback you would like to share, please email the &lt;a href=&quot;mailto:jenkinsci-board@googlegroups.com&quot;&gt;Jenkins Board&lt;/a&gt;.
If you would like to raise any issues about the election process, please contact one of the elected Governance Board members.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
</feed>
